summaryrefslogtreecommitdiff
path: root/public
diff options
context:
space:
mode:
authorerdgeist <erdgeist@erdgeist.org>2026-07-31 22:36:17 +0200
committererdgeist <erdgeist@erdgeist.org>2026-07-31 22:36:17 +0200
commit529f81b28ed77c62acaa63fad957e751798f2440 (patch)
tree9d928cbe54008b1f75c4b813182970dd0757002c /public
parent3b4e1423635fd9f33ae760312e438cc1e484662e (diff)
Warn before the gate refuses, and check restore destinations
nodes#new marks the kinds that place under /updates, derived from each kind's own path_prefix. The three parent pickers mark candidates the current user cannot publish into; menu_search returns needs_redaktion per result, computed per user rather than as a bare restricted flag, and the menu-item picker opts out. restore_from_trash! checks its destination: the restore is the move, applied rather than staged, so no later publish would have caught it. The node returns as a draft either way.
Diffstat (limited to 'public')
-rw-r--r--public/javascripts/admin_search.js8
-rw-r--r--public/stylesheets/admin.css11
2 files changed, 19 insertions, 0 deletions
diff --git a/public/javascripts/admin_search.js b/public/javascripts/admin_search.js
index 792849f7..37b696e4 100644
--- a/public/javascripts/admin_search.js
+++ b/public/javascripts/admin_search.js
@@ -46,6 +46,7 @@ function initSearchPicker(options) {
46 var isActive = options.isActive; 46 var isActive = options.isActive;
47 var resultsHeaderHtml = options.resultsHeaderHtml; 47 var resultsHeaderHtml = options.resultsHeaderHtml;
48 var renderResults = options.renderResults; 48 var renderResults = options.renderResults;
49 var showRestricted = options.showRestricted;
49 var loadOnFocus = options.loadOnFocus; // optional, fires an initial search on focus with no term typed yet 50 var loadOnFocus = options.loadOnFocus; // optional, fires an initial search on focus with no term typed yet
50 var requestId = 0; 51 var requestId = 0;
51 var timeout; 52 var timeout;
@@ -75,6 +76,10 @@ function initSearchPicker(options) {
75 var anchor = $("<a>").attr("href", onSelect ? "#" : node.node_path); 76 var anchor = $("<a>").attr("href", onSelect ? "#" : node.node_path);
76 anchor.append(document.createTextNode(node.title || "")); 77 anchor.append(document.createTextNode(node.title || ""));
77 anchor.append($("<span>", { "class": "result_path" }).text(node.unique_name || "")); 78 anchor.append($("<span>", { "class": "result_path" }).text(node.unique_name || ""));
79 if (showRestricted && node.needs_redaktion) {
80 anchor.append($("<span>", { "class": "restricted_result" })
81 .text(ADMIN_STRINGS.needs_redaktion));
82 }
78 var link = $("<p>").append(anchor); 83 var link = $("<p>").append(anchor);
79 84
80 if (onSelect) { 85 if (onSelect) {
@@ -192,6 +197,7 @@ parent_search = {
192 initSearchPicker({ 197 initSearchPicker({
193 inputSelector: "#parent_search_term", 198 inputSelector: "#parent_search_term",
194 resultsSelector: "#parent_search_results", 199 resultsSelector: "#parent_search_results",
200 showRestricted: true,
195 onSelect: function(node) { 201 onSelect: function(node) {
196 $("#parent_search_term").val(node.title); 202 $("#parent_search_term").val(node.title);
197 $("#parent_id").val(node.node_id).attr("data-unique-name", node.unique_name); 203 $("#parent_id").val(node.node_id).attr("data-unique-name", node.unique_name);
@@ -248,6 +254,7 @@ move_to_search = {
248 initSearchPicker({ 254 initSearchPicker({
249 inputSelector: "#move_to_search_term", 255 inputSelector: "#move_to_search_term",
250 resultsSelector: "#move_to_search_results", 256 resultsSelector: "#move_to_search_results",
257 showRestricted: true,
251 onSelect: function(node) { 258 onSelect: function(node) {
252 $("#move_to_search_term").val(node.title); 259 $("#move_to_search_term").val(node.title);
253 $("#node_staged_parent_id").val(node.node_id); 260 $("#node_staged_parent_id").val(node.node_id);
@@ -261,6 +268,7 @@ restore_search = {
261 initSearchPicker({ 268 initSearchPicker({
262 inputSelector: "#restore_search_term", 269 inputSelector: "#restore_search_term",
263 resultsSelector: "#restore_search_results", 270 resultsSelector: "#restore_search_results",
271 showRestricted: true,
264 onSelect: function(node) { 272 onSelect: function(node) {
265 $("#restore_search_term").val(node.title); 273 $("#restore_search_term").val(node.title);
266 $("#parent_id").val(node.node_id); 274 $("#parent_id").val(node.node_id);
diff --git a/public/stylesheets/admin.css b/public/stylesheets/admin.css
index 55fdf15d..7f286705 100644
--- a/public/stylesheets/admin.css
+++ b/public/stylesheets/admin.css
@@ -889,6 +889,7 @@ div.layout_row_content {
889 font-weight: bold; 889 font-weight: bold;
890 color: var(--text-muted); 890 color: var(--text-muted);
891 cursor: not-allowed; 891 cursor: not-allowed;
892 line-height: 1.25rem;
892} 893}
893 894
894.info_group .disabled_action svg { 895.info_group .disabled_action svg {
@@ -973,6 +974,10 @@ form.button_to button[type="submit"] {
973 padding-bottom: 4px; 974 padding-bottom: 4px;
974} 975}
975 976
977.restricted_kind_hint {
978 color: var(--accent);
979}
980
976.action_button + .field_hint { 981.action_button + .field_hint {
977 display: inline; 982 display: inline;
978 margin-left: 0.5rem; 983 margin-left: 0.5rem;
@@ -1459,6 +1464,12 @@ input#menu_item_title {
1459 padding-bottom: 4px; 1464 padding-bottom: 4px;
1460} 1465}
1461 1466
1467.search_results .restricted_result {
1468 display: block;
1469 font-size: 0.85rem;
1470 color: var(--accent);
1471}
1472
1462.search_results p.search_more { 1473.search_results p.search_more {
1463 margin: 0; 1474 margin: 0;
1464 padding: 6px 4px; 1475 padding: 6px 4px;