summaryrefslogtreecommitdiff
path: root/app/models/node.rb
diff options
context:
space:
mode:
authorerdgeist <erdgeist@erdgeist.org>2026-07-10 02:03:19 +0200
committererdgeist <erdgeist@erdgeist.org>2026-07-10 02:03:19 +0200
commit205e6216fc7850fe717122c189e5003d1f9e8afe (patch)
tree8627354f3577f0a974949e759b0e93662840ade7 /app/models/node.rb
parent81769557804ce59ce3e4603e8f47e731b61b180d (diff)
Add head/draft/autosave layer comparison at three UI entry points
Node#resolve_page_reference and #available_layer_pairs let Page#diff_against compare named layers (head/draft/autosave), not just numbered revisions -- autosave was never part of Node#pages, so this was the missing piece. Wired into nodes#show's Status section, nodes#edit right after an autosave gets resurrected ("What changed?"), and the admin wizard's current-drafts table, which now also lists autosave-only nodes it previously never showed. revisions#diff hides the numbered-revision picker when comparing named layers (it can't represent them), shows a plain label instead, and offers buttons to switch between whichever other pairs make sense for the node's current state. Destroying the topmost layer is available directly from the diff view, reusing the existing revert! path. "Discard changes" is renamed "Discard Autosave" everywhere it appears, to match "Destroy Draft".
Diffstat (limited to 'app/models/node.rb')
-rw-r--r--app/models/node.rb21
1 files changed, 21 insertions, 0 deletions
diff --git a/app/models/node.rb b/app/models/node.rb
index 7675ab6..82d9954 100644
--- a/app/models/node.rb
+++ b/app/models/node.rb
@@ -123,6 +123,27 @@ class Node < ApplicationRecord
123 self.draft.reload 123 self.draft.reload
124 end 124 end
125 125
126 def resolve_page_reference ref
127 case ref.to_s
128 when "head" then head
129 when "draft" then draft
130 when "autosave" then autosave
131 else pages.find_by_revision(ref)
132 end
133 end
134
135 # Which layer-pairs are meaningful to compare right now, given this
136 # node's actual state. Head vs autosave only shows up when no draft
137 # sits between them -- with a draft present, autosave is compared
138 # against the draft, never past it straight to head.
139 def available_layer_pairs
140 pairs = []
141 pairs << [:head, :draft] if head && draft
142 pairs << [:draft, :autosave] if draft && autosave
143 pairs << [:head, :autosave] if head && autosave && !draft
144 pairs
145 end
146
126 def find_or_create_draft current_user 147 def find_or_create_draft current_user
127 self.wipe_draft! 148 self.wipe_draft!
128 if draft && self.lock_owner == current_user 149 if draft && self.lock_owner == current_user