Commit graph

1524 commits

Author SHA1 Message Date
Johannes Millan
a42c8a4cee Merge branch 'master' into feat/operation-logs
* master:
  refactor(dialog): remove unused OnDestroy implementation from DialogAddNoteComponent
  fix(calendar): poll all calendar tasks and prevent auto-move of existing tasks
  docs: add info about how to translate stuff #5893
  refactor(calendar): replace deprecated toPromise with firstValueFrom
  build: update links to match our new organization
  add QuestArc to community plugins list
  feat(calendar): implement polling for calendar task updates and enhance data retrieval logic
  fix(heatmap): use app theme class instead of prefers-color-scheme
  fix(focus-mode): start break from banner when manual break start enabled
  feat(i18n): connect Finnish and Swedish translation files
  refactor(focus-mode): split sessionComplete$ and breakComplete$ into single-responsibility effects
  Fixing Plugin API doc on persistence

# Conflicts:
#	src/app/features/issue/store/poll-issue-updates.effects.ts
#	src/app/t.const.ts
2026-01-05 19:12:46 +01:00
Johannes Millan
1a79592aca build: update links to match our new organization 2026-01-05 14:45:06 +01:00
Johannes Millan
e046eb9100 fix(e2e): limit supersync test workers to prevent server crash
SuperSync tests create 2-3 browser contexts per test. Running with
12 workers resulted in 24-36 simultaneous connections overwhelming
the Angular dev server, causing ERR_CONNECTION_REFUSED errors.

Changes:
- Add --workers=3 to e2e:supersync and e2e:supersync:file scripts
- Add documentation to supersync.fixture.ts explaining the issue
2026-01-04 18:47:02 +01:00
Johannes Millan
3f3f0685eb Merge branch 'master' into feat/operation-logs
* master: (21 commits)
  test: increase timeout for encryption
  16.8.3
  fix(e2e): use pressSequentially for time input in task-detail tests
  fix(sync): resolve 25-second initial sync timeout race condition
  feat(e2e): add Docker-based E2E test isolation
  fix(schedule): start tracking selected task when pressing Y in schedule view
  fix(tasks): clear reminder when clicking "today" button on already-today tasks
  fix(e2e): use format-agnostic time change in task-detail tests
  16.8.2
  fix(test): reset selector overrides to prevent test pollution
  build: update CLAUDE.md
  fix(calendar): add periodic refresh for planner and scheduler views
  feat(effects): consolidate task update actions in PluginHooksEffects
  fix(sync): show skip button immediately when offline
  fix(db): add missing _afterReady guard to loadAll method
  feat(android): add alarm sound and vibration to task reminders
  feat(sync): add skip button to loading screen when waiting for sync
  fix(pomodoro): allow manual session end to start break early
  fix(i18n): add missing translate pipe to play button tooltip
  fix(tasks): handle undefined tasks in reminder effect
  ...

# Conflicts:
#	CLAUDE.md
#	docker-compose.e2e.yaml
#	e2e/tests/task-detail/task-detail.spec.ts
#	package.json
#	src/app/features/tasks/store/task-reminder.effects.spec.ts
#	src/app/features/tasks/store/task-reminder.effects.ts
#	src/app/plugins/plugin-hooks.effects.ts
2026-01-04 18:20:10 +01:00
Johannes Millan
2cc06178e5 16.8.3 2026-01-04 17:27:04 +01:00
Johannes Millan
40d7118e17 feat(e2e): add Docker-based E2E test isolation
Add Docker setup for running E2E tests with the Angular dev server
containerized while Playwright runs on the host. Supports multiple
instances via configurable ports.

New files:
- Dockerfile.e2e.dev: Dev server image
- docker-compose.e2e.yaml: E2E orchestration config
- scripts/wait-for-app.sh: Health check script

New npm scripts:
- e2e:docker: Run E2E with containerized app
- e2e:docker:webdav: Same but includes WebDAV for sync tests

Usage: APP_PORT=4343 npm run e2e:docker
2026-01-04 17:09:39 +01:00
Johannes Millan
70f1e4ba73 16.8.2 2026-01-04 14:57:50 +01:00
Johannes Millan
85fa50974b Merge branch 'master' into feat/operation-logs
* master:
  refactor(e2e): improve test infrastructure for easier expansion
  chore(e2e): remove broken/empty skipped tests
  test(e2e): fix flaky plugin and WebDAV sync tests
  refactor(e2e): replace waitForTimeout with condition-based waits
  perf(e2e): remove ineffective waits to speed up test runs
  docs(e2e): add CLAUDE.md reference and barrel export for easier test creation
  build: update dep
  refactor(e2e): simplify waits and fix flaky tests
  feat(e2e): streamline e2e test development with improved infrastructure
  perf(e2e): optimize wait utilities and addTask method for faster test execution
  16.8.1

# Conflicts:
#	e2e/pages/base.page.ts
#	e2e/pages/project.page.ts
#	e2e/tests/reminders/reminders-schedule-page.spec.ts
#	e2e/tests/sync/webdav-sync-advanced.spec.ts
#	e2e/tests/sync/webdav-sync-expansion.spec.ts
#	e2e/tests/sync/webdav-sync-full.spec.ts
#	e2e/utils/waits.ts
2026-01-03 18:51:51 +01:00
Johannes Millan
9c84de94ee build: update dep 2026-01-03 12:57:47 +01:00
Johannes Millan
ac31531ca6 16.8.1 2026-01-02 20:12:41 +01:00
Johannes Millan
e6ea0d74f0 Merge branch 'master' into feat/operation-logs
* master: (37 commits)
  16.8.0
  feat(i18n): add new translations
  fix: address code review issues from today's changes
  fix: address code review issues from today's changes
  fix(data-repair): change quickSetting to CUSTOM when startDate is missing
  fix(test): fix fetch spy setup in audio tests
  fix(android): sync time tracking from notification correctly on resume
  fix(database): prevent repeated error dialogs when disk is full
  fix(reminder): prevent dismissed reminders from reappearing
  fix(task-repeat): prevent race condition when saving repeat config
  fix(android): add error handling for native service calls
  fix(reminder): cancel native Android reminders immediately on task deletion
  fix(error-handler): use getErrorTxt to prevent [object Object] in error titles
  fix(planner): use task startDate for weekly repeat weekday calculation
  fix(focus-mode): use independent 1s timer for Pomodoro countdown
  feat(focus-mode): add Skip Break button to banner during active breaks
  feat(notes): add auto-save to fullscreen markdown editor
  fix(reflection-note): prevent trailing spaces from being deleted while typing
  fix(sync): add error handling for JSON parse failures in sync data
  fix(error-handling): prevent [object Object] from appearing in error messages
  ...

# Conflicts:
#	src/app/core/persistence/database.service.ts
#	src/app/features/android/store/android-focus-mode.effects.ts
#	src/app/features/android/store/android-foreground-tracking.effects.ts
#	src/app/features/reminder/reminder.service.spec.ts
#	src/app/features/reminder/reminder.service.ts
#	src/app/features/tasks/dialog-view-task-reminders/dialog-view-task-reminders.component.ts
#	src/app/features/tasks/store/task-reminder.effects.spec.ts
#	src/app/features/tasks/store/task-reminder.effects.ts
#	src/app/features/work-context/store/work-context.effects.spec.ts
#	src/app/features/work-context/store/work-context.effects.ts
#	src/app/t.const.ts
#	src/assets/i18n/en.json
2026-01-02 19:56:30 +01:00
Johannes Millan
092d32a39e 16.8.0 2026-01-02 19:26:41 +01:00
dependabot[bot]
4738955b04
chore(deps-dev): bump @typescript-eslint/utils from 8.41.0 to 8.51.0
Bumps [@typescript-eslint/utils](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/utils) from 8.41.0 to 8.51.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/utils/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.51.0/packages/utils)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/utils"
  dependency-version: 8.51.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-01 13:01:10 +00:00
Johannes Millan
ac43881d2d build: update types 2025-12-31 12:45:42 +01:00
Johannes Millan
6c098b6eaa Merge branch 'master' into feat/operation-logs
Resolve conflict in webdav-sync-expansion.spec.ts:
- Use simplified sync verification without reload (sync updates NgRx directly)
- Test: B marks task done -> sync -> verify A sees task as done
2025-12-29 21:54:15 +01:00
Johannes Millan
30d2209688 chore(package): update baseline-browser-mapping to version 2.9.11 2025-12-26 12:04:55 +01:00
Johannes Millan
efb164c1fe fix(security): update Angular packages to address CVEs
- CVE-2025-66035: XSRF token leakage via protocol-relative URLs
- CVE-2025-66412: Stored XSS via SVG animation and MathML attributes
- CVE-2025-66414: DNS rebinding in @modelcontextprotocol/sdk

Updated @angular/* packages to 20.3.15 and @angular/cli to 20.3.13.
2025-12-23 14:10:16 +01:00
Johannes Millan
501b8b5a32 Merge branch 'master' into feat/operation-logs
* master:
  fix(build): remove deprecated win32metadata from electron-builder config
  fix(focus-mode): address critical focus mode and Android notification issues
  test(task-repeat): fix flaky tests and add Mon/Wed/Fri coverage (#5594)
  fix(electron): delay window focus after notification to prevent accidental input
  feat(task): add Go to Task button for all newly created tasks
  fix(sync): show context-aware permission error for Flatpak/Snap
  fix(android): skip reminder dialog on Android to fix snooze button
  fix(focus-mode): respect isFocusModeEnabled setting in App Features
  fix(android): sync notification timer when time spent is manually changed
  feat(sync): add WebDAV Test Connection button and improve UX
  fix(build): ensure consistent Windows EXE metadata for installer and portable
  Update es.json
  Update es.json
  Update es.json
  feat(i18n): update Turkish language
  16.7.3
  fix: es.json

# Conflicts:
#	src/app/features/android/store/android.effects.ts
#	src/app/features/config/form-cfgs/sync-form.const.ts
#	src/app/features/focus-mode/store/focus-mode.effects.ts
#	src/app/features/tasks/store/task-ui.effects.ts
#	src/app/imex/sync/sync-wrapper.service.ts
#	src/app/pages/config-page/config-page.component.ts
#	src/app/pfapi/api/sync/providers/webdav/webdav.ts
#	src/app/t.const.ts
2025-12-22 20:44:21 +01:00
Johannes Millan
77b991c75c 16.7.3 2025-12-20 11:43:20 +01:00
Johannes Millan
79853eee3f Merge branch 'master' into feat/operation-logs
* master: (41 commits)
  16.7.2
  16.7.1
  16.7.0
  fix(focus-mode): show start button when break time is up in banner mode
  fix(focus-mode): hide dismiss button in banner-only mode (#5737)
  fix(focus-mode): add start button in banner after session completes (#5737)
  refactor(focus-mode): remove isAlwaysUseFocusMode setting (#5737)
  feat(focus-mode): add task existence check before resuming tracking (#5737)
  feat(focus-mode): add icon buttons for banner and sync session with tracking (#5753)
  fix(repeat): schedule tasks for correct day and remove from Today when needed (#5594)
  feat(focus-mode): sync duration when Pomodoro settings change (#5753)
  feat(focus-mode): add new settings and fix pomodoro dialog (#5753)
  fix(focus-mode): fix pomodoro long break timing and add ticking sound option (#5753)
  feat(android): add better notifications and permanent notification for focus mode
  feat(android): add background time tracking via foreground service
  build(ci): add i18n JSON validation step to lint-and-test workflow
  docs: add archived tasks viewer to community plugins
  fix(android): make schedule dialog scrollable on small screens (#5741)
  fix(focus-mode): preserve existing notes when opening notes panel (#5752)
  fix(sync): show user-friendly error for Flatpak/Snap permission issues
  ...

# Conflicts:
#	src/app/features/android/store/android.effects.ts
#	src/app/features/focus-mode/store/focus-mode.effects.ts
#	src/app/features/issue/dialog-edit-issue-provider/dialog-edit-issue-provider.component.ts
#	src/app/features/reminder/reminder.module.ts
#	src/app/features/task-repeat-cfg/store/task-repeat-cfg.effects.ts
2025-12-19 21:38:29 +01:00
Johannes Millan
1d52bb91be 16.7.2 2025-12-19 21:17:46 +01:00
Johannes Millan
4a40af6f14 16.7.1 2025-12-19 21:15:45 +01:00
Johannes Millan
592eb3ba39 16.7.0 2025-12-19 21:10:21 +01:00
Johannes Millan
4367fe2109 feat(lint): add ESLint rule to enforce hydration guards on selector effects
Add local-rules/require-hydration-guard ESLint rule that warns when
selector-based NgRx effects lack hydration guards (skipDuringSync() or
isApplyingRemoteOps()).

The rule correctly identifies:
- Effects that START with this.store.select() as primary source
- Does NOT flag selectors in withLatestFrom (secondary sources)
- Does NOT flag selectors inside operator callbacks (already guarded)

This prevents duplicate operations during sync replay where selector-based
effects would fire on intermediate states.

Install eslint-plugin-local-rules to enable the rule.
2025-12-18 17:33:37 +01:00
Johannes Millan
5992fad51b fix(sync): perform archive flush synchronously to prevent DB lock error
Previously, flushYoungToOld was dispatched as an action and handled by
an NgRx effect. This caused a race condition during finish day:
1. Action dispatched, effect queued
2. Method returned, sync started, DB locked
3. Effect ran, tried to write, blocked by DB lock

Fix follows the same pattern as moveToArchive:
- Perform the flush synchronously in ArchiveService before dispatching
- Dispatch action for op-log capture only (syncs to other clients)
- Handler skips local operations (only runs for remote)

Also adds comprehensive unit tests and e2e test for this scenario.
2025-12-17 16:42:59 +01:00
Johannes Millan
02d80249af fix(sync): prevent SYNC_IMPORT for fresh clients syncing to empty server
The server migration check was incorrectly creating a SYNC_IMPORT when
a fresh client (with local data but no sync history) synced to an empty
server. This caused operations from other clients to be filtered out as
"invalidated by SYNC_IMPORT" because they were CONCURRENT with it.

Now _checkAndHandleServerMigration() checks for previously synced ops
before triggering migration, correctly distinguishing between:
- Fresh client (only local ops) → uploads ops normally
- Server migration (has sync history) → creates SYNC_IMPORT

Also adds npm scripts for debugging supersync E2E tests.
2025-12-17 15:56:17 +01:00
Johannes Millan
9f1d68ea40 Merge branch 'master' into feat/operation-logs
* master:
  fix(electron): use includes() instead of in operator for hostname check
  fix(docker): use Debian-based nginx for ARM64 QEMU compatibility
  16.6.1
  build: add resolved URL and integrity for ical.js version 2.1.0
  fix(ui): align time tracking button overlay (#5720)
  fix(calendar): handle Office 365 updateTimezones crash (#5722)
  fix(repeat): use fallback for undefined startDate (#5724)
  build(welcome): update wording for issue claiming instructions
  fix(docker): drop arm/v7 platform to fix QEMU build failure
2025-12-16 18:14:12 +01:00
Johannes Millan
0e17203d0a 16.6.1 2025-12-14 12:33:38 +01:00
Johannes Millan
3791fa14c0 build(sync): add SuperSync service for E2E testing in docker-compose 2025-12-12 20:48:10 +01:00
Johannes Millan
c87e7ec218 refactor(sync): use uuidv7 library for UUID generation
Replace custom UUID v7 implementations with the standard uuidv7 library.
The custom implementation had a bug with JavaScript bitwise operators
not handling 48-bit timestamps correctly.
2025-12-12 20:46:19 +01:00
Johannes Millan
19dfc5ca07 build: add development build script for frontend 2025-12-12 20:46:05 +01:00
Johannes Millan
a10eb2fcf8 16.6.0 2025-12-12 19:06:20 +01:00
Johannes Millan
fe40bdf179 build(deps): update dependencies to fix security vulnerabilities
- Override @conventional-changelog/git-client to ^2.5.1 to fix CVE-2025-59433
- Update glob (via nested deps) to ^11.1.0 to fix CVE-2025-64756
- Update node-forge to ^1.3.3 to fix CVE-2025-12816 & CVE-2025-66030
2025-12-11 18:47:56 +01:00
Johannes Millan
e268076332 test(e2e): try to fix e2e tests 2025-12-10 21:26:48 +01:00
Johannes Millan
102ac1c330 16.5.5 2025-12-09 14:26:48 +01:00
johannesjo
7ce0d784ce 16.5.4 2025-12-07 09:57:23 +01:00
Johannes Millan
4bf3754fef 16.5.3 2025-12-06 16:29:09 +01:00
Johannes Millan
6e60bde789 build: downgrade electron again 2025-12-06 16:26:39 +01:00
Johannes Millan
6a150ea8a2 16.5.2 2025-12-06 13:41:30 +01:00
Johannes Millan
5ef527990a 16.5.1 2025-12-06 12:08:14 +01:00
Johannes Millan
02093f871d 16.5.0 2025-12-05 17:24:02 +01:00
Johannes Millan
68ff0ffb88 build(electron): upgrade to Electron 39 with X11 default on Linux
Upgrade Electron from 37.7.0 to 39.2.5. Since Electron 38+ defaults to
Wayland via --ozone-platform=auto, force X11 on Linux to ensure reliable
idle detection (#1443) and global shortcuts. Users can opt-in to Wayland
with --ozone-platform=wayland or --force-wayland flags.
2025-12-05 15:28:40 +01:00
Johannes Millan
e6d1464f00
Merge pull request #5638 from johannesjo/dependabot/npm_and_yarn/electron-builder-26.3.2
chore(deps-dev): bump electron-builder from 26.1.0 to 26.3.2
2025-12-04 11:06:05 +01:00
Johannes Millan
af55e8d409
Merge pull request #5608 from nicojmn/master
feat(encryption): migrate to argon2id
2025-12-02 12:41:12 +01:00
Johannes Millan
8f2161623f
Merge pull request #5637 from johannesjo/dependabot/npm_and_yarn/electron-log-5.4.3
chore(deps): bump electron-log from 5.4.1 to 5.4.3
2025-12-02 12:34:58 +01:00
dependabot[bot]
cfe80ef7e4
chore(deps-dev): bump electron-builder from 26.1.0 to 26.3.2
Bumps [electron-builder](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-builder) from 26.1.0 to 26.3.2.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/packages/electron-builder/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/commits/electron-builder@26.3.2/packages/electron-builder)

---
updated-dependencies:
- dependency-name: electron-builder
  dependency-version: 26.3.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-02 02:20:14 +00:00
Johannes Millan
e6883d5117
Merge pull request #5634 from johannesjo/dependabot/npm_and_yarn/canvas-confetti-1.9.4
chore(deps-dev): bump canvas-confetti from 1.9.3 to 1.9.4
2025-12-02 01:20:31 +01:00
dependabot[bot]
07cc3d387b
chore(deps): bump electron-log from 5.4.1 to 5.4.3
Bumps [electron-log](https://github.com/megahertz/electron-log) from 5.4.1 to 5.4.3.
- [Changelog](https://github.com/megahertz/electron-log/blob/master/CHANGELOG.md)
- [Commits](https://github.com/megahertz/electron-log/compare/v5.4.1...v5.4.3)

---
updated-dependencies:
- dependency-name: electron-log
  dependency-version: 5.4.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-01 15:46:50 +00:00
dependabot[bot]
a50907bb32
chore(deps-dev): bump canvas-confetti from 1.9.3 to 1.9.4
Bumps [canvas-confetti](https://github.com/catdad/canvas-confetti) from 1.9.3 to 1.9.4.
- [Release notes](https://github.com/catdad/canvas-confetti/releases)
- [Commits](https://github.com/catdad/canvas-confetti/compare/1.9.3...1.9.4)

---
updated-dependencies:
- dependency-name: canvas-confetti
  dependency-version: 1.9.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-01 15:45:58 +00:00
Johannes Millan
6b6e815635
Merge pull request #5630 from johannesjo/dependabot/npm_and_yarn/nanoid-5.1.6
chore(deps-dev): bump nanoid from 5.1.5 to 5.1.6
2025-12-01 16:24:02 +01:00