pages_core 3.12.4 → 3.12.5

Sign up to get free protection for your applications and to get access to all the features.
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",