Commit graph

18692 commits

Author SHA1 Message Date
Corey Newton
daa5cea0f6 docs(wiki): add new notes for Quick History and Worklog 2026-02-04 14:45:00 +01:00
Corey Newton
1bb1b6839e docs(wiki): add Task Archiving section and update references across multiple documents 2026-02-04 14:45:00 +01:00
Corey Newton
f8c4e76c8e docs(wiki): add Metrics 2026-02-04 14:45:00 +01:00
Corey Newton
fd9ee3e421 docs(wiki): add Reflection 2026-02-04 14:45:00 +01:00
Corey Newton
4a8a04ecc3 docs(wiki): add Reminders and Idle Time 2026-02-04 14:45:00 +01:00
Corey Newton
1b52eb8a6b docs(wiki): add Timers and Focus Mode 2026-02-04 14:45:00 +01:00
Corey Newton
73739df285 docs(wiki): add How Time Is Logged section 2026-02-04 14:45:00 +01:00
Corey Newton
9faa3e4bb4 docs(wiki): add Repeating Tasks section and update references across multiple documents 2026-02-04 14:45:00 +01:00
Corey Newton
19a78f42fb docs(wiki): added Scheduled Tasks; updated references in multiple sections 2026-02-04 14:45:00 +01:00
Corey Newton
9a0f1a6000 docs(wiki): add Subtasks section and references in Task Attributes 2026-02-04 14:45:00 +01:00
Corey Newton
86d0242e81 docs(wiki): add Task Notes 2026-02-04 14:45:00 +01:00
Corey Newton
1f8b2504fe docs(wiki): add note about Task Attributes 2026-02-04 14:45:00 +01:00
Corey Newton
cfe8095a82 docs(wiki): create note regarding Time Estimates 2026-02-04 14:45:00 +01:00
novikov1337danil
b350141c5d
fix(schedule-week): adjust sizes (#6350) 2026-02-04 12:44:51 +01:00
dependabot[bot]
3e01a70479
chore(deps): bump @isaacs/brace-expansion (#6346)
Bumps the npm_and_yarn group with 1 update in the / directory: @isaacs/brace-expansion.


Updates `@isaacs/brace-expansion` from 5.0.0 to 5.0.1

---
updated-dependencies:
- dependency-name: "@isaacs/brace-expansion"
  dependency-version: 5.0.1
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-04 12:42:34 +01:00
Johannes Millan
b8e448e707 fix(e2e): use desktop selectors for simple counter sync tests
Counter test helpers assumed mobile layout (.mobile-dropdown-wrapper)
but simulated clients use 1920x1080 viewport where counters render
inline in .counters-action-group.
2026-02-03 18:26:54 +01:00
Johannes Millan
350e07e696 fix(e2e): reduce flakiness and speed up WebDAV sync tests
- Remove serial mode and networkidle waits in legacy migration tests
- Reduce optional conflict dialog timeout from 5s to 2s
- Add dialog handler for Client B in first-sync-conflict USE_REMOTE test
- Add delay before sync check and lower threshold in burst sync test
- Add waitForArchivePersistence in concurrent same-task archive test
- Use closeContextsSafely, increase keyboard timing, and add
  waitForStatePersistence in today-tag reorder tests
2026-02-03 17:53:07 +01:00
Johannes Millan
80007dbc19 fix(tasks): clear remindAt when rescheduling task via planner (#6342)
planTaskForDay set dueDay and cleared dueWithTime but left remindAt
untouched. The reminder worker kept firing for the past remindAt value,
causing the reminder popup to reopen in a loop after "Reschedule for
tomorrow".
2026-02-03 16:55:25 +01:00
Johannes Millan
d83f0b69c0 fix(e2e): correct case-sensitive switch labels in app-features tests
The getByRole('switch', { exact: true }) selector is case-sensitive.
The test labels used Title Case but the actual accessible names from
en.json translations use sentence case, causing intermittent failures.
2026-02-03 16:50:24 +01:00
Johannes Millan
0df56878e1 fix(tasks): reset devError state in orphan ID detection test
The devError module has shared mutable state (isShowAlert flag) that
caused flaky test failures in America/Los_Angeles timezone. Add a
test-only reset function and call it before the affected test.
2026-02-03 15:54:52 +01:00
Johannes Millan
8e7f32d700 test(e2e): add waitForAngularStability to app-features navigation 2026-02-03 15:45:35 +01:00
Johannes Millan
47cc5d1514 refactor(sync): extract shared native HTTP retry utility with locale-proof error detection
- Extract executeNativeRequestWithRetry and isTransientNetworkError into
  shared native-http-retry.ts for reuse by Dropbox and SuperSync
- Add locale-proof error.code checks: iOS NSURLErrorDomain, Android
  SocketTimeoutException/UnknownHostException/ConnectException
- Keep English string matching as fallback for web/Electron
- Wrap Dropbox token refresh in retry logic
- Split timeouts: 30s for auth endpoints, 120s for data transfer
- Apply retry wrapper to SuperSync _fetchApiNative and _fetchApiCompressedNative
2026-02-03 15:45:27 +01:00
Johannes Millan
e69108b14e fix(tasks): filter orphan IDs in removeTasksFromTodayTag reducer (#6327)
The reducer unconditionally prepended payload taskIds into state.ids
without checking entity existence. During op-log replay or concurrent
effects, deleted task IDs could be re-injected as orphans, causing
TypeErrors on properties like dueWithTime and dueDay.
2026-02-03 15:33:28 +01:00
Johannes Millan
eb9ae7a06d test(sync): add E2E test for fresh-client sync duplication bug (b2b63da9)
Validates both duplication paths that were fixed: download path
(recentOps re-applied on second sync cycle) and piggyback path
(snapshot ops returned during upload).
2026-02-03 14:38:05 +01:00
Johannes Millan
39eaef79dd fix(sync): add retry logic for transient iOS network errors in Dropbox sync
iOS CapacitorHttp uses URLSession.dataTask which does not auto-retry POST
requests. Large sync payloads crossing the WKWebView bridge are vulnerable
to TCP connection drops (NSURLErrorNetworkConnectionLost / -1005).

- Add _executeNativeRequestWithRetry() with max 2 retries and linear backoff
- Add _isTransientNetworkError() classifier for iOS NSError descriptions
- Increase readTimeout from 60s to 120s for all native CapacitorHttp calls
- Add comprehensive unit tests for error classification and edge cases

Closes #6333
2026-02-03 14:38:05 +01:00
Johannes Millan
f78f6f4e39 refactor: replace PFLog with SyncLog/OpLog and remove obsolete migration scripts
PFLog was named after "Pfapi" which is no longer used. Replace with
SyncLog in sync provider files and OpLog in op-log infrastructure files.
Delete unused migration scripts.
2026-02-03 14:38:05 +01:00
Johannes Millan
f6c9714433 fix(sync): prevent task duplication during file-based sync snapshot hydration
When a fresh client first syncs with a file-based provider (WebDAV,
Dropbox, LocalFile), it receives both a snapshotState and recentOps.
The snapshot was hydrated correctly, but recentOps were not recorded,
causing duplication through two paths:

1. Download path: On the next sync cycle, recentOps bypassed the
   appliedOpIds filter (not in IndexedDB) and were re-applied.
2. Piggyback path: The adapter's isForceFromZero guard skipped marking
   ops as processed, so they were returned as piggybacked during upload.

Fix by writing recentOps to IndexedDB after snapshot hydration and
always marking downloaded ops as processed for piggyback tracking.
2026-02-03 14:38:05 +01:00
Johannes Millan
a5c6337ff5 fix(main-header): remove unnecessary right padding on macOS Electron
The WCO padding-right rule matched on macOS where window controls are
on the left side, causing header icons to be pushed ~140px inward.
Restrict the rule to non-Mac Electron using the isNoMac body class.

Closes #6337
2026-02-03 14:38:05 +01:00
Johannes Millan
2a491010af fix(main-header): restore inline simple counter buttons on desktop
Counter buttons were always behind a dropdown toggle after the habits
management page change. Restore inline rendering on desktop and restrict
the timer-icon dropdown to mobile viewports only.
2026-02-03 14:38:05 +01:00
Stone Widder
204ae7b6c6
Fix long break condition calculation (#6259)
* Fix long break condition calculation

Adjust calculation for long break condition to account for cycle update.

* Undo Previous Change to getBreakDuration

* Move fix To Focus-Mode.effects

Adjust break duration calculation to account for cycle increment.

* Fix formatting of getBreakDuration calculation

* fix Test(pomodoro-bug-6044): Change test cases to be correct

* fix(Focus-Mode-Session-done): Subtract 1 from cycle to get last cycle

* Fix Test(focus-mode-effect.spec): Verify decrement of cycle

* Fix(focus-mode.effect.ts): Make comments clearer

* Fix(Pormodoro-Bug-6044.spec): Update tests names

* fix(focus-mode-effects.ts): Fix Missed tests

* Add(fpcis-mode-session-done): add || 1 Guard

* Fix Linting and formatting

* fix(focus-mode.effects.spec.ts): update cycle number for manual break duration calculation
2026-02-03 13:55:56 +01:00
Andrii Hrushetskyi
b9fde5fb53
feat: add Czech, Slovak, and Ukrainian calendar locale support and correct Czech language code from 'cz' to 'cs'. (#6329) 2026-02-03 13:02:59 +01:00
Gitoffthelawn
29ed466122
Further improve English i18n (#6336)
In this update, I focused on improving UI consistency and adhering to UI standards.
2026-02-03 12:24:44 +01:00
dependabot[bot]
518d40f6c1
chore(deps): bump fastify in the npm_and_yarn group across 1 directory (#6334)
Bumps the npm_and_yarn group with 1 update in the / directory: [fastify](https://github.com/fastify/fastify).


Updates `fastify` from 5.6.2 to 5.7.3
- [Release notes](https://github.com/fastify/fastify/releases)
- [Commits](https://github.com/fastify/fastify/compare/v5.6.2...v5.7.3)

---
updated-dependencies:
- dependency-name: fastify
  dependency-version: 5.7.3
  dependency-type: direct:production
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-03 12:19:34 +01:00
Johannes Millan
b66b680e30
fix: address code review findings across sync, tasks, and UI (#6339)
- fix(tasks): preserve selectAllTasks memoization by only filtering when
  undefined entities exist, avoiding new array allocation on every call
- fix(sync): replace mutable ARGON2_PARAMS export with getter/setter to
  prevent test pollution across spec files
- fix(sync): convert tag-task-page from async pipe to toSignal pattern
  to fix OnPush change detection after bulk sync state updates
- fix(sync): remove E2E navigation workarounds that masked the rendering
  bug now fixed by the toSignal conversion
- fix(sync): add clarifying comments for archive-wins sibling conflict
  resolution and waitForSyncWindow switchMap concurrency semantics
- fix(ios): add hex preview of first 16 bytes to WebDAV UTF-8 decode
  error for easier debugging
- docs: add JSDoc to getDiffInWeeks noting negative diff behavior

https://claude.ai/code/session_01Y51QDFEdvrJ9VVgp9XfWLJ

Co-authored-by: Claude <noreply@anthropic.com>
2026-02-03 12:13:57 +01:00
Johannes Millan
c6701ba2d8 fix(test): add missing skipConflictDetection arg in forceDownloadRemoteState test 2026-02-02 21:41:10 +01:00
Johannes Millan
e44450c5c4 fix(test): add skipSpinnerCheck to USE_REMOTE waitForSyncToComplete calls
Sync may complete before the dialog closes, so the spinner is already
gone when waitForSyncToComplete runs. skipSpinnerCheck prevents timeout.
2026-02-02 21:31:25 +01:00
Johannes Millan
9ff4d5e7cb fix(sync): address code review findings for E2E tests and sync services
Remove unused _counterTitle parameter from counter helpers, replace
hardcoded waitForTimeout with visibility check, unify timeout strategy
to test.slow(), fix waitForSyncToComplete API call, add
skipConflictDetection for forceDownloadRemoteState, and clean up
package-lock.json.
2026-02-02 21:28:36 +01:00
Johannes Millan
741d7b61e7 fix(habit-tracker): remove unused MsToStringPipe import 2026-02-02 21:10:48 +01:00
Johannes Millan
0b14ba83ae fix(sync): address code review findings for archive-wins and entity frontier
- Use toEntityKey() utility instead of inline template strings
- Fix stale mock in remote-ops-processing.service.spec.ts to match
  new _buildEntityFrontier logic (appliedFrontier !== undefined)
- Fix transient entity resurrection: non-archive conflicts for
  locally-archived entities now resolve as local-wins (no localWinOp)
  instead of remote-wins, preventing addOne() from resurrecting entities
- Add unit test for multi-conflict pre-scan scenario
- Add TODO comments for Angular reactivity navigation workarounds
2026-02-02 21:06:19 +01:00
Johannes Millan
0dd49c1894 fix(sync): archive-wins pre-scan and entity frontier for new clients
Fix two sync bugs causing E2E test failures:

1. Archive-wins pre-scan: When an entity has multiple conflicts (e.g.,
   field updates + archive), the archive op was only checked per-conflict.
   Non-archive conflicts resolved via LWW, creating local-win update ops
   that resurrected archived entities. Now pre-scans ALL conflicts to
   build entity-level sets, so all conflicts for an archived entity
   resolve as archive-wins.

2. Entity frontier for new entities: When snapshotEntityKeys was undefined
   (old format), _buildEntityFrontier used the snapshot vector clock for
   ALL entities, inflating the frontier for genuinely new entities never
   seen locally. Remote ops for these entities were incorrectly discarded
   as superseded. Now only uses snapshot clock when appliedFrontier exists
   for the entity.

Also improves E2E tests with navigation-based component refresh and
Playwright auto-retry assertions (toHaveCount with timeout).
2026-02-02 20:32:32 +01:00
Johannes Millan
5e0453203c fix(tasks): filter undefined entities in selectAllTasks to prevent crashes 2026-02-02 18:23:57 +01:00
Johannes Millan
ef480810a9 perf(test): speed up slow encryption and large batch sync tests
Extract Argon2 params into mutable exported constant so tests can use
minimal KDF settings (8 KiB memory, 1 iteration) instead of production
values (64 MB, 3 iterations). Add batch operation creation helper and
configurable download limit to SimulatedClient, reducing test op counts
from 500-1000 to 50-100 while still exercising pagination.
2026-02-02 18:19:48 +01:00
Johannes Millan
b6db912665 fix(tasks): filter undefined subtasks in mapSubTasksToTask (#6325)
Prevent "Cannot read properties of undefined" crash when subtask
entities are transiently missing during sync import or recurring
task replay.
2026-02-02 17:15:13 +01:00
Johannes Millan
9810c320b1 fix(tasks): prevent recurring tasks from failing to repeat (#6192)
Use immutable `created` timestamp instead of mutable `dueDay` for
duplicate detection in task-repeat-cfg.service.ts. The old check
used dueDay which gets mutated by planTasksForToday when users
reschedule overdue tasks, causing false-positive duplicate matches.

Replace filter-and-drop with waitForSyncWindow operator in all three
TaskDueEffects so day-change emissions during hydration/sync are
deferred rather than permanently lost.

Add waitForSyncWindow reusable RxJS operator and expose isInSyncWindow
as a computed signal + observable on HydrationStateService.
2026-02-02 17:15:13 +01:00
Johannes Millan
d74ab299d9 fix(main-header): center sync icon glyph to eliminate spin wobble
Use inline-flex centering on the mat-icon to align the font glyph
to the geometric center of its bounding box, and promote the spinning
element to a GPU compositing layer via translateZ(0) to prevent
sub-pixel anti-aliasing shifts during rotation.

Closes #6318
2026-02-02 17:15:13 +01:00
Johannes Millan
e6930390d0 fix(inline-markdown): preserve unsaved content when adding checklist item
Save current textarea value before toggling checklist mode to prevent
content loss when mousedown.preventDefault() blocks the blur event.
2026-02-02 17:15:13 +01:00
Johannes Millan
68309b731d fix(focus-mode): stop time tracking when exiting break to planning
exitBreakToPlanning resets focus session state but had no effect to stop
tracking, leaving it running orphaned. Add effect to dispatch
unsetCurrentTask() when isSyncSessionWithTracking is enabled.
2026-02-02 17:15:13 +01:00
Johannes Millan
9002157a6b test(util): add coverage for extract-first-emoji edge cases
Add tests for plain #/digit false-positive guards, null/undefined/non-string
inputs, and isSingleEmoji with variation selector emoji (❤️).
2026-02-02 17:15:13 +01:00
Johannes Millan
3154dbbb8c fix(tasks): handle compound emojis in icon input using Intl.Segmenter
Replace manual Unicode code-point iteration with Intl.Segmenter for
correct handling of ZWJ sequences, flag emojis, and keycap emojis.
Fixes #6256.
2026-02-02 17:15:13 +01:00
Johannes Millan
875341f04a fix(tasks): correct biweekly recurring task week boundary calculation (#6298)
getDiffInWeeks used Math.round(ms / weekMs) which rounded Friday (day 4
of 7) into the next week. Switch to day-first calculation with
Math.floor(days / 7) to respect week boundaries while preserving DST
safety via Math.round on the day count.
2026-02-02 17:15:13 +01:00