From 92c394b43a0603743b914c6298aab986805ca990 Mon Sep 17 00:00:00 2001
From: erdgeist
Date: Sat, 11 Jul 2026 23:43:02 +0200
Subject: Add drafts/recent/mine/chapters admin node views
Four NodesController actions -- drafts, recent, mine, chapters --
each building its own base scope, sharing one private method
(index_matching) for search narrowing and pagination. Wizard rewrite
to link into these instead of rendering its own tables is a separate,
later step.
Node.editor_search backs the shared "q" narrowing: an ILIKE substring
match against title/abstract on whichever of head or draft is
present, splitting the term on whitespace and requiring every word to
match somewhere independently, not as one phrase, since real words can
end up separated by markup in the underlying HTML. Deliberately
separate from Node.search, the public content search, which stays
tsvector-based and head-only.
chapters generalizes into /admin/nodes/tags/:tags for an arbitrary
tag list (OR'd, not AND'd), sharing the controller action but
rendering its own template rather than branching inside one view.
---
app/views/nodes/_node_list.html.erb | 39 +++++++++++++++++++++++++++++++++++++
1 file changed, 39 insertions(+)
create mode 100644 app/views/nodes/_node_list.html.erb
(limited to 'app/views/nodes/_node_list.html.erb')
diff --git a/app/views/nodes/_node_list.html.erb b/app/views/nodes/_node_list.html.erb
new file mode 100644
index 0000000..03f38b4
--- /dev/null
+++ b/app/views/nodes/_node_list.html.erb
@@ -0,0 +1,39 @@
+<%= form_tag url_for(controller: params[:controller], action: params[:action]), method: :get, class: "node_search_form" do %>
+ <% Array(params[:kinds]).each do |kind| %>
+ <%= hidden_field_tag "kinds[]", kind %>
+ <% end %>
+ <%= hidden_field_tag :tags, params[:tags] if params[:tags].present? %>
+ <%= text_field_tag :q, params[:q], placeholder: "Search title, abstract, body…" %>
+ <%= submit_tag "Search", class: "action_button" %>
+ <% if params[:q].present? || params[:kinds].present? || params[:tags].present? %>
+ <%= link_to "Reset", url_for(controller: params[:controller], action: params[:action]) %>
+ <% end %>
+<% end %>
+
+<%= will_paginate @nodes %>
+
+
+ <% @nodes.each do |node| %>
+ ">
+ | <%= node.id %> |
+
+ <%= link_to title_for_node(node), node_path(node) %>
+ <%= link_to_path(node.unique_name, node.unique_name) %>
+ |
+
+ <%= link_to 'show', node_path(node) %>
+ <%= link_to 'edit', edit_node_path(node) %>
+ <%= link_to 'revisions', node_revisions_path(node) %>
+ |
+ <%= node.lock_owner.login if node.lock_owner %> |
+ <%= node.draft ? node.draft.revision : (node.head ? node.head.revision : "EMPTY") %> |
+
+ <% end %>
+
+<%= will_paginate @nodes %>
--
cgit v1.3
From 848ce18303f927bfadaf0965a769cae2c62492a0 Mon Sep 17 00:00:00 2001
From: erdgeist
Date: Sun, 12 Jul 2026 23:43:02 +0200
Subject: Normalize action-button wording and add icons app-wide
"New X" becomes "Create X" throughout (users, events, assets, menu
items, nodes), matching the verb-first pattern the dashboard's own
signposts already established, with a shared plus icon rather than a
document-flavored one that only made sense next to "post". The
"Destroy"/"destroy"/"Delete" family is normalized to "Destroy"
everywhere, with a shared trash icon; occurrences#index and
pages#index also pick up the destructive button class they'd been
silently missing. Filter and Search convert from submit_tag to
button_tag, the only way either can hold an icon alongside its label.
Edit and the node editor's three dynamic labels (Continue Editing /
Edit Draft / Lock + Edit) share one icon without touching their
wording -- unlike Destroy's family, the state nuance in the text is
real information, not just inconsistent phrasing.
---
app/views/assets/index.html.erb | 8 ++++++--
app/views/assets/show.html.erb | 4 +++-
app/views/events/edit.html.erb | 6 ++++--
app/views/events/index.html.erb | 8 ++++++--
app/views/events/show.html.erb | 8 ++++++--
app/views/events/without_node.html.erb | 4 +++-
app/views/menu_items/index.html.erb | 11 +++++++----
app/views/nodes/_node_list.html.erb | 4 +++-
app/views/nodes/chapters.html.erb | 6 ++++--
app/views/nodes/edit.html.erb | 8 +++++---
app/views/nodes/index.html.erb | 4 +++-
app/views/nodes/show.html.erb | 15 ++++++++++-----
app/views/occurrences/index.html.erb | 4 +++-
app/views/pages/index.html.erb | 4 +++-
app/views/revisions/diff.html.erb | 10 ++++++----
app/views/users/_user.html.erb | 7 ++++---
app/views/users/index.html.erb | 8 ++++++--
app/views/users/show.html.erb | 4 +++-
test/controllers/users_controller_test.rb | 2 +-
19 files changed, 86 insertions(+), 39 deletions(-)
(limited to 'app/views/nodes/_node_list.html.erb')
diff --git a/app/views/assets/index.html.erb b/app/views/assets/index.html.erb
index 6591091..8c35561 100644
--- a/app/views/assets/index.html.erb
+++ b/app/views/assets/index.html.erb
@@ -1,6 +1,8 @@
Assets
-<%= link_to 'New asset', new_asset_path, class: 'action_button' %>
+<%= link_to new_asset_path, class: 'action_button' do %>
+ <%= icon("plus", library: "tabler", "aria-hidden": true) %> Create asset
+<% end %>
<%= will_paginate @assets %>
@@ -20,7 +22,9 @@
<%= asset.upload.content_type %> |
<%= link_to 'Show', asset %> |
<%= link_to 'Edit', edit_asset_path(asset) %> |
- <%= button_to 'Destroy', asset, method: :delete, form: { data: { confirm: 'Are you sure?' }, class: 'button_to destructive' } %> |
+ <%= button_to asset, method: :delete, form: { data: { confirm: 'Are you sure?' }, class: 'button_to destructive' } do %>
+ <%= icon("trash", library: "tabler", "aria-hidden": true) %> Destroy
+ <% end %> |
<% end %>
diff --git a/app/views/assets/show.html.erb b/app/views/assets/show.html.erb
index 0286678..5717dd9 100644
--- a/app/views/assets/show.html.erb
+++ b/app/views/assets/show.html.erb
@@ -6,7 +6,9 @@
- <%= link_to 'Edit', edit_asset_path(@asset), class: 'action_button' %>
+ <%= link_to edit_asset_path(@asset), class: 'action_button' do %>
+ <%= icon("edit", library: "tabler", "aria-hidden": true) %> Edit
+ <% end %>
<%= link_to 'Back', assets_path %>
diff --git a/app/views/events/edit.html.erb b/app/views/events/edit.html.erb
index 45b084f..b6564a4 100644
--- a/app/views/events/edit.html.erb
+++ b/app/views/events/edit.html.erb
@@ -2,8 +2,10 @@
<%= link_to 'Back', safe_return_to(params[:return_to] || events_path) %>
- <%= button_to 'Destroy', event_path(@event), method: :delete,
- form: { data: { confirm: 'Delete this event?' }, class: 'button_to destructive' } %>
+ <%= button_to event_path(@event), method: :delete,
+ form: { data: { confirm: 'Delete this event?' }, class: 'button_to destructive' } do %>
+ <%= icon("trash", library: "tabler", "aria-hidden": true) %> Destroy
+ <% end %>
<%= form_for(@event) do |f| %>
diff --git a/app/views/events/index.html.erb b/app/views/events/index.html.erb
index 3d953d5..dde897e 100644
--- a/app/views/events/index.html.erb
+++ b/app/views/events/index.html.erb
@@ -1,7 +1,11 @@
Events
-<%= link_to 'New event', new_event_path, class: 'action_button' %>
-<%= link_to 'View events without a page →', without_node_events_path %>
+
+ <%= link_to new_event_path, class: 'action_button' do %>
+ <%= icon("plus", library: "tabler", "aria-hidden": true) %> Create event
+ <% end %>
+ <%= link_to 'View events without a page →', without_node_events_path %>
+
<%= will_paginate @events %>
diff --git a/app/views/events/show.html.erb b/app/views/events/show.html.erb
index 5812228..ac084c9 100644
--- a/app/views/events/show.html.erb
+++ b/app/views/events/show.html.erb
@@ -11,10 +11,14 @@
<% end %>
- <%= link_to 'Edit', edit_event_path(@event, return_to: request.path), class: 'action_button' %>
+ <%= link_to edit_event_path(@event, return_to: request.path), class: 'action_button' do %>
+ <%= icon("edit", library: "tabler", "aria-hidden": true) %> Edit
+ <% end %>
- <%= button_to 'Destroy', event_path(@event), method: :delete, form: { data: { confirm: 'Delete this event?' }, class: 'button_to destructive' } %>
+ <%= button_to event_path(@event), method: :delete, form: { data: { confirm: 'Delete this event?' }, class: 'button_to destructive' } do %>
+ <%= icon("trash", library: "tabler", "aria-hidden": true) %> Destroy
+ <% end %>
diff --git a/app/views/events/without_node.html.erb b/app/views/events/without_node.html.erb
index 52514ab..bb27173 100644
--- a/app/views/events/without_node.html.erb
+++ b/app/views/events/without_node.html.erb
@@ -1,7 +1,9 @@
Events without a node
<%= link_to '← All events', events_path %>
-<%= link_to 'New event', new_event_path, class: 'action_button' %>
+<%= link_to new_event_path, class: 'action_button' do %>
+ <%= icon("plus", library: "tabler", "aria-hidden": true) %> Create event
+<% end %>
<%= will_paginate @events %>
diff --git a/app/views/menu_items/index.html.erb b/app/views/menu_items/index.html.erb
index e84199b..591eb68 100644
--- a/app/views/menu_items/index.html.erb
+++ b/app/views/menu_items/index.html.erb
@@ -1,6 +1,8 @@
Menu Items
-<%= link_to 'New menu item', new_menu_item_path, class: 'action_button' %>
+<%= link_to new_menu_item_path, class: 'action_button' do %>
+ <%= icon("plus", library: "tabler", "aria-hidden": true) %> Create menu item
+<% end %>
diff --git a/app/views/pages/index.html.erb b/app/views/pages/index.html.erb
index 05c7311..da67871 100644
--- a/app/views/pages/index.html.erb
+++ b/app/views/pages/index.html.erb
@@ -12,7 +12,9 @@
<%=h page.title %> |
<%= link_to 'Show', content_path(:page_path => page.node.unique_path) %> |
<%= link_to 'Edit', edit_page_path(page) %> |
- <%= button_to 'Destroy', page, method: :delete, form: { data: { confirm: 'Are you sure?' } } %> |
+ <%= button_to page, method: :delete, form: { data: { confirm: 'Are you sure?' }, class: 'button_to destructive' } do %>
+ <%= icon("trash", library: "tabler", "aria-hidden": true) %> Destroy
+ <% end %> |
<% end %>
diff --git a/app/views/revisions/diff.html.erb b/app/views/revisions/diff.html.erb
index b9ce6bd..5638b7a 100644
--- a/app/views/revisions/diff.html.erb
+++ b/app/views/revisions/diff.html.erb
@@ -49,10 +49,12 @@
<% end %>
<% if !@locked_by_other && (@node.autosave || @node.draft) %>
- <%= button_to (@node.draft && !@node.autosave ? 'Destroy Draft' : 'Discard Autosave'),
- revert_node_path(@node), method: :put,
- params: { return_to: request.fullpath },
- form: { data: { confirm: "This cannot be undone. Continue?" }, class: 'button_to destructive' } %>
+ <%= button_to revert_node_path(@node), method: :put,
+ params: { return_to: request.fullpath },
+ form: { data: { confirm: "This cannot be undone. Continue?" }, class: 'button_to destructive' } do %>
+ <%= icon("trash", library: "tabler", "aria-hidden": true) %>
+ <%= @node.draft && !@node.autosave ? "Destroy Draft" : "Discard Autosave" %>
+ <% end %>
<% end %>
<% end %>
diff --git a/app/views/users/_user.html.erb b/app/views/users/_user.html.erb
index 798b82b..3a88f5e 100644
--- a/app/views/users/_user.html.erb
+++ b/app/views/users/_user.html.erb
@@ -7,9 +7,10 @@
<%= link_to "edit", edit_user_path(user) %>
- <%= button_to "destroy", user_path(user),
- method: :delete,
- form: { data: { confirm: "Do you really want to delete user #{user.login}?" }, class: 'button_to destructive' } %>
+ <%= button_to user_path(user), method: :delete,
+ form: { data: { confirm: "Do you really want to destroy user #{user.login}?" }, class: 'button_to destructive' } do %>
+ <%= icon("trash", library: "tabler", "aria-hidden": true) %> Destroy
+ <% end %>
|
<% end %>
diff --git a/app/views/users/index.html.erb b/app/views/users/index.html.erb
index 46e958b..4f5266d 100644
--- a/app/views/users/index.html.erb
+++ b/app/views/users/index.html.erb
@@ -1,5 +1,7 @@
Admins
-<%= link_to 'New admin user', new_user_path(admin: true), class: 'action_button' %>
+<%= link_to new_user_path(admin: true), class: 'action_button' do %>
+ <%= icon("plus", library: "tabler", "aria-hidden": true) %> Create admin user
+<% end %>
Users
-<%= link_to 'New user', new_user_path, class: 'action_button' %>
+<%= link_to new_user_path, class: 'action_button' do %>
+ <%= icon("plus", library: "tabler", "aria-hidden": true) %> Create user
+<% end %>