Commit graph

16711 commits

Author SHA1 Message Date
Johannes Millan
e6da7ced37 chore(deps): upgrade ESLint to v9 with flat config
- Upgrade eslint from v8 to v9.39.2
- Upgrade typescript-eslint to v8.52.0 (unified package)
- Add angular-eslint package for flat config support
- Migrate from .eslintrc.json to eslint.config.js (flat config)
- Update package configs for sync-md, automations, boilerplate-solid-js
- Remove unused eslint-disable directives
- Fix lint errors (empty interface, template eqeqeq)

BREAKING: Requires Node.js 18.18+ (ESLint 9 requirement)
2026-01-10 16:08:11 +01:00
Johannes Millan
cd22f8018b fix(pfapi): accept compact clientId format in validation
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.
2026-01-10 15:46:31 +01:00
Johannes Millan
132947a69b feat(deps): upgrade Angular to v21
- 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)
2026-01-10 15:27:20 +01:00
Johannes Millan
3f86044147 chore(deps): update NgRx packages to v21 2026-01-10 14:58:30 +01:00
Johannes Millan
5bed090756 chore(deps): update angular-eslint to v21 2026-01-10 14:57:25 +01:00
Johannes Millan
5c7df8a2a8 chore(deps): update Angular Material and CDK to v21 2026-01-10 14:56:37 +01:00
Johannes Millan
1ce8c0d0c8 chore(deps): update Angular to v21 and TypeScript to 5.9 2026-01-10 14:55:45 +01:00
Johannes Millan
560b691a41 chore(deps): update typia to v11 for TypeScript 5.9 support 2026-01-10 14:54:14 +01:00
Johannes Millan
a8cf4378da fix(ci): restore Docker Hub image name to personal repo
The Docker Hub image remains under johannesjo/ to maintain existing
references for users, while the GitHub repo moved to super-productivity/
2026-01-10 14:43:35 +01:00
Johannes Millan
f9656ceb70 16.9.4 2026-01-10 12:58:17 +01:00
Johannes Millan
7179e3d6f8 docs: add Angular commit message guidelines to CLAUDE.md 2026-01-10 12:57:32 +01:00
Johannes Millan
9b7b01d24a fix(ci): update references for repo migration to super-productivity org
- 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
2026-01-10 12:56:27 +01:00
Johannes Millan
e0031b1378 build(ci): improve android build release upload reliability
- 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
2026-01-10 12:55:14 +01:00
Johannes Millan
6dcede853f 16.9.3 2026-01-10 12:23:21 +01:00
Johannes Millan
3b14a04934 fix(calendar): display proper error messages instead of [object Object]
Use getErrorTxt utility to extract meaningful error messages from
HttpErrorResponse objects in calendar integration error handling.

Fixes #5870
2026-01-10 12:21:28 +01:00
Johannes Millan
52bf171ec4 fix(e2e): fix keyboard shortcut delete test and reduce sync test flakiness
- 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
2026-01-10 12:10:23 +01:00
Johannes Millan
adbea068da fix(tasks): add subscription cleanup to delete confirmation dialog
Prevents potential issues when component is destroyed while the
delete confirmation dialog is open.
2026-01-10 12:10:23 +01:00
Johannes Millan
81b6d4f30e
Merge pull request #5949 from miqh/fix/schedule-task-start-overlap
fix(schedule): maintain visibility during task overlap on schedule (#5887)
2026-01-10 12:10:18 +01:00
Michael Huynh
28c92cf944
fix(schedule): maintain visibility during task overlap on schedule (#5887) 2026-01-10 15:47:57 +08:00
Johannes Millan
7fcec38476 16.9.2 2026-01-09 18:28:21 +01:00
Johannes Millan
79276f3fc7 16.9.1 2026-01-09 17:59:07 +01:00
Johannes Millan
9c7549af40 fix(e2e): handle task deletion confirmation dialog in WebDAV sync test
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.
2026-01-09 17:59:06 +01:00
Johannes Millan
dae5caa6ff fix: resolve build failures from missing translations and unused imports
Remove unused imports (MatSlideToggle, MatFormField, MatLabel, TranslatePipe,
RouterLink) and add missing translation keys for CalDAV issue content, G.SHARE,
and WORKLOG restore task from archive.
2026-01-09 17:59:06 +01:00
Johannes Millan
b3dfd1f6a2
Merge pull request #5914 from Gitoffthelawn/patch-1
Added Scoop installation instructions
2026-01-09 16:57:12 +01:00
Johannes Millan
4919ab188b 16.9.0 2026-01-09 16:41:59 +01:00
Johannes Millan
1acef88877 Merge remote-tracking branch 'origin/master'
* origin/master:
  Update Chinese localization strings in zh.json

# Conflicts:
#	src/assets/i18n/zh.json
2026-01-09 16:39:30 +01:00
Johannes Millan
a2e1f932f4 fix: address code review issues from daily review
- 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)
2026-01-09 16:25:41 +01:00
Johannes Millan
73690c3766 feat(task-repeat): add history heatmap to repeat config dialog
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.
2026-01-09 15:55:17 +01:00
Johannes Millan
7bf9e9393e fix(imex): auto-fix deprecated metric/improvement array fields on import
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.
2026-01-09 15:43:55 +01:00
Johannes Millan
d2a13d21e3 fix(imex): show validation error details on import failure
Include failed field paths in DataValidationFailedError message and
display them in the snackbar, making it easier to debug import issues.
2026-01-09 15:43:39 +01:00
Johannes Millan
10d652a382 fix(reminder): invoke cfg signal correctly to access reminder config 2026-01-09 15:36:27 +01:00
Johannes Millan
45826b8bcf
Merge pull request #5945 from dXrayb/patch-13
Update Chinese localization strings in zh.json
2026-01-09 15:33:21 +01:00
Johannes Millan
93c319830f fix(gitlab): use consistent update detection logic across methods
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.
2026-01-09 15:11:16 +01:00
Johannes Millan
dfa6a94a4b fix(android): show notification with sound when focus mode timer completes in background
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
2026-01-09 15:01:06 +01:00
Johannes Millan
ba9ceb25fd fix(reminder): cancel native Android alarm when removing reminder
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.
2026-01-09 15:01:06 +01:00
Johannes Millan
5f724ad16e fix(reminder): prevent duplicate notifications from worker race condition
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
2026-01-09 15:01:06 +01:00
Johannes Millan
6d1f5a7113 feat(reminder): add option to disable window focus on reminder
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
2026-01-09 15:01:06 +01:00
Johannes Millan
dc498ef77d fix(ci): fix first-time contributor welcome action
- Change repo-token to repo_token (correct parameter name)
- Add write permissions for issues and pull-requests
2026-01-09 15:01:06 +01:00
Johannes Millan
6d96cab5ae feat(tasks): show focus session option in context menu on mobile
Remove IS_TOUCH_PRIMARY restriction so the "Start Focus Session"
context menu entry is visible on mobile/touch devices.
2026-01-09 15:01:06 +01:00
Johannes Millan
d475d88da3 feat(work-view): show day of week in scheduled date group headers
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
2026-01-09 15:01:06 +01:00
Johannes Millan
2194cb952d fix(planner): respect first day of week setting in schedule dialog
Wait for localization config to load before rendering mat-calendar
so DateAdapter.getFirstDayOfWeek() returns the user's configured value.

Fixes #5935
2026-01-09 15:01:06 +01:00
Johannes Millan
f3954131ac feat(tasks): add confirmation dialog before task deletion
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
2026-01-09 15:01:06 +01:00
Johannes Millan
b3ecfabc45 feat(18n): update translations 2026-01-09 15:01:06 +01:00
Johannes Millan
124ab686ed chore(i18n): remove 228 unimplemented feature translation keys
Remove translation keys for features that were planned but never
implemented, including:

- F.FOCUS_MODE.* (11) - planned focus mode extensions
- F.JIRA.STEPPER.* (5) - setup wizard never built
- F.METRIC.EVAL_FORM.* (15) - unused evaluation fields
- F.SYNC.* (36) - unused error states and dialogs
- F.TASK.* (29) - unused task bar and reminder keys
- F.PROJECT.D_CREATE.SETUP_* (7) - issue provider setup wizards
- F.ISSUE.*/JIRA.*/GITEA.*/etc (various) - unused provider keys
- MH.*/GCF.*/PLUGINS.*/G.* (various) - miscellaneous unused

Remaining 18 "unused" keys are false positives due to dynamic
object access pattern (F.TAG_FOLDER.*, F.PROJECT_FOLDER.*).

Total translation keys: 1965 → 1594 (371 removed, 19% reduction)
2026-01-09 15:00:36 +01:00
Johannes Millan
af4e622f91 chore(i18n): remove additional 86 orphan translation keys
Remove keys that are duplicates, never implemented, or obsolete:
- F.SAFETY_BACKUP.* (32) - orphan duplicate of F.SYNC.SAFETY_BACKUP
- F.PROCRASTINATION.* (32) - feature never implemented
- GCF.PAST.* (11) - orphan duplicate of GLOBAL_RELATIVE_TIME.PAST
- GCF.TIMELINE.* (10) - settings form never implemented
- WW.HELP_PROCRASTINATION (1) - related to unimplemented feature

Total unused keys reduced: 350 → 264
Remaining 264 keys need case-by-case review (planned features,
dynamic object access patterns, edge cases).

Add docs/unused-translations-analysis.md with detailed findings.
2026-01-09 14:59:05 +01:00
Johannes Millan
12d315a703 chore(i18n): add unused translation scanner and remove orphaned keys
Add tools to detect and clean up unused translation keys:
- find-unused-translations.js: scans for T.* and string literal patterns
- cleanup-unused-translations.js: removes specified orphaned sections

Remove 34 orphaned translation keys from all 25 language files:
- ANDROID.* (5 keys) - code removed in previous commits
- THEMES.* (17 keys) - never used, themes use hardcoded names
- F.CALDAV.ISSUE_CONTENT.* (12 keys) - never wired up

Convert string literal translation keys to T.* pattern in:
- dialog-user-profile-management component
- user-profile-button component
- plugin-management component
- config-sound-form component
- lazy-chart component
2026-01-09 14:59:05 +01:00
Johannes Millan
dec0d4ec33
Merge pull request #5944 from kemsar/bugfix/5518-gitlab-created-tasks-show-updated-when-not
Fixes Gitlab created tasks being marked incorrectly as updated
2026-01-09 14:57:27 +01:00
John
c1aace20fb
Update Chinese localization strings in zh.json 2026-01-09 21:52:39 +08:00
Johannes Millan
38428d6e1c
Merge pull request #5930 from ryziopl/master
Translation to Polish
2026-01-09 14:36:54 +01:00
Kevin Sarsen
6870483d4c
Fixes Gitlab created tasks being marked incorrectly as updated
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
2026-01-08 11:40:18 -07:00