Update clientId validation to accept both formats:
- Old format: 10+ chars (e.g., "BCL1pq4d2j11_27")
- New compact format: 6 chars matching /^[BEAI]_[a-zA-Z0-9]{4}$/
The compact format was introduced in feat/operation-logs branch but
the validation was rejecting it, causing "Invalid clientId loaded" errors.
- Update @angular/* packages to v21.0.8
- Update @angular/material and @angular/cdk to v21.0.6
- Update @angular-eslint/* to v21.1.0
- Update @ngrx/* to v21.0.1
- Update TypeScript to 5.9.3
- Update ngx-markdown to v21 and marked to v17
- Update typia to v11 for TypeScript 5.9 support
- Update @types/node to v22, chart.js to v4.5.1
Breaking changes addressed:
- Replace deep imports with public API imports (idb, formly, ngrx)
- Update marked-options-factory for marked v17 API changes
- Add custom FormlySliderComponent (formly slider incompatible with Mat v21)
- Update ngx-markdown SANITIZE configuration
- Fix HostListener decorators with unused $event args
- Fix crypto.subtle type compatibility
- Add skipLibCheck for dependency type conflicts
- Update tsconfig module settings for Angular 21
Removed:
- @angular-builders/custom-webpack (unused)
- Add permissions: contents: write to build.yml and manual-build.yml
to fix GitHub release creation after org migration
- Update AUR PKGBUILD download URL to new org
- Update release notes changelog link
- Update GitHub project example hints in translation files
- Add explicit contents: write permission for GITHUB_TOKEN
- Increase wait time for release creation from 15 to 20 minutes
- Add failure check if release is not found after waiting
- Click on .drag-handle instead of task element to properly focus task
without triggering title edit mode (which would block keyboard shortcuts)
- Verify WebDAV form fields appear after selection before proceeding
- Add clear error message when WebDAV selection fails after retries
The test was failing because task deletion now shows a confirmation
dialog by default (isConfirmBeforeTaskDelete=true). Added handling
to click the confirm button before expecting the task count to change.
- Apply runtime default for isConfirmBeforeTaskDelete to ensure existing users get confirmation dialog
- Add takeUntil cleanup for dialog subscription in context menu
- Move _isTaskDeleteTriggered flag before delete call to prevent race condition
- Replace alert() with PFLog.warn() for non-blocking notification
- Change any to unknown type for better type safety
- Localize month names using DateAdapter instead of hardcoded English strings
- Remove duplicate monthNames array declaration (DRY)
Extract reusable heatmap component from activity-heatmap and add
a new repeat-task-heatmap that shows time spent history for
repeatable task instances in the configuration dialog.
Add handlers to autoFixTypiaErrors to fix validation errors for deprecated
fields that will be removed in future:
- metric.entities[*].obstructions, improvements, improvementsTomorrow
- improvement.hiddenImprovementBannerItems
These fields are now auto-fixed to empty arrays when missing/undefined,
allowing import of older backups without validation failures.
Apply GitHub's OR pattern to fix timing bug while preserving filterUsername.
Refactor getFreshDataForIssueTasks to call getFreshDataForIssueTask (DRY).
Fixes inconsistency from #5944 where only one method was updated.
When the app is backgrounded on Android, the focus mode countdown timer
now triggers a high-priority notification with alarm sound and vibration
when it completes. Previously, only the silent foreground service
notification was shown, causing users to miss timer completion.
Changes:
- Add completion notification channel with IMPORTANCE_HIGH
- Detect timer completion in FocusModeForegroundService
- Broadcast completion event to activity via LocalBroadcastManager
- Forward event to Angular via onFocusModeTimerComplete$ subject
- Handle native completion in effects to sync app state
Fixes#5923
Fixes#5921: When a task was rescheduled by removing the time and
changing only the date, the native Android alarm would still fire at
the original time. This was because removeTaskReminderSideEffects$
only removed the reminder from ReminderService but did not cancel
the native Android alarm.
Added explicit native Android alarm cancellation following the same
pattern used in clearRemindersOnDelete$, unscheduleDoneTask$, and
other similar effects.
Add service-level deduplication to prevent the same reminder from
triggering multiple notifications when the worker's 10-second polling
interval races with state updates.
The fix tracks recently processed reminder IDs and filters them out
before emitting. IDs are cleared when snoozing (to allow re-trigger at
new time) and auto-cleaned after 60 seconds to prevent memory leaks.
Closes#5925
Add isFocusWindow setting to reminder config, defaulting to false.
This prevents the app from stealing focus when reminders fire, which
was interrupting users working in other applications.
Closes#5922
Display weekday alongside date when tasks are grouped by scheduled date
(e.g., "Wed 1/15" instead of "2025-01-15"), making it easier to identify
weekends at a glance.
Closes#5941
Add optional setting to show confirmation dialog when deleting tasks
via keyboard shortcut (Backspace) or context menu. This prevents
accidental cascading deletions when users press Backspace expecting
browser-like "go back" behavior.
- Add isConfirmBeforeTaskDelete setting (defaults to true)
- Add confirmation dialog to TaskComponent.deleteTask()
- Add confirmation dialog to context menu deleteTask()
- Add setting checkbox in Settings > Misc
- Add unit and E2E tests for the feature
Closes#5942
Rather than comparing the issues last update timestamp with the last comment timestamp, it now compares the issue last update timestamp with the task `issueLastUpdated` property. This avoids the latency between an update and the update being logged in the comments.
Fixes#5518