summaryrefslogtreecommitdiff
path: root/app/controllers/revisions_controller.rb
blob: cfd31308ced042c352f94059baed95e57d98b2f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
class RevisionsController < ApplicationController
  include PinnedToDefaultLocale
  
  # Private
  
  before_action :login_required
  
  layout 'admin'

  def index
    @node               = Node.find(params[:node_id])
    @pages              = @node.pages.all
    @translation_locale = resolve_locale(params[:translation_locale])
  end

  def diff
    @node = Node.find(params[:node_id])

    if @node.pages.length > 1
      params[:start_revision]  ||= @node.pages.all[-2].revision
      params[:end_revision]    ||= @node.pages.all[-1].revision
    else
      params[:start_revision], params[:end_revision] = 1, 1
    end

    @start = @node.resolve_page_reference(params[:start_revision])
    @end   = @node.resolve_page_reference(params[:end_revision])

    if @start.nil? || @end.nil?
      flash[:error] = t("flash.revisions.unavailable")
      redirect_to(node_path(@node)) and return
    end

    @locale_summary     = @end.locale_diff_summary(@start)
    requested_locale    = params[:translation_locale].presence&.to_sym

    available           = @locale_summary.map { |s| s[:locale] }
    default_locale      = @locale_summary.find { |s| s[:changed] }&.dig(:locale) ||
                               (I18n.default_locale if available.include?(I18n.default_locale)) ||
                                available.first ||
                                I18n.default_locale

    @translation_locale = @locale_summary.any? { |s| s[:locale] == requested_locale } ? requested_locale : default_locale

    @diff_view              = params[:view] == "side_by_side" ? :side_by_side : :inline
    @diff                   = @end.diff_against(@start, view: @diff_view, locale: @translation_locale)
    @available_layer_pairs  = @node.available_layer_pairs
    @locked_by_other        = @node.locked? && @node.lock_owner != current_user
  end

  def show
    @node               = Node.find(params[:node_id])
    @page               = @node.pages.find(params[:id])
    @translation_locale = resolve_locale(params[:translation_locale])
  end

  def restore
    page = Page.find(params[:id])
    page.node.restore_revision! page.revision, current_user
    flash[:notice] = t("flash.revisions.restored", :rev => page.revision)
    redirect_to node_path(page.node)
  end

  private

    def resolve_locale(requested)
      candidate = requested.presence&.to_sym
      allowed   = [I18n.default_locale] + Page.non_default_locales
      allowed.include?(candidate) ? candidate : I18n.default_locale
    end
end