Mark Phase 0.1, 0.2, and 0.2.5 as complete:
- Legacy sync stale data: Implemented PfapiStoreDelegateService
- Feature flag: useOperationLogSync already existed
- SaveToDbEffects gating: Now filtered by feature flag
Update architecture to reflect B-Lite delegate pattern:
- Exclusive persistence based on feature flag
- PfapiStoreDelegateService reads from NgRx store
- Backward compatibility flush when disabling op-log mode
When useOperationLogSync is enabled:
- SaveToDbEffects is completely disabled (no writes to 'pf' database)
- Legacy sync (WebDAV/Dropbox) reads from NgRx store via delegate
- Non-NgRx models (reminders, archives, plugins) are loaded from 'pf' DB on-demand
Key changes:
- Add PfapiStoreDelegateService to read sync data from NgRx store
- Wire up delegate in PfapiService based on useOperationLogSync config
- Flush NgRx state to 'pf' database when disabling op-log mode
This approach simplifies PFAPI/OpLog integration by making SUP_OPS
the write path while keeping PFAPI functional for legacy sync.
- Add useOperationLogSync feature flag to SyncConfig (default: false)
- Restore and gate SaveToDbEffects by feature flag
- Add provider gating in sync.service.ts (op-log disabled for all providers)
- Add delegate pattern in Pfapi.getAllSyncModelData() for NgRx reads
- Add dependency retry queue in OperationApplierService (max 3 retries)
- Update tests to provide required mocks
When useOperationLogSync is false (default), legacy sync behavior is
preserved. This ensures backward compatibility while laying groundwork
for future operation log sync support.
- Add WebdavServerCapabilities interface to detect server features
- Implement detectServerCapabilities() method in WebdavApi
- Support detection of ETags, Last-Modified, If headers, and locking
- Add comprehensive test coverage for capability detection
- Cache detected capabilities to avoid repeated requests
- Support configuration-based capability overrides
- Add documentation for WebDAV conditional headers analysis
- Maintain 100% backward compatibility with existing ETag behavior
This is Phase 2 of WebDAV non-ETag server support implementation.
All existing 180 tests continue to pass.
- dialog-edit-task-repeat-cfg: converts timestamp to local date string correctly
- date.service: utility wrapper working as intended
- metric.util: converts timestamps for metrics display correctly
- archive.service: uses current time for today string correctly
When GitLab and OpenProject return due dates as YYYY-MM-DD strings,
we should use them directly instead of converting through getWorklogStr()
which causes timezone issues. In timezones with negative UTC offset,
dates would appear as the previous day.
- GitLab: use issue.due_date directly
- OpenProject: use issue.startDate directly
* master: (93 commits)
test: add comprehensive tests for task-archive.service _reduceForArchive
fix: use _reduceForArchive consistently in task-archive.service
test: fix or remove failing
feat: re-implement task-archive restoring
feat: add helper function for reducing for archive
feat: persist overdue & later today toggle state
feat: move overdue before later today
feat: improve styling for work-view sections
feat: move overdue below
fix(sync): prevent overwrite form sync when importing safety backup
fix(sync): wait for real initial sync instead of just loaded data and current sync to be done
feat(log): adjust logs
feat(sync): improve clientId
feat(log): improve readability
build: fix e2e tests
feat: adjust log path
test: fix
fix: weird no window error
fix(logs): improve log download for Android and fix test failures
fix(log): make export work better for android
...
# Conflicts:
# src/app/plugins/plugin-api.ts
# src/app/plugins/plugin-bridge.service.ts
# src/app/plugins/plugin-hooks.ts
# src/app/plugins/util/plugin-iframe.util.ts