The sync import conflict dialog was showing multiple times when it should
only show once, or not at all for already-accepted remote imports.
Root cause: The dialog trigger condition was too broad - it showed whenever
ALL downloaded ops were filtered by a SYNC_IMPORT, without distinguishing
between local unsynced imports (user needs to choose) and remote/synced
imports (old ops being silently cleaned up is expected behavior).
Changes:
- Add getLatestFullStateOpEntry() to get import with metadata (source, syncedAt)
- Add clearFullStateOps() for USE_REMOTE conflict resolution
- Return isLocalUnsyncedImport flag from SyncImportFilterService
- Pass through flag via RemoteOpsProcessingService
- Only show dialog when isLocalUnsyncedImport=true (local import not yet synced)
- Silently filter old ops when import was already accepted from remote
SuperSync page object improvements:
- Add networkidle wait before interacting with sync dialog
- Add explicit mat-dialog-container wait before form interaction
- Add toBeAttached() assertions for element stability
- Use toPass() with progressive backoff for dropdown interactions
- Dismiss existing dropdown overlays before retrying
- Add blur() calls in password change dialog for Angular validation
- Add try-catch for fresh client dialog race condition
Task detail tests:
- Add blur() after time input fill to ensure Angular registers
the change before clicking Save
These changes fix intermittent failures when running E2E tests
with multiple workers in parallel.
- Tags test: Use right-click context menu approach instead of 'g' shortcut
to avoid typing into editable task title
- Tags test: Add robust dismissAllOverlays helper with multiple Escape
presses and backdrop click fallback
- Late-join test: Improve conflict dialog handling with retry loop and
wait for dialog to close
- Late-join test: Add extra sync cycle after conflict resolution for
more reliable data propagation
- All files: Fix incorrect port in warning messages (1900 -> 1901)
All 48 supersync e2e tests pass consistently.
- Add test for task deletion syncing between clients
- Document that scheduled task tests use dueDay, not actual repeat configs
- Reference integration tests for full repeat config sync testing
When filtering operations after a SYNC_IMPORT, the previous string
comparison `op.id > latestImport.id` could incorrectly filter out
operations created in the same millisecond due to random bits in UUIDv7.
This caused repeatable task instances to not sync when created
immediately after an import operation.
Fix: Extract the 48-bit timestamp from UUIDv7 and use >= comparison
to ensure same-millisecond operations are kept.