@raketa-cloud/admin 1.8.7 → 1.8.8

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 (120) hide show
  1. package/dist/application.css +0 -4
  2. package/package.json +1 -1
  3. package/src/HonoAdapter.js +9 -22
  4. package/src/index.js +0 -3
  5. package/src/routeCategoriesModule.js +1 -1
  6. package/src/routeCollection.js +15 -8
  7. package/src/routeNestedCollection.js +1 -1
  8. package/src/routeNestedMember.js +1 -1
  9. package/src/routeResource.js +19 -21
  10. package/src/routeStandard.js +6 -6
  11. package/src/tests/HonoAdapter.coverage.test.js +15 -25
  12. package/src/tests/routeCategoriesModule.test.js +2 -2
  13. package/src/tests/routeResource.test.js +12 -37
  14. package/src/tests/routeStandard.test.js +13 -13
  15. package/src/views/_shared/_date_fields_input.ejs +13 -0
  16. package/src/views/{page_revisions → resource_revisions}/general/_form.ejs +1 -0
  17. package/src/views/{pages → resources}/_form.ejs +1 -0
  18. package/src/views/{pages → resources}/history/index.ejs +1 -1
  19. package/src/views/{articles → resources}/index.ejs +6 -0
  20. package/src/views/{pages → resources}/show.ejs +7 -7
  21. package/src/views/{articles → resources}/translations/create_form.ejs +2 -2
  22. package/src/routeArticlesModule.js +0 -15
  23. package/src/routeEventsModule.js +0 -15
  24. package/src/routePagesModule.js +0 -15
  25. package/src/tests/routeArticlesModule.test.js +0 -43
  26. package/src/tests/routeEventsModule.test.js +0 -43
  27. package/src/tests/routePagesModule.test.js +0 -43
  28. package/src/views/article_revisions/_nav.ejs +0 -53
  29. package/src/views/article_revisions/general/_form.ejs +0 -18
  30. package/src/views/article_revisions/tags/edit_form.ejs +0 -16
  31. package/src/views/articles/_form.ejs +0 -45
  32. package/src/views/articles/_shared/history_table.ejs +0 -74
  33. package/src/views/articles/deletes/create_form.ejs +0 -68
  34. package/src/views/articles/history/index.ejs +0 -80
  35. package/src/views/articles/show.ejs +0 -222
  36. package/src/views/articles/urls/create_form.ejs +0 -36
  37. package/src/views/event_revisions/codes/_form.ejs +0 -14
  38. package/src/views/event_revisions/codes/edit_form.ejs +0 -16
  39. package/src/views/event_revisions/general/_form.ejs +0 -20
  40. package/src/views/event_revisions/general/edit_form.ejs +0 -16
  41. package/src/views/event_revisions/locks/_form.ejs +0 -11
  42. package/src/views/event_revisions/locks/create_form.ejs +0 -27
  43. package/src/views/event_revisions/meta/_form.ejs +0 -16
  44. package/src/views/event_revisions/meta/edit_form.ejs +0 -16
  45. package/src/views/event_revisions/publishes/_form.ejs +0 -77
  46. package/src/views/event_revisions/publishes/create_form.ejs +0 -9
  47. package/src/views/event_revisions/tags/_form.ejs +0 -13
  48. package/src/views/event_revisions/tags/edit_form.ejs +0 -16
  49. package/src/views/event_revisions/visuals/_form.ejs +0 -13
  50. package/src/views/event_revisions/visuals/edit_form.ejs +0 -16
  51. package/src/views/events/_form.ejs +0 -47
  52. package/src/views/events/_shared/_addons.ejs +0 -0
  53. package/src/views/events/_shared/_export_button.ejs +0 -9
  54. package/src/views/events/_shared/_history_toolbar.ejs +0 -24
  55. package/src/views/events/_shared/_revision_operator.ejs +0 -8
  56. package/src/views/events/_shared/_revision_toolbar.ejs +0 -68
  57. package/src/views/events/_shared/_title.ejs +0 -14
  58. package/src/views/events/_shared/_toolbar.ejs +0 -45
  59. package/src/views/events/_shared/history_table.ejs +0 -74
  60. package/src/views/events/create_form.ejs +0 -9
  61. package/src/views/events/deletes/create_form.ejs +0 -68
  62. package/src/views/events/history/index.ejs +0 -80
  63. package/src/views/events/index.ejs +0 -190
  64. package/src/views/events/show.ejs +0 -222
  65. package/src/views/events/translations/_translation_toolbar.ejs +0 -18
  66. package/src/views/events/translations/create_form.ejs +0 -75
  67. package/src/views/events/translations/index.ejs +0 -39
  68. package/src/views/events/urls/create_form.ejs +0 -36
  69. package/src/views/page_revisions/_nav.ejs +0 -53
  70. package/src/views/page_revisions/codes/_form.ejs +0 -14
  71. package/src/views/page_revisions/codes/edit_form.ejs +0 -16
  72. package/src/views/page_revisions/general/edit_form.ejs +0 -16
  73. package/src/views/page_revisions/locks/_form.ejs +0 -11
  74. package/src/views/page_revisions/locks/create_form.ejs +0 -27
  75. package/src/views/page_revisions/meta/_form.ejs +0 -16
  76. package/src/views/page_revisions/meta/edit_form.ejs +0 -16
  77. package/src/views/page_revisions/publishes/_form.ejs +0 -76
  78. package/src/views/page_revisions/publishes/create_form.ejs +0 -9
  79. package/src/views/page_revisions/tags/_form.ejs +0 -13
  80. package/src/views/page_revisions/visuals/_form.ejs +0 -13
  81. package/src/views/page_revisions/visuals/edit_form.ejs +0 -16
  82. package/src/views/pages/_shared/_addons.ejs +0 -0
  83. package/src/views/pages/_shared/_export_button.ejs +0 -9
  84. package/src/views/pages/_shared/_history_toolbar.ejs +0 -24
  85. package/src/views/pages/_shared/_revision_operator.ejs +0 -8
  86. package/src/views/pages/_shared/_revision_toolbar.ejs +0 -68
  87. package/src/views/pages/_shared/_title.ejs +0 -14
  88. package/src/views/pages/_shared/_toolbar.ejs +0 -45
  89. package/src/views/pages/create_form.ejs +0 -9
  90. package/src/views/pages/index.ejs +0 -185
  91. package/src/views/pages/translations/_translation_toolbar.ejs +0 -18
  92. package/src/views/pages/translations/create_form.ejs +0 -75
  93. package/src/views/pages/translations/index.ejs +0 -39
  94. /package/src/views/{event_revisions → resource_revisions}/_nav.ejs +0 -0
  95. /package/src/views/{article_revisions → resource_revisions}/codes/_form.ejs +0 -0
  96. /package/src/views/{article_revisions → resource_revisions}/codes/edit_form.ejs +0 -0
  97. /package/src/views/{article_revisions → resource_revisions}/general/edit_form.ejs +0 -0
  98. /package/src/views/{article_revisions → resource_revisions}/locks/_form.ejs +0 -0
  99. /package/src/views/{article_revisions → resource_revisions}/locks/create_form.ejs +0 -0
  100. /package/src/views/{article_revisions → resource_revisions}/meta/_form.ejs +0 -0
  101. /package/src/views/{article_revisions → resource_revisions}/meta/edit_form.ejs +0 -0
  102. /package/src/views/{article_revisions → resource_revisions}/publishes/_form.ejs +0 -0
  103. /package/src/views/{article_revisions → resource_revisions}/publishes/create_form.ejs +0 -0
  104. /package/src/views/{article_revisions → resource_revisions}/tags/_form.ejs +0 -0
  105. /package/src/views/{page_revisions → resource_revisions}/tags/edit_form.ejs +0 -0
  106. /package/src/views/{article_revisions → resource_revisions}/visuals/_form.ejs +0 -0
  107. /package/src/views/{article_revisions → resource_revisions}/visuals/edit_form.ejs +0 -0
  108. /package/src/views/{articles → resources}/_shared/_addons.ejs +0 -0
  109. /package/src/views/{articles → resources}/_shared/_export_button.ejs +0 -0
  110. /package/src/views/{articles → resources}/_shared/_history_toolbar.ejs +0 -0
  111. /package/src/views/{articles → resources}/_shared/_revision_operator.ejs +0 -0
  112. /package/src/views/{articles → resources}/_shared/_revision_toolbar.ejs +0 -0
  113. /package/src/views/{articles → resources}/_shared/_title.ejs +0 -0
  114. /package/src/views/{articles → resources}/_shared/_toolbar.ejs +0 -0
  115. /package/src/views/{pages → resources}/_shared/history_table.ejs +0 -0
  116. /package/src/views/{articles → resources}/create_form.ejs +0 -0
  117. /package/src/views/{pages → resources}/deletes/create_form.ejs +0 -0
  118. /package/src/views/{articles → resources}/translations/_translation_toolbar.ejs +0 -0
  119. /package/src/views/{articles → resources}/translations/index.ejs +0 -0
  120. /package/src/views/{pages → resources}/urls/create_form.ejs +0 -0
@@ -2,6 +2,7 @@
2
2
  <form action="<%= `/${_context.locale}/${_context.resourceConfig.resourceType}_revisions/${resource.id}/general` %>" method="POST" class="form">
3
3
  <%- f.field('resource.title', { required: true }) %>
4
4
  <%- f.field('resource.slug', { label: "URL", required: true, hint: "Only lowercase letters, numbers, slash and dash allowed. E.g: celebrate/friday-13" }) %>
5
+ <%- include('../../_shared/_date_fields_input.ejs', { f }) %>
5
6
  <%- f.field('resource.visibility', { as: 'select', required: true, options: visibilityOptions }) %>
6
7
 
7
8
  <%- include('../../_shared/_credentials_input.ejs', { f, visibilityFieldId: "f_resource_visibility"}) %>
@@ -4,6 +4,7 @@
4
4
 
5
5
  <%- f.field('resource.title', { required: true }) %>
6
6
  <%- f.field('resource.slug', { label: "URL", required: true, hint: "Only lowercase letters, numbers, slash and dash allowed. Ex: celebrate/friday-13" }) %>
7
+ <%- include('../_shared/_date_fields_input.ejs', { f }) %>
7
8
  <%- f.field('resource.visibility', { as: 'select', required: true, options: visibilityOptions }) %>
8
9
 
9
10
  <%- include('../_shared/_credentials_input.ejs', { f, visibilityFieldId: "f_resource_visibility"}) %>
@@ -1,7 +1,7 @@
1
1
  <div class="page-wrapper">
2
2
  <div class="page-title">
3
3
  <div>
4
- <h1 class="heading-1">Pages / History of changes</h1>
4
+ <h1 class="heading-1"><%= Inflector.humanize(Inflector.capitalize(_context.resourceConfig.resourceTypePlural)) %> / History of changes</h1>
5
5
  <span class="body-2 opacity-50"><%= %></span>
6
6
  </div>
7
7
 
@@ -15,12 +15,16 @@
15
15
  </div>
16
16
  </div>
17
17
 
18
+ <% const hasPublishAt = _context.resourceConfig.dateFields?.includes('publish_at'); %>
19
+
18
20
  <table class="data-grid">
19
21
  <thead>
20
22
  <tr>
21
23
  <th><%- sort_button("Title", "title", _context) %></th>
22
24
  <th>Visibility</th>
25
+ <% if (hasPublishAt) { %>
23
26
  <th><%- sort_button(`${Inflector.capitalize(_context.resourceConfig.resourceType)} post date`, "publish_at", _context) %></th>
27
+ <% } %>
24
28
  <th><%- sort_button("Last change", "updated_at", _context) %></th>
25
29
  <th>Translations</th>
26
30
  </tr>
@@ -77,9 +81,11 @@
77
81
  </div>
78
82
  </td>
79
83
 
84
+ <% if (hasPublishAt) { %>
80
85
  <td>
81
86
  <time data-pretty-date datetime="<%= item.settings.publish_at %>"><%= utils.formattedDate(item.settings.publish_at) %></time>
82
87
  </td>
88
+ <% } %>
83
89
 
84
90
  <td>
85
91
  <div class="body-3 text-raketa-foreground/50">
@@ -4,12 +4,12 @@
4
4
  <%- render_partial('./_shared/_toolbar.ejs') %>
5
5
  </div>
6
6
 
7
- <div class="flex flex-wrap items-center gap-1 mb-6 -mt-4">
7
+ <div class="flex flex-wrap items-center gap-1 mb-6 -my-4">
8
8
  <%
9
- const availableLocales = Object.keys(_context.locales);
10
- const totalPossibleTranslations = availableLocales.length - 1;
11
- const existingTranslationsCount = Object.keys(resource.translations).length;
12
- const canBeTranslated = existingTranslationsCount < totalPossibleTranslations;
9
+ const availableLocales = Object.keys(_context.locales);
10
+ const totalPossibleTranslations = availableLocales.length - 1;
11
+ const existingTranslationsCount = Object.keys(resource.translations).length;
12
+ const canBeTranslated = existingTranslationsCount < totalPossibleTranslations;
13
13
  %>
14
14
 
15
15
  <% Object.keys(_context.locales).forEach(key => { %>
@@ -215,8 +215,8 @@
215
215
  toolbarPath: './_shared/_history_toolbar.ejs'
216
216
  }) %>
217
217
 
218
- <a href="<%= `/${_context.locale}/${_context.resourceConfig.resourceTypePlural}/${resource.id}/history` %>" class="ml-2 btn-text">
218
+ <a href="<%= `/${_context.locale}/${_context.resourceConfig.resourceTypePlural}/${resource.id}/history` %>" class="my-8 ml-2 btn-text">
219
219
  Full page history
220
220
  </a>
221
221
  </div>
222
- </div>
222
+ </div>
@@ -59,13 +59,13 @@
59
59
  <path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" />
60
60
  </svg>
61
61
 
62
- <h3 class="heading-3">Translating articles</h3>
62
+ <h3 class="heading-3">Translating <%= Inflector.downcase(_context.resourceConfig.resourceTypePlural) %></h3>
63
63
  </div>
64
64
 
65
65
  <div class="markdown">
66
66
  <ol>
67
67
  <li>Select multiple locales to initiate bulk translations.</li>
68
- <li>A private copy of the article will be automatically created for each selected language, with a new revision opened to facilitate the translation process.</li>
68
+ <li>A private copy of the <%= Inflector.downcase(_context.resourceConfig.resourceType) %> will be automatically created for each selected language, with a new revision opened to facilitate the translation process.</li>
69
69
  <li>On the next screen you'll see a list with quick links to transalte settings and widgets</li>
70
70
  </ol>
71
71
  </div>
@@ -1,15 +0,0 @@
1
- import routeResource from "./routeResource";
2
-
3
- function routeArticlesModule(
4
- adapter,
5
- resourceType = "article",
6
- resourceTypePlural = "articles",
7
- ) {
8
- return routeResource(adapter, resourceType, resourceTypePlural, {
9
- viewsType: "article",
10
- viewsTypePlural: "articles",
11
- dateFields: ["publish_at"],
12
- });
13
- }
14
-
15
- export default routeArticlesModule;
@@ -1,15 +0,0 @@
1
- import routeResource from "./routeResource";
2
-
3
- function routeEventsModule(
4
- adapter,
5
- resourceType = "event",
6
- resourceTypePlural = "events",
7
- ) {
8
- return routeResource(adapter, resourceType, resourceTypePlural, {
9
- viewsType: "event",
10
- viewsTypePlural: "events",
11
- dateFields: ["publish_at", "starts_at", "ends_at"],
12
- });
13
- }
14
-
15
- export default routeEventsModule;
@@ -1,15 +0,0 @@
1
- import routeResource from "./routeResource";
2
-
3
- function routePagesModule(
4
- adapter,
5
- resourceType = "page",
6
- resourceTypePlural = "pages",
7
- ) {
8
- return routeResource(adapter, resourceType, resourceTypePlural, {
9
- viewsType: "page",
10
- viewsTypePlural: "pages",
11
- dateFields: [],
12
- });
13
- }
14
-
15
- export default routePagesModule;
@@ -1,43 +0,0 @@
1
- import routeArticlesModule from "../routeArticlesModule";
2
- import routeResource from "../routeResource";
3
-
4
- jest.mock("../routeResource", () => jest.fn());
5
-
6
- describe("routeArticlesModule", () => {
7
- beforeEach(() => {
8
- routeResource.mockClear();
9
- });
10
-
11
- test("delegates to routeResource with default types and publish_at dateField", () => {
12
- const adapter = {};
13
-
14
- routeArticlesModule(adapter);
15
-
16
- expect(routeResource).toHaveBeenCalledWith(adapter, "article", "articles", {
17
- viewsType: "article",
18
- viewsTypePlural: "articles",
19
- dateFields: ["publish_at"],
20
- });
21
- });
22
-
23
- test("delegates to routeResource with custom types", () => {
24
- const adapter = {};
25
-
26
- routeArticlesModule(adapter, "post", "posts");
27
-
28
- expect(routeResource).toHaveBeenCalledWith(adapter, "post", "posts", {
29
- viewsType: "article",
30
- viewsTypePlural: "articles",
31
- dateFields: ["publish_at"],
32
- });
33
- });
34
-
35
- test("returns value of routeResource", () => {
36
- const adapter = {};
37
- routeResource.mockReturnValueOnce("ok");
38
-
39
- const result = routeArticlesModule(adapter);
40
-
41
- expect(result).toBe("ok");
42
- });
43
- });
@@ -1,43 +0,0 @@
1
- import routeEventsModule from "../routeEventsModule";
2
- import routeResource from "../routeResource";
3
-
4
- jest.mock("../routeResource", () => jest.fn());
5
-
6
- describe("routeEventsModule", () => {
7
- beforeEach(() => {
8
- routeResource.mockClear();
9
- });
10
-
11
- test("delegates to routeResource with default types and event dateFields", () => {
12
- const adapter = {};
13
-
14
- routeEventsModule(adapter);
15
-
16
- expect(routeResource).toHaveBeenCalledWith(adapter, "event", "events", {
17
- viewsType: "event",
18
- viewsTypePlural: "events",
19
- dateFields: ["publish_at", "starts_at", "ends_at"],
20
- });
21
- });
22
-
23
- test("delegates to routeResource with custom types", () => {
24
- const adapter = {};
25
-
26
- routeEventsModule(adapter, "meeting", "meetings");
27
-
28
- expect(routeResource).toHaveBeenCalledWith(adapter, "meeting", "meetings", {
29
- viewsType: "event",
30
- viewsTypePlural: "events",
31
- dateFields: ["publish_at", "starts_at", "ends_at"],
32
- });
33
- });
34
-
35
- test("returns value of routeResource", () => {
36
- const adapter = {};
37
- routeResource.mockReturnValueOnce("ok");
38
-
39
- const result = routeEventsModule(adapter);
40
-
41
- expect(result).toBe("ok");
42
- });
43
- });
@@ -1,43 +0,0 @@
1
- import routePagesModule from "../routePagesModule";
2
- import routeResource from "../routeResource";
3
-
4
- jest.mock("../routeResource", () => jest.fn());
5
-
6
- describe("routePagesModule", () => {
7
- beforeEach(() => {
8
- routeResource.mockClear();
9
- });
10
-
11
- test("delegates to routeResource with default types", () => {
12
- const adapter = {};
13
-
14
- routePagesModule(adapter);
15
-
16
- expect(routeResource).toHaveBeenCalledWith(adapter, "page", "pages", {
17
- viewsType: "page",
18
- viewsTypePlural: "pages",
19
- dateFields: [],
20
- });
21
- });
22
-
23
- test("delegates to routeResource with custom types", () => {
24
- const adapter = {};
25
-
26
- routePagesModule(adapter, "landing", "landings");
27
-
28
- expect(routeResource).toHaveBeenCalledWith(adapter, "landing", "landings", {
29
- viewsType: "page",
30
- viewsTypePlural: "pages",
31
- dateFields: [],
32
- });
33
- });
34
-
35
- test("returns value of routeResource", () => {
36
- const adapter = {};
37
- routeResource.mockReturnValueOnce("ok");
38
-
39
- const result = routePagesModule(adapter);
40
-
41
- expect(result).toBe("ok");
42
- });
43
- });
@@ -1,53 +0,0 @@
1
- <% if (_context.query?.success) { %>
2
- <div class="mb-6 text-emerald-600">Settings saved successfully.</div>
3
- <% } %>
4
-
5
- <%
6
- const activeClass = "relative top-0.5 px-4 border-b-2 border-raketa-primary pb-4";
7
- const inactiveClass = "relative top-0.5 px-4 border-b-2 border-transparent pb-4";
8
- %>
9
-
10
- <div class="flex gap-4 w-full pb-4">
11
- <div class="flex items-center justify-between mb-4">
12
- <div class="flex items-center border-b-2">
13
- <div class=" <%= active === 'general' ? activeClass : inactiveClass %>">
14
- <a href="<%= `/${_context.locale}/${_context.resourceConfig.resourceType}_revisions/${resource.id}/general/edit` %>" class="text-raketa-primary font-semibold">
15
- General
16
- </a>
17
- </div>
18
-
19
- <div class="<%= active === 'visuals' ? activeClass : inactiveClass %>">
20
- <a href="<%= `/${_context.locale}/${_context.resourceConfig.resourceType}_revisions/${resource.id}/visuals/edit` %>" class="text-raketa-primary font-semibold">
21
- Visuals
22
- </a>
23
- </div>
24
-
25
- <div class="<%= active === 'codes' ? activeClass : inactiveClass %>">
26
- <a href="<%= `/${_context.locale}/${_context.resourceConfig.resourceType}_revisions/${resource.id}/codes/edit` %>" class="text-raketa-primary font-semibold">
27
- Code customizations
28
- </a>
29
- </div>
30
-
31
- <div class="<%= active === 'meta' ? activeClass : inactiveClass %>">
32
- <a href="<%= `/${_context.locale}/${_context.resourceConfig.resourceType}_revisions/${resource.id}/meta/edit` %>" class="text-raketa-primary font-semibold">
33
- Open graph & meta tags
34
- </a>
35
- </div>
36
-
37
- <div class="<%= active === 'tags' ? activeClass : inactiveClass %>">
38
- <a href="<%= `/${_context.locale}/${_context.resourceConfig.resourceType}_revisions/${resource.id}/tags/edit` %>" class="text-raketa-primary font-semibold">
39
- Content tags
40
- </a>
41
- </div>
42
- </div>
43
- </div>
44
-
45
- <div>
46
- <a href="/remote/login?redirect_to=/<%= _context.locale %>/admin/<%= _context.resourceConfig.resourceType %>-revisions/<%= resource.id %>/builder" class="btn-secondary has-icon <%= resource.meta && resource.meta.locked ? 'cursor-not-allowed text-gray-400 pointer-events-none' : '' %>">
47
- <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
48
- <path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" />
49
- </svg>
50
- Edit content
51
- </a>
52
- </div>
53
- </div>
@@ -1,18 +0,0 @@
1
- <% form_for({ resource }, errors, (f) => { %>
2
- <form action="<%= `/${_context.locale}/${_context.resourceConfig.resourceType}_revisions/${resource.id}/general` %>" method="POST" class="form">
3
- <%- f.field('resource.title', { required: true }) %>
4
- <%- f.field('resource.slug', { label: "URL", required: true, hint: "Only lowercase letters, numbers and dash allowed. E.g: celebrate-friday-13" }) %>
5
- <%- f.field('resource.settings.publish_at', { required: true, type: 'date', label: `${Inflector.capitalize(_context.resourceConfig.resourceType)} post date` }) %>
6
- <%- f.field('resource.visibility', { as: 'select', required: true, options: visibilityOptions }) %>
7
-
8
- <%- include('../../_shared/_credentials_input.ejs', { f, visibilityFieldId: "f_resource_visibility"}) %>
9
-
10
- <div class="form-actions">
11
- <div class="btn-toolbar">
12
- <%- f.submit('Save', { class: 'btn-primary' }) %>
13
- <%- f.submit('Save and publish', { class: 'btn-secondary', name: '_next', value: 'publish' }) %>
14
- <a href="<%= `/${_context.locale}/${_context.resourceConfig.resourceTypePlural}/${resource.originalId}` %>" class="btn-text">Back</a>
15
- </div>
16
- </div>
17
- </form>
18
- <% }) %>
@@ -1,16 +0,0 @@
1
- <div class="page-wrapper">
2
- <div class="page-title">
3
- <h1 class="heading-1">
4
- <span class="opacity-50">Tags / </span>
5
- <%= resource.title %>
6
- </h1>
7
- </div>
8
-
9
- <%- render_partial('../_nav.ejs', { resource, active: 'tags' }) %>
10
-
11
- <div class="grid gap-4 md:grid-cols-3">
12
- <div>
13
- <%- render_partial('_form.ejs', { tags: tags }) %>
14
- </div>
15
- </div>
16
- </div>
@@ -1,45 +0,0 @@
1
- <% form_for({ resource }, errors, (f) => { %>
2
- <form action="<%= resource?.id ? `/${_context.locale}/${_context.resourceConfig.resourceTypePlural}/${resource.id}` : `/${_context.locale}/${_context.resourceConfig.resourceTypePlural}` %>" method="post" class="form">
3
- <h2 class="mb-4 heading-2">General</h2>
4
-
5
- <%- f.field('resource.title', { required: true }) %>
6
- <%- f.field('resource.slug', { label: "URL", required: true, hint: "Only lowercase letters, numbers and dash allowed. Ex: celebrate-friday-13" }) %>
7
- <%- f.field('resource.settings.publish_at', { required: true, type: 'date', label: `${Inflector.capitalize(_context.resourceConfig.resourceType)} post date` }) %>
8
- <%- f.field('resource.visibility', { as: 'select', required: true, options: visibilityOptions }) %>
9
-
10
- <%- include('../_shared/_credentials_input.ejs', { f, visibilityFieldId: "f_resource_visibility"}) %>
11
-
12
- <h2 class="my-4 heading-2">Visuals</h2>
13
-
14
- <%- include('../_shared/_layout_input.ejs', { f }) %>
15
-
16
- <h2 class="my-4 heading-2">OpenGraph & Meta tags</h2>
17
-
18
- <%- f.field('resource.settings.meta.title', { required: true, label: "Meta title", hint: "Used for both meta and OpenGraph" }) %>
19
- <%- f.field('resource.settings.meta.description', { as: "textarea", required: true, label: "Meta description", hint: "Used for both meta and OpenGraph" }) %>
20
-
21
- <raketa-image-picker name="resource[settings][meta][image]" value="<%= JSON.stringify(resource.settings?.meta?.image || {}) %>" label="OpenGraph image"></raketa-image-picker>
22
-
23
- <h2 class="my-4 heading-2">Content tags</h2>
24
-
25
- <%- f.field('resource.tags', { as: 'checkbox_group', options: tags.map(tag => [tag.id, tag.name]) }) %>
26
-
27
- <div class="form-actions">
28
- <div class="btn-toolbar">
29
- <%- f.submit('Save record', { class: 'btn-primary' }) %>
30
-
31
- <a href="<%= `/${_context.locale}/${_context.resourceConfig.resourceTypePlural}` %>" class="btn-secondary">Back to list</a>
32
- </div>
33
-
34
- <% if (resource?.id) {%>
35
- <button hx-delete="<%= `/${_context.locale}/${_context.resourceConfig.resourceTypePlural}/${resource.id}` %>" hx-confirm="Are you sure?" class="btn-danger has-icon">
36
- <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
37
- <path stroke-linecap="round" stroke-linejoin="round" d="m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0" />
38
- </svg>
39
-
40
- Delete record
41
- </button>
42
- <% } %>
43
- </div>
44
- </form>
45
- <% }) %>
@@ -1,74 +0,0 @@
1
- <% if (changes && changes.list.length > 0) { %>
2
- <% const maxVersion = history.getMaxVersion(changes); %>
3
-
4
- <div class="mb-4 history-table-wrapper">
5
- <table class="data-grid">
6
- <thead>
7
- <tr>
8
- <th>#</th>
9
- <th>Date of change</th>
10
- <th>Editor</th>
11
- <th>Action</th>
12
- <th>Reason</th>
13
- <th>&nbsp;</th>
14
- </tr>
15
- </thead>
16
-
17
- <tbody>
18
- <% changes.list.forEach((change)=> { %>
19
- <tr class="border-b border-mono-25">
20
- <td class="py-4 pl-2">
21
- <div class="flex items-center gap-2">
22
- <%= change.version %>
23
- </div>
24
- </td>
25
-
26
- <td class="whitespace-nowrap">
27
- <div class="body-3 text-raketa-foreground/50">
28
- <div class="flex items-center gap-1">
29
- <time data-pretty-datetime datetime="<%= change.insertedAt %>"><%= utils.formattedDateTime(change.insertedAt) %></time>
30
- </div>
31
- </div>
32
- </td>
33
-
34
- <td class="whitespace-nowrap">
35
- <div class="body-3 text-raketa-foreground/50">
36
- <div class="flex items-center gap-1" title="<%= change.operatorMeta.name %>">
37
- <% if (change.operatorMeta.avatar) { %>
38
- <img src="<%= change.operatorMeta.avatar %>" class="rounded-full size-4">
39
- <% } %>
40
-
41
- <%= change.operatorMeta.name %>
42
- </div>
43
- </div>
44
- </td>
45
-
46
- <td class="py-4 pl-2">
47
- <div class="flex items-center gap-2">
48
- <%= history.changeAction(change, _context.resourceConfig.resourceType) %>
49
- </div>
50
- </td>
51
-
52
- <td class="py-4 pl-2">
53
- <div class="flex items-center gap-2">
54
- <%= history.changeReason(change) %>
55
- </div>
56
- </td>
57
-
58
- <td>
59
- <%- render_partial(toolbarPath, { maxVersion, change }) %>
60
- </td>
61
- </tr>
62
- <% }); %>
63
- </tbody>
64
- </table>
65
-
66
- <% if (!skipPagination) { %>
67
- <%- pagination(changes.pagination, _context) %>
68
- <% } %>
69
- </div>
70
- <% } else { %>
71
- <div class="history-table-wrapper mb-4">
72
- <p class="text-center py-4">No changes, yet.</p>
73
- </div>
74
- <% } %>
@@ -1,68 +0,0 @@
1
- <div class="page-wrapper">
2
- <div class="page-title">
3
- <h1 class="heading-1">
4
- <span class="opacity-50">Delete / </span>
5
- <%= record.title %>
6
- </h1>
7
- </div>
8
-
9
- <div class="grid gap-4 md:grid-cols-3">
10
- <div>
11
- <% form_for({ resource }, errors, (f) => { %>
12
- <form action="<%= `/${_context.locale}/${_context.resourceConfig.resourceTypePlural}/${resource.id}/deletes` %>" method="POST" class="form">
13
- <%- f.field('resource.redirect', { as: 'select', required: true,options: [['301', '301: Redirect to another page'], ['404', '404: Return an error'],['410', '410: Inform Google to remove the content from its index']] }) %>
14
- <%- f.field('resource.destination', {label: 'Destination URL', required: true}) %>
15
-
16
- <div class="form-actions">
17
- <div class="btn-toolbar">
18
- <%- f.submit('Proceed', { class: 'btn-primary' }) %>
19
- <a href="<%=`/${_context.locale}/${_context.resourceConfig.resourceTypePlural}/${resource.id}`%>" class="btn-secondary">Back</a>
20
- </div>
21
- </div>
22
- </form>
23
- <% }) %>
24
- </div>
25
-
26
- <div>
27
- <div class="help">
28
- <div class="mb-2 flex items-center gap-1">
29
- <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
30
- <path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" />
31
- </svg>
32
-
33
- <h3 class="heading-3">How to safely retire a page?</h3>
34
- </div>
35
-
36
- <div class="markdown">
37
- <p>Warning: Deleting a page can break existing links. To mitigate this, choose one of these options:</p>
38
-
39
- <ol>
40
- <li>Create a redirect to another page</li>
41
- <li>Set a 410 response to signal Google to remove the page from its index</li>
42
- <li>Use a 404 response only if absolutely certain</li>
43
- </ol>
44
-
45
- <p>In all cases, the current content will be deleted and forgotten like tears in rain — a moment lost in time. You might also consider changing the visibility of the page to private, which will preserve the content but hide it from end users.</p>
46
- </div>
47
- </div>
48
- </div>
49
- </div>
50
- </div>
51
-
52
- <script>
53
- function onDestinationChange(event) {
54
- const newValue = event.target.value;
55
- const requiresRedirect = newValue === "301"
56
-
57
- document.getElementById("f_resource_destination").parentElement.style.display = requiresRedirect ? "block" : "none";
58
- document.getElementById("f_resource_destination").required = requiresRedirect;
59
- }
60
-
61
- onDestinationChange({
62
- target: {
63
- value: '<%= resource.redirect %>'
64
- }
65
- })
66
-
67
- document.getElementById("f_resource_redirect").addEventListener("change", onDestinationChange)
68
- </script>
@@ -1,80 +0,0 @@
1
- <div class="page-wrapper">
2
- <div class="page-title">
3
- <div>
4
- <h1 class="heading-1">Articles / History of changes</h1>
5
- <span class="body-2 opacity-50"><%= %></span>
6
- </div>
7
-
8
- <div class="actions-toolbar">
9
- <a href="<%= `/${_context.locale}/${_context.resourceConfig.resourceTypePlural}/${resource.id}` %>" class="btn-text">Back</a>
10
- <button type="button" data-toggle-sidebar="1" class="p-2.5 rounded hover:bg-neutral-200 transition-all duration-300 ease-in-out dark:hover:bg-neutral-700">
11
- <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
12
- <path stroke-linecap="round" stroke-linejoin="round" d="m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z" />
13
- </svg>
14
- </button>
15
- </div>
16
- </div>
17
-
18
- <%- render_partial('../_shared/history_table.ejs', {
19
- changes,
20
- resource,
21
- _context,
22
- render_partial,
23
- skipPagination: false,
24
- toolbarPath: '../_shared/_history_toolbar.ejs'
25
- }) %>
26
-
27
- </div>
28
-
29
- <div data-sidebar="1" class="search-sidebar <%= Object.keys(_context.query).some(k => k.startsWith('f:')) ? '' : 'hidden' %>">
30
- <span class="heading-2">Search by</span>
31
-
32
- <form action="<%= `/${_context.locale}/${_context.resourceConfig.resourceTypePlural}/${resource.id}/history` %>" method="GET" class="form mt-4">
33
- <input type="hidden" name="order_direction" value="<%= _context.query.order_direction %>" />
34
- <input type="hidden" name="order_by" value="<%= _context.query.order_by %>" />
35
-
36
- <div class="mb-4">
37
- <label for="date_from" class="font-semibold hover:cursor-pointer body-3">From</label>
38
- <input type="date" name="f:date_from" value="<%= _context.query["f:date_from"] %>" />
39
- </div>
40
-
41
- <div class="mb-4">
42
- <label for="date_to" class="font-semibold hover:cursor-pointer body-3">To</label>
43
- <input type="date" name="f:date_to" value="<%= _context.query["f:date_to"] %>" />
44
- </div>
45
-
46
- <div class="mb-4">
47
- <%- f.field('f:operator', {
48
- as: 'select',
49
- options: editors.map(editor => [editor.id, editor.name]),
50
- label: "Editor",
51
- include_blank: 'All Editors',
52
- value: _context.query["f:operator"]
53
- }) %>
54
- </div>
55
-
56
- <div class="mb-4">
57
- <label for="" class="font-semibold hover:cursor-pointer body-3">Changes</label>
58
- <div class="checkbox-group mb-4">
59
- <% Object.entries(history.changeTypes(_context.resourceConfig.resourceType)).forEach(([key, {label}])=> { %>
60
- <div class="flex items-center gap-1">
61
- <% if (utils.includedInCollection(key, _context.query["f:change_type"])) { %>
62
- <input type="checkbox" name="f:change_type" id='change-<%= key %>' checked value="<%= key %>" class="hover:cursor-pointer">
63
- <% } else { %>
64
- <input type="checkbox" name="f:change_type" id='change-<%= key %>' value="<%= key %>" class="hover:cursor-pointer">
65
- <% } %>
66
- <label for='change-<%= key %>' class="body-2 hover:cursor-pointer">
67
- <%= label %>
68
- </label>
69
- </div>
70
- <% }); %>
71
- </div>
72
- </div>
73
-
74
- <div class="btn-toolbar">
75
- <button type="submit" class="btn-primary">Search</button>
76
- <a href="<%= `/${_context.locale}/${_context.resourceConfig.resourceTypePlural}/${resource.id}/history` %>" class="btn-text">Clear search</a>
77
- </div>
78
- </form>
79
- </div>
80
-