summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorerdgeist <erdgeist@erdgeist.org>2026-07-13 19:12:56 +0200
committererdgeist <erdgeist@erdgeist.org>2026-07-13 19:12:56 +0200
commitba789678f9e8ed189413afb1446ad210df34e488 (patch)
tree23ac4ce3c3403438fa8e50985de2db3b11a924a8 /app
parent4072efdc912ecb3b79621fb1838434f792e3a531 (diff)
Make revision diffs locale-aware, defaulting to whichever locale changed
diff_against compared title/abstract/body under whatever I18n.locale happened to be ambient, with no concept of 'diff this translation specifically' -- so a change confined to one locale was invisible to Diff Head vs. Draft regardless of which locale you were looking at when you clicked it, exactly the 'yields nothing' complaint from earlier this session. Page#diff_against gains a locale: keyword, additive only -- nil preserves the exact original ambient-locale behavior every existing caller and test already depends on; passing a locale switches to reading each side's actual PageTranslation row directly, same fallback-free reasoning as Page#translation_summary. Page#locale_diff_summary reports one entry per locale present on either side, so an added or removed translation counts as a change even where content matches everywhere it exists on both. RevisionsController#diff now resolves a real locale before diffing -- defaulting to whichever locale actually changed, falling back to the default locale only when nothing did -- and the view carries that locale through every existing control (view toggle, layer-pair buttons, the revision-select form) so it and the view/layer-pair axis stay independently selectable rather than resetting each other.
Diffstat (limited to 'app')
-rw-r--r--app/controllers/revisions_controller.rb7
-rw-r--r--app/views/revisions/diff.html.erb25
2 files changed, 27 insertions, 5 deletions
diff --git a/app/controllers/revisions_controller.rb b/app/controllers/revisions_controller.rb
index 4b0c549..0aed243 100644
--- a/app/controllers/revisions_controller.rb
+++ b/app/controllers/revisions_controller.rb
@@ -29,8 +29,13 @@ class RevisionsController < ApplicationController
29 redirect_to(node_path(@node)) and return 29 redirect_to(node_path(@node)) and return
30 end 30 end
31 31
32 @locale_summary = @end.locale_diff_summary(@start)
33 requested_locale = params[:locale].presence&.to_sym
34 default_locale = @locale_summary.find { |s| s[:changed] }&.dig(:locale) || I18n.default_locale
35 @locale = @locale_summary.any? { |s| s[:locale] == requested_locale } ? requested_locale : default_locale
36
32 @diff_view = params[:view] == "side_by_side" ? :side_by_side : :inline 37 @diff_view = params[:view] == "side_by_side" ? :side_by_side : :inline
33 @diff = @end.diff_against(@start, view: @diff_view) 38 @diff = @end.diff_against(@start, view: @diff_view, locale: @locale)
34 @available_layer_pairs = @node.available_layer_pairs 39 @available_layer_pairs = @node.available_layer_pairs
35 @locked_by_other = @node.locked? && @node.lock_owner != current_user 40 @locked_by_other = @node.locked? && @node.lock_owner != current_user
36 end 41 end
diff --git a/app/views/revisions/diff.html.erb b/app/views/revisions/diff.html.erb
index 5638b7a..149b17c 100644
--- a/app/views/revisions/diff.html.erb
+++ b/app/views/revisions/diff.html.erb
@@ -7,20 +7,37 @@
7<p class="diff_comparison_label"> 7<p class="diff_comparison_label">
8 Comparing <strong><%= describe_page_reference(params[:start_revision]) %></strong> 8 Comparing <strong><%= describe_page_reference(params[:start_revision]) %></strong>
9 against <strong><%= describe_page_reference(params[:end_revision]) %></strong> 9 against <strong><%= describe_page_reference(params[:end_revision]) %></strong>
10 — showing the <strong><%= @locale.to_s.upcase %></strong> translation
10</p> 11</p>
11 12
13<% if @locale_summary.size > 1 %>
14 <p class="diff_locale_toggle">
15 Locale:
16 <% @locale_summary.each_with_index do |s, i| %>
17 <%= " &middot; ".html_safe if i > 0 %>
18 <% label = "#{s[:locale].to_s.upcase}#{' *' if s[:changed]}" %>
19 <% if s[:locale] == @locale %>
20 <strong><%= label %></strong>
21 <% else %>
22 <%= link_to label, diff_node_revisions_path(@node, start_revision: params[:start_revision], end_revision: params[:end_revision], view: @diff_view, locale: s[:locale]) %>
23 <% end %>
24 <% end %>
25 </p>
26 <p class="field_hint">* has a difference between these two versions.</p>
27<% end %>
28
12<p class="diff_view_toggle"> 29<p class="diff_view_toggle">
13 View: 30 View:
14 <% if @diff_view == :inline %> 31 <% if @diff_view == :inline %>
15 <strong>Inline</strong> 32 <strong>Inline</strong>
16 <% else %> 33 <% else %>
17 <%= link_to 'Inline', diff_node_revisions_path(@node, start_revision: params[:start_revision], end_revision: params[:end_revision], view: 'inline') %> 34 <%= link_to 'Inline', diff_node_revisions_path(@node, start_revision: params[:start_revision], end_revision: params[:end_revision], view: 'inline', locale: @locale) %>
18 <% end %> 35 <% end %>
19 &middot; 36 &middot;
20 <% if @diff_view == :side_by_side %> 37 <% if @diff_view == :side_by_side %>
21 <strong>Side by side</strong> 38 <strong>Side by side</strong>
22 <% else %> 39 <% else %>
23 <%= link_to 'Side by side', diff_node_revisions_path(@node, start_revision: params[:start_revision], end_revision: params[:end_revision], view: 'side_by_side') %> 40 <%= link_to 'Side by side', diff_node_revisions_path(@node, start_revision: params[:start_revision], end_revision: params[:end_revision], view: 'side_by_side', locale: @locale) %>
24 <% end %> 41 <% end %>
25</p> 42</p>
26 43
@@ -31,6 +48,7 @@
31 <%= select_tag :start_revision, options_for_select(@node.pages.map{|x| x.revision}, params[:start_revision].to_i) %> 48 <%= select_tag :start_revision, options_for_select(@node.pages.map{|x| x.revision}, params[:start_revision].to_i) %>
32 <%= select_tag :end_revision, options_for_select(@node.pages.map{|x| x.revision}, params[:end_revision].to_i) %> 49 <%= select_tag :end_revision, options_for_select(@node.pages.map{|x| x.revision}, params[:end_revision].to_i) %>
33 <%= hidden_field_tag :view, @diff_view %> 50 <%= hidden_field_tag :view, @diff_view %>
51 <%= hidden_field_tag :locale, @locale %>
34 <%= submit_tag 'Diff' %> 52 <%= submit_tag 'Diff' %>
35 <% end %> 53 <% end %>
36<% else %> 54<% else %>
@@ -44,10 +62,9 @@
44 <%= button_to "Diff #{pair.first.to_s.capitalize} vs. #{pair.last.to_s.capitalize}", 62 <%= button_to "Diff #{pair.first.to_s.capitalize} vs. #{pair.last.to_s.capitalize}",
45 diff_node_revisions_path(@node), 63 diff_node_revisions_path(@node),
46 method: :get, 64 method: :get,
47 params: { start_revision: pair.first, end_revision: pair.last, view: @diff_view }, 65 params: { start_revision: pair.first, end_revision: pair.last, view: @diff_view, locale: @locale },
48 form: { class: 'button_to computation' } %> 66 form: { class: 'button_to computation' } %>
49 <% end %> 67 <% end %>
50
51 <% if !@locked_by_other && (@node.autosave || @node.draft) %> 68 <% if !@locked_by_other && (@node.autosave || @node.draft) %>
52 <%= button_to revert_node_path(@node), method: :put, 69 <%= button_to revert_node_path(@node), method: :put,
53 params: { return_to: request.fullpath }, 70 params: { return_to: request.fullpath },