summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorerdgeist <erdgeist@erdgeist.org>2026-08-09 15:45:56 +0200
committererdgeist <erdgeist@erdgeist.org>2026-08-09 15:45:56 +0200
commit9d32458491d79f8e06a706375030c78282f4427b (patch)
tree5eee208b844df39dfd66d9f0d1618fb5fa437fdb /app
parented3905b5409190c1e11c2c49c2163ac967c6d8b9 (diff)
Report every editorial attribute in the revision diff
diff_against gained external_url, published_at and user. The view renders each metadata section only when that attribute changed, and says so once when none did. Metadata now precedes the locale pointer, which speaks only of translations: above the metadata it read as "nothing changed" on a revision that had moved the page.
Diffstat (limited to 'app')
-rw-r--r--app/models/page.rb6
-rw-r--r--app/views/revisions/diff.html.erb133
2 files changed, 87 insertions, 52 deletions
diff --git a/app/models/page.rb b/app/models/page.rb
index 3240057f..c2dc227b 100644
--- a/app/models/page.rb
+++ b/app/models/page.rb
@@ -277,6 +277,12 @@ class Page < ApplicationRecord
277 277
278 text_diffs.merge( 278 text_diffs.merge(
279 address: address_diff_against(other), 279 address: address_diff_against(other),
280 external_url: { from: other.external_url, to: external_url,
281 changed: external_url.presence != other.external_url.presence },
282 published_at: { from: other.published_at, to: published_at,
283 changed: published_at != other.published_at },
284 user: { from: other.user, to: user,
285 changed: user_id != other.user_id },
280 tags: { added: tag_list.to_a - other.tag_list.to_a, removed: other.tag_list.to_a - tag_list.to_a }, 286 tags: { added: tag_list.to_a - other.tag_list.to_a, removed: other.tag_list.to_a - tag_list.to_a },
281 template_name: { from: other.template_name, to: template_name, changed: template_name != other.template_name }, 287 template_name: { from: other.template_name, to: template_name, changed: template_name != other.template_name },
282 assets: { added: assets.to_a - other.assets.to_a, removed: other.assets.to_a - assets.to_a } 288 assets: { added: assets.to_a - other.assets.to_a, removed: other.assets.to_a - assets.to_a }
diff --git a/app/views/revisions/diff.html.erb b/app/views/revisions/diff.html.erb
index 0fd9ccb9..25f5ad04 100644
--- a/app/views/revisions/diff.html.erb
+++ b/app/views/revisions/diff.html.erb
@@ -48,7 +48,6 @@
48 </p> 48 </p>
49<% end %> 49<% end %>
50 50
51
52<% if @available_layer_pairs.present? %> 51<% if @available_layer_pairs.present? %>
53 <div class="node_action_bar standalone_action_bar"> 52 <div class="node_action_bar standalone_action_bar">
54 <% @available_layer_pairs.each do |pair| %> 53 <% @available_layer_pairs.each do |pair| %>
@@ -71,21 +70,88 @@
71<% end %> 70<% end %>
72 71
73<div id="diffview"> 72<div id="diffview">
74 <% current_summary = @locale_summary.find { |s| s[:locale] == @translation_locale } %> 73 <% meta_changed = @diff[:address][:changed] || @diff[:external_url][:changed] ||
75 <% if current_summary && !current_summary[:changed] %> 74 @diff[:template_name][:changed] ||
76 <% elsewhere = @locale_summary.select { |s| s[:changed] }.map { |s| 75 @diff[:published_at][:changed] || @diff[:user][:changed] ||
77 link_to s[:locale].to_s.upcase, diff_node_revisions_path(@node, 76 @diff[:tags][:added].any? || @diff[:tags][:removed].any? ||
78 start_revision: params[:start_revision], end_revision: params[:end_revision], 77 @diff[:assets][:added].any? || @diff[:assets][:removed].any? %>
79 view: @diff_view, translation_locale: s[:locale]) } %> 78
80 <p class="diff_unchanged diff_locale_pointer"> 79 <div class="diff_preamble">
81 <% if elsewhere.any? %> 80 <div class="diff_meta">
82 <%= t(".unchanged_here_html", :lang => @translation_locale.to_s.upcase, 81 <% unless meta_changed %>
83 :others => safe_join(elsewhere, ", ")) %> 82 <p class="diff_unchanged"><%= t(".no_metadata_change") %></p>
84 <% else %> 83 <% end %>
85 <%= t(".unchanged_anywhere") %> 84
85 <% if @diff[:address][:changed] %>
86 <h3><%= t(".address") %></h3>
87 <p>
88 <del><%= @diff[:address][:from] || t(".none_marker") %></del>
89 <ins><%= @diff[:address][:to] || t(".none_marker") %></ins>
90 </p>
91 <% end %>
92
93 <% if @diff[:external_url][:changed] %>
94 <h3><%= Page.human_attribute_name(:external_url) %></h3>
95 <p>
96 <del><%= @diff[:external_url][:from].presence || t(".none_marker") %></del>
97 <ins><%= @diff[:external_url][:to].presence || t(".none_marker") %></ins>
98 </p>
99 <% end %>
100
101 <% if @diff[:published_at][:changed] %>
102 <h3><%= Page.human_attribute_name(:published_at) %></h3>
103 <p>
104 <del><%= @diff[:published_at][:from] ? admin_datetime(@diff[:published_at][:from]) : t(".none_marker") %></del>
105 <ins><%= @diff[:published_at][:to] ? admin_datetime(@diff[:published_at][:to]) : t(".none_marker") %></ins>
106 </p>
86 <% end %> 107 <% end %>
87 </p> 108
88 <% end %> 109 <% if @diff[:user][:changed] %>
110 <h3><%= Page.human_attribute_name(:user) %></h3>
111 <p>
112 <del><%= @diff[:user][:from]&.login || t(".none_marker") %></del>
113 <ins><%= @diff[:user][:to]&.login || t(".none_marker") %></ins>
114 </p>
115 <% end %>
116
117 <% if @diff[:tags][:added].any? || @diff[:tags][:removed].any? %>
118 <h3><%= Page.human_attribute_name(:tag_list) %></h3>
119 <ul class="diff_set_list">
120 <% @diff[:tags][:added].each do |tag| %><li><ins><%= tag %></ins></li><% end %>
121 <% @diff[:tags][:removed].each do |tag| %><li><del><%= tag %></del></li><% end %>
122 </ul>
123 <% end %>
124
125 <% if @diff[:template_name][:changed] %>
126 <h3><%= Page.human_attribute_name(:template_name) %></h3>
127 <p><del><%= @diff[:template_name][:from] || t(".none_marker") %></del> <ins><%= @diff[:template_name][:to] || t(".none_marker") %></ins></p>
128 <% end %>
129
130 <% if @diff[:assets][:added].any? || @diff[:assets][:removed].any? %>
131 <h3><%= Page.human_attribute_name(:assets) %></h3>
132 <ul class="diff_set_list">
133 <% @diff[:assets][:added].each do |asset| %><li><ins><%= asset.upload_file_name %></ins></li><% end %>
134 <% @diff[:assets][:removed].each do |asset| %><li><del><%= asset.upload_file_name %></del></li><% end %>
135 </ul>
136 <% end %>
137 </div>
138
139 <% current_summary = @locale_summary.find { |s| s[:locale] == @translation_locale } %>
140 <% if current_summary && !current_summary[:changed] %>
141 <% elsewhere = @locale_summary.select { |s| s[:changed] }.map { |s|
142 link_to s[:locale].to_s.upcase, diff_node_revisions_path(@node,
143 start_revision: params[:start_revision], end_revision: params[:end_revision],
144 view: @diff_view, translation_locale: s[:locale]) } %>
145 <p class="diff_unchanged diff_locale_pointer">
146 <% if elsewhere.any? %>
147 <%= t(".unchanged_here_html", :lang => @translation_locale.to_s.upcase,
148 :others => safe_join(elsewhere, ", ")) %>
149 <% else %>
150 <%= t(".unchanged_anywhere") %>
151 <% end %>
152 </p>
153 <% end %>
154 </div>
89 155
90 <% if @diff_view == :side_by_side %> 156 <% if @diff_view == :side_by_side %>
91 <div class="diff_side_by_side"> 157 <div class="diff_side_by_side">
@@ -114,41 +180,4 @@
114 <h3><%= Page.human_attribute_name(:body) %></h3> 180 <h3><%= Page.human_attribute_name(:body) %></h3>
115 <%= raw @diff[:body] %> 181 <%= raw @diff[:body] %>
116 <% end %> 182 <% end %>
117
118 <h3><%= t(".address") %></h3>
119 <% if @diff[:address][:changed] %>
120 <p>
121 <del><%= @diff[:address][:from] || t(".none_marker") %></del>
122 <ins><%= @diff[:address][:to] || t(".none_marker") %></ins>
123 </p>
124 <% else %>
125 <p class="diff_unchanged"><%= t(".no_change") %></p>
126 <% end %>
127
128 <h3><%= Page.human_attribute_name(:tag_list) %></h3>
129 <% if @diff[:tags][:added].empty? && @diff[:tags][:removed].empty? %>
130 <p class="diff_unchanged"><%= t(".no_change") %></p>
131 <% else %>
132 <ul class="diff_set_list">
133 <% @diff[:tags][:added].each do |tag| %><li><ins><%= tag %></ins></li><% end %>
134 <% @diff[:tags][:removed].each do |tag| %><li><del><%= tag %></del></li><% end %>
135 </ul>
136 <% end %>
137
138 <h3><%= Page.human_attribute_name(:template_name) %></h3>
139 <% if @diff[:template_name][:changed] %>
140 <p><del><%= @diff[:template_name][:from] || t(".none_marker") %></del> <ins><%= @diff[:template_name][:to] || t(".none_marker") %></ins></p>
141 <% else %>
142 <p class="diff_unchanged"><%= t(".no_change") %></p>
143 <% end %>
144
145 <h3><%= Page.human_attribute_name(:assets) %></h3>
146 <% if @diff[:assets][:added].empty? && @diff[:assets][:removed].empty? %>
147 <p class="diff_unchanged"><%= t(".no_change") %></p>
148 <% else %>
149 <ul class="diff_set_list">
150 <% @diff[:assets][:added].each do |asset| %><li><ins><%= asset.upload_file_name %></ins></li><% end %>
151 <% @diff[:assets][:removed].each do |asset| %><li><del><%= asset.upload_file_name %></del></li><% end %>
152 </ul>
153 <% end %>
154</div> 183</div>