@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.
- package/dist/application.css +0 -4
- package/package.json +1 -1
- package/src/HonoAdapter.js +9 -22
- package/src/index.js +0 -3
- package/src/routeCategoriesModule.js +1 -1
- package/src/routeCollection.js +15 -8
- package/src/routeNestedCollection.js +1 -1
- package/src/routeNestedMember.js +1 -1
- package/src/routeResource.js +19 -21
- package/src/routeStandard.js +6 -6
- package/src/tests/HonoAdapter.coverage.test.js +15 -25
- package/src/tests/routeCategoriesModule.test.js +2 -2
- package/src/tests/routeResource.test.js +12 -37
- package/src/tests/routeStandard.test.js +13 -13
- package/src/views/_shared/_date_fields_input.ejs +13 -0
- package/src/views/{page_revisions → resource_revisions}/general/_form.ejs +1 -0
- package/src/views/{pages → resources}/_form.ejs +1 -0
- package/src/views/{pages → resources}/history/index.ejs +1 -1
- package/src/views/{articles → resources}/index.ejs +6 -0
- package/src/views/{pages → resources}/show.ejs +7 -7
- package/src/views/{articles → resources}/translations/create_form.ejs +2 -2
- package/src/routeArticlesModule.js +0 -15
- package/src/routeEventsModule.js +0 -15
- package/src/routePagesModule.js +0 -15
- package/src/tests/routeArticlesModule.test.js +0 -43
- package/src/tests/routeEventsModule.test.js +0 -43
- package/src/tests/routePagesModule.test.js +0 -43
- package/src/views/article_revisions/_nav.ejs +0 -53
- package/src/views/article_revisions/general/_form.ejs +0 -18
- package/src/views/article_revisions/tags/edit_form.ejs +0 -16
- package/src/views/articles/_form.ejs +0 -45
- package/src/views/articles/_shared/history_table.ejs +0 -74
- package/src/views/articles/deletes/create_form.ejs +0 -68
- package/src/views/articles/history/index.ejs +0 -80
- package/src/views/articles/show.ejs +0 -222
- package/src/views/articles/urls/create_form.ejs +0 -36
- package/src/views/event_revisions/codes/_form.ejs +0 -14
- package/src/views/event_revisions/codes/edit_form.ejs +0 -16
- package/src/views/event_revisions/general/_form.ejs +0 -20
- package/src/views/event_revisions/general/edit_form.ejs +0 -16
- package/src/views/event_revisions/locks/_form.ejs +0 -11
- package/src/views/event_revisions/locks/create_form.ejs +0 -27
- package/src/views/event_revisions/meta/_form.ejs +0 -16
- package/src/views/event_revisions/meta/edit_form.ejs +0 -16
- package/src/views/event_revisions/publishes/_form.ejs +0 -77
- package/src/views/event_revisions/publishes/create_form.ejs +0 -9
- package/src/views/event_revisions/tags/_form.ejs +0 -13
- package/src/views/event_revisions/tags/edit_form.ejs +0 -16
- package/src/views/event_revisions/visuals/_form.ejs +0 -13
- package/src/views/event_revisions/visuals/edit_form.ejs +0 -16
- package/src/views/events/_form.ejs +0 -47
- package/src/views/events/_shared/_addons.ejs +0 -0
- package/src/views/events/_shared/_export_button.ejs +0 -9
- package/src/views/events/_shared/_history_toolbar.ejs +0 -24
- package/src/views/events/_shared/_revision_operator.ejs +0 -8
- package/src/views/events/_shared/_revision_toolbar.ejs +0 -68
- package/src/views/events/_shared/_title.ejs +0 -14
- package/src/views/events/_shared/_toolbar.ejs +0 -45
- package/src/views/events/_shared/history_table.ejs +0 -74
- package/src/views/events/create_form.ejs +0 -9
- package/src/views/events/deletes/create_form.ejs +0 -68
- package/src/views/events/history/index.ejs +0 -80
- package/src/views/events/index.ejs +0 -190
- package/src/views/events/show.ejs +0 -222
- package/src/views/events/translations/_translation_toolbar.ejs +0 -18
- package/src/views/events/translations/create_form.ejs +0 -75
- package/src/views/events/translations/index.ejs +0 -39
- package/src/views/events/urls/create_form.ejs +0 -36
- package/src/views/page_revisions/_nav.ejs +0 -53
- package/src/views/page_revisions/codes/_form.ejs +0 -14
- package/src/views/page_revisions/codes/edit_form.ejs +0 -16
- package/src/views/page_revisions/general/edit_form.ejs +0 -16
- package/src/views/page_revisions/locks/_form.ejs +0 -11
- package/src/views/page_revisions/locks/create_form.ejs +0 -27
- package/src/views/page_revisions/meta/_form.ejs +0 -16
- package/src/views/page_revisions/meta/edit_form.ejs +0 -16
- package/src/views/page_revisions/publishes/_form.ejs +0 -76
- package/src/views/page_revisions/publishes/create_form.ejs +0 -9
- package/src/views/page_revisions/tags/_form.ejs +0 -13
- package/src/views/page_revisions/visuals/_form.ejs +0 -13
- package/src/views/page_revisions/visuals/edit_form.ejs +0 -16
- package/src/views/pages/_shared/_addons.ejs +0 -0
- package/src/views/pages/_shared/_export_button.ejs +0 -9
- package/src/views/pages/_shared/_history_toolbar.ejs +0 -24
- package/src/views/pages/_shared/_revision_operator.ejs +0 -8
- package/src/views/pages/_shared/_revision_toolbar.ejs +0 -68
- package/src/views/pages/_shared/_title.ejs +0 -14
- package/src/views/pages/_shared/_toolbar.ejs +0 -45
- package/src/views/pages/create_form.ejs +0 -9
- package/src/views/pages/index.ejs +0 -185
- package/src/views/pages/translations/_translation_toolbar.ejs +0 -18
- package/src/views/pages/translations/create_form.ejs +0 -75
- package/src/views/pages/translations/index.ejs +0 -39
- /package/src/views/{event_revisions → resource_revisions}/_nav.ejs +0 -0
- /package/src/views/{article_revisions → resource_revisions}/codes/_form.ejs +0 -0
- /package/src/views/{article_revisions → resource_revisions}/codes/edit_form.ejs +0 -0
- /package/src/views/{article_revisions → resource_revisions}/general/edit_form.ejs +0 -0
- /package/src/views/{article_revisions → resource_revisions}/locks/_form.ejs +0 -0
- /package/src/views/{article_revisions → resource_revisions}/locks/create_form.ejs +0 -0
- /package/src/views/{article_revisions → resource_revisions}/meta/_form.ejs +0 -0
- /package/src/views/{article_revisions → resource_revisions}/meta/edit_form.ejs +0 -0
- /package/src/views/{article_revisions → resource_revisions}/publishes/_form.ejs +0 -0
- /package/src/views/{article_revisions → resource_revisions}/publishes/create_form.ejs +0 -0
- /package/src/views/{article_revisions → resource_revisions}/tags/_form.ejs +0 -0
- /package/src/views/{page_revisions → resource_revisions}/tags/edit_form.ejs +0 -0
- /package/src/views/{article_revisions → resource_revisions}/visuals/_form.ejs +0 -0
- /package/src/views/{article_revisions → resource_revisions}/visuals/edit_form.ejs +0 -0
- /package/src/views/{articles → resources}/_shared/_addons.ejs +0 -0
- /package/src/views/{articles → resources}/_shared/_export_button.ejs +0 -0
- /package/src/views/{articles → resources}/_shared/_history_toolbar.ejs +0 -0
- /package/src/views/{articles → resources}/_shared/_revision_operator.ejs +0 -0
- /package/src/views/{articles → resources}/_shared/_revision_toolbar.ejs +0 -0
- /package/src/views/{articles → resources}/_shared/_title.ejs +0 -0
- /package/src/views/{articles → resources}/_shared/_toolbar.ejs +0 -0
- /package/src/views/{pages → resources}/_shared/history_table.ejs +0 -0
- /package/src/views/{articles → resources}/create_form.ejs +0 -0
- /package/src/views/{pages → resources}/deletes/create_form.ejs +0 -0
- /package/src/views/{articles → resources}/translations/_translation_toolbar.ejs +0 -0
- /package/src/views/{articles → resources}/translations/index.ejs +0 -0
- /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"
|
|
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 -
|
|
7
|
+
<div class="flex flex-wrap items-center gap-1 mb-6 -my-4">
|
|
8
8
|
<%
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
|
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
|
|
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;
|
package/src/routeEventsModule.js
DELETED
|
@@ -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;
|
package/src/routePagesModule.js
DELETED
|
@@ -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> </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
|
-
|