kempo 4.2.19 → 4.2.20

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 (115) hide show
  1. package/app-public/CATCH.page.html +15 -0
  2. package/app-public/kempo-global.global.html +0 -6
  3. package/dist/admin/accounts/groups/[name]/index.page.html +112 -2
  4. package/dist/admin/accounts/groups/index.page.html +87 -2
  5. package/dist/admin/accounts/permissions/index.page.html +84 -2
  6. package/dist/admin/accounts/users/[id]/index.page.html +117 -3
  7. package/dist/admin/accounts/users/index.page.html +116 -2
  8. package/dist/admin/components/tableControls/InstallExtension.js +2 -2
  9. package/dist/admin/components/tableControls/InstallExtension.js.map +1 -1
  10. package/dist/admin/components/tableControls/UninstallExtension.js +2 -2
  11. package/dist/admin/components/tableControls/UninstallExtension.js.map +1 -1
  12. package/dist/admin/content/fragments/edit/index.page.html +8 -1
  13. package/dist/admin/content/fragments/index.page.html +87 -2
  14. package/dist/admin/content/globals/edit/index.page.html +8 -1
  15. package/dist/admin/content/globals/index.page.html +102 -7
  16. package/dist/admin/content/pages/edit/index.page.html +8 -1
  17. package/dist/admin/content/pages/index.page.html +224 -27
  18. package/dist/admin/content/templates/edit/index.page.html +8 -1
  19. package/dist/admin/content/templates/index.page.html +116 -2
  20. package/dist/admin/default.template.html +20 -1
  21. package/dist/admin/extensions/index.page.html +59 -2
  22. package/dist/admin/icons/extension_add.svg +1 -0
  23. package/dist/admin/icons/extension_remove.svg +1 -0
  24. package/dist/admin/index.page.html +5 -1
  25. package/dist/admin/nav.fragment.html +84 -2
  26. package/dist/admin/settings/[owner]/[name]/index.page.html +110 -4
  27. package/dist/admin/settings/index.page.html +87 -2
  28. package/dist/kempo/api/fragments/DELETE.js +1 -1
  29. package/dist/kempo/api/fragments/DELETE.js.map +1 -1
  30. package/dist/kempo/api/fragments/GET.js +1 -1
  31. package/dist/kempo/api/fragments/GET.js.map +1 -1
  32. package/dist/kempo/api/fragments/POST.js +1 -1
  33. package/dist/kempo/api/fragments/POST.js.map +1 -1
  34. package/dist/kempo/api/fragments/disable/PUT.js +1 -1
  35. package/dist/kempo/api/fragments/disable/PUT.js.map +1 -1
  36. package/dist/kempo/api/fragments/enable/PUT.js +1 -1
  37. package/dist/kempo/api/fragments/enable/PUT.js.map +1 -1
  38. package/dist/kempo/api/fragments/file/GET.js +1 -1
  39. package/dist/kempo/api/fragments/file/GET.js.map +1 -1
  40. package/dist/kempo/api/fragments/file/PATCH.js +1 -1
  41. package/dist/kempo/api/fragments/file/PATCH.js.map +1 -1
  42. package/dist/kempo/api/fragments/file/PUT.js +1 -1
  43. package/dist/kempo/api/fragments/file/PUT.js.map +1 -1
  44. package/dist/kempo/api/fragments/lock/PUT.js +1 -1
  45. package/dist/kempo/api/fragments/lock/PUT.js.map +1 -1
  46. package/dist/kempo/api/globals/DELETE.js +1 -1
  47. package/dist/kempo/api/globals/DELETE.js.map +1 -1
  48. package/dist/kempo/api/globals/GET.js +1 -1
  49. package/dist/kempo/api/globals/GET.js.map +1 -1
  50. package/dist/kempo/api/globals/POST.js +1 -1
  51. package/dist/kempo/api/globals/POST.js.map +1 -1
  52. package/dist/kempo/api/globals/disable/PUT.js +1 -1
  53. package/dist/kempo/api/globals/disable/PUT.js.map +1 -1
  54. package/dist/kempo/api/globals/enable/PUT.js +1 -1
  55. package/dist/kempo/api/globals/enable/PUT.js.map +1 -1
  56. package/dist/kempo/api/globals/entry/GET.js +1 -1
  57. package/dist/kempo/api/globals/entry/GET.js.map +1 -1
  58. package/dist/kempo/api/globals/entry/PUT.js +1 -1
  59. package/dist/kempo/api/globals/entry/PUT.js.map +1 -1
  60. package/dist/kempo/api/globals/lock/PUT.js +1 -1
  61. package/dist/kempo/api/globals/lock/PUT.js.map +1 -1
  62. package/dist/kempo/api/pages/DELETE.js +1 -1
  63. package/dist/kempo/api/pages/DELETE.js.map +1 -1
  64. package/dist/kempo/api/pages/GET.js +1 -1
  65. package/dist/kempo/api/pages/GET.js.map +1 -1
  66. package/dist/kempo/api/pages/POST.js +1 -1
  67. package/dist/kempo/api/pages/POST.js.map +1 -1
  68. package/dist/kempo/api/pages/directories/GET.js +1 -1
  69. package/dist/kempo/api/pages/directories/GET.js.map +1 -1
  70. package/dist/kempo/api/pages/disable/PUT.js +1 -1
  71. package/dist/kempo/api/pages/disable/PUT.js.map +1 -1
  72. package/dist/kempo/api/pages/enable/PUT.js +1 -1
  73. package/dist/kempo/api/pages/enable/PUT.js.map +1 -1
  74. package/dist/kempo/api/pages/file/GET.js +1 -1
  75. package/dist/kempo/api/pages/file/GET.js.map +1 -1
  76. package/dist/kempo/api/pages/file/PATCH.js +1 -1
  77. package/dist/kempo/api/pages/file/PATCH.js.map +1 -1
  78. package/dist/kempo/api/pages/file/PUT.js +1 -1
  79. package/dist/kempo/api/pages/file/PUT.js.map +1 -1
  80. package/dist/kempo/api/pages/lock/PUT.js +1 -1
  81. package/dist/kempo/api/pages/lock/PUT.js.map +1 -1
  82. package/dist/kempo/api/pages/rescan/POST.js +2 -0
  83. package/dist/kempo/api/pages/rescan/POST.js.map +1 -0
  84. package/dist/kempo/api/pages/search/GET.js +1 -1
  85. package/dist/kempo/api/pages/search/GET.js.map +1 -1
  86. package/dist/kempo/api/pages/templates/GET.js +1 -1
  87. package/dist/kempo/api/pages/templates/GET.js.map +1 -1
  88. package/dist/kempo/api/templates/DELETE.js +1 -1
  89. package/dist/kempo/api/templates/DELETE.js.map +1 -1
  90. package/dist/kempo/api/templates/GET.js +1 -1
  91. package/dist/kempo/api/templates/GET.js.map +1 -1
  92. package/dist/kempo/api/templates/POST.js +1 -1
  93. package/dist/kempo/api/templates/POST.js.map +1 -1
  94. package/dist/kempo/api/templates/disable/PUT.js +1 -1
  95. package/dist/kempo/api/templates/disable/PUT.js.map +1 -1
  96. package/dist/kempo/api/templates/enable/PUT.js +1 -1
  97. package/dist/kempo/api/templates/enable/PUT.js.map +1 -1
  98. package/dist/kempo/api/templates/file/GET.js +1 -1
  99. package/dist/kempo/api/templates/file/GET.js.map +1 -1
  100. package/dist/kempo/api/templates/file/PATCH.js +1 -1
  101. package/dist/kempo/api/templates/file/PATCH.js.map +1 -1
  102. package/dist/kempo/api/templates/file/PUT.js +1 -1
  103. package/dist/kempo/api/templates/file/PUT.js.map +1 -1
  104. package/dist/kempo/api/templates/lock/PUT.js +1 -1
  105. package/dist/kempo/api/templates/lock/PUT.js.map +1 -1
  106. package/dist/kempo/sdk.js +1 -1
  107. package/dist/kempo/sdk.js.map +1 -1
  108. package/middleware/kempo.js +50 -1
  109. package/package.json +3 -3
  110. package/server/utils/fragments/listFragments.js +10 -1
  111. package/server/utils/hooks/triggerHook.js +7 -12
  112. package/server/utils/pages/listPages.js +57 -7
  113. package/app-public/kempo-global.global-disabled.html +0 -0
  114. package/app-public/new-page.page.html +0 -17
  115. package/app-public/test.page.html +0 -21
@@ -1,7 +1,174 @@
1
1
  <!--
2
2
  locked: true
3
3
  -->
4
- <page title="Pages - Admin"><content><script type="module" src="/kempo-ui/components/Table.js"></script><script type="module" src="/kempo-ui/components/tableControls/FirstPage.js"></script><script type="module" src="/kempo-ui/components/tableControls/PrevPage.js"></script><script type="module" src="/kempo-ui/components/tableControls/NextPage.js"></script><script type="module" src="/kempo-ui/components/tableControls/LastPage.js"></script><script type="module" src="/kempo-ui/components/tableControls/PageSelect.js"></script><script type="module" src="/kempo-ui/components/tableControls/PageSize.js"></script><script type="module" src="/kempo-ui/components/tableControls/DeleteRecord.js"></script><script type="module" src="/kempo-ui/components/tableControls/DeleteSelected.js"></script><script type="module" src="/kempo-ui/components/Icon.js"></script><script type="module" src="/admin/components/TableRowLink.js"></script><script type="module" src="/kempo/components/Permission.js"></script><div class="d-f mb" style="align-items: center; gap: var(--spacer);"><h1 class="flex mb0">Pages</h1><k-permission has="system:pages:create"><button id="createPageBtn" class="primary">Create Page</button></k-permission></div><h2>Custom Pages</h2><k-table id="customTable" enable-pages page-size="25" page-size-options="[10,25,50,100]" placeholder="No custom pages have been created yet."><admin-table-row-link slot="before" url-pattern="/admin/content/pages/edit?path={editPath}" field-name="editPath"></admin-table-row-link><div slot="top" class="d-f full" style="align-items: center;"><div><k-permission has="system:pages:delete"><k-tc-delete-selected></k-tc-delete-selected></k-permission></div></div><div class="d-f full" style="align-items: center;"><div><k-tc-first-page></k-tc-first-page><k-tc-prev-page></k-tc-prev-page><k-tc-next-page></k-tc-next-page><k-tc-last-page></k-tc-last-page></div><div class="flex"></div><div><k-tc-page-select></k-tc-page-select></div><div class="flex"></div><div><k-tc-page-size></k-tc-page-size></div></div></k-table><h2>Extension Pages</h2><k-table id="extensionTable" enable-pages page-size="25" page-size-options="[10,25,50,100]" placeholder="No extension pages installed."><admin-table-row-link slot="before" url-pattern="/admin/pages/edit?path={editPath}" field-name="editPath"></admin-table-row-link><div class="d-f full" style="align-items: center;"><div><k-tc-first-page></k-tc-first-page><k-tc-prev-page></k-tc-prev-page><k-tc-next-page></k-tc-next-page><k-tc-last-page></k-tc-last-page></div><div class="flex"></div><div><k-tc-page-select></k-tc-page-select></div><div class="flex"></div><div><k-tc-page-size></k-tc-page-size></div></div></k-table><h2>System Pages</h2><k-table id="systemTable" enable-pages page-size="25" page-size-options="[10,25,50,100]" placeholder="No system pages found."><admin-table-row-link slot="before" url-pattern="/admin/pages/edit?path={editPath}" field-name="editPath"></admin-table-row-link><div class="d-f full" style="align-items: center;"><div><k-tc-first-page></k-tc-first-page><k-tc-prev-page></k-tc-prev-page><k-tc-next-page></k-tc-next-page><k-tc-last-page></k-tc-last-page></div><div class="flex"></div><div><k-tc-page-select></k-tc-page-select></div><div class="flex"></div><div><k-tc-page-size></k-tc-page-size></div></div></k-table><script type="module">import { listPages, listTemplates, listDirectories, createPage, deletePages, getAllCurrentUserPermissions } from '/kempo/sdk.js';
4
+ <page title="Pages - Admin">
5
+ <content>
6
+ <script
7
+ type="module"
8
+ src="/kempo-ui/components/Table.js"
9
+ ></script>
10
+ <script
11
+ type="module"
12
+ src="/kempo-ui/components/tableControls/FirstPage.js"
13
+ ></script>
14
+ <script
15
+ type="module"
16
+ src="/kempo-ui/components/tableControls/PrevPage.js"
17
+ ></script>
18
+ <script
19
+ type="module"
20
+ src="/kempo-ui/components/tableControls/NextPage.js"
21
+ ></script>
22
+ <script
23
+ type="module"
24
+ src="/kempo-ui/components/tableControls/LastPage.js"
25
+ ></script>
26
+ <script
27
+ type="module"
28
+ src="/kempo-ui/components/tableControls/PageSelect.js"
29
+ ></script>
30
+ <script
31
+ type="module"
32
+ src="/kempo-ui/components/tableControls/PageSize.js"
33
+ ></script>
34
+ <script
35
+ type="module"
36
+ src="/kempo-ui/components/tableControls/DeleteRecord.js"
37
+ ></script>
38
+ <script
39
+ type="module"
40
+ src="/kempo-ui/components/tableControls/DeleteSelected.js"
41
+ ></script>
42
+ <script
43
+ type="module"
44
+ src="/kempo-ui/components/Icon.js"
45
+ ></script>
46
+ <script
47
+ type="module"
48
+ src="/admin/components/TableRowLink.js"
49
+ ></script>
50
+ <script
51
+ type="module"
52
+ src="/kempo/components/Permission.js"
53
+ ></script>
54
+ <div class="d-f mb">
55
+ <h1 class="flex mb0">Pages</h1>
56
+ <div class="flex"></div>
57
+ <div>
58
+ <span id="scanInfo" class="muted"></span>
59
+ <button id="rescanBtn">Rescan</button>
60
+ <k-permission has="system:pages:create">
61
+ <button
62
+ id="createPageBtn"
63
+ class="primary"
64
+ >Create Page</button>
65
+ </k-permission>
66
+ </div>
67
+ </div>
68
+
69
+ <h2>Custom Pages</h2>
70
+ <k-table
71
+ id="customTable"
72
+ enable-pages
73
+ page-size="25"
74
+ page-size-options="[10,25,50,100]"
75
+ placeholder="No custom pages have been created yet."
76
+ >
77
+ <admin-table-row-link
78
+ slot="before"
79
+ url-pattern="/admin/content/pages/edit?path={editPath}"
80
+ field-name="editPath"
81
+ ></admin-table-row-link>
82
+ <div
83
+ slot="top"
84
+ class="d-f full"
85
+ style="align-items: center;"
86
+ >
87
+ <div>
88
+ <k-permission has="system:pages:delete">
89
+ <k-tc-delete-selected></k-tc-delete-selected>
90
+ </k-permission>
91
+ </div>
92
+ </div>
93
+ <div
94
+ class="d-f full"
95
+ style="align-items: center;"
96
+ >
97
+ <div>
98
+ <k-tc-first-page></k-tc-first-page>
99
+ <k-tc-prev-page></k-tc-prev-page>
100
+ <k-tc-next-page></k-tc-next-page>
101
+ <k-tc-last-page></k-tc-last-page>
102
+ </div>
103
+ <div class="flex"></div>
104
+ <div><k-tc-page-select></k-tc-page-select></div>
105
+ <div class="flex"></div>
106
+ <div><k-tc-page-size></k-tc-page-size></div>
107
+ </div>
108
+ </k-table>
109
+
110
+ <h2>Extension Pages</h2>
111
+ <k-table
112
+ id="extensionTable"
113
+ enable-pages
114
+ page-size="25"
115
+ page-size-options="[10,25,50,100]"
116
+ placeholder="No extension pages installed."
117
+ >
118
+ <admin-table-row-link
119
+ slot="before"
120
+ url-pattern="/admin/pages/edit?path={editPath}"
121
+ field-name="editPath"
122
+ ></admin-table-row-link>
123
+ <div
124
+ class="d-f full"
125
+ style="align-items: center;"
126
+ >
127
+ <div>
128
+ <k-tc-first-page></k-tc-first-page>
129
+ <k-tc-prev-page></k-tc-prev-page>
130
+ <k-tc-next-page></k-tc-next-page>
131
+ <k-tc-last-page></k-tc-last-page>
132
+ </div>
133
+ <div class="flex"></div>
134
+ <div><k-tc-page-select></k-tc-page-select></div>
135
+ <div class="flex"></div>
136
+ <div><k-tc-page-size></k-tc-page-size></div>
137
+ </div>
138
+ </k-table>
139
+
140
+ <h2>System Pages</h2>
141
+ <k-table
142
+ id="systemTable"
143
+ enable-pages
144
+ page-size="25"
145
+ page-size-options="[10,25,50,100]"
146
+ placeholder="No system pages found."
147
+ >
148
+ <admin-table-row-link
149
+ slot="before"
150
+ url-pattern="/admin/pages/edit?path={editPath}"
151
+ field-name="editPath"
152
+ ></admin-table-row-link>
153
+ <div
154
+ class="d-f full"
155
+ style="align-items: center;"
156
+ >
157
+ <div>
158
+ <k-tc-first-page></k-tc-first-page>
159
+ <k-tc-prev-page></k-tc-prev-page>
160
+ <k-tc-next-page></k-tc-next-page>
161
+ <k-tc-last-page></k-tc-last-page>
162
+ </div>
163
+ <div class="flex"></div>
164
+ <div><k-tc-page-select></k-tc-page-select></div>
165
+ <div class="flex"></div>
166
+ <div><k-tc-page-size></k-tc-page-size></div>
167
+ </div>
168
+ </k-table>
169
+
170
+ <script type="module">
171
+ import { listPages, rescanPages, listTemplates, listDirectories, createPage, deletePages, getAllCurrentUserPermissions } from '/kempo/sdk.js';
5
172
  import { html } from '/kempo-ui/lit-all.min.js';
6
173
  import Dialog from '/kempo-ui/components/Dialog.js';
7
174
  import Toast from '/kempo-ui/components/Toast.js';
@@ -12,7 +179,7 @@
12
179
  const myPerms = new Set(permData?.permissions ?? []);
13
180
 
14
181
  const fields = [
15
- { name: 'lockedBadge', label: '', size: 40, formatter: v => v },
182
+ { name: 'locked', label: '', size: 40, calculator: r => r.locked ? html`<k-icon name="lock"></k-icon>` : html`` },
16
183
  { name: 'name', label: 'Name', size: 200 },
17
184
  { name: 'url', label: 'URL', size: 250 },
18
185
  { name: 'author', label: 'Author', size: 150 },
@@ -30,35 +197,62 @@
30
197
  const $extensionTable = document.getElementById('extensionTable');
31
198
  const $systemTable = document.getElementById('systemTable');
32
199
 
33
- const loadPages = async () => {
34
- const [error, data] = await listPages();
200
+ const $scanInfo = document.getElementById('scanInfo');
201
+ const $rescanBtn = document.getElementById('rescanBtn');
202
+ let scannedAt = null;
203
+
204
+ const formatAge = ts => {
205
+ const s = Math.floor((Date.now() - ts) / 1000);
206
+ if(s < 60) return `${s}s ago`;
207
+ if(s < 3600) return `${Math.floor(s / 60)}m ago`;
208
+ return `${Math.floor(s / 3600)}h ago`;
209
+ };
210
+
211
+ const updateScanInfo = () => {
212
+ $scanInfo.textContent = scannedAt ? `Scanned ${formatAge(scannedAt)}` : '';
213
+ };
214
+
215
+ setInterval(updateScanInfo, 1000);
216
+
217
+ const toEditPath = p => ({ ...p, editPath: p.file.replace(/\.page\.html$/, '') });
218
+
219
+ const initTable = async ($table, tableFields, owner) => {
220
+ const [error, data] = await listPages({ owner, showHidden: false, offset: 0, limit: 25 });
35
221
  if(error){
36
222
  Toast.error(error.msg || 'Failed to load pages');
37
- return;
223
+ return null;
38
224
  }
39
- const toEditPath = p => ({ ...p, editPath: p.file.replace(/\.page\.html$/, ''), lockedBadge: p.locked ? '<k-icon name="lock"></k-icon>' : '' });
40
- const sortPages = pages => pages.slice().sort((a, b) => {
41
- const aPath = a.file.replace(/\.page\.html$/, '');
42
- const bPath = b.file.replace(/\.page\.html$/, '');
43
- const aDir = aPath.includes('/') ? aPath.split('/').slice(0, -1).join('/') : '';
44
- const bDir = bPath.includes('/') ? bPath.split('/').slice(0, -1).join('/') : '';
45
- if(aPath === 'index' || aPath === '') return -1;
46
- if(bPath === 'index' || bPath === '') return 1;
47
- if(aDir !== bDir){
48
- if(!aDir) return -1;
49
- if(!bDir) return 1;
50
- return aDir.localeCompare(bDir);
51
- }
52
- return aPath.localeCompare(bPath);
53
- });
54
- const custom = sortPages(data.pages.filter(p => p.owner === 'custom').map(toEditPath));
55
- const extension = sortPages(data.pages.filter(p => p.owner !== 'custom' && p.owner !== 'system').map(toEditPath));
56
- const system = sortPages(data.pages.filter(p => p.owner === 'system').map(toEditPath));
57
- $customTable.setData({ records: custom, fields });
58
- $extensionTable.setData({ records: extension, fields: extensionFields });
59
- $systemTable.setData({ records: system, fields });
225
+ $table.setData({ records: data.pages.map(toEditPath), fields: tableFields });
226
+ if(data.total > data.pages.length){
227
+ $table.setupFetchRecords(data.total, async (start, count) => {
228
+ const [, d] = await listPages({ owner, showHidden: false, offset: start, limit: count });
229
+ return (d?.pages || []).map(toEditPath);
230
+ });
231
+ }
232
+ return data.scannedAt;
233
+ };
234
+
235
+ const loadPages = async () => {
236
+ const results = await Promise.all([
237
+ initTable($customTable, fields, 'custom'),
238
+ initTable($extensionTable, extensionFields, 'extension'),
239
+ initTable($systemTable, fields, 'system')
240
+ ]);
241
+ scannedAt = results.find(r => r != null) ?? null;
242
+ updateScanInfo();
60
243
  };
61
244
 
245
+ $rescanBtn.addEventListener('click', async () => {
246
+ $rescanBtn.disabled = true;
247
+ const [error] = await rescanPages();
248
+ if(error){
249
+ $rescanBtn.disabled = false;
250
+ Toast.error(error.msg || 'Rescan failed');
251
+ return;
252
+ }
253
+ window.location.reload();
254
+ });
255
+
62
256
  if(myPerms.has('system:pages:delete')){
63
257
  $customTable.setAttribute('request-delete', '');
64
258
  $customTable.setAttribute('enable-selection', '');
@@ -215,4 +409,7 @@
215
409
  updateSlug();
216
410
  });
217
411
  $dialog.querySelector('#dlg-name').addEventListener('input', updateSlug);
218
- });</script></content></page>
412
+ });
413
+ </script>
414
+ </content>
415
+ </page>
@@ -1,4 +1,11 @@
1
1
  <!--
2
2
  locked: true
3
3
  -->
4
- <page title="Edit Template - Admin"><content><admin-template-editor></admin-template-editor></content><content location="head"><script type="module" src="/admin/components/TemplateEditor.js"></script></content></page>
4
+ <page title="Edit Template - Admin">
5
+ <content>
6
+ <admin-template-editor></admin-template-editor>
7
+ </content>
8
+ <content location="head">
9
+ <script type="module" src="/admin/components/TemplateEditor.js"></script>
10
+ </content>
11
+ </page>
@@ -1,7 +1,118 @@
1
1
  <!--
2
2
  locked: true
3
3
  -->
4
- <page title="Templates - Admin"><content><script type="module" src="/kempo-ui/components/Table.js"></script><script type="module" src="/kempo-ui/components/tableControls/FirstPage.js"></script><script type="module" src="/kempo-ui/components/tableControls/PrevPage.js"></script><script type="module" src="/kempo-ui/components/tableControls/NextPage.js"></script><script type="module" src="/kempo-ui/components/tableControls/LastPage.js"></script><script type="module" src="/kempo-ui/components/tableControls/PageSelect.js"></script><script type="module" src="/kempo-ui/components/tableControls/PageSize.js"></script><script type="module" src="/kempo-ui/components/tableControls/DeleteRecord.js"></script><script type="module" src="/kempo-ui/components/tableControls/DeleteSelected.js"></script><script type="module" src="/kempo-ui/components/Icon.js"></script><script type="module" src="/admin/components/TableRowLink.js"></script><script type="module" src="/kempo/components/Permission.js"></script><div class="d-f mb" style="align-items: center; gap: var(--spacer);"><h1 class="flex mb0">Templates</h1><k-permission has="system:pages:create"><button id="createTemplateBtn" class="primary">Create Template</button></k-permission></div><h2>Custom Templates</h2><k-table id="customTable" enable-pages page-size="25" page-size-options="[10,25,50,100]" placeholder="No custom templates have been created yet."><admin-table-row-link slot="before" url-pattern="/admin/content/templates/edit?template={editPath}" field-name="editPath"></admin-table-row-link><div slot="top" class="d-f full" style="align-items: center;"><div><k-permission has="system:pages:delete"><k-tc-delete-selected></k-tc-delete-selected></k-permission></div></div><div class="d-f full" style="align-items: center;"><div><k-tc-first-page></k-tc-first-page><k-tc-prev-page></k-tc-prev-page><k-tc-next-page></k-tc-next-page><k-tc-last-page></k-tc-last-page></div><div class="flex"></div><div><k-tc-page-select></k-tc-page-select></div><div class="flex"></div><div><k-tc-page-size></k-tc-page-size></div></div></k-table><h2>Extension Templates</h2><k-table id="extensionTable" enable-pages page-size="25" page-size-options="[10,25,50,100]" placeholder="No extension templates installed."><admin-table-row-link slot="before" url-pattern="/admin/content/templates/edit?template={editPath}" field-name="editPath"></admin-table-row-link><div class="d-f full" style="align-items: center;"><div><k-tc-first-page></k-tc-first-page><k-tc-prev-page></k-tc-prev-page><k-tc-next-page></k-tc-next-page><k-tc-last-page></k-tc-last-page></div><div class="flex"></div><div><k-tc-page-select></k-tc-page-select></div><div class="flex"></div><div><k-tc-page-size></k-tc-page-size></div></div></k-table><h2>System Templates</h2><k-table id="systemTable" enable-pages page-size="25" page-size-options="[10,25,50,100]" placeholder="No system templates found."><admin-table-row-link slot="before" url-pattern="/admin/content/templates/edit?template={editPath}" field-name="editPath"></admin-table-row-link><div class="d-f full" style="align-items: center;"><div><k-tc-first-page></k-tc-first-page><k-tc-prev-page></k-tc-prev-page><k-tc-next-page></k-tc-next-page><k-tc-last-page></k-tc-last-page></div><div class="flex"></div><div><k-tc-page-select></k-tc-page-select></div><div class="flex"></div><div><k-tc-page-size></k-tc-page-size></div></div></k-table><script type="module">import { listTemplates, listDirectories, createTemplate, deleteTemplates, getAllCurrentUserPermissions } from '/kempo/sdk.js';
4
+ <page title="Templates - Admin">
5
+ <content>
6
+ <script type="module" src="/kempo-ui/components/Table.js"></script>
7
+ <script type="module" src="/kempo-ui/components/tableControls/FirstPage.js"></script>
8
+ <script type="module" src="/kempo-ui/components/tableControls/PrevPage.js"></script>
9
+ <script type="module" src="/kempo-ui/components/tableControls/NextPage.js"></script>
10
+ <script type="module" src="/kempo-ui/components/tableControls/LastPage.js"></script>
11
+ <script type="module" src="/kempo-ui/components/tableControls/PageSelect.js"></script>
12
+ <script type="module" src="/kempo-ui/components/tableControls/PageSize.js"></script>
13
+ <script type="module" src="/kempo-ui/components/tableControls/DeleteRecord.js"></script>
14
+ <script type="module" src="/kempo-ui/components/tableControls/DeleteSelected.js"></script>
15
+ <script type="module" src="/kempo-ui/components/Icon.js"></script>
16
+ <script type="module" src="/admin/components/TableRowLink.js"></script>
17
+ <script type="module" src="/kempo/components/Permission.js"></script>
18
+
19
+ <div class="d-f mb" style="align-items: center; gap: var(--spacer);">
20
+ <h1 class="flex mb0">Templates</h1>
21
+ <k-permission has="system:pages:create">
22
+ <button id="createTemplateBtn" class="primary">Create Template</button>
23
+ </k-permission>
24
+ </div>
25
+
26
+ <h2>Custom Templates</h2>
27
+ <k-table
28
+ id="customTable"
29
+ enable-pages
30
+ page-size="25"
31
+ page-size-options="[10,25,50,100]"
32
+ placeholder="No custom templates have been created yet."
33
+ >
34
+ <admin-table-row-link
35
+ slot="before"
36
+ url-pattern="/admin/content/templates/edit?template={editPath}"
37
+ field-name="editPath"
38
+ ></admin-table-row-link>
39
+ <div slot="top" class="d-f full" style="align-items: center;">
40
+ <div>
41
+ <k-permission has="system:pages:delete">
42
+ <k-tc-delete-selected></k-tc-delete-selected>
43
+ </k-permission>
44
+ </div>
45
+ </div>
46
+ <div class="d-f full" style="align-items: center;">
47
+ <div>
48
+ <k-tc-first-page></k-tc-first-page>
49
+ <k-tc-prev-page></k-tc-prev-page>
50
+ <k-tc-next-page></k-tc-next-page>
51
+ <k-tc-last-page></k-tc-last-page>
52
+ </div>
53
+ <div class="flex"></div>
54
+ <div><k-tc-page-select></k-tc-page-select></div>
55
+ <div class="flex"></div>
56
+ <div><k-tc-page-size></k-tc-page-size></div>
57
+ </div>
58
+ </k-table>
59
+
60
+ <h2>Extension Templates</h2>
61
+ <k-table
62
+ id="extensionTable"
63
+ enable-pages
64
+ page-size="25"
65
+ page-size-options="[10,25,50,100]"
66
+ placeholder="No extension templates installed."
67
+ >
68
+ <admin-table-row-link
69
+ slot="before"
70
+ url-pattern="/admin/content/templates/edit?template={editPath}"
71
+ field-name="editPath"
72
+ ></admin-table-row-link>
73
+ <div class="d-f full" style="align-items: center;">
74
+ <div>
75
+ <k-tc-first-page></k-tc-first-page>
76
+ <k-tc-prev-page></k-tc-prev-page>
77
+ <k-tc-next-page></k-tc-next-page>
78
+ <k-tc-last-page></k-tc-last-page>
79
+ </div>
80
+ <div class="flex"></div>
81
+ <div><k-tc-page-select></k-tc-page-select></div>
82
+ <div class="flex"></div>
83
+ <div><k-tc-page-size></k-tc-page-size></div>
84
+ </div>
85
+ </k-table>
86
+
87
+ <h2>System Templates</h2>
88
+ <k-table
89
+ id="systemTable"
90
+ enable-pages
91
+ page-size="25"
92
+ page-size-options="[10,25,50,100]"
93
+ placeholder="No system templates found."
94
+ >
95
+ <admin-table-row-link
96
+ slot="before"
97
+ url-pattern="/admin/content/templates/edit?template={editPath}"
98
+ field-name="editPath"
99
+ ></admin-table-row-link>
100
+ <div class="d-f full" style="align-items: center;">
101
+ <div>
102
+ <k-tc-first-page></k-tc-first-page>
103
+ <k-tc-prev-page></k-tc-prev-page>
104
+ <k-tc-next-page></k-tc-next-page>
105
+ <k-tc-last-page></k-tc-last-page>
106
+ </div>
107
+ <div class="flex"></div>
108
+ <div><k-tc-page-select></k-tc-page-select></div>
109
+ <div class="flex"></div>
110
+ <div><k-tc-page-size></k-tc-page-size></div>
111
+ </div>
112
+ </k-table>
113
+
114
+ <script type="module">
115
+ import { listTemplates, listDirectories, createTemplate, deleteTemplates, getAllCurrentUserPermissions } from '/kempo/sdk.js';
5
116
  import { html } from '/kempo-ui/lit-all.min.js';
6
117
  import Dialog from '/kempo-ui/components/Dialog.js';
7
118
  import Toast from '/kempo-ui/components/Toast.js';
@@ -190,4 +301,7 @@
190
301
  updateSlug();
191
302
  });
192
303
  $dialog.querySelector('#dlg-name').addEventListener('input', updateSlug);
193
- });</script></content></page>
304
+ });
305
+ </script>
306
+ </content>
307
+ </page>
@@ -6,4 +6,23 @@
6
6
  created:
7
7
  updated:
8
8
  -->
9
- <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" type="image/png" sizes="48x48" href="/media/icon48.png"><link rel="manifest" href="/manifest.json"><title>{{title}}</title><link rel="stylesheet" href="/kempo-css/kempo.min.css"><script src="/admin/init.js"></script><location name="head"/></head><body><fragment name="nav"/><k-main><location/></k-main><location name="scripts"/></body></html>
9
+ <!DOCTYPE html>
10
+ <html lang="en">
11
+ <head>
12
+ <meta charset="UTF-8">
13
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
14
+ <link rel="icon" type="image/png" sizes="48x48" href="/media/icon48.png">
15
+ <link rel="manifest" href="/manifest.json">
16
+ <title>{{title}}</title>
17
+ <link rel="stylesheet" href="/kempo-css/kempo.min.css">
18
+ <script src="/admin/init.js"></script>
19
+ <location name="head" />
20
+ </head>
21
+ <body>
22
+ <fragment name="nav" />
23
+ <k-main>
24
+ <location />
25
+ </k-main>
26
+ <location name="scripts" />
27
+ </body>
28
+ </html>
@@ -1,7 +1,61 @@
1
1
  <!--
2
2
  locked: true
3
3
  -->
4
- <page title="Extensions - Admin"><content><script type="module" src="/kempo-ui/components/Table.js"></script><script type="module" src="/kempo-ui/components/tableControls/FirstPage.js"></script><script type="module" src="/kempo-ui/components/tableControls/PrevPage.js"></script><script type="module" src="/kempo-ui/components/tableControls/NextPage.js"></script><script type="module" src="/kempo-ui/components/tableControls/LastPage.js"></script><script type="module" src="/kempo-ui/components/tableControls/PageSelect.js"></script><script type="module" src="/kempo-ui/components/tableControls/PageSize.js"></script><script type="module" src="/admin/components/tableControls/InstallExtension.js"></script><script type="module" src="/admin/components/tableControls/UninstallExtension.js"></script><script type="module" src="/kempo/components/Permission.js"></script><div class="d-f mb" style="align-items: center; gap: var(--spacer);"><h1 class="flex mb0">Extensions</h1></div><h2>Installed Extensions</h2><k-table id="installedTable" enable-pages page-size="25" placeholder="No extensions are currently installed."><admin-uninstall-extension slot="after"></admin-uninstall-extension><div class="d-f full" style="align-items: center;"><div><k-tc-first-page></k-tc-first-page><k-tc-prev-page></k-tc-prev-page><k-tc-next-page></k-tc-next-page><k-tc-last-page></k-tc-last-page></div><div class="flex"></div><div><k-tc-page-select></k-tc-page-select></div><div class="flex"></div><div><k-tc-page-size></k-tc-page-size></div></div></k-table><h2>Available Extensions</h2><k-table id="availableTable" enable-pages page-size="25" placeholder="No extensions are available to install. Install a kempo extension package via npm first."><admin-install-extension slot="after"></admin-install-extension><div class="d-f full" style="align-items: center;"><div><k-tc-first-page></k-tc-first-page><k-tc-prev-page></k-tc-prev-page><k-tc-next-page></k-tc-next-page><k-tc-last-page></k-tc-last-page></div><div class="flex"></div><div><k-tc-page-select></k-tc-page-select></div><div class="flex"></div><div><k-tc-page-size></k-tc-page-size></div></div></k-table></content><content location="scripts"><script type="module">import { listExtensions, listAvailableExtensions } from '/kempo/sdk.js';
4
+ <page title="Extensions - Admin">
5
+ <content>
6
+ <script type="module" src="/kempo-ui/components/Table.js"></script>
7
+ <script type="module" src="/kempo-ui/components/tableControls/FirstPage.js"></script>
8
+ <script type="module" src="/kempo-ui/components/tableControls/PrevPage.js"></script>
9
+ <script type="module" src="/kempo-ui/components/tableControls/NextPage.js"></script>
10
+ <script type="module" src="/kempo-ui/components/tableControls/LastPage.js"></script>
11
+ <script type="module" src="/kempo-ui/components/tableControls/PageSelect.js"></script>
12
+ <script type="module" src="/kempo-ui/components/tableControls/PageSize.js"></script>
13
+ <script type="module" src="/admin/components/tableControls/InstallExtension.js"></script>
14
+ <script type="module" src="/admin/components/tableControls/UninstallExtension.js"></script>
15
+ <script type="module" src="/kempo/components/Permission.js"></script>
16
+
17
+ <div class="d-f mb" style="align-items: center; gap: var(--spacer);">
18
+ <h1 class="flex mb0">Extensions</h1>
19
+ </div>
20
+
21
+ <h2>Installed Extensions</h2>
22
+ <k-table id="installedTable" enable-pages page-size="25" placeholder="No extensions are currently installed.">
23
+ <admin-uninstall-extension slot="after"></admin-uninstall-extension>
24
+ <div class="d-f full" style="align-items: center;">
25
+ <div>
26
+ <k-tc-first-page></k-tc-first-page>
27
+ <k-tc-prev-page></k-tc-prev-page>
28
+ <k-tc-next-page></k-tc-next-page>
29
+ <k-tc-last-page></k-tc-last-page>
30
+ </div>
31
+ <div class="flex"></div>
32
+ <div><k-tc-page-select></k-tc-page-select></div>
33
+ <div class="flex"></div>
34
+ <div><k-tc-page-size></k-tc-page-size></div>
35
+ </div>
36
+ </k-table>
37
+
38
+ <h2>Available Extensions</h2>
39
+ <k-table id="availableTable" enable-pages page-size="25" placeholder="No extensions are available to install. Install a kempo extension package via npm first.">
40
+ <admin-install-extension slot="after"></admin-install-extension>
41
+ <div class="d-f full" style="align-items: center;">
42
+ <div>
43
+ <k-tc-first-page></k-tc-first-page>
44
+ <k-tc-prev-page></k-tc-prev-page>
45
+ <k-tc-next-page></k-tc-next-page>
46
+ <k-tc-last-page></k-tc-last-page>
47
+ </div>
48
+ <div class="flex"></div>
49
+ <div><k-tc-page-select></k-tc-page-select></div>
50
+ <div class="flex"></div>
51
+ <div><k-tc-page-size></k-tc-page-size></div>
52
+ </div>
53
+ </k-table>
54
+
55
+ </content>
56
+ <content location="scripts">
57
+ <script type="module">
58
+ import { listExtensions, listAvailableExtensions } from '/kempo/sdk.js';
5
59
 
6
60
  const installedTable = document.getElementById('installedTable');
7
61
  const availableTable = document.getElementById('availableTable');
@@ -63,4 +117,7 @@
63
117
  };
64
118
 
65
119
  availableTable.addEventListener('recordDeleted', refreshInstalledTable);
66
- installedTable.addEventListener('recordDeleted', refreshAvailableTable);</script></content></page>
120
+ installedTable.addEventListener('recordDeleted', refreshAvailableTable);
121
+ </script>
122
+ </content>
123
+ </page>
@@ -0,0 +1 @@
1
+ <svg viewBox="0 0 16667 16667" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M4019.272,16222.329l-2431.295,0c-351.899,0 -653.137,-125.29 -903.74,-375.893c-250.599,-250.599 -375.893,-551.84 -375.893,-903.74l0,-2431.295c511.851,0 959.722,-162.623 1343.611,-487.858c383.889,-325.235 575.833,-738.456 575.833,-1239.643c0,-501.182 -191.944,-914.408 -575.833,-1239.643c-383.889,-325.235 -831.761,-487.858 -1343.611,-487.858l0,-2431.295c0,-351.899 125.29,-653.141 375.893,-903.74c250.599,-250.599 551.84,-375.893 903.74,-375.893l2559.261,0c0,-447.872 154.627,-826.432 463.865,-1135.67c309.238,-309.238 687.802,-463.865 1135.67,-463.865c447.872,0 826.432,154.627 1135.67,463.865c309.238,309.238 463.865,687.802 463.865,1135.67l2559.261,0c351.899,0 653.141,125.29 903.74,375.893c250.599,250.599 375.893,551.84 375.893,903.74l0,2559.261c447.872,0 826.432,154.627 1135.67,463.865c309.238,309.238 463.865,687.802 463.865,1135.67c0,447.872 -154.627,826.432 -463.865,1135.67c-309.238,309.238 -687.802,463.865 -1135.67,463.865l0,2559.261c0,351.899 -125.29,653.137 -375.893,903.74c-250.599,250.599 -551.84,375.893 -903.74,375.893l-2431.295,0c0,-533.172 -167.951,-986.387 -503.854,-1359.608c-335.903,-373.221 -743.785,-559.837 -1223.646,-559.837c-479.861,0 -887.743,186.62 -1223.646,559.837c-335.903,373.221 -503.854,826.432 -503.854,1359.608Zm-2431.295,-1279.627l1359.608,-0.002c255.927,-703.795 666.477,-1199.653 1231.642,-1487.57c565.165,-287.917 1087.684,-431.875 1567.545,-431.875c479.861,0 1002.384,143.958 1567.545,431.875c565.165,287.917 975.719,783.775 1231.642,1487.57l1359.608,0l0,-3838.889l1279.628,0c85.304,0 159.955,-31.989 223.934,-95.972c63.983,-63.983 95.972,-138.63 95.972,-223.934c0,-85.304 -31.989,-159.955 -95.972,-223.934c-63.983,-63.983 -138.634,-95.972 -223.934,-95.972l-1279.628,0l0,-3838.889l-3838.889,0l0,-1279.628c0,-85.304 -31.989,-159.955 -95.972,-223.934c-63.983,-63.983 -138.63,-95.972 -223.934,-95.972c-85.304,0 -159.955,31.989 -223.934,95.972c-63.983,63.983 -95.972,138.634 -95.972,223.934l0,1279.628l-3838.889,0l0,1407.594c575.833,213.266 1039.698,570.509 1391.597,1071.691c351.899,501.182 527.847,1061.023 527.847,1679.514c0,607.823 -175.948,1162.335 -527.847,1663.517c-351.899,501.182 -815.764,863.75 -1391.597,1087.684l0,1407.592Zm12403.694,-8446.685l-1587.205,0l0,-2380.82l-2380.82,0l0,-1587.205l2380.82,0l0,-2380.82l1587.205,0l0,2380.82l2380.82,0l0,1587.205l-2380.82,0l-0,2380.82Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg viewBox="0 0 16667 16667" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M4019.272,16222.329l-2431.295,0c-351.899,0 -653.137,-125.29 -903.74,-375.893c-250.599,-250.599 -375.893,-551.84 -375.893,-903.74l0,-2431.295c511.851,0 959.722,-162.623 1343.611,-487.858c383.889,-325.235 575.833,-738.456 575.833,-1239.643c0,-501.182 -191.944,-914.408 -575.833,-1239.643c-383.889,-325.235 -831.761,-487.858 -1343.611,-487.858l0,-2431.295c0,-351.899 125.29,-653.141 375.893,-903.74c250.599,-250.599 551.84,-375.893 903.74,-375.893l2559.261,0c0,-447.872 154.627,-826.432 463.865,-1135.67c309.238,-309.238 687.802,-463.865 1135.67,-463.865c447.872,0 826.432,154.627 1135.67,463.865c309.238,309.238 463.865,687.802 463.865,1135.67l2559.261,0c351.899,0 653.141,125.29 903.74,375.893c250.599,250.599 375.893,551.84 375.893,903.74l0,2559.261c447.872,0 826.432,154.627 1135.67,463.865c309.238,309.238 463.865,687.802 463.865,1135.67c0,447.872 -154.627,826.432 -463.865,1135.67c-309.238,309.238 -687.802,463.865 -1135.67,463.865l0,2559.261c0,351.899 -125.29,653.137 -375.893,903.74c-250.599,250.599 -551.84,375.893 -903.74,375.893l-2431.295,0c0,-533.172 -167.951,-986.387 -503.854,-1359.608c-335.903,-373.221 -743.785,-559.837 -1223.646,-559.837c-479.861,0 -887.743,186.62 -1223.646,559.837c-335.903,373.221 -503.854,826.432 -503.854,1359.608Zm-2431.295,-1279.627l1359.608,-0.002c255.927,-703.795 666.477,-1199.653 1231.642,-1487.57c565.165,-287.917 1087.684,-431.875 1567.545,-431.875c479.861,0 1002.384,143.958 1567.545,431.875c565.165,287.917 975.719,783.775 1231.642,1487.57l1359.608,0l0,-3838.889l1279.628,0c85.304,0 159.955,-31.989 223.934,-95.972c63.983,-63.983 95.972,-138.63 95.972,-223.934c0,-85.304 -31.989,-159.955 -95.972,-223.934c-63.983,-63.983 -138.634,-95.972 -223.934,-95.972l-1279.628,0l0,-3838.889l-3838.889,0l0,-1279.628c0,-85.304 -31.989,-159.955 -95.972,-223.934c-63.983,-63.983 -138.63,-95.972 -223.934,-95.972c-85.304,0 -159.955,31.989 -223.934,95.972c-63.983,63.983 -95.972,138.634 -95.972,223.934l0,1279.628l-3838.889,0l0,1407.594c575.833,213.266 1039.698,570.509 1391.597,1071.691c351.899,501.182 527.847,1061.023 527.847,1679.514c0,607.823 -175.948,1162.335 -527.847,1663.517c-351.899,501.182 -815.764,863.75 -1391.597,1087.684l0,1407.592Zm14371.18,-11628.351l-6348.844,-0l0,-1587.205l6348.844,0l0,1587.205Z"/></svg>
@@ -2,4 +2,8 @@
2
2
  locked: true
3
3
  template: default
4
4
  -->
5
- <page title="Admin Dashboard"><content><h1>Dashboard</h1></content></page>
5
+ <page title="Admin Dashboard">
6
+ <content>
7
+ <h1>Dashboard</h1>
8
+ </content>
9
+ </page>