Give card windows their own undo stacks and coarsen the close
Phase B of the two-level undo card: every card-window gesture — comment
post/delete/edit, body Edit sessions, style and details changes —
registers fine-grained on the window's own stack (window.undoManager
answers with it; board ⌘Z never sees mid-session card steps; an empty
window stack beeps, never falls through). Window close folds the stack
into one coarse values-based board step ("Edit card 'X'") — per-target
per-field later-wins merge, so foreign mid-session writes stay out by
construction, a no-net-change session registers nothing, and any stale
component skips the whole step. The comments/.trash purge defers with
the coarse step via a step-retirement seam on the providers: it runs
when the step leaves the board stack or the board session ends; the git
provider retires dropped steps on register, which keeps Pro's
purge-at-close-flush structural with no tier check. Interim on git
boards: gestures still auto-commit per debounce until phase C's
close-flush commit.
2432 tests in 418 suites green.
Claude-Session: https://claude.ai/code/session_01CqjXB7ASoWtbyoGod68k97
This commit is contained in:
@@ -36,6 +36,31 @@ public enum ExpectedField: Sendable, Equatable {
|
||||
/// The body span, **byte for byte** — the Edit session's step, and the one inverse in the app
|
||||
/// whose fidelity is not field-level (13: "body steps compare bytes").
|
||||
case body(String)
|
||||
|
||||
/// Which field this is, ignoring the value it carries — the key a fold merges on
|
||||
/// (`CardWindowUndo`): two writes to `background` inside one card-window session are one field
|
||||
/// with a first and a last value, while a write to `background` and one to `icon` are two.
|
||||
var kind: Kind {
|
||||
switch self {
|
||||
case .title: .title
|
||||
case .order: .order
|
||||
case .width: .width
|
||||
case .background: .background
|
||||
case .icon: .icon
|
||||
case .body: .body
|
||||
}
|
||||
}
|
||||
|
||||
/// The field names, as a comparable value — deliberately not the `String` keys, which are
|
||||
/// `FrontmatterKeys`' business and would tie a fold to the file format.
|
||||
enum Kind: Hashable, Sendable {
|
||||
case title
|
||||
case order
|
||||
case width
|
||||
case background
|
||||
case icon
|
||||
case body
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - HistoryExpectation
|
||||
|
||||
Reference in New Issue
Block a user