<%= t(".title", :path => @node.unique_name) %>

<%= link_to t(".back_to_node"), node_path(@node) %>

<% if Page.non_default_locales.any? %>

<%= t("revisions.locale_label") %> <% ([I18n.default_locale] + Page.non_default_locales).each_with_index do |locale, i| %> <%= " · ".html_safe if i > 0 %> <% if locale == @translation_locale %> <%= locale.to_s.upcase %> <% else %> <%= link_to locale.to_s.upcase, node_revisions_path(@node, :translation_locale => locale) %> <% end %> <% end %>

<% end %> <% pages = (@pages || @node.pages.all).reverse %> <% pages.each do |page| %> <% end %>
<%= t("admin.columns.rev") %> <%= t("admin.columns.title") %> <%= t("admin.columns.editor") %> <%= t("admin.columns.date") %>
<%= form_tag diff_node_revisions_path(@node), :method => :post, :id => "diff_form", :class => "button_to computation" do %> <%= hidden_field_tag :translation_locale, @translation_locale %> <%= hidden_field_tag :start_revision, pages[1]&.revision %> <%= hidden_field_tag :end_revision, pages[0]&.revision %> <%= submit_tag t(".diff_revisions") %> <%= t(".diff_selection_html", :from => tag.span(:id => "diff_from"), :to => tag.span(:id => "diff_to")) %> <% end %>
<%= page.revision %> <%= page.translations.find_by(:locale => @translation_locale)&.title || "—" %> <%= page.editor.try(:login) %> <%= admin_datetime(page.updated_at) %> <%= link_to t(".show_link"), node_revision_path(@node, page, :translation_locale => @translation_locale) %> <%= button_to t(".restore_link"), restore_node_revision_path(@node, page), method: :put, form: { data: { confirm: t(".confirm_restore") }, class: 'button_to state_changing' } %>
<%= javascript_tag nonce: true do %> (function () { var table = document.getElementById('revisions'); var form = document.getElementById('diff_form'); if (!table || !form) { return; } var from_field = form.querySelector('input[name="start_revision"]'); var to_field = form.querySelector('input[name="end_revision"]'); var from_label = document.getElementById('diff_from'); var to_label = document.getElementById('diff_to'); var readout = document.getElementById('diff_selection_label'); var submit = form.querySelector('input[type="submit"]'); var rows = table.querySelectorAll('tbody tr'); // Two-slot FIFO: the newest pick becomes the target and the previous // target becomes the source, so two taps anywhere give any pair. // Picking the current target is a no-op; picking the current source // swaps them. var stack = [from_field.value, to_field.value].filter(function (v) { return v !== ''; }); function render() { var from = stack[0] || ''; var to = stack[1] || ''; from_field.value = from; to_field.value = to; from_label.textContent = from; to_label.textContent = to; readout.hidden = !(from && to); submit.disabled = !(from && to && from !== to); rows.forEach(function (row) { var rev = row.dataset.revision; row.classList.toggle('diff_source', rev === from); row.classList.toggle('diff_target', rev === to); row.setAttribute('aria-pressed', (rev === from || rev === to) ? 'true' : 'false'); }); } function pick(rev) { if (rev === stack[1]) { return; } stack.push(rev); if (stack.length > 2) { stack.shift(); } render(); } rows.forEach(function (row) { row.addEventListener('click', function (e) { if (e.target.closest('a, button, input, label')) { return; } pick(row.dataset.revision); }); row.addEventListener('keydown', function (e) { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); pick(row.dataset.revision); } }); }); render(); })(); <% end %>