@raketa-cloud/admin 0.0.7 → 0.0.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 (114) hide show
  1. package/package.json +3 -2
  2. package/src/Adapter.js +1 -4
  3. package/src/cloud/ChangePageURL.js +24 -0
  4. package/src/cloud/ClonesPage.js +14 -0
  5. package/src/cloud/DeletePage.js +35 -0
  6. package/src/cloud/PageChanges.js +15 -0
  7. package/src/cloud/PageRevisions.js +135 -0
  8. package/src/cloud/PageTranslations.js +22 -0
  9. package/src/cloud/Pages.js +63 -0
  10. package/src/cloud/RaketaClient.js +118 -0
  11. package/src/cloud/Redirects.js +81 -0
  12. package/src/cloud/RevertPageRevision.js +18 -0
  13. package/src/cloud/Settings.js +30 -0
  14. package/src/cloud/Tags.js +80 -0
  15. package/src/cloud/documents/articlesDocuments.js +608 -0
  16. package/src/cloud/documents/categoryDocuments.js +64 -0
  17. package/src/cloud/documents/common.js +84 -0
  18. package/src/cloud/documents/pagesDocuments.js +245 -0
  19. package/src/cloud/documents/redirectsDocuments.js +82 -0
  20. package/src/cloud/documents/settingsDocuments.js +23 -0
  21. package/src/cloud/documents/tagsDocuments.js +63 -0
  22. package/src/handlers/PageCloneHandler.js +17 -0
  23. package/src/handlers/PageCloneHandler.test/create.test.js +55 -0
  24. package/src/handlers/PageDeleteHandler.js +68 -0
  25. package/src/handlers/PageDeleteHandler.test/create.test.js +112 -0
  26. package/src/handlers/PageDeleteHandler.test/create_form.test.js +54 -0
  27. package/src/handlers/PageRevisionsCodesHandler.js +83 -0
  28. package/src/handlers/PageRevisionsCodesHandler.test/edit_form.test.js +56 -0
  29. package/src/handlers/PageRevisionsCodesHandler.test/update.test.js +137 -0
  30. package/src/handlers/PageRevisionsGeneralHandler.js +86 -0
  31. package/src/handlers/PageRevisionsGeneralHandler.test/edit_form.test.js +62 -0
  32. package/src/handlers/PageRevisionsGeneralHandler.test/update.test.js +147 -0
  33. package/src/handlers/PageRevisionsHandler.js +47 -0
  34. package/src/handlers/PageRevisionsHandler.test/create.test.js +67 -0
  35. package/src/handlers/PageRevisionsHandler.test/destroy.test.js +54 -0
  36. package/src/handlers/PageRevisionsLockHandler.js +54 -0
  37. package/src/handlers/PageRevisionsMetaHandler.js +83 -0
  38. package/src/handlers/PageRevisionsMetaHandler.test/edit_form.test.js +57 -0
  39. package/src/handlers/PageRevisionsMetaHandler.test/update.test.js +141 -0
  40. package/src/handlers/PageRevisionsTagsHandler.js +80 -0
  41. package/src/handlers/PageRevisionsTagsHandler.test/edit_form.test.js +69 -0
  42. package/src/handlers/PageRevisionsTagsHandler.test/update.test.js +141 -0
  43. package/src/handlers/PageRevisionsUnlockHandler.js +22 -0
  44. package/src/handlers/PageRevisionsVisualsHandler.js +77 -0
  45. package/src/handlers/PageRevisionsVisualsHandler.test/edit_form.test.js +55 -0
  46. package/src/handlers/PageRevisionsVisualsHandler.test/update.test.js +129 -0
  47. package/src/handlers/PageRevisionsWidgetsHandler.js +41 -0
  48. package/src/handlers/PageRevisionsWidgetsHandler.test/show.test.js +47 -0
  49. package/src/handlers/PageRevisionsWidgetsHandler.test/update.test.js +104 -0
  50. package/src/handlers/PageTranslationsHandler.js +91 -0
  51. package/src/handlers/PageURLsHandler.js +69 -0
  52. package/src/handlers/PageURLsHandler.test/create.test.js +157 -0
  53. package/src/handlers/PageURLsHandler.test/create_form.test.js +51 -0
  54. package/src/handlers/PagesHandler.js +114 -0
  55. package/src/handlers/PagesHandler.test/create.test.js +140 -0
  56. package/src/handlers/PagesHandler.test/create_form.test.js +41 -0
  57. package/src/handlers/PagesHandler.test/index.test.js +49 -0
  58. package/src/handlers/PagesHandler.test/show.test.js +103 -0
  59. package/src/handlers/PublishPageRevisionHandler.js +84 -0
  60. package/src/handlers/PublishPageRevisionHandler.test/create.test.js +136 -0
  61. package/src/handlers/PublishPageRevisionHandler.test/create_form.test.js +47 -0
  62. package/src/handlers/RedirectsHandler.js +124 -0
  63. package/src/handlers/RedirectsHandler.test/create.test.js +84 -0
  64. package/src/handlers/RedirectsHandler.test/create_form.test.js +29 -0
  65. package/src/handlers/RedirectsHandler.test/destroy.test.js +54 -0
  66. package/src/handlers/RedirectsHandler.test/edit_form.test.js +38 -0
  67. package/src/handlers/RedirectsHandler.test/index.test.js +42 -0
  68. package/src/handlers/RedirectsHandler.test/show.test.js +41 -0
  69. package/src/handlers/RedirectsHandler.test/update.test.js +89 -0
  70. package/src/handlers/RevertPageRevisionHandler.js +26 -0
  71. package/src/handlers/RevertPageRevisionHandler.test/create.test.js +80 -0
  72. package/src/handlers/SettingsGeneralHandler.js +13 -0
  73. package/src/handlers/SettingsLayoutHandler.js +51 -0
  74. package/src/handlers/SettingsMetaHandler.js +52 -0
  75. package/src/handlers/TagsHandler.js +113 -0
  76. package/src/helpers/FormBuilder.js +12 -4
  77. package/src/index.js +33 -0
  78. package/src/setupAuthentication.js +1 -1
  79. package/src/styles/application.css +55 -19
  80. package/src/views/layouts/application.ejs +30 -31
  81. package/src/views/layouts/header.ejs +5 -6
  82. package/src/views/page_deletes/create_form.ejs +55 -0
  83. package/src/views/page_lock/create_form.ejs +35 -0
  84. package/src/views/page_publish/_form.ejs +57 -0
  85. package/src/views/page_publish/create_form.ejs +11 -0
  86. package/src/views/page_revisions/_nav.ejs +40 -0
  87. package/src/views/page_revisions/codes/edit_form.ejs +39 -0
  88. package/src/views/page_revisions/general/edit_form.ejs +69 -0
  89. package/src/views/page_revisions/meta/edit_form.ejs +41 -0
  90. package/src/views/page_revisions/tags/edit_form.ejs +64 -0
  91. package/src/views/page_revisions/visuals/edit_form.ejs +42 -0
  92. package/src/views/page_translations/_form.ejs +76 -0
  93. package/src/views/page_translations/create_form.ejs +11 -0
  94. package/src/views/page_urls/create_form.ejs +31 -0
  95. package/src/views/pages/_form.ejs +84 -0
  96. package/src/views/pages/create_form.ejs +9 -0
  97. package/src/views/pages/edit_form.ejs +3 -0
  98. package/src/views/pages/index.ejs +161 -0
  99. package/src/views/pages/show.ejs +281 -0
  100. package/src/views/redirects/_form.ejs +40 -0
  101. package/src/views/redirects/create_form.ejs +9 -0
  102. package/src/views/redirects/edit_form.ejs +9 -0
  103. package/src/views/redirects/index.ejs +75 -1
  104. package/src/views/redirects/show.ejs +60 -0
  105. package/src/views/settings/_nav.ejs +28 -0
  106. package/src/views/settings/general/edit_form.ejs +26 -0
  107. package/src/views/settings/layout/edit_form.ejs +22 -0
  108. package/src/views/settings/meta/edit_form.ejs +38 -0
  109. package/src/views/tags/_form.ejs +39 -0
  110. package/src/views/tags/create_form.ejs +9 -0
  111. package/src/views/tags/edit_form.ejs +9 -0
  112. package/src/views/tags/index.ejs +43 -0
  113. package/test/factory.js +91 -0
  114. package/test/handlersHelper.js +9 -0
@@ -0,0 +1,57 @@
1
+ <% form_for({ publishing }, errors, (f) => { %>
2
+ <form action="<%= `/${_context.locale}/page_revisions/${publishing.id}/page_publish` %>" method="post" class="form">
3
+ <%- f.field('publishing.title'), { required: true } %>
4
+ <%- f.field('publishing.description', { as: "textarea" }) %>
5
+ <%- f.field('publishing.visibility', { as: 'select', required: true, options: visibilityOptions }) %>
6
+ <%- f.field('publishing.username', { required: true }) %>
7
+ <%- f.field('publishing.password', { required: true }) %>
8
+
9
+ <div class="form-actions">
10
+ <div class="btn-toolbar">
11
+ <%- f.submit('Save record', { class: 'btn-primary' }) %>
12
+
13
+ <a href="<%= `/${_context.locale}/pages/${publishing.originalId}` %>" class="btn-secondary">Back</a>
14
+ </div>
15
+ </div>
16
+ </form>
17
+ <% }) %>
18
+
19
+ <div>
20
+ <div class="help">
21
+ <div class="flex items-center gap-1 mb-2">
22
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
23
+ <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" />
24
+ </svg>
25
+
26
+ <h3 class="heading-3">Contextual help</h3>
27
+ </div>
28
+
29
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Tempore nostrum fugit sint sunt distinctio ut cum, corrupti ad error, quo labore minima. Reprehenderit quasi maxime repudiandae voluptatum commodi saepe molestiae?</p>
30
+ </div>
31
+ </div>
32
+
33
+ <script>
34
+ function onVisibilityChange(event) {
35
+ const newValue = event.target.value;
36
+
37
+ if (newValue === "protected") {
38
+ document.getElementById("f_username").parentElement.style.display = "block";
39
+ document.getElementById("f_username").required = true;
40
+ document.getElementById("f_password").parentElement.style.display = "block";
41
+ document.getElementById("f_password").required = true;
42
+ } else {
43
+ document.getElementById("f_username").parentElement.style.display = "none";
44
+ document.getElementById("f_username").required = false;
45
+ document.getElementById("f_password").parentElement.style.display = "none";
46
+ document.getElementById("f_password").required = false;
47
+ }
48
+ }
49
+
50
+ onVisibilityChange({
51
+ target: {
52
+ value: '<%= publishing.visibility %>'
53
+ }
54
+ })
55
+
56
+ document.getElementById("f_visibility").addEventListener("change", onVisibilityChange)
57
+ </script>
@@ -0,0 +1,11 @@
1
+ <div class="flex w-full">
2
+ <div class="flex items-center justify-between mt-6 mb-4">
3
+ <div class="flex items-center gap-2">
4
+ <h1 class="heading-1">Publish revision</h1>
5
+ </div>
6
+ </div>
7
+ </div>
8
+
9
+ <div class="grid gap-4 md:grid-cols-3">
10
+ <%- include('_form.ejs') %>
11
+ </div>
@@ -0,0 +1,40 @@
1
+ <%
2
+ const activeClass = "relative top-0.5 px-4 border-b-2 border-raketa-primary pb-4";
3
+ const inactiveClass = "relative top-0.5 px-4 border-b-2 border-transparent pb-4";
4
+ %>
5
+
6
+ <div class="flex w-full pb-4">
7
+ <div class="flex items-center justify-between mb-4">
8
+ <div class="flex items-center border-b-2">
9
+ <div class=" <%= active === 'general' ? activeClass : inactiveClass %>">
10
+ <a href="<%= `/${_context.locale}/page_revisions/${settings.id}/general/edit` %>" class="text-raketa-primary font-semibold">
11
+ General
12
+ </a>
13
+ </div>
14
+
15
+ <div class="<%= active === 'visuals' ? activeClass : inactiveClass %>">
16
+ <a href="<%= `/${_context.locale}/page_revisions/${settings.id}/visuals/edit` %>" class="text-raketa-primary font-semibold">
17
+ Visuals
18
+ </a>
19
+ </div>
20
+
21
+ <div class="<%= active === 'codes' ? activeClass : inactiveClass %>">
22
+ <a href="<%= `/${_context.locale}/page_revisions/${settings.id}/codes/edit` %>" class="text-raketa-primary font-semibold">
23
+ Code customizations
24
+ </a>
25
+ </div>
26
+
27
+ <div class="<%= active === 'meta' ? activeClass : inactiveClass %>">
28
+ <a href="<%= `/${_context.locale}/page_revisions/${settings.id}/meta/edit` %>" class="text-raketa-primary font-semibold">
29
+ Open graph & meta tags
30
+ </a>
31
+ </div>
32
+
33
+ <div class="<%= active === 'tags' ? activeClass : inactiveClass %>">
34
+ <a href="<%= `/${_context.locale}/page_revisions/${settings.id}/tags/edit` %>" class="text-raketa-primary font-semibold">
35
+ Content tags
36
+ </a>
37
+ </div>
38
+ </div>
39
+ </div>
40
+ </div>
@@ -0,0 +1,39 @@
1
+ <div class="page-wrapper">
2
+ <div class="page-title">
3
+ <h1 class="heading-1">Edit revision / Code customizations</h1>
4
+ </div>
5
+
6
+ <%- include('../_nav.ejs', { settings: code_settings, active: 'codes' }) %>
7
+
8
+ <div class="grid gap-4 md:grid-cols-3">
9
+ <div>
10
+ <% form_for({ code_settings }, errors, (f) => { %>
11
+ <form action="<%= `/${_context.locale}/page_revisions/${code_settings.id}/codes` %>" method="POST" class="form">
12
+ <%- f.field('code_settings.scripts', { as: 'textarea', }) %>
13
+ <%- f.field('code_settings.structured_data', { label: 'Structured data (JSON)', as: 'textarea', hint: 'Click here for a structured data verification tool' }) %>
14
+
15
+ <div class="form-actions">
16
+ <div class="btn-toolbar">
17
+ <%- f.submit('Save changes', { class: 'btn-primary' }) %>
18
+ <a href="<%= `/${_context.locale}/pages/${code_settings.originalId}` %>" class="btn-secondary">Back</a>
19
+ </div>
20
+ </div>
21
+ </form>
22
+ <% }) %>
23
+ </div>
24
+
25
+ <div>
26
+ <div class="help">
27
+ <div class="mb-2 flex items-center gap-1">
28
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
29
+ <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" />
30
+ </svg>
31
+
32
+ <h3 class="heading-3">Contextual help</h3>
33
+ </div>
34
+
35
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Tempore nostrum fugit sint sunt distinctio ut cum, corrupti ad error, quo labore minima. Reprehenderit quasi maxime repudiandae voluptatum commodi saepe molestiae?</p>
36
+ </div>
37
+ </div>
38
+ </div>
39
+ </div>
@@ -0,0 +1,69 @@
1
+ <div class="page-wrapper">
2
+ <div class="page-title">
3
+ <h1 class="heading-1">Edit revision / General</h1>
4
+ </div>
5
+
6
+ <%- include('../_nav.ejs', { settings: general_settings, active: 'general' }) %>
7
+
8
+ <div class="grid gap-4 md:grid-cols-3">
9
+ <div>
10
+ <% form_for({ general_settings }, errors, (f) => { %>
11
+ <form action="<%= `/${_context.locale}/page_revisions/${general_settings.id}/general` %>" method="POST" class="form">
12
+ <%- f.field('general_settings.title', { required: true }) %>
13
+ <%- f.field('general_settings.slug', { label: "URL", required: true }) %>
14
+ <%- f.field('general_settings.visibility', { as: 'select', required: true, options: visibilityOptions }) %>
15
+
16
+ <%- f.field('general_settings.username', { required: true }) %>
17
+ <%- f.field('general_settings.password', { required: true }) %>
18
+
19
+ <div class="form-actions">
20
+ <div class="btn-toolbar">
21
+ <%- f.submit('Save changes', { class: 'btn-primary' }) %>
22
+ <a href="<%= `/${_context.locale}/pages/${general_settings.originalId}` %>" class="btn-secondary">Back</a>
23
+ </div>
24
+ </div>
25
+ </form>
26
+ <% }) %>
27
+ </div>
28
+
29
+ <div>
30
+ <div class="help">
31
+ <div class="mb-2 flex items-center gap-1">
32
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
33
+ <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" />
34
+ </svg>
35
+
36
+ <h3 class="heading-3">Contextual help</h3>
37
+ </div>
38
+
39
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Tempore nostrum fugit sint sunt distinctio ut cum, corrupti ad error, quo labore minima. Reprehenderit quasi maxime repudiandae voluptatum commodi saepe molestiae?</p>
40
+ </div>
41
+ </div>
42
+ </div>
43
+ </div>
44
+
45
+ <script>
46
+ function onVisibilityChange(event) {
47
+ const newValue = event.target.value;
48
+
49
+ if (newValue === "protected") {
50
+ document.getElementById("f_username").parentElement.style.display = "block";
51
+ document.getElementById("f_username").required = true;
52
+ document.getElementById("f_password").parentElement.style.display = "block";
53
+ document.getElementById("f_password").required = true;
54
+ } else {
55
+ document.getElementById("f_username").parentElement.style.display = "none";
56
+ document.getElementById("f_username").required = false;
57
+ document.getElementById("f_password").parentElement.style.display = "none";
58
+ document.getElementById("f_password").required = false;
59
+ }
60
+ }
61
+
62
+ onVisibilityChange({
63
+ target: {
64
+ value: '<%= general_settings.visibility %>'
65
+ }
66
+ })
67
+
68
+ document.getElementById("f_visibility").addEventListener("change", onVisibilityChange)
69
+ </script>
@@ -0,0 +1,41 @@
1
+ <div class="page-wrapper">
2
+ <div class="page-title">
3
+ <h1 class="heading-1">Edit revision / Open graph & meta tags</h1>
4
+ </div>
5
+
6
+ <%- include('../_nav.ejs', { settings: meta_settings, active: 'meta' }) %>
7
+
8
+ <div class="grid gap-4 md:grid-cols-3">
9
+ <div>
10
+ <% form_for({ meta_settings }, errors, (f) => { %>
11
+ <form action="<%= `/${_context.locale}/page_revisions/${meta_settings.id}/meta` %>" method="POST" class="form">
12
+ <%- f.field('meta_settings.title', { required: true }) %>
13
+ <%- f.field('meta_settings.description', { as: 'textarea', required: true }) %>
14
+
15
+ <raketa-image-picker name="meta_settings[image]" value="<%= JSON.stringify(meta_settings.image) %>"></raketa-image-picker>
16
+
17
+ <div class="form-actions">
18
+ <div class="btn-toolbar">
19
+ <%- f.submit('Save changes', { class: 'btn-primary' }) %>
20
+ <a href="<%= `/${_context.locale}/pages/${meta_settings.originalId}` %>" class="btn-secondary">Back</a>
21
+ </div>
22
+ </div>
23
+ </form>
24
+ <% }) %>
25
+ </div>
26
+
27
+ <div>
28
+ <div class="help">
29
+ <div class="mb-2 flex items-center gap-1">
30
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
31
+ <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" />
32
+ </svg>
33
+
34
+ <h3 class="heading-3">Contextual help</h3>
35
+ </div>
36
+
37
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Tempore nostrum fugit sint sunt distinctio ut cum, corrupti ad error, quo labore minima. Reprehenderit quasi maxime repudiandae voluptatum commodi saepe molestiae?</p>
38
+ </div>
39
+ </div>
40
+ </div>
41
+ </div>
@@ -0,0 +1,64 @@
1
+ <div class="page-wrapper">
2
+ <div class="page-title">
3
+ <h1 class="heading-1">Edit revision / Content tags</h1>
4
+ </div>
5
+
6
+ <%- include('../_nav.ejs', { settings: tag_settings, active: 'tags' }) %>
7
+
8
+ <div class="grid gap-4 md:grid-cols-3">
9
+ <div>
10
+ <% form_for({ tag_settings }, errors, (f) => { %>
11
+ <form action="<%= `/${_context.locale}/page_revisions/${tag_settings.id}/tags` %>" method="POST" class="form">
12
+ <%- f.field('tag_settings.tags', { as: 'checkbox_group', required: true, options: tags.map(tag => [tag.id, tag.name]) }) %>
13
+
14
+ <div class="form-actions">
15
+ <div class="btn-toolbar">
16
+ <%- f.submit('Save changes', { class: 'btn-primary' }) %>
17
+ <a href="<%= `/${_context.locale}/pages/${tag_settings.originalId}` %>" class="btn-secondary">Back</a>
18
+ </div>
19
+ </div>
20
+ </form>
21
+ <% }) %>
22
+ </div>
23
+
24
+ <div>
25
+ <div class="help">
26
+ <div class="mb-2 flex items-center gap-1">
27
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
28
+ <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" />
29
+ </svg>
30
+
31
+ <h3 class="heading-3">Contextual help</h3>
32
+ </div>
33
+
34
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Tempore nostrum fugit sint sunt distinctio ut cum, corrupti ad error, quo labore minima. Reprehenderit quasi maxime repudiandae voluptatum commodi saepe molestiae?</p>
35
+ </div>
36
+ </div>
37
+ </div>
38
+ </div>
39
+
40
+ <script>
41
+ function onVisibilityChange(event) {
42
+ const newValue = event.target.value;
43
+
44
+ if (newValue === "protected") {
45
+ document.getElementById("f_username").parentElement.style.display = "block";
46
+ document.getElementById("f_username").required = true;
47
+ document.getElementById("f_password").parentElement.style.display = "block";
48
+ document.getElementById("f_password").required = true;
49
+ } else {
50
+ document.getElementById("f_username").parentElement.style.display = "none";
51
+ document.getElementById("f_username").required = false;
52
+ document.getElementById("f_password").parentElement.style.display = "none";
53
+ document.getElementById("f_password").required = false;
54
+ }
55
+ }
56
+
57
+ onVisibilityChange({
58
+ target: {
59
+ value: '<%= tag_settings.visibility %>'
60
+ }
61
+ })
62
+
63
+ document.getElementById("f_visibility").addEventListener("change", onVisibilityChange)
64
+ </script>
@@ -0,0 +1,42 @@
1
+ <div class="page-wrapper">
2
+ <div class="page-title">
3
+ <h1 class="heading-1">Edit revision / Visuals</h1>
4
+ </div>
5
+
6
+ <%- include('../_nav.ejs', { settings: visual_settings, active: 'visuals' }) %>
7
+
8
+ <div class="grid gap-4 md:grid-cols-3">
9
+ <div>
10
+ <% form_for({ visual_settings }, errors, (f) => { %>
11
+ <form action="<%= `/${_context.locale}/page_revisions/${visual_settings.id}/visuals` %>" method="POST" class="form">
12
+ <%- f.field('visual_settings.layout', { as: 'select', required: true, options: [
13
+ ["default", "Default"],
14
+ ["landing", "Landing page"],
15
+ ["headless", "Headless"],
16
+ ] }) %>
17
+
18
+ <div class="form-actions">
19
+ <div class="btn-toolbar">
20
+ <%- f.submit('Save changes', { class: 'btn-primary' }) %>
21
+ <a href="<%= `/${_context.locale}/pages/${visual_settings.originalId}` %>" class="btn-secondary">Back</a>
22
+ </div>
23
+ </div>
24
+ </form>
25
+ <% }) %>
26
+ </div>
27
+
28
+ <div>
29
+ <div class="help">
30
+ <div class="mb-2 flex items-center gap-1">
31
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
32
+ <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" />
33
+ </svg>
34
+
35
+ <h3 class="heading-3">Contextual help</h3>
36
+ </div>
37
+
38
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Tempore nostrum fugit sint sunt distinctio ut cum, corrupti ad error, quo labore minima. Reprehenderit quasi maxime repudiandae voluptatum commodi saepe molestiae?</p>
39
+ </div>
40
+ </div>
41
+ </div>
42
+ </div>
@@ -0,0 +1,76 @@
1
+ <% form_for({ translation }, errors, (f) => { %>
2
+ <form action="<%= `/${_context.locale}/pages/${page.id}/page_translations` %>" method="post" class="form">
3
+ <input type="hidden" name="target_locale" value="<%= targetLocale %>" />
4
+
5
+ <%- f.field('translation.title', { required: true }) %>
6
+ <%- f.field('translation.slug', { label: "URL", required: true }) %>
7
+ <%- f.field('translation.visibility', { as: 'select', required: true, options: visibilityOptions }) %>
8
+
9
+ <%- f.field('translation.username', { required: true }) %>
10
+ <%- f.field('translation.password', { required: true }) %>
11
+
12
+ <%- f.field('translation.layout', { as: 'select', required: true, options: [
13
+ ["default", "Default"],
14
+ ["landing", "Landing page"],
15
+ ["headless", "Headless"],
16
+ ] }) %>
17
+
18
+ <%- f.field('translation.meta_title', { required: true }) %>
19
+ <%- f.field('translation.meta_description', { as: "textarea", required: true }) %>
20
+
21
+ <raketa-image-picker name="translation[meta_image]" value="<%= JSON.stringify(translation.meta_image) %>"></raketa-image-picker>
22
+
23
+ <h6>Original tags:</h6>
24
+ <div><%= blueprint_tags.map((tag) => tag.name).join(", ")%></div>
25
+
26
+ <%- f.field('translation.tags', { as: 'checkbox_group', required: true, options: tags.map(tag => [tag.id, tag.name])}) %>
27
+
28
+ <div class="form-actions">
29
+ <div class="btn-toolbar">
30
+ <%- f.submit('Save record', { class: 'btn-primary' }) %>
31
+
32
+ <a href="<%= `/${_context.locale}/pages/${page.id}` %>" class="btn-secondary">Cancel</a>
33
+ </div>
34
+ </div>
35
+ </form>
36
+ <% }) %>
37
+
38
+ <div>
39
+ <div class="help">
40
+ <div class="flex items-center gap-1 mb-2">
41
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
42
+ <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" />
43
+ </svg>
44
+
45
+ <h3 class="heading-3">Contextual help</h3>
46
+ </div>
47
+
48
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Tempore nostrum fugit sint sunt distinctio ut cum, corrupti ad error, quo labore minima. Reprehenderit quasi maxime repudiandae voluptatum commodi saepe molestiae?</p>
49
+ </div>
50
+ </div>
51
+
52
+ <script>
53
+ function onVisibilityChange(event) {
54
+ const newValue = event.target.value;
55
+
56
+ if (newValue === "protected") {
57
+ document.getElementById("f_username").parentElement.style.display = "block";
58
+ document.getElementById("f_username").required = true;
59
+ document.getElementById("f_password").parentElement.style.display = "block";
60
+ document.getElementById("f_password").required = true;
61
+ } else {
62
+ document.getElementById("f_username").parentElement.style.display = "none";
63
+ document.getElementById("f_username").required = false;
64
+ document.getElementById("f_password").parentElement.style.display = "none";
65
+ document.getElementById("f_password").required = false;
66
+ }
67
+ }
68
+
69
+ onVisibilityChange({
70
+ target: {
71
+ value: '<%= page.visibility %>'
72
+ }
73
+ })
74
+
75
+ document.getElementById("f_visibility").addEventListener("change", onVisibilityChange)
76
+ </script>
@@ -0,0 +1,11 @@
1
+ <div class="w-full">
2
+ <div class="flex items-center justify-between mt-6 mb-4">
3
+ <div class="flex items-center gap-2">
4
+ <h1 class="heading-1">Create page translation</h1>
5
+ </div>
6
+ </div>
7
+ </div>
8
+
9
+ <div class="grid gap-4 md:grid-cols-3">
10
+ <%- include('_form.ejs') %>
11
+ </div>
@@ -0,0 +1,31 @@
1
+ <div class="page-wrapper">
2
+ <div class="page-title">
3
+ <h1 class="heading-1">Change URL</h1>
4
+ </div>
5
+
6
+ <div class="grid gap-4 md:grid-cols-3">
7
+ <% form_for({ change }, errors, (f) => { %>
8
+ <form action="<%= `/${_context.locale}/pages/${change.id}/page_urls` %>" method="post" class="form">
9
+ <%- f.field('change.slug', { label: "URL", required: true }) %>
10
+ <%- f.field('change.redirect', { as: "checkbox", value: "1", label: "Create 301 redirect for the old URL" }) %>
11
+
12
+ <%- f.submit('Save record', { class: 'btn-primary' }) %>
13
+ <a href="<%=`/${_context.locale}/pages/${change.id}`%>" class="btn-secondary">Back</a>
14
+ </form>
15
+ <% }) %>
16
+
17
+ <div>
18
+ <div class="help">
19
+ <div class="flex items-center gap-1 mb-2">
20
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
21
+ <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" />
22
+ </svg>
23
+
24
+ <h3 class="heading-3">Contextual help</h3>
25
+ </div>
26
+
27
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Tempore nostrum fugit sint sunt distinctio ut cum, corrupti ad error, quo labore minima. Reprehenderit quasi maxime repudiandae voluptatum commodi saepe molestiae?</p>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ </div>
@@ -0,0 +1,84 @@
1
+ <% form_for({ page }, errors, (f) => { %>
2
+ <form action="<%= page?.id ? `/${_context.locale}/pages/${page.id}` : `/${_context.locale}/pages` %>" method="post" class="form">
3
+ <%- f.field('page.title', { required: true }) %>
4
+ <%- f.field('page.slug', { label: "URL", required: true }) %>
5
+ <%- f.field('page.visibility', { as: 'select', required: true, options: visibilityOptions }) %>
6
+
7
+ <%- f.field('page.username', { required: true }) %>
8
+ <%- f.field('page.password', { required: true }) %>
9
+
10
+ <%- f.field('page.layout', { as: 'select', required: true, options: [
11
+ ["default", "Default"],
12
+ ["landing", "Landing page"],
13
+ ["headless", "Headless"],
14
+ ] }) %>
15
+
16
+ <%- f.field('page.meta_title', { required: true }) %>
17
+ <%- f.field('page.meta_description', { as: "textarea", required: true }) %>
18
+
19
+ <raketa-image-picker
20
+ name="page[meta_image]"
21
+ value="<%= JSON.stringify(page.meta_image) %>"
22
+ ></raketa-image-picker>
23
+
24
+ <%- f.field('page.tags', { as: 'checkbox_group', required: true, options: tags.map(tag => [tag.id, tag.name]) }) %>
25
+
26
+ <div class="form-actions">
27
+ <div class="btn-toolbar">
28
+ <%- f.submit('Save record', { class: 'btn-primary' }) %>
29
+
30
+ <a href="<%= `/${_context.locale}/pages` %>" class="btn-secondary">Back to list</a>
31
+ </div>
32
+
33
+ <% if (page?.id) {%>
34
+ <button hx-delete="<%= `/${_context.locale}/pages/${page.id}` %>" hx-confirm="Are you sure?" class="btn-danger has-icon">
35
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
36
+ <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" />
37
+ </svg>
38
+
39
+ Delete record
40
+ </button>
41
+ <% } %>
42
+ </div>
43
+ </form>
44
+ <% }) %>
45
+
46
+ <div>
47
+ <div class="help">
48
+ <div class="flex items-center gap-1 mb-2">
49
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
50
+ <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" />
51
+ </svg>
52
+
53
+ <h3 class="heading-3">Contextual help</h3>
54
+ </div>
55
+
56
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Tempore nostrum fugit sint sunt distinctio ut cum, corrupti ad error, quo labore minima. Reprehenderit quasi maxime repudiandae voluptatum commodi saepe molestiae?</p>
57
+ </div>
58
+ </div>
59
+
60
+ <script>
61
+ function onVisibilityChange(event) {
62
+ const newValue = event.target.value;
63
+
64
+ if (newValue === "protected") {
65
+ document.getElementById("f_username").parentElement.style.display = "block";
66
+ document.getElementById("f_username").required = true;
67
+ document.getElementById("f_password").parentElement.style.display = "block";
68
+ document.getElementById("f_password").required = true;
69
+ } else {
70
+ document.getElementById("f_username").parentElement.style.display = "none";
71
+ document.getElementById("f_username").required = false;
72
+ document.getElementById("f_password").parentElement.style.display = "none";
73
+ document.getElementById("f_password").required = false;
74
+ }
75
+ }
76
+
77
+ onVisibilityChange({
78
+ target: {
79
+ value: '<%= page.visibility %>'
80
+ }
81
+ })
82
+
83
+ document.getElementById("f_visibility").addEventListener("change", onVisibilityChange)
84
+ </script>
@@ -0,0 +1,9 @@
1
+ <div class="page-wrapper">
2
+ <div class="page-title">
3
+ <h1 class="heading-1">Create page</h1>
4
+ </div>
5
+
6
+ <div class="grid gap-4 md:grid-cols-3">
7
+ <%- include('_form.ejs') %>
8
+ </div>
9
+ </div>
@@ -0,0 +1,3 @@
1
+ <h1>Hello from edit form <%= id %></h1>
2
+
3
+ <%- include('_form.ejs') %>