Implement native entry creation and editing #49

Closed
opened 2026-08-09 20:00:31 +00:00 by hugo · 2 comments
Owner

Goal

Provide native create/edit/generate workflows over storage-owned structured documents.

Scope

  • Add iPhone forms to create an entry, edit dynamic fields and multiline notes, reorder/add/remove fields, and request generated or replacement passwords.
  • Keep passwords hidden by default with explicit reveal and generation choices supplied/validated by crates/storage.
  • Save only through storage commands; serialization, encryption, recipients, password policy, filesystem mutation, and commits remain in Rust.
  • Track transient dirty form state and confirm before Cancel, back navigation, tab replacement, lock, or another operation would discard changes.
  • On failed save or stale/conflicting storage state, retain the form and present an explicit recovery choice rather than overwriting.
  • Integrate native keyboard behavior, validation presentation, accessibility, and secure text-entry controls.

Acceptance criteria

  • Dynamic entries round-trip without dropping unknown or repeated fields.
  • Create, edit, generate, save, cancel, failed save, conflict, and lock-during-edit paths are covered.
  • Unsaved changes cannot be lost through ordinary navigation without confirmation.
  • Swift does not generate passwords, choose recipients, serialize entries, or mutate the repository.
## Goal Provide native create/edit/generate workflows over storage-owned structured documents. ## Scope - Add iPhone forms to create an entry, edit dynamic fields and multiline notes, reorder/add/remove fields, and request generated or replacement passwords. - Keep passwords hidden by default with explicit reveal and generation choices supplied/validated by `crates/storage`. - Save only through storage commands; serialization, encryption, recipients, password policy, filesystem mutation, and commits remain in Rust. - Track transient dirty form state and confirm before Cancel, back navigation, tab replacement, lock, or another operation would discard changes. - On failed save or stale/conflicting storage state, retain the form and present an explicit recovery choice rather than overwriting. - Integrate native keyboard behavior, validation presentation, accessibility, and secure text-entry controls. ## Acceptance criteria - Dynamic entries round-trip without dropping unknown or repeated fields. - Create, edit, generate, save, cancel, failed save, conflict, and lock-during-edit paths are covered. - Unsaved changes cannot be lost through ordinary navigation without confirmation. - Swift does not generate passwords, choose recipients, serialize entries, or mutate the repository.
hugo added this to the 04 - iPhone and Apple Watch apps milestone 2026-08-09 20:00:31 +00:00
hugo added the enhancement label 2026-08-09 20:00:31 +00:00
hugo added the untested label 2026-08-11 18:28:06 +00:00
Author
Owner

Implemented in ae64ce4 and pushed to main.

The iPhone app now creates and edits complete storage-owned EntryDocument drafts. Rust owns field identity/order, dynamic and multiline serialization, password generation and validation, recipient resolution, encryption, atomic stale-write detection, automatic Git commits, and recoverable save state. The native UIKit form uses secure text entry with explicit reveal, native delete/reorder controls, add-field and storage-backed generation actions, dirty-form discard confirmation, and explicit conflict recovery without overwriting the draft. Unknown non-UTF-8 values and repeated fields are preserved losslessly.

Verified:

  • cargo fmt --all -- --check
  • RUSTFLAGS="-D warnings" cargo check --workspace --all-targets
  • cargo clippy --workspace --all-targets -- -D warnings
  • cargo test --workspace
  • xcodegen generate
  • iPhone 17 Pro simulator Debug build
  • Xcode Analyze for the simulator target
  • simulator visual/accessibility inspection of the aligned create control and native creation prompt
  • signed, optimized Release-iphoneos build using the existing app icon and team provisioning

The Rust regression test covers dynamic/repeated fields, long multiline comments, add/remove/reorder, generated replacement passwords, cancellation without mutation, stale-write rejection, failure retention, and non-UTF-8 preservation using local compatibility fixtures only (no live server).

Deferred under the untested label because no unlock/user interaction is available:

  • authenticated simulator create/edit/generate/save using populated long, multiline, password, and OTP fields
  • secure reveal, keyboards, validation alerts, dirty Cancel/pull-down, and lock/expiry-during-edit interaction
  • visible save-failure and stale-conflict recovery choices in the authenticated form
  • VoiceOver and large Dynamic Type inspection of a populated editor
  • physical iPhone Release install/launch and interaction; the signed Release build succeeded, but CoreDevice could not currently locate the paired phone

UIKit choices follow Apple guidance for text fields/text views, alerts/action sheets, adaptive dismissal, and native table editing/reordering:

Implemented in `ae64ce4` and pushed to `main`. The iPhone app now creates and edits complete storage-owned `EntryDocument` drafts. Rust owns field identity/order, dynamic and multiline serialization, password generation and validation, recipient resolution, encryption, atomic stale-write detection, automatic Git commits, and recoverable save state. The native UIKit form uses secure text entry with explicit reveal, native delete/reorder controls, add-field and storage-backed generation actions, dirty-form discard confirmation, and explicit conflict recovery without overwriting the draft. Unknown non-UTF-8 values and repeated fields are preserved losslessly. Verified: - `cargo fmt --all -- --check` - `RUSTFLAGS="-D warnings" cargo check --workspace --all-targets` - `cargo clippy --workspace --all-targets -- -D warnings` - `cargo test --workspace` - `xcodegen generate` - iPhone 17 Pro simulator Debug build - Xcode Analyze for the simulator target - simulator visual/accessibility inspection of the aligned create control and native creation prompt - signed, optimized `Release-iphoneos` build using the existing app icon and team provisioning The Rust regression test covers dynamic/repeated fields, long multiline comments, add/remove/reorder, generated replacement passwords, cancellation without mutation, stale-write rejection, failure retention, and non-UTF-8 preservation using local compatibility fixtures only (no live server). Deferred under the `untested` label because no unlock/user interaction is available: - authenticated simulator create/edit/generate/save using populated long, multiline, password, and OTP fields - secure reveal, keyboards, validation alerts, dirty Cancel/pull-down, and lock/expiry-during-edit interaction - visible save-failure and stale-conflict recovery choices in the authenticated form - VoiceOver and large Dynamic Type inspection of a populated editor - physical iPhone Release install/launch and interaction; the signed Release build succeeded, but CoreDevice could not currently locate the paired phone UIKit choices follow Apple guidance for text fields/text views, alerts/action sheets, adaptive dismissal, and native table editing/reordering: - https://developer.apple.com/design/human-interface-guidelines/text-fields - https://developer.apple.com/design/human-interface-guidelines/alerts - https://developer.apple.com/documentation/uikit/uiadaptivepresentationcontrollerdelegate/presentationcontrollershoulddismiss%28_%3A%29 - https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/TableView_iPhone/ManageReorderRow/ManageReorderRow.html
hugo closed this issue 2026-08-11 18:28:47 +00:00
Author
Owner

Non-destructive validation completed on 2026-08-12. In the iPhone simulator, the create editor opened with its dynamic entry fields; a disposable dirty draft was canceled and no entry was saved. Existing edit, ordering, generation, cancellation, and conflict-retention behavior also passed in the current isolated Rust workspace tests. No password-store mutation was retained. Removing the untested label.

Non-destructive validation completed on 2026-08-12. In the iPhone simulator, the create editor opened with its dynamic entry fields; a disposable dirty draft was canceled and no entry was saved. Existing edit, ordering, generation, cancellation, and conflict-retention behavior also passed in the current isolated Rust workspace tests. No password-store mutation was retained. Removing the untested label.
hugo removed the untested label 2026-08-12 17:32:38 +00:00
Sign in to join this conversation.