pages_core 3.12.4 → 3.12.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/app/assets/builds/pages_core/admin-dist.js +8 -43
  4. data/app/assets/builds/pages_core/admin-dist.js.map +4 -4
  5. data/app/assets/builds/pages_core/admin.css +264 -133
  6. data/app/assets/stylesheets/pages_core/admin/components/attachments.css +3 -4
  7. data/app/assets/stylesheets/pages_core/admin/components/forms.css +17 -16
  8. data/app/assets/stylesheets/pages_core/admin/components/image_editor.css +8 -4
  9. data/app/assets/stylesheets/pages_core/admin/components/image_grid.css +1 -1
  10. data/app/assets/stylesheets/pages_core/admin/components/list_table.css +11 -3
  11. data/app/assets/stylesheets/pages_core/admin/components/modal.css +9 -5
  12. data/app/assets/stylesheets/pages_core/admin/components/page_tree.css +5 -1
  13. data/app/assets/stylesheets/pages_core/admin/components/toast.css +2 -2
  14. data/app/assets/stylesheets/pages_core/admin/controllers/pages.css +4 -2
  15. data/app/assets/stylesheets/pages_core/admin/vars.css +2 -1
  16. data/app/controllers/admin/calendars_controller.rb +2 -2
  17. data/app/controllers/admin/categories_controller.rb +3 -3
  18. data/app/controllers/admin/news_controller.rb +6 -6
  19. data/app/controllers/admin/pages_controller.rb +12 -11
  20. data/app/controllers/admin/users_controller.rb +1 -1
  21. data/app/controllers/concerns/pages_core/preview_pages_controller.rb +15 -17
  22. data/app/controllers/pages_core/admin_controller.rb +2 -2
  23. data/app/controllers/pages_core/base_controller.rb +1 -8
  24. data/app/controllers/pages_core/frontend/pages_controller.rb +13 -5
  25. data/app/controllers/pages_core/frontend_controller.rb +12 -7
  26. data/app/helpers/admin/menu_helper.rb +2 -0
  27. data/app/helpers/admin/pages_helper.rb +1 -4
  28. data/app/helpers/pages_core/admin/admin_helper.rb +0 -1
  29. data/app/helpers/pages_core/admin/content_tabs_helper.rb +9 -2
  30. data/app/helpers/pages_core/application_helper.rb +2 -3
  31. data/app/helpers/pages_core/frontend_helper.rb +1 -1
  32. data/app/helpers/pages_core/head_tags_helper.rb +15 -46
  33. data/app/helpers/pages_core/images_helper.rb +76 -21
  34. data/app/helpers/pages_core/locales_helper.rb +9 -0
  35. data/app/helpers/pages_core/open_graph_tags_helper.rb +3 -5
  36. data/app/helpers/pages_core/page_path_helper.rb +1 -1
  37. data/app/javascript/components/Attachments/Attachment.tsx +55 -52
  38. data/app/javascript/components/Attachments/AttachmentEditor.tsx +45 -50
  39. data/app/javascript/components/Attachments/Placeholder.tsx +1 -2
  40. data/app/javascript/components/Attachments.jsx +69 -57
  41. data/app/javascript/components/DateRangeSelect.jsx +94 -54
  42. data/app/javascript/components/EditableImage.tsx +20 -16
  43. data/app/javascript/components/FileUploadButton.tsx +12 -12
  44. data/app/javascript/components/ImageCropper/FocalPoint.tsx +22 -20
  45. data/app/javascript/components/ImageCropper/Image.tsx +20 -16
  46. data/app/javascript/components/ImageCropper/Toolbar.tsx +35 -27
  47. data/app/javascript/components/ImageCropper/useCrop.ts +105 -91
  48. data/app/javascript/components/ImageCropper.tsx +34 -25
  49. data/app/javascript/components/ImageEditor/Form.tsx +32 -43
  50. data/app/javascript/components/ImageEditor.tsx +29 -21
  51. data/app/javascript/components/ImageGrid/DragElement.tsx +6 -4
  52. data/app/javascript/components/ImageGrid/GridImage.tsx +56 -52
  53. data/app/javascript/components/ImageGrid/Placeholder.tsx +1 -1
  54. data/app/javascript/components/ImageGrid.jsx +132 -101
  55. data/app/javascript/components/ImageUploader.tsx +59 -55
  56. data/app/javascript/components/Modal.tsx +2 -4
  57. data/app/javascript/components/PageDates.jsx +25 -20
  58. data/app/javascript/components/PageFiles.jsx +7 -5
  59. data/app/javascript/components/PageImages.tsx +9 -7
  60. data/app/javascript/components/PageTree/Draggable.tsx +46 -40
  61. data/app/javascript/components/PageTree/Node.tsx +111 -95
  62. data/app/javascript/components/PageTree/types.ts +9 -9
  63. data/app/javascript/components/PageTree.tsx +44 -29
  64. data/app/javascript/components/RichTextArea.jsx +51 -37
  65. data/app/javascript/components/RichTextToolbarButton.tsx +8 -5
  66. data/app/javascript/components/TagEditor/AddTagForm.tsx +11 -10
  67. data/app/javascript/components/TagEditor/Tag.tsx +10 -8
  68. data/app/javascript/components/TagEditor.tsx +15 -10
  69. data/app/javascript/components/Toast.tsx +3 -7
  70. data/app/javascript/components/drag/draggedOrder.ts +16 -15
  71. data/app/javascript/components/drag/types.ts +12 -12
  72. data/app/javascript/components/drag/useDragCollection.ts +36 -42
  73. data/app/javascript/components/drag/useDragUploader.ts +3 -2
  74. data/app/javascript/components/drag.ts +5 -4
  75. data/app/javascript/controllers/LoginController.ts +0 -1
  76. data/app/javascript/controllers/MainController.ts +6 -2
  77. data/app/javascript/controllers/PageOptionsController.js +7 -2
  78. data/app/javascript/features/RichText.tsx +9 -7
  79. data/app/javascript/index.ts +5 -3
  80. data/app/javascript/lib/Tree.ts +27 -24
  81. data/app/javascript/lib/copyToClipboard.ts +5 -4
  82. data/app/javascript/lib/readyHandler.ts +4 -4
  83. data/app/javascript/lib/request.ts +7 -3
  84. data/app/javascript/stores/useModalStore.ts +3 -3
  85. data/app/javascript/stores/useToastStore.ts +14 -12
  86. data/app/javascript/types.ts +22 -22
  87. data/app/models/concerns/pages_core/page_model/templateable.rb +1 -1
  88. data/app/views/admin/calendars/show.html.erb +1 -1
  89. data/app/views/admin/news/index.html.erb +1 -1
  90. data/app/views/admin/pages/_edit_files.html.erb +1 -1
  91. data/app/views/admin/pages/_edit_images.html.erb +1 -1
  92. data/app/views/admin/pages/_list_item.html.erb +1 -1
  93. data/app/views/admin/pages/_search_bar.html.erb +1 -1
  94. data/app/views/admin/pages/deleted.html.erb +2 -2
  95. data/app/views/admin/pages/edit.html.erb +3 -3
  96. data/app/views/admin/pages/index.html.erb +4 -4
  97. data/app/views/admin/pages/new.html.erb +1 -1
  98. data/app/views/admin/pages/search.html.erb +3 -3
  99. data/app/views/feeds/pages.rss.builder +2 -2
  100. data/app/views/layouts/admin/_page_header.html.erb +4 -4
  101. data/app/views/layouts/admin.html.erb +1 -2
  102. data/config/locales/en.yml +1 -0
  103. data/lib/pages_core/pages_plugin.rb +5 -3
  104. data/lib/rails/generators/pages_core/frontend/templates/application.html.erb +15 -13
  105. data/lib/tasks/pages/reports.rake +26 -0
  106. metadata +32 -4
  107. data/app/helpers/pages_core/admin/deprecated_admin_helper.rb +0 -40
  108. data/app/views/pages_core/_google_analytics.html.erb +0 -8
@@ -25,8 +25,7 @@ function hideDraggable(draggable: Draggable | null, callback: () => void) {
25
25
  const result = callback();
26
26
  draggable.ref.current.style.display = prevDisplay;
27
27
  return result;
28
- }
29
- else {
28
+ } else {
30
29
  return callback();
31
30
  }
32
31
  }
@@ -36,67 +35,62 @@ function insertFiles(state: Draggable[], files: Draggable[]): Draggable[] {
36
35
  if (index === -1 || !files) {
37
36
  return state;
38
37
  } else {
39
- return [
40
- ...state.slice(0, index),
41
- ...files,
42
- ...state.slice(index + 1)
43
- ];
38
+ return [...state.slice(0, index), ...files, ...state.slice(index + 1)];
44
39
  }
45
40
  }
46
41
 
47
42
  function dragCollectionReducer(
48
- state: Draggable[], action: DragCollectionAction
43
+ state: Draggable[],
44
+ action: DragCollectionAction
49
45
  ): Draggable[] {
50
46
  switch (action.type) {
51
- case "append":
52
- return [...state, ...action.payload as Draggable[]];
53
- case "prepend":
54
- return [...action.payload as Draggable[], ...state];
55
- case "insertFiles":
56
- return insertFiles(state, action.payload);
57
- case "update":
58
- return state.map(d => {
59
- return (d.handle === action.payload.handle) ? action.payload : d;
60
- });
61
- case "updatePositions":
62
- return hideDraggable(action.payload, () => {
63
- return state.map(d => {
64
- return { ...d, rect: getPosition(d) };
47
+ case "append":
48
+ return [...state, ...(action.payload as Draggable[])];
49
+ case "prepend":
50
+ return [...(action.payload as Draggable[]), ...state];
51
+ case "insertFiles":
52
+ return insertFiles(state, action.payload);
53
+ case "update":
54
+ return state.map((d) => {
55
+ return d.handle === action.payload.handle ? action.payload : d;
65
56
  });
66
- });
67
- case "remove":
68
- return state.filter(d => d.handle !== action.payload.handle);
69
- case "replace":
70
- return action.payload;
71
- case "reorder":
72
- return action.payload;
73
- default:
74
- return state;
57
+ case "updatePositions":
58
+ return hideDraggable(action.payload, () => {
59
+ return state.map((d) => {
60
+ return { ...d, rect: getPosition(d) };
61
+ });
62
+ });
63
+ case "remove":
64
+ return state.filter((d) => d.handle !== action.payload.handle);
65
+ case "replace":
66
+ return action.payload;
67
+ case "reorder":
68
+ return action.payload;
69
+ default:
70
+ return state;
75
71
  }
76
72
  }
77
73
 
78
74
  export function createDraggable(record: Record<string, unknown>): Draggable {
79
- return { record: record,
80
- rect: null,
81
- ref: createRef(),
82
- handle: uniqueId("draggable") };
75
+ return {
76
+ record: record,
77
+ rect: null,
78
+ ref: createRef(),
79
+ handle: uniqueId("draggable")
80
+ };
83
81
  }
84
82
 
85
83
  export default function useDragCollection(
86
84
  records: DraggableRecord[]
87
85
  ): DragCollection {
88
86
  const containerRef = useRef<HTMLElement>(null);
89
- const [draggables, dispatch] = useReducer(
90
- dragCollectionReducer,
91
- [],
92
- () => records.map(r => createDraggable(r))
87
+ const [draggables, dispatch] = useReducer(dragCollectionReducer, [], () =>
88
+ records.map((r) => createDraggable(r))
93
89
  ) as [Draggables, (Draggables) => Draggable[]];
94
90
 
95
91
  useEffect(() => {
96
92
  dispatch({ type: "updatePositions" });
97
93
  }, []);
98
94
 
99
- return { ref: containerRef,
100
- draggables: draggables,
101
- dispatch: dispatch };
95
+ return { ref: containerRef, draggables: draggables, dispatch: dispatch };
102
96
  }
@@ -51,13 +51,14 @@ export default function useDragUploader(
51
51
  ) {
52
52
  const initialState: DragState = {
53
53
  dragging: false,
54
- x: null, y: null
54
+ x: null,
55
+ y: null
55
56
  };
56
57
 
57
58
  const [dragState, setDragState] = useState(initialState);
58
59
 
59
60
  const updatePositions = (dragging: Draggable | null) => {
60
- collections.forEach(c => {
61
+ collections.forEach((c) => {
61
62
  c.dispatch({ type: "updatePositions", payload: dragging });
62
63
  });
63
64
  };
@@ -1,7 +1,8 @@
1
1
  export { Draggable, DragState } from "./drag/types";
2
- export { default as useDragCollection,
3
- createDraggable } from "./drag/useDragCollection";
2
+ export {
3
+ default as useDragCollection,
4
+ createDraggable
5
+ } from "./drag/useDragCollection";
4
6
  export { default as useDragUploader } from "./drag/useDragUploader";
5
7
  export { default as useDraggable } from "./drag/useDraggable";
6
- export { default as draggedOrder,
7
- collectionOrder } from "./drag/draggedOrder";
8
+ export { default as draggedOrder, collectionOrder } from "./drag/draggedOrder";
@@ -13,7 +13,6 @@ export default class LoginController extends Controller {
13
13
  }
14
14
  }
15
15
 
16
-
17
16
  changeTab(evt: Event) {
18
17
  evt.preventDefault();
19
18
  if ("dataset" in evt.target && "tab" in evt.target.dataset) {
@@ -42,7 +42,11 @@ export default class MainController extends Controller {
42
42
  if ("dataset" in evt.target && "tab" in evt.target.dataset) {
43
43
  const tab = evt.target.dataset.tab as string;
44
44
  this.showTab(tab);
45
- history.pushState({ tabId: tab }, "", `${window.location.pathname}#${tab}`);
45
+ history.pushState(
46
+ { tabId: tab },
47
+ "",
48
+ `${window.location.pathname}#${tab}`
49
+ );
46
50
  }
47
51
  }
48
52
 
@@ -64,7 +68,7 @@ export default class MainController extends Controller {
64
68
  });
65
69
  }
66
70
 
67
- tabNames (): string[] {
71
+ tabNames(): string[] {
68
72
  return this.linkTargets.map((l) => l.dataset.tab);
69
73
  }
70
74
  }
@@ -2,7 +2,12 @@ import { Controller } from "@hotwired/stimulus";
2
2
 
3
3
  export default class PageOptionsController extends Controller {
4
4
  static get targets() {
5
- return ["advancedOptions", "autoPublishNotice", "published", "publishedDate"];
5
+ return [
6
+ "advancedOptions",
7
+ "autoPublishNotice",
8
+ "published",
9
+ "publishedDate"
10
+ ];
6
11
  }
7
12
 
8
13
  connect() {
@@ -32,7 +37,7 @@ export default class PageOptionsController extends Controller {
32
37
  };
33
38
  return new Date(
34
39
  lookup("year"),
35
- (lookup("month") - 1),
40
+ lookup("month") - 1,
36
41
  lookup("day"),
37
42
  lookup("hour"),
38
43
  lookup("minute")
@@ -4,27 +4,29 @@ import RichTextArea from "../components/RichTextArea";
4
4
  import readyHandler from "../lib/readyHandler";
5
5
 
6
6
  class RichText {
7
- apply () {
7
+ apply() {
8
8
  const elems = document.querySelectorAll("textarea.rich");
9
9
  elems.forEach((elem) => {
10
10
  this.enhance(elem);
11
11
  });
12
12
  }
13
13
 
14
- enhance (elem: HTMLTextAreaElement) {
14
+ enhance(elem: HTMLTextAreaElement) {
15
15
  const container = document.createElement("div");
16
16
  elem.parentNode.appendChild(container);
17
17
  createRoot(container).render(
18
- <RichTextArea value={elem.value}
19
- name={elem.name}
20
- rows={elem.rows}
21
- id={elem.id} />,
18
+ <RichTextArea
19
+ value={elem.value}
20
+ name={elem.name}
21
+ rows={elem.rows}
22
+ id={elem.id}
23
+ />,
22
24
  container
23
25
  );
24
26
  elem.parentNode.removeChild(elem);
25
27
  }
26
28
 
27
- start () {
29
+ start() {
28
30
  readyHandler.ready(() => {
29
31
  this.apply();
30
32
  });
@@ -16,7 +16,7 @@ export function registerComponent(name: string, component: FC) {
16
16
  window[name] = component;
17
17
  }
18
18
 
19
- export default function startPages () {
19
+ export default function startPages() {
20
20
  startRails();
21
21
  for (const name in Components) {
22
22
  registerComponent(name, Components[name] as FC);
@@ -35,5 +35,7 @@ export * from "./hooks";
35
35
  export * from "./stores";
36
36
 
37
37
  export * from "./lib/request";
38
- export { default as copyToClipboard,
39
- copySupported } from "./lib/copyToClipboard";
38
+ export {
39
+ default as copyToClipboard,
40
+ copySupported
41
+ } from "./lib/copyToClipboard";
@@ -54,19 +54,19 @@ export type TreeId = number | string;
54
54
  type MovePlacement = "before" | "after" | "prepend" | "append";
55
55
 
56
56
  export interface TreeNode {
57
- children: TreeNode[],
58
- collapsed: boolean
57
+ children: TreeNode[];
58
+ collapsed: boolean;
59
59
  }
60
60
 
61
61
  export interface TreeIndex<T extends TreeNode = TreeNode> {
62
- id: number,
63
- node: T,
64
- children: TreeIndex<T>[],
65
- parent: TreeIndex<T>
66
- next: TreeIndex<T> | null,
67
- prev: TreeIndex<T> | null,
68
- top: number,
69
- height: number
62
+ id: number;
63
+ node: T;
64
+ children: TreeIndex<T>[];
65
+ parent: TreeIndex<T>;
66
+ next: TreeIndex<T> | null;
67
+ prev: TreeIndex<T> | null;
68
+ top: number;
69
+ height: number;
70
70
  }
71
71
 
72
72
  function indexName(id: number | string): string {
@@ -114,13 +114,13 @@ export default class Tree<N extends TreeNode = TreeNode> {
114
114
  });
115
115
  parent.children = children;
116
116
 
117
- children.forEach(function(id, i) {
117
+ children.forEach(function (id, i) {
118
118
  const index = indexes[indexName(id)];
119
119
  if (i > 0) {
120
120
  index.prev = children[i - 1];
121
121
  }
122
- if (i < children.length-1) {
123
- index.next = children[i+1];
122
+ if (i < children.length - 1) {
123
+ index.next = children[i + 1];
124
124
  }
125
125
  });
126
126
  };
@@ -173,10 +173,10 @@ export default class Tree<N extends TreeNode = TreeNode> {
173
173
  const index = this.getIndex(id);
174
174
  index.prev = index.next = null;
175
175
  if (i > 0) {
176
- index.prev = children[i-1];
176
+ index.prev = children[i - 1];
177
177
  }
178
- if (i < children.length-1) {
179
- index.next = children[i+1];
178
+ if (i < children.length - 1) {
179
+ index.next = children[i + 1];
180
180
  }
181
181
  });
182
182
  }
@@ -213,7 +213,7 @@ export default class Tree<N extends TreeNode = TreeNode> {
213
213
  const destIndex = this.getIndex(destId);
214
214
  const parentId = destIndex.parent;
215
215
  const i = this.getIndex(parentId).children.indexOf(destId);
216
- return this.insert(obj, parentId, i+1);
216
+ return this.insert(obj, parentId, i + 1);
217
217
  }
218
218
 
219
219
  prepend(obj: N, destId: TreeId): TreeIndex<N> {
@@ -237,7 +237,10 @@ export default class Tree<N extends TreeNode = TreeNode> {
237
237
  root.left = left++;
238
238
 
239
239
  const walk = (
240
- children: TreeIndex<N>[], parent: TreeIndex<N>, left: number, collapsed: boolean
240
+ children: TreeIndex<N>[],
241
+ parent: TreeIndex<N>,
242
+ left: number,
243
+ collapsed: boolean
241
244
  ) => {
242
245
  let height = 1;
243
246
  children.forEach((id: TreeId) => {
@@ -254,7 +257,7 @@ export default class Tree<N extends TreeNode = TreeNode> {
254
257
  height += walk(
255
258
  node.children,
256
259
  node,
257
- left+1,
260
+ left + 1,
258
261
  collapsed || node.node.collapsed
259
262
  );
260
263
  } else {
@@ -263,7 +266,7 @@ export default class Tree<N extends TreeNode = TreeNode> {
263
266
  }
264
267
  });
265
268
 
266
- if(parent.node.collapsed) parent.height = 1;
269
+ if (parent.node.collapsed) parent.height = 1;
267
270
  else parent.height = height;
268
271
  return parent.height;
269
272
  };
@@ -285,9 +288,9 @@ export default class Tree<N extends TreeNode = TreeNode> {
285
288
  index = this.insertBefore(obj, toId);
286
289
  } else if (placement === "after") {
287
290
  index = this.insertAfter(obj, toId);
288
- } else if(placement === "prepend") {
291
+ } else if (placement === "prepend") {
289
292
  index = this.prepend(obj, toId);
290
- } else if(placement === "append") {
293
+ } else if (placement === "append") {
291
294
  index = this.append(obj, toId);
292
295
  }
293
296
 
@@ -305,9 +308,9 @@ export default class Tree<N extends TreeNode = TreeNode> {
305
308
 
306
309
  getNodeByTop(top) {
307
310
  const indexes = this.indexes;
308
- for(const id in indexes) {
311
+ for (const id in indexes) {
309
312
  if (Object.prototype.hasOwnProperty.call(indexes, id)) {
310
- if(indexes[id].top === top) {
313
+ if (indexes[id].top === top) {
311
314
  return indexes[id];
312
315
  }
313
316
  }
@@ -1,9 +1,10 @@
1
- export function copySupported () {
2
- return document.queryCommandSupported &&
3
- document.queryCommandSupported("copy");
1
+ export function copySupported() {
2
+ return (
3
+ document.queryCommandSupported && document.queryCommandSupported("copy")
4
+ );
4
5
  }
5
6
 
6
- export default function copyToClipboard (str: string) {
7
+ export default function copyToClipboard(str: string) {
7
8
  const el = document.createElement("textarea");
8
9
  el.value = str;
9
10
  document.body.appendChild(el);
@@ -4,18 +4,18 @@ const readyHandlers: ReadyHandlerFunc[] = [];
4
4
 
5
5
  const handleState = () => {
6
6
  if (["interactive", "complete"].indexOf(document.readyState) > -1) {
7
- while(readyHandlers.length > 0) {
8
- (readyHandlers.shift())();
7
+ while (readyHandlers.length > 0) {
8
+ readyHandlers.shift()();
9
9
  }
10
10
  }
11
11
  };
12
12
 
13
13
  class ReadyHandler {
14
- constructor () {
14
+ constructor() {
15
15
  document.onreadystatechange = handleState;
16
16
  }
17
17
 
18
- ready (handler: ReadyHandlerFunc) {
18
+ ready(handler: ReadyHandlerFunc) {
19
19
  readyHandlers.push(handler);
20
20
  handleState();
21
21
  }
@@ -9,9 +9,13 @@ export function csrfToken(): string {
9
9
  }
10
10
 
11
11
  function jsonFetchOptions() {
12
- return({ method: "POST",
13
- headers: { "Content-Type": "application/json; charset=utf-8",
14
- "X-CSRF-Token": csrfToken() } });
12
+ return {
13
+ method: "POST",
14
+ headers: {
15
+ "Content-Type": "application/json; charset=utf-8",
16
+ "X-CSRF-Token": csrfToken()
17
+ }
18
+ };
15
19
  }
16
20
 
17
21
  export async function postJson(url: string, data: Record<string, unknown>) {
@@ -1,9 +1,9 @@
1
1
  import { create } from "zustand";
2
2
 
3
3
  interface ModalState {
4
- component: JSX.Element | null,
5
- open: (elem: JSX.Element) => void,
6
- close: () => void
4
+ component: JSX.Element | null;
5
+ open: (elem: JSX.Element) => void;
6
+ close: () => void;
7
7
  }
8
8
 
9
9
  const useModalStore = create<ModalState>((set) => ({
@@ -1,25 +1,27 @@
1
1
  import { create } from "zustand";
2
2
 
3
3
  export interface Toast {
4
- type: string,
5
- message: string
4
+ type: string;
5
+ message: string;
6
6
  }
7
7
 
8
8
  interface ToastState {
9
- toasts: Toast[],
10
- error: (msg: string) => void,
11
- notice: (msg: string) => void,
12
- next: () => void
9
+ toasts: Toast[];
10
+ error: (msg: string) => void;
11
+ notice: (msg: string) => void;
12
+ next: () => void;
13
13
  }
14
14
 
15
15
  const useToastStore = create<ToastState>((set) => ({
16
16
  toasts: [],
17
- error: (msg: string) => set((state) => (
18
- { toasts: [...state.toasts, { message: msg, type: "error" }] }
19
- )),
20
- notice: (msg: string) => set((state) => (
21
- { toasts: [...state.toasts, { message: msg, type: "notice" }] }
22
- )),
17
+ error: (msg: string) =>
18
+ set((state) => ({
19
+ toasts: [...state.toasts, { message: msg, type: "error" }]
20
+ })),
21
+ notice: (msg: string) =>
22
+ set((state) => ({
23
+ toasts: [...state.toasts, { message: msg, type: "notice" }]
24
+ })),
23
25
  next: () => set((state) => ({ toasts: state.toasts.slice(1) }))
24
26
  }));
25
27
 
@@ -1,30 +1,30 @@
1
1
  export interface Locale {
2
- name: string,
3
- dir: "ltr" | "rtl"
2
+ name: string;
3
+ dir: "ltr" | "rtl";
4
4
  }
5
5
 
6
6
  export interface AttachmentResource {
7
- id: number | null,
8
- name: Record<string, string>,
9
- description: Record<string, string>,
10
- url: string
7
+ id: number | null;
8
+ name: Record<string, string>;
9
+ description: Record<string, string>;
10
+ url: string;
11
11
  }
12
12
 
13
13
  export interface ImageResource {
14
- id: number | null,
15
- alternative: Record<string, string>,
16
- caption: Record<string, string>,
17
- content_type: string,
18
- filename: string,
19
- crop_start_x: number | null,
20
- crop_start_y: number | null,
21
- crop_width: number | null,
22
- crop_height: number | null,
23
- crop_gravity_x: number,
24
- crop_gravity_y: number,
25
- real_width: number,
26
- real_height: number,
27
- original_url: string,
28
- thumbnail_url: string
29
- uncropped_url: string
14
+ id: number | null;
15
+ alternative: Record<string, string>;
16
+ caption: Record<string, string>;
17
+ content_type: string;
18
+ filename: string;
19
+ crop_start_x: number | null;
20
+ crop_start_y: number | null;
21
+ crop_width: number | null;
22
+ crop_height: number | null;
23
+ crop_gravity_x: number;
24
+ crop_gravity_y: number;
25
+ real_width: number;
26
+ real_height: number;
27
+ original_url: string;
28
+ thumbnail_url: string;
29
+ uncropped_url: string;
30
30
  }
@@ -47,7 +47,7 @@ module PagesCore
47
47
  end
48
48
 
49
49
  def base_template
50
- template.split(/_/)
50
+ template.split("_")
51
51
  .reject { |w| %w[index list archive liste arkiv].include?(w) }
52
52
  .join(" ")
53
53
  end
@@ -14,7 +14,7 @@
14
14
  <% end %>
15
15
 
16
16
  <% content_for :sidebar do %>
17
- <%= render(partial: "sidebar", locals: { locale: @locale }) %>
17
+ <%= render(partial: "sidebar", locals: { locale: content_locale }) %>
18
18
  <% end %>
19
19
 
20
20
  <% if @pages.any? %>
@@ -17,7 +17,7 @@
17
17
  <% content_for :sidebar do %>
18
18
  <%= render(partial: "sidebar",
19
19
  locals: {
20
- locale: @locale,
20
+ locale: content_locale,
21
21
  category: @category,
22
22
  news_pages: @news_pages,
23
23
  archive_finder: @archive_finder
@@ -1,4 +1,4 @@
1
1
  <%= react_component("PageFiles",
2
- locale: @locale,
2
+ locale: content_locale,
3
3
  locales: locales_with_dir,
4
4
  records: @page.files.map { |pf| Admin::PageFileResource.new(pf).to_hash }) %>
@@ -1,4 +1,4 @@
1
1
  <%= react_component("PageImages",
2
- locale: @locale,
2
+ locale: content_locale,
3
3
  locales: locales_with_dir,
4
4
  records: @page.page_images.map { |pi| Admin::PageImageResource.new(pi).to_hash }) %>
@@ -8,7 +8,7 @@
8
8
  <td class="name">
9
9
  <%= link_to_if(policy(page).edit?,
10
10
  page_name(page),
11
- edit_admin_page_url(@locale, page),
11
+ edit_admin_page_url(content_locale, page),
12
12
  class: 'name_link') %>
13
13
  <%= autopublish_notice(page) %>
14
14
  </td>
@@ -1,5 +1,5 @@
1
1
  <% query ||= "" %>
2
- <%= form_tag(search_admin_pages_path(@locale),
2
+ <%= form_tag(search_admin_pages_path(content_locale),
3
3
  method: "get",
4
4
  class: "search-bar") do %>
5
5
  <%= text_field_tag(:q, query,
@@ -1,7 +1,7 @@
1
1
  <% content_for :page_title, "Deleted pages" %>
2
2
 
3
3
  <% content_for :page_description do %>
4
- <%= link_to("All pages", admin_pages_path(@locale)) %> /
4
+ <%= link_to("All pages", admin_pages_path(content_locale)) %> /
5
5
  Deleted pages
6
6
  <% end %>
7
7
 
@@ -22,7 +22,7 @@
22
22
  <td class="name">
23
23
  <%= link_to_if(policy(page).edit?,
24
24
  page_name(page),
25
- edit_admin_page_url(@locale, page),
25
+ edit_admin_page_url(content_locale, page),
26
26
  class: 'name_link') %>
27
27
  </td>
28
28
  <td>
@@ -9,11 +9,11 @@
9
9
  Editing
10
10
  <% @page.ancestors.reverse.each do |page| %>
11
11
  <%= link_to(page.name? ? page.name : tag.i("Untitled"),
12
- edit_admin_page_path(@locale, page)) %>
12
+ edit_admin_page_path(content_locale, page)) %>
13
13
  &raquo;
14
14
  <% end %>
15
15
  <%= link_to(@page.name? ? @page.name : tag.i("Untitled"),
16
- edit_admin_page_path(@locale, @page)) %>
16
+ edit_admin_page_path(content_locale, @page)) %>
17
17
  <% end %>
18
18
 
19
19
  <% content_for :page_description_links do %>
@@ -22,7 +22,7 @@
22
22
 
23
23
  <% content_for :main_wrapper do %>
24
24
  <%= form_for(@page,
25
- url: admin_page_url(@locale, @page),
25
+ url: admin_page_url(content_locale, @page),
26
26
  builder: PagesCore::Admin::FormBuilder,
27
27
  html: {
28
28
  class: "edit-page main-wrapper",