- Fix snackbar selector in supersync edge cases test
- Add polling for plugin navigation stability
- Show error snackbar and status icon on decryption failure
- All 5 failing tests now passing consistently
Resolves issue #6095 where Task View Customizer settings (sort, group, filter)
were being reset on app restart or day change.
Changes:
- Add localStorage keys for sort/group/filter settings
- Initialize signals from localStorage with default fallbacks
- Add effects to auto-persist signal changes to localStorage
- Add 7 comprehensive unit tests for persistence behavior
Settings now persist across app restarts, work context changes, and day boundaries.
Invalid localStorage data gracefully falls back to defaults.
Add allowed_non_write_users parameter to bypass actor permission check for PRs from external contributors. This enables automated code reviews for all PRs, including those from forks, while maintaining security through pull_request_target context.
Optimize WebDAV E2E test startup by caching health checks at the
worker level instead of checking in each test file's beforeAll hook.
Changes:
- Create webdav.fixture.ts with worker-level health check caching
- Update 12 WebDAV test files to use new fixture
- Remove redundant beforeAll health check blocks
Impact:
- Reduces health check overhead from ~8s to ~2s when WebDAV unavailable
- Saves ~6 seconds on PR/build CI runs (combined with existing SuperSync optimization)
- Tests automatically skip when WebDAV server is not reachable
Modify e2e:docker:all to run all 360+ E2E tests including @supersync tests.
- Start all required services (app, webdav, db, supersync)
- Add wait-for-supersync.sh for SuperSync health check
- Execute tests in two phases:
- Phase 1: Non-supersync tests (default workers)
- Phase 2: SuperSync tests (3 workers to avoid server overload)
- Both phases run independently; exit code reflects first failure
- Previously skipped 131 @supersync tests now included
Resolves complete E2E test coverage for all sync providers.
- Add top-level headings to all wiki files (MD041)
- Fix heading spacing and blank line issues (MD022, MD012)
- Convert HTML badges to markdown format (MD033)
- Add alt text to images (MD045)
- Fix list indentation and numbering (MD005, MD029, MD032)
- Remove trailing punctuation from headings (MD026)
- Convert emphasis to proper headings (MD036)
- Fix heading level increments (MD001)
- Add trailing newlines to all files (MD047)
This ensures the wiki-sync.yml GitHub Action will pass linting.
All changes maintain the same visual appearance and functionality.
Fixes the lint failures reported in GitHub Action run #21212863659
The plugin-feature-check test was failing intermittently because window.ng
might not be available immediately after Angular bootstrap. Added polling
logic (5s timeout, 100ms intervals) to wait for window.ng to become available.
Use Capacitor's native WebView resize mode on iOS instead of CSS-based
workarounds. When keyboard appears, the WebView itself shrinks so 100vh
automatically fits above the keyboard.
- Configure iOS to use `resize: 'native'` (Android keeps `resize: 'body'`)
- Add scrollIntoViewIfNeeded() to scroll focused inputs into view
- Add proper cleanup for keyboard event listeners
- Improve flexbox shrinking in fullscreen markdown dialog
On iOS, dismissing the native share sheet by tapping the background
would cause it to reopen immediately. Two issues were fixed:
1. The Capacitor Share plugin on iOS throws {errorMessage: "Share canceled"}
but the code only checked for error.name === 'AbortError'. This caused
the cancellation to not be detected, falling through to try the Web
Share API as a fallback, opening a second share dialog.
2. Moved the iOS share guard from component level to ShareService. The
component-level guard didn't work because WorkContextMenuComponent is
inside ng-template matMenuContent, so it gets destroyed when the menu
closes, losing the guard state.
- Replace deprecated `selector:` properties with proper Electron `role:` in macOS menu
- Add standard macOS menu items (hide, hideOthers, unhide)
- Ensure before-close handlers always call setDone() to prevent app hanging
- Change sync error dialog from confirm() to alert() since result was ignored
Implement lazy loading for material-icons.const.ts (69.5KB, 3800+ icons) to reduce initial bundle size by ~68KB.
Changes:
- Create MaterialIconsLoaderService with promise caching to prevent concurrent loads
- Update DialogCreateTagComponent to use lazy loader service
- Update IconInputComponent to use lazy loader service
- Add comprehensive unit tests for MaterialIconsLoaderService
- Convert icon input methods to async for lazy loading support
Expected impact: Main bundle reduced by ~69KB, icons loaded on-demand when user focuses icon input fields.
- Replace hardcoded 7-day navigation with responsive day counts
- Desktop (≥1200px): 7 days (full week)
- Tablet (768-1199px): 5 days
- Mobile (480-767px): 3 days
- Small mobile (<480px): 2 days
- Navigation now moves by the number of days currently shown
- Remove horizontal scroll (no longer needed with responsive day count)
This fixes the mobile navigation bug where users saw 3 days but
navigation skipped by 7 days, causing 4 days to be hidden between
each navigation action.
- Move horizontal scroll control to parent .scroll-wrapper element
- Both vertical and horizontal scrollbars now on same container
- Pass isHorizontalScrollMode as input to schedule-week component
- Remove duplicate scroll wrapper from schedule-week
- Maintain responsive column widths based on scroll mode
- Fixes scrollbar positioning and coordination issues
This ensures both scrollbars are managed by the same element, providing
better UX and preventing scrollbar positioning conflicts.
- Wrap content in .horizontal-scroll-wrapper to control scroll positioning
- Move overflow from :host to wrapper to keep scrollbar at viewport level
- Use app's standard scrollbar styling (4px width, themed colors)
- Scrollbar now stays visible regardless of vertical scroll position
- Increase height to 8px for better horizontal scroll visibility
- Change overflow-x from auto to scroll to always show scrollbar
- Fix overflow-y: visible issue that prevented proper scrollbar display
- Increase scrollbar height to 14px for better visibility
- Use scrollbar-width: thin for Firefox (always visible)
- Improve scrollbar styling with better contrast
- Week view now always shows all 7 days with navigation skipping full weeks
- Add horizontal scroll when viewport < 1900px to show hidden days
- Implement responsive column widths (180px desktop, 150px tablet, 120px mobile)
- Columns scale up with minmax() when extra space available
- Add visible themed scrollbar for better UX
- Simplify navigation logic: always skip 7 days forward/backward
- Simplify day generation: sequential days from reference date
- Update tests to match new 7-day navigation behavior
Changes the mobile navigation drawer to slide in from the right side
instead of the left, improving spatial consistency with the nav button
(positioned far right in bottom nav) and enhancing right-handed UX.
Implementation:
- Add position-right class to drawer when in mobile mode
- Implement dual animation triggers (mobileNav for desktop/left,
mobileNavRight for mobile/right)
- Fix box-shadow direction for right-positioned drawer
- Swap border-right/left based on position
- Desktop behavior unchanged (drawer remains on left)
The test was incomplete - it collected hasPluginService data but never asserted it.
The string-based service lookup via injector.get() didn't work because Angular's DI
expects Type/InjectionToken, not strings. Fixed by checking if Angular's root component
is accessible, which guarantees all root-level services (including PluginService) exist.
Adds a new e2e:docker:all script that runs the complete E2E test suite
(including WebDAV tests) against the Docker production build.
This provides a clearer command name than e2e:docker:webdav for running
the full test suite, making it more discoverable for developers.
Pin all GitHub Actions to immutable commit SHAs to prevent supply chain attacks.
This protects against tag-poisoning attacks like the March 2025 tj-actions compromise
that affected 23,000+ repositories.
Changes:
- Pin 55 action references across 19 workflow files to commit SHAs
- Add version comments (e.g., "# v6") for readability
- Manually resolved: gradle/actions, github/codeql-action, actions/setup-node
All actions now use immutable references following GitHub security best practices:
https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions
Future updates should be managed via Dependabot to automate SHA updates.
Complete E2E Docker migration (Steps 1-3):
1. Add SPA routing support in nginx (try_files directive)
2. Make APP_PORT configurable via environment variable
3. Migrate docker-compose.e2e.yaml from dev server to production build
Changes:
- docker-compose.e2e.yaml: Use production Dockerfile instead of dev server
- Remove volume mounts (self-contained production build)
- Add UNSPLASH build args
- Add WEBDAV_BACKEND environment variable
- Reduce healthcheck start_period from 120s to 30s (nginx is faster)
- nginx/default.conf.template: Add try_files for SPA routing, use APP_PORT
- docker-entrypoint.sh: Export APP_PORT with default value
Benefits:
- Production build provides more realistic test environment
- Faster startup (30s vs 120s)
- No dependency on local node_modules
- Matches production deployment more closely
The deleteTaskRepeatCfg action does not have a taskIdsToUnlink property.
Removed this property from test expectations to match the actual action
definition.
This was causing TypeScript compilation errors in the test file.