- Document intent of editReminder cancel path: when user cancels the
inner schedule dialog, the outer dialog closes and the destroy handler
clears deadlineRemindAt (same as ESC). Prevents the worker from
re-firing the past-due reminder.
- Replace page.waitForTimeout with expect().not.toBeVisible({timeout}) in
the deadline ESC e2e test so it fails fast if the dialog reappears and
complies with the "no waitForTimeout" rule in e2e/CLAUDE.md.
- Capture realTodayStr per test in is-deadline-approaching spec to close
the (narrow) midnight-rollover flake window.
Without this, ESC/backdrop dismissal left deadlineRemindAt in the store,
so the reminder worker re-fired on its next 10s tick and the dialog
reopened indefinitely (reported in #4328 preview feedback).
ngOnDestroy now dispatches clearDeadlineReminder for any deadline
reminder shown in the session that was not explicitly handled. Bulk
handlers (markSingleAsDone, markAllTasksAsDone, addAllToToday) now
populate _dismissedReminderIds so destroy is a no-op for them.
Adds 7 unit tests and a Playwright e2e regression test that fails on
the unpatched component and passes with the fix.
Add deadline support for tasks with date-only and time-specific deadlines.
Core:
- Add deadlineDay, deadlineWithTime, deadlineRemindAt fields to task model
- Add NgRx actions (setDeadline, removeDeadline, clearDeadlineReminder)
- Add meta-reducer with mutual exclusivity and input validation
- Register deadline actions in ActionType enum and op-log codes
UI:
- Create deadline dialog with calendar, time input, and reminder options
- Add deadline badge to task list row with overdue warning color
- Add deadline item to task detail panel with flag icon
- Add deadline options to task context menu
- Show deadlines in scheduled list page
Reminders:
- Add deadline reminder effects and selectors
- Show reminder dialog with grouped deadline/schedule sections
- Handle deadline reminder clearing on dismiss, done, add-to-today
- Cancel Android native deadline notifications on delete/archive
Planner:
- Show deadline tasks in planner day view and overdue section
- Create dedicated planner-deadline-task component
- Optimize deadline grouping with O(N) single-pass selector
Other:
- Add deadline-today banner effect for unplanned deadline tasks
- Add translation keys for all deadline UI strings
- Add E2E tests for deadline reminder flows
- Add unit tests for deadline reducer and overdue utility
- Extract shared isDeadlineOverdue utility function
- Guard app-state selectors against undefined during teardown
* refactor(schedule): remove initial schedule config dialog
Users can configure schedule settings directly in the global settings
page instead of being prompted with a dialog on first visit.
https://claude.ai/code/session_015pbDmfqYTYCyymZiYHhtbr
* test(e2e): remove schedule config dialog dismissal from tests
The initial schedule config dialog was removed, so e2e tests no longer
need to wait for and dismiss it before interacting with the schedule view.
https://claude.ai/code/session_015pbDmfqYTYCyymZiYHhtbr
---------
Co-authored-by: Claude <noreply@anthropic.com>
- Wait for mat-dialog-container to be visible before clicking
- Scope button selectors within the dialog container
- Wait for dialog to be detached after dismissing
- Remove flaky waitForTimeout in favor of proper state waits
Code review improvements addressing critical and high priority issues:
Archive Handler:
- Rollback BOTH archiveYoung and archiveOld on flush failure
- Prevents data loss when partial write occurs
Cache Invalidation:
- Add _unsyncedCache invalidation in deleteOpsWhere
- Prevents stale data when deleted ops include unsynced operations
Simple Counter:
- Extract _getCounterValue helper to reduce code duplication
- Use selectSimpleCounterById (O(1)) instead of selectAllSimpleCounters+find (O(n))
- Update tests to properly mock both selectors
Operation Log Sync:
- Add infinite loop prevention when force download returns no clocks
- Add GREATER_THAN corruption detection (treats as CONCURRENT to be safe)
ESLint Hydration Guard Rule:
- Fix combineLatest detection at root level vs nested in operator callbacks
- Add comprehensive test suite (17 test cases)
E2E Tests:
- Fix flaky reminders-schedule-page tests (tasks disappear after scheduling)
- Increase timeout to 90 seconds for multiple operations
- Add page stabilization waits after critical operations
- Implement retry logic for hover interactions (3 retries)
- Add scrollIntoViewIfNeeded before hovering to ensure visibility
- Use force:true for hover to handle overlapping elements
- Clear input field before filling time values
- Add explicit waits for dialog state transitions
- Use .first() consistently to avoid multiple element issues
- Implement toPass() with retry for dynamic content verification
- Add small delays between operations to prevent race conditions
The test was flaky due to:
1. Hover interactions not always revealing buttons reliably
2. Race conditions between task creation and scheduling
3. Dialog state transitions happening too quickly
4. Multiple similar elements causing selector conflicts
The reminders test was failing with 'strict mode violation' because after
scheduling a task, there can be multiple schedule buttons in the DOM.
Fixed by using .first() to select only the first matching element when
checking for schedule button visibility after scheduling tasks.
Refactored tests to remove arbitrary timeouts and use proper wait conditions:
plugin-iframe.spec.ts:
- Removed all waitForTimeout() calls and waitForLoadState('networkidle')
- Replaced with specific waitForSelector() and waitFor() conditions
- Used better selectors with :has() and attribute selectors
- Simplified toggle state checking with count() instead of evaluate()
reminders-schedule-page.spec.ts:
- Removed all waitForTimeout() calls
- Replaced with waitFor() on specific elements
- Better selector constants for dialog elements
- Removed unnecessary waitForLoadState() calls
These changes make tests deterministic and faster by waiting for specific
conditions rather than arbitrary time periods.
- Re-enable previously skipped tests
- Add robust waits and timeouts for CI stability
- Improve task selection using filter with hasText
- Add helper function to reduce code duplication
- Increase schedule times to 1-2 minutes for better reliability
- Fix task order verification to handle dynamic ordering
- Remove unused constants and fix linting issues
Tests now pass consistently both locally and should work in CI
- Fix artifact upload path from e2e-test-results to .tmp/e2e-test-results
- Re-enable serial execution for plugin-iframe tests to avoid race conditions
- Skip flaky reminders-schedule-page tests in CI temporarily
- Update both build.yml and lint-and-test-pr.yml workflows
The CI was failing because test results were being written to .tmp/e2e-test-results
but the artifact upload was looking in e2e-test-results (without .tmp prefix)
- Remove serial test execution from plugin-iframe tests to prevent blocking
- Add explicit timeouts to prevent indefinite hanging
- Make reminders tests independent (not relying on previous test state)
- Improve plugin enablement logic to handle already-enabled state
- Enable previously skipped tests that now work properly
- Fix selectors and improve error handling
All planner-navigation tests now pass consistently
- Remove all console.log statements from E2E test files
- Replace console.error with throw new Error for proper error handling
- Remove console.warn statements
- Fix unused variable linting errors in plugin tests