summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/controllers/node_actions_controller.rb14
-rw-r--r--app/helpers/node_actions_helper.rb68
-rw-r--r--app/views/node_actions/_change_details.html.erb27
-rw-r--r--app/views/node_actions/index.html.erb22
-rw-r--r--app/views/nodes/show.html.erb1
5 files changed, 132 insertions, 0 deletions
diff --git a/app/controllers/node_actions_controller.rb b/app/controllers/node_actions_controller.rb
new file mode 100644
index 0000000..6e46719
--- /dev/null
+++ b/app/controllers/node_actions_controller.rb
@@ -0,0 +1,14 @@
1class NodeActionsController < ApplicationController
2
3 before_action :login_required
4
5 layout 'admin'
6
7 def index
8 @actions = NodeAction.order(:occurred_at => :desc, :id => :desc)
9 @actions = @actions.where(:node_id => params[:node_id]) if params[:node_id].present?
10 @actions = @actions.where(:user_id => params[:user_id]) if params[:user_id].present?
11 @actions = @actions.includes(:node, :user)
12 .paginate(:page => params[:page], :per_page => 50)
13 end
14end
diff --git a/app/helpers/node_actions_helper.rb b/app/helpers/node_actions_helper.rb
new file mode 100644
index 0000000..ef42b75
--- /dev/null
+++ b/app/helpers/node_actions_helper.rb
@@ -0,0 +1,68 @@
1module NodeActionsHelper
2 include ERB::Util
3
4 # One sentence per entry, rendered from metadata alone, so entries
5 # stay renderable after the rows they reference are gone. Live
6 # associations only upgrade plain names to links. Every metadata
7 # value passes through h() here -- this helper is the escaping
8 # boundary; the locale sentences are trusted, the data never is.
9 def action_summary action
10 renderer = "summarize_#{action.action}"
11 return send(renderer, action) if respond_to?(renderer, true)
12
13 # Unknown-verb fallback: the log outlives the vocabulary. A renamed
14 # or future verb degrades to an ugly sentence, never to a 500.
15 t("node_actions.unknown", :actor => actor_ref(action),
16 :action => h(action.action), :subject => subject_ref(action)).html_safe
17 end
18
19 private
20
21 def actor_ref action
22 if action.user && respond_to?(:current_user) && action.user == current_user
23 return t("node_actions.actor_self")
24 end
25 action.user ? link_to(h(action.actor_name), admin_log_path(:user_id => action.user_id))
26 : h(action.actor_name)
27 end
28
29 def subject_ref action
30 action.node ? link_to(h(action.subject_name), node_path(action.node))
31 : h(action.subject_name)
32 end
33
34 def summarize_publish action
35 key = if action.metadata["via"] == "revision"
36 "node_actions.publish_rollback"
37 elsif action.metadata.dig("title", "from").nil?
38 "node_actions.publish_first"
39 else
40 "node_actions.publish"
41 end
42
43 t(key, :actor => actor_ref(action), :subject => subject_ref(action),
44 :from => h(action.metadata.dig("title", "from")),
45 :to => h(action.metadata.dig("title", "to"))).html_safe
46 end
47
48 def summarize_move action
49 t("node_actions.move", :actor => actor_ref(action), :subject => subject_ref(action),
50 :from => h(action.metadata.dig("path", "from")),
51 :to => h(action.metadata.dig("path", "to"))).html_safe
52 end
53
54 def summarize_create action
55 t("node_actions.create", :actor => actor_ref(action), :subject => subject_ref(action),
56 :path => h(action.metadata["path"])).html_safe
57 end
58
59 def summarize_discard_autosave action
60 t("node_actions.discard_autosave",
61 :actor => actor_ref(action), :subject => subject_ref(action)).html_safe
62 end
63
64 def summarize_destroy_draft action
65 t("node_actions.destroy_draft",
66 :actor => actor_ref(action), :subject => subject_ref(action)).html_safe
67 end
68end
diff --git a/app/views/node_actions/_change_details.html.erb b/app/views/node_actions/_change_details.html.erb
new file mode 100644
index 0000000..383f53a
--- /dev/null
+++ b/app/views/node_actions/_change_details.html.erb
@@ -0,0 +1,27 @@
1<details class="node_action_details">
2 <summary><%= t("node_actions.show_changes") %></summary>
3 <table>
4 <% action_entry.metadata["translation_diff"].each do |locale, diff| %>
5 <tr>
6 <th><%= locale.upcase %></th>
7 <td>
8 <% case diff["status"] %>
9 <% when "added" %>
10 <%= t("node_actions.locale_added", :title => diff.dig("title", "to")) %>
11 <% when "removed" %>
12 <%= t("node_actions.locale_removed", :title => diff.dig("title", "from")) %>
13 <% else %>
14 <% if diff["title"] %>
15 <%= diff.dig("title", "from") %> → <%= diff.dig("title", "to") %>
16 <% end %>
17 <%= t("node_actions.abstract_changed") if diff["abstract_changed"] %>
18 <%= t("node_actions.body_changed") if diff["body_changed"] %>
19 <% end %>
20 </td>
21 </tr>
22 <% end %>
23 </table>
24 <% if action_entry.page && action_entry.node %>
25 <%= link_to t("node_actions.view_revision"), node_revision_path(action_entry.node, action_entry.page) %>
26 <% end %>
27</details>
diff --git a/app/views/node_actions/index.html.erb b/app/views/node_actions/index.html.erb
new file mode 100644
index 0000000..92740cd
--- /dev/null
+++ b/app/views/node_actions/index.html.erb
@@ -0,0 +1,22 @@
1<h1><%= t("node_actions.heading") %></h1>
2
3<% if params[:node_id].present? || params[:user_id].present? %>
4 <p><%= link_to t("node_actions.show_all"), admin_log_path %></p>
5<% end %>
6
7<%= will_paginate @actions %>
8
9<ul id="node_action_list">
10 <% @actions.each do |action| %>
11 <li class="node_action node_action--<%= action.action %>">
12 <span class="node_action_time"><%= l(action.occurred_at, :format => :ccc) %></span>
13 <% if action.inferred_from %>
14 <span class="node_action_inferred" title="<%= action.inferred_from %>"><%= t("node_actions.backfilled") %></span>
15 <% end %>
16 <span class="node_action_summary"><%= action_summary(action) %></span>
17 <%= render "change_details", :action_entry => action if action.metadata["translation_diff"].present? %>
18 </li>
19 <% end %>
20</ul>
21
22<%= will_paginate @actions %>
diff --git a/app/views/nodes/show.html.erb b/app/views/nodes/show.html.erb
index 66f04f9..d0eff60 100644
--- a/app/views/nodes/show.html.erb
+++ b/app/views/nodes/show.html.erb
@@ -183,6 +183,7 @@
183 </ul> 183 </ul>
184 </details> 184 </details>
185 <p class="revisions_full_history_link"><%= link_to 'Full history (diff / restore)', node_revisions_path(@node) %></p> 185 <p class="revisions_full_history_link"><%= link_to 'Full history (diff / restore)', node_revisions_path(@node) %></p>
186 <p class)"revisions_full_history_link"><%= link_to t("node_actions.heading"), admin_log_path(:node_id => @node.id) %></p>
186 </div> 187 </div>
187 188
188 189