The updateAllSimpleCounters reducer was using adapter.upsertMany() which
doesn't preserve the order of items passed to it. Now explicitly sets
the ids array after upserting to maintain the desired order. Also marks
form as dirty when moving items for consistency with removeItem().
Fixes#6232
WebCrypto (crypto.subtle) is unavailable on Android/iOS Capacitor apps
due to insecure contexts. This adds @noble/ciphers as a pure JavaScript
fallback for AES-GCM encryption when WebCrypto is not available.
- Add @noble/ciphers dependency (Cure53 audited, ~4-6KB tree-shaken)
- Update DerivedKeyInfo to support both CryptoKey and raw bytes
- Add fallback encrypt/decrypt functions using gcm from @noble/ciphers
- Legacy PBKDF2 data still requires WebCrypto with clear error message
Move plugin build from pree2e hook to Playwright global setup to ensure
plugins are built before dev server starts. Previously, plugins:build and
ng serve ran concurrently, causing tests to start before manifests were
available and resulting in 404 errors during the retry window.
Replace two-phase execution (non-supersync then supersync with
--workers=3) with single-phase execution using --workers=6.
Benefits:
- Simpler script (one line vs. complex phase logic)
- No server overload (0 ECONNREFUSED errors)
- Better parallelism (2x faster than --workers=3)
- 98% test pass rate (355/362 passed)
Testing showed:
- Default 12 workers: 95 ECONNREFUSED errors (nginx overload)
- --workers=6: 0 connection errors, all tests passed
- Total duration: 18.8 minutes
The two-phase approach was designed to prevent ng serve from
crashing. With Docker nginx, --workers=6 provides optimal balance
between parallelism and server capacity.
Note: e2e:supersync script keeps --workers=3 (uses ng serve).
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.
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.
iOS renders transparent pixels as white, causing a white frame around the
app icon. This fix generates a 1024x1024 RGB PNG (no alpha channel) from
the existing build/icons/sq2160x2160.png source.
Changes:
- Add tools/generate-ios-icon.js script using Sharp to resize and remove alpha
- Add npm script 'generate:ios-icon' for reproducible icon generation
- Update AppIcon-512@2x.png to RGB format (was RGBA)
- Install Sharp as dev dependency for image processing
Icon is now fully opaque with correct brand blue color and white checkmark.
- Create build-ios.yml workflow triggered on releases
- Configure signing keychain with iOS distribution certificate
- Install provisioning profile for App Store distribution
- Sync version from package.json using agvtool
- Build, archive, and export IPA with manual code signing
- Validate and upload to App Store Connect via xcrun altool
- Add sync:ios and dist:ios:prod npm scripts
Resolves merge conflicts in:
- src/app/core/startup/startup.service.ts: Keep both _store and _platformService injections
- src/app/features/android/store/android.effects.ts: Refactor to use platform-agnostic CapacitorReminderService
The feat/ios branch adds iOS support via Capacitor, introducing platform-agnostic
services for notifications, reminders, and platform detection that work across
web, Android, and iOS.
Add iOS-specific UX improvements:
Safe Areas:
- Add CSS variables for safe area insets (notch, home indicator)
- Add body classes: isNativeMobile, isIOS, isKeyboardVisible
- Apply safe area padding on native mobile platforms
Keyboard Handling:
- Install @capacitor/keyboard plugin
- Track keyboard visibility via keyboardWillShow/Hide events
- Set --keyboard-height CSS variable for layout adjustments
- Remove bottom safe area padding when keyboard is visible
Status Bar:
- Install @capacitor/status-bar plugin
- Sync status bar style with app dark/light theme
- Configure overlaysWebView: false in capacitor.config.ts
These changes ensure proper display on iPhone devices with
notch/Dynamic Island and home indicator.
The shared-schema package was not being built before lint and test
steps in CI, causing "Cannot find module '@sp/shared-schema'" errors.
Changes:
- Add shared-schema:build script to package.json
- Update prepare script to build shared-schema first
- Add shared-schema to build-packages.js for completeness
- 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)