kempo 4.2.16 → 4.2.18

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 (274) hide show
  1. package/bin/cli.js +21 -4
  2. package/dist/admin/components/AddGroupControl.js +2 -2
  3. package/dist/admin/components/AddGroupControl.js.map +1 -1
  4. package/dist/admin/components/ClearExpiredSessionsControl.js +2 -2
  5. package/dist/admin/components/ClearExpiredSessionsControl.js.map +1 -1
  6. package/dist/admin/components/FragmentEditor.js +15 -15
  7. package/dist/admin/components/FragmentEditor.js.map +1 -1
  8. package/dist/admin/components/GlobalContentEditor.js +12 -12
  9. package/dist/admin/components/GlobalContentEditor.js.map +1 -1
  10. package/dist/admin/components/GroupDeleteSelected.js +2 -2
  11. package/dist/admin/components/GroupDeleteSelected.js.map +1 -1
  12. package/dist/admin/components/GroupRemoveRecord.js +2 -2
  13. package/dist/admin/components/GroupRemoveRecord.js.map +1 -1
  14. package/dist/admin/components/Monaco.js +1 -1
  15. package/dist/admin/components/Monaco.js.map +1 -1
  16. package/dist/admin/components/PageEditor.js +42 -28
  17. package/dist/admin/components/PageEditor.js.map +1 -1
  18. package/dist/admin/components/TableRowDelete.js +2 -2
  19. package/dist/admin/components/TableRowDelete.js.map +1 -1
  20. package/dist/admin/components/TableRowLink.js +2 -2
  21. package/dist/admin/components/TableRowLink.js.map +1 -1
  22. package/dist/admin/components/TemplateEditor.js +18 -18
  23. package/dist/admin/components/TemplateEditor.js.map +1 -1
  24. package/dist/admin/components/ValueEditor.js +17 -17
  25. package/dist/admin/components/ValueEditor.js.map +1 -1
  26. package/dist/admin/components/tableControls/AddMember.js +2 -2
  27. package/dist/admin/components/tableControls/AddMember.js.map +1 -1
  28. package/dist/admin/components/tableControls/AddPermission.js +2 -2
  29. package/dist/admin/components/tableControls/AddPermission.js.map +1 -1
  30. package/dist/admin/components/tableControls/InstallExtension.js +2 -2
  31. package/dist/admin/components/tableControls/InstallExtension.js.map +1 -1
  32. package/dist/admin/components/tableControls/UninstallExtension.js +2 -2
  33. package/dist/admin/components/tableControls/UninstallExtension.js.map +1 -1
  34. package/dist/admin/extensions/index.page.html +49 -15
  35. package/dist/admin/icons/open_in_new.svg +1 -0
  36. package/dist/admin/nav.fragment.html +1 -1
  37. package/dist/kempo/api/admin-globals/DELETE.js +1 -1
  38. package/dist/kempo/api/admin-globals/DELETE.js.map +1 -1
  39. package/dist/kempo/api/admin-globals/GET.js +1 -1
  40. package/dist/kempo/api/admin-globals/GET.js.map +1 -1
  41. package/dist/kempo/api/admin-globals/POST.js +1 -1
  42. package/dist/kempo/api/admin-globals/POST.js.map +1 -1
  43. package/dist/kempo/api/admin-globals/[id]/GET.js +1 -1
  44. package/dist/kempo/api/admin-globals/[id]/GET.js.map +1 -1
  45. package/dist/kempo/api/admin-globals/[id]/PUT.js +1 -1
  46. package/dist/kempo/api/admin-globals/[id]/PUT.js.map +1 -1
  47. package/dist/kempo/api/admin-globals/[id]/disable/PUT.js +1 -1
  48. package/dist/kempo/api/admin-globals/[id]/disable/PUT.js.map +1 -1
  49. package/dist/kempo/api/admin-globals/[id]/enable/PUT.js +1 -1
  50. package/dist/kempo/api/admin-globals/[id]/enable/PUT.js.map +1 -1
  51. package/dist/kempo/api/auth/change-password/POST.js +1 -1
  52. package/dist/kempo/api/auth/change-password/POST.js.map +1 -1
  53. package/dist/kempo/api/auth/login/email/POST.js +1 -1
  54. package/dist/kempo/api/auth/login/email/POST.js.map +1 -1
  55. package/dist/kempo/api/auth/logout/POST.js +1 -1
  56. package/dist/kempo/api/auth/logout/POST.js.map +1 -1
  57. package/dist/kempo/api/auth/register/email/POST.js +1 -1
  58. package/dist/kempo/api/auth/register/email/POST.js.map +1 -1
  59. package/dist/kempo/api/auth/reset-password/POST.js +1 -1
  60. package/dist/kempo/api/auth/reset-password/POST.js.map +1 -1
  61. package/dist/kempo/api/auth/session/GET.js +1 -1
  62. package/dist/kempo/api/auth/session/GET.js.map +1 -1
  63. package/dist/kempo/api/auth/verify-email/POST.js +1 -1
  64. package/dist/kempo/api/auth/verify-email/POST.js.map +1 -1
  65. package/dist/kempo/api/extensions/DELETE.js +1 -1
  66. package/dist/kempo/api/extensions/DELETE.js.map +1 -1
  67. package/dist/kempo/api/extensions/GET.js +1 -1
  68. package/dist/kempo/api/extensions/GET.js.map +1 -1
  69. package/dist/kempo/api/extensions/POST.js +1 -1
  70. package/dist/kempo/api/extensions/POST.js.map +1 -1
  71. package/dist/kempo/api/extensions/[name]/disable/POST.js +1 -1
  72. package/dist/kempo/api/extensions/[name]/disable/POST.js.map +1 -1
  73. package/dist/kempo/api/extensions/[name]/enable/POST.js +1 -1
  74. package/dist/kempo/api/extensions/[name]/enable/POST.js.map +1 -1
  75. package/dist/kempo/api/extensions/[name]/update/POST.js +1 -1
  76. package/dist/kempo/api/extensions/[name]/update/POST.js.map +1 -1
  77. package/dist/kempo/api/extensions/[name]/update-check/GET.js +1 -1
  78. package/dist/kempo/api/extensions/[name]/update-check/GET.js.map +1 -1
  79. package/dist/kempo/api/extensions/available/GET.js +1 -1
  80. package/dist/kempo/api/extensions/available/GET.js.map +1 -1
  81. package/dist/kempo/api/extensions/known/GET.js +1 -1
  82. package/dist/kempo/api/extensions/known/GET.js.map +1 -1
  83. package/dist/kempo/api/forgot-password/POST.js +1 -1
  84. package/dist/kempo/api/forgot-password/POST.js.map +1 -1
  85. package/dist/kempo/api/fragments/DELETE.js +1 -1
  86. package/dist/kempo/api/fragments/DELETE.js.map +1 -1
  87. package/dist/kempo/api/fragments/GET.js +1 -1
  88. package/dist/kempo/api/fragments/GET.js.map +1 -1
  89. package/dist/kempo/api/fragments/POST.js +1 -1
  90. package/dist/kempo/api/fragments/POST.js.map +1 -1
  91. package/dist/kempo/api/fragments/disable/PUT.js +1 -1
  92. package/dist/kempo/api/fragments/disable/PUT.js.map +1 -1
  93. package/dist/kempo/api/fragments/enable/PUT.js +1 -1
  94. package/dist/kempo/api/fragments/enable/PUT.js.map +1 -1
  95. package/dist/kempo/api/fragments/file/GET.js +1 -1
  96. package/dist/kempo/api/fragments/file/GET.js.map +1 -1
  97. package/dist/kempo/api/fragments/file/PATCH.js +1 -1
  98. package/dist/kempo/api/fragments/file/PATCH.js.map +1 -1
  99. package/dist/kempo/api/fragments/file/PUT.js +1 -1
  100. package/dist/kempo/api/fragments/file/PUT.js.map +1 -1
  101. package/dist/kempo/api/fragments/lock/PUT.js +2 -2
  102. package/dist/kempo/api/fragments/lock/PUT.js.map +1 -1
  103. package/dist/kempo/api/globals/DELETE.js +1 -1
  104. package/dist/kempo/api/globals/DELETE.js.map +1 -1
  105. package/dist/kempo/api/globals/GET.js +1 -1
  106. package/dist/kempo/api/globals/GET.js.map +1 -1
  107. package/dist/kempo/api/globals/POST.js +1 -1
  108. package/dist/kempo/api/globals/POST.js.map +1 -1
  109. package/dist/kempo/api/globals/disable/PUT.js +1 -1
  110. package/dist/kempo/api/globals/disable/PUT.js.map +1 -1
  111. package/dist/kempo/api/globals/enable/PUT.js +1 -1
  112. package/dist/kempo/api/globals/enable/PUT.js.map +1 -1
  113. package/dist/kempo/api/globals/entry/GET.js +1 -1
  114. package/dist/kempo/api/globals/entry/GET.js.map +1 -1
  115. package/dist/kempo/api/globals/entry/PUT.js +1 -1
  116. package/dist/kempo/api/globals/entry/PUT.js.map +1 -1
  117. package/dist/kempo/api/globals/lock/PUT.js +2 -2
  118. package/dist/kempo/api/globals/lock/PUT.js.map +1 -1
  119. package/dist/kempo/api/groups/DELETE.js +1 -1
  120. package/dist/kempo/api/groups/DELETE.js.map +1 -1
  121. package/dist/kempo/api/groups/GET.js +1 -1
  122. package/dist/kempo/api/groups/GET.js.map +1 -1
  123. package/dist/kempo/api/groups/PATCH.js +1 -1
  124. package/dist/kempo/api/groups/PATCH.js.map +1 -1
  125. package/dist/kempo/api/groups/POST.js +1 -1
  126. package/dist/kempo/api/groups/POST.js.map +1 -1
  127. package/dist/kempo/api/groups/[name]/GET.js +1 -1
  128. package/dist/kempo/api/groups/[name]/GET.js.map +1 -1
  129. package/dist/kempo/api/groups/[name]/members/DELETE.js +1 -1
  130. package/dist/kempo/api/groups/[name]/members/DELETE.js.map +1 -1
  131. package/dist/kempo/api/groups/[name]/members/GET.js +1 -1
  132. package/dist/kempo/api/groups/[name]/members/GET.js.map +1 -1
  133. package/dist/kempo/api/groups/[name]/members/POST.js +1 -1
  134. package/dist/kempo/api/groups/[name]/members/POST.js.map +1 -1
  135. package/dist/kempo/api/groups/[name]/permissions/DELETE.js +1 -1
  136. package/dist/kempo/api/groups/[name]/permissions/DELETE.js.map +1 -1
  137. package/dist/kempo/api/groups/[name]/permissions/GET.js +1 -1
  138. package/dist/kempo/api/groups/[name]/permissions/GET.js.map +1 -1
  139. package/dist/kempo/api/groups/[name]/permissions/POST.js +1 -1
  140. package/dist/kempo/api/groups/[name]/permissions/POST.js.map +1 -1
  141. package/dist/kempo/api/pages/DELETE.js +1 -1
  142. package/dist/kempo/api/pages/DELETE.js.map +1 -1
  143. package/dist/kempo/api/pages/GET.js +1 -1
  144. package/dist/kempo/api/pages/GET.js.map +1 -1
  145. package/dist/kempo/api/pages/POST.js +1 -1
  146. package/dist/kempo/api/pages/POST.js.map +1 -1
  147. package/dist/kempo/api/pages/directories/GET.js +1 -1
  148. package/dist/kempo/api/pages/directories/GET.js.map +1 -1
  149. package/dist/kempo/api/pages/disable/PUT.js +1 -1
  150. package/dist/kempo/api/pages/disable/PUT.js.map +1 -1
  151. package/dist/kempo/api/pages/enable/PUT.js +1 -1
  152. package/dist/kempo/api/pages/enable/PUT.js.map +1 -1
  153. package/dist/kempo/api/pages/file/GET.js +1 -1
  154. package/dist/kempo/api/pages/file/GET.js.map +1 -1
  155. package/dist/kempo/api/pages/file/PATCH.js +1 -1
  156. package/dist/kempo/api/pages/file/PATCH.js.map +1 -1
  157. package/dist/kempo/api/pages/file/PUT.js +1 -1
  158. package/dist/kempo/api/pages/file/PUT.js.map +1 -1
  159. package/dist/kempo/api/pages/lock/PUT.js +2 -2
  160. package/dist/kempo/api/pages/lock/PUT.js.map +1 -1
  161. package/dist/kempo/api/pages/search/GET.js +2 -2
  162. package/dist/kempo/api/pages/search/GET.js.map +1 -1
  163. package/dist/kempo/api/pages/templates/GET.js +1 -1
  164. package/dist/kempo/api/pages/templates/GET.js.map +1 -1
  165. package/dist/kempo/api/permissions/DELETE.js +1 -1
  166. package/dist/kempo/api/permissions/DELETE.js.map +1 -1
  167. package/dist/kempo/api/permissions/GET.js +1 -1
  168. package/dist/kempo/api/permissions/GET.js.map +1 -1
  169. package/dist/kempo/api/permissions/PATCH.js +1 -1
  170. package/dist/kempo/api/permissions/PATCH.js.map +1 -1
  171. package/dist/kempo/api/permissions/POST.js +1 -1
  172. package/dist/kempo/api/permissions/POST.js.map +1 -1
  173. package/dist/kempo/api/settings/[owner]/GET.js +1 -1
  174. package/dist/kempo/api/settings/[owner]/GET.js.map +1 -1
  175. package/dist/kempo/api/settings/[owner]/[name]/DELETE.js +1 -1
  176. package/dist/kempo/api/settings/[owner]/[name]/DELETE.js.map +1 -1
  177. package/dist/kempo/api/settings/[owner]/[name]/GET.js +1 -1
  178. package/dist/kempo/api/settings/[owner]/[name]/GET.js.map +1 -1
  179. package/dist/kempo/api/settings/[owner]/[name]/POST.js +1 -1
  180. package/dist/kempo/api/settings/[owner]/[name]/POST.js.map +1 -1
  181. package/dist/kempo/api/settings/public/GET.js +1 -1
  182. package/dist/kempo/api/settings/public/GET.js.map +1 -1
  183. package/dist/kempo/api/templates/DELETE.js +1 -1
  184. package/dist/kempo/api/templates/DELETE.js.map +1 -1
  185. package/dist/kempo/api/templates/GET.js +1 -1
  186. package/dist/kempo/api/templates/GET.js.map +1 -1
  187. package/dist/kempo/api/templates/POST.js +1 -1
  188. package/dist/kempo/api/templates/POST.js.map +1 -1
  189. package/dist/kempo/api/templates/disable/PUT.js +1 -1
  190. package/dist/kempo/api/templates/disable/PUT.js.map +1 -1
  191. package/dist/kempo/api/templates/enable/PUT.js +1 -1
  192. package/dist/kempo/api/templates/enable/PUT.js.map +1 -1
  193. package/dist/kempo/api/templates/file/GET.js +1 -1
  194. package/dist/kempo/api/templates/file/GET.js.map +1 -1
  195. package/dist/kempo/api/templates/file/PATCH.js +1 -1
  196. package/dist/kempo/api/templates/file/PATCH.js.map +1 -1
  197. package/dist/kempo/api/templates/file/PUT.js +1 -1
  198. package/dist/kempo/api/templates/file/PUT.js.map +1 -1
  199. package/dist/kempo/api/templates/lock/PUT.js +2 -2
  200. package/dist/kempo/api/templates/lock/PUT.js.map +1 -1
  201. package/dist/kempo/api/user/DELETE.js +1 -1
  202. package/dist/kempo/api/user/DELETE.js.map +1 -1
  203. package/dist/kempo/api/user/GET.js +1 -1
  204. package/dist/kempo/api/user/GET.js.map +1 -1
  205. package/dist/kempo/api/user/PATCH.js +1 -1
  206. package/dist/kempo/api/user/PATCH.js.map +1 -1
  207. package/dist/kempo/api/user/[userid]/GET.js +1 -1
  208. package/dist/kempo/api/user/[userid]/GET.js.map +1 -1
  209. package/dist/kempo/api/user/[userid]/groups/DELETE.js +1 -1
  210. package/dist/kempo/api/user/[userid]/groups/DELETE.js.map +1 -1
  211. package/dist/kempo/api/user/[userid]/groups/GET.js +1 -1
  212. package/dist/kempo/api/user/[userid]/groups/GET.js.map +1 -1
  213. package/dist/kempo/api/user/[userid]/groups/POST.js +1 -1
  214. package/dist/kempo/api/user/[userid]/groups/POST.js.map +1 -1
  215. package/dist/kempo/api/user/[userid]/permissions/GET.js +1 -1
  216. package/dist/kempo/api/user/[userid]/permissions/GET.js.map +1 -1
  217. package/dist/kempo/api/user/[userid]/permissions/all/GET.js +1 -1
  218. package/dist/kempo/api/user/[userid]/permissions/all/GET.js.map +1 -1
  219. package/dist/kempo/api/user/[userid]/permissions/list/GET.js +1 -1
  220. package/dist/kempo/api/user/[userid]/permissions/list/GET.js.map +1 -1
  221. package/dist/kempo/api/user/[userid]/permissions/some/GET.js +1 -1
  222. package/dist/kempo/api/user/[userid]/permissions/some/GET.js.map +1 -1
  223. package/dist/kempo/api/user/[userid]/sessions/DELETE.js +1 -1
  224. package/dist/kempo/api/user/[userid]/sessions/DELETE.js.map +1 -1
  225. package/dist/kempo/api/user/[userid]/sessions/GET.js +1 -1
  226. package/dist/kempo/api/user/[userid]/sessions/GET.js.map +1 -1
  227. package/dist/kempo/api/user/[userid]/sessions/expired/DELETE.js +1 -1
  228. package/dist/kempo/api/user/[userid]/sessions/expired/DELETE.js.map +1 -1
  229. package/dist/kempo/api/user/create/POST.js +1 -1
  230. package/dist/kempo/api/user/create/POST.js.map +1 -1
  231. package/dist/kempo/api/user/search/GET.js +1 -1
  232. package/dist/kempo/api/user/search/GET.js.map +1 -1
  233. package/dist/kempo/components/LogoutBtn.js +1 -1
  234. package/dist/kempo/components/LogoutBtn.js.map +1 -1
  235. package/dist/kempo/components/Menu.js +9 -9
  236. package/dist/kempo/components/Menu.js.map +1 -1
  237. package/dist/kempo/components/Permission.js +1 -1
  238. package/dist/kempo/components/Permission.js.map +1 -1
  239. package/dist/kempo/components/Role.js +1 -1
  240. package/dist/kempo/components/Role.js.map +1 -1
  241. package/dist/kempo/components/UserCreatedAt.js +1 -1
  242. package/dist/kempo/components/UserCreatedAt.js.map +1 -1
  243. package/dist/kempo/components/UserEmail.js +1 -1
  244. package/dist/kempo/components/UserEmail.js.map +1 -1
  245. package/dist/kempo/components/UserEmailVerified.js +1 -1
  246. package/dist/kempo/components/UserEmailVerified.js.map +1 -1
  247. package/dist/kempo/components/UserName.js +1 -1
  248. package/dist/kempo/components/UserName.js.map +1 -1
  249. package/dist/kempo/fetch.js +1 -1
  250. package/dist/kempo/fetch.js.map +1 -1
  251. package/dist/kempo/sdk.js +1 -1
  252. package/dist/kempo/sdk.js.map +1 -1
  253. package/middleware/kempo.js +36 -6
  254. package/package.json +2 -2
  255. package/server/utils/extensions/installExtension.js +19 -13
  256. package/server/utils/extensions/uninstallExtension.js +6 -10
  257. package/server/utils/pages/deletePage.js +2 -10
  258. package/dist/admin/accounts/groups/[name]/index.html +0 -518
  259. package/dist/admin/accounts/groups/index.html +0 -378
  260. package/dist/admin/accounts/permissions/index.html +0 -397
  261. package/dist/admin/accounts/users/[id]/index.html +0 -541
  262. package/dist/admin/accounts/users/index.html +0 -396
  263. package/dist/admin/content/fragments/edit/index.html +0 -132
  264. package/dist/admin/content/fragments/index.html +0 -375
  265. package/dist/admin/content/globals/edit/index.html +0 -132
  266. package/dist/admin/content/globals/index.html +0 -358
  267. package/dist/admin/content/pages/edit/index.html +0 -132
  268. package/dist/admin/content/pages/index.html +0 -509
  269. package/dist/admin/content/templates/edit/index.html +0 -132
  270. package/dist/admin/content/templates/index.html +0 -429
  271. package/dist/admin/extensions/index.html +0 -222
  272. package/dist/admin/index.html +0 -130
  273. package/dist/admin/settings/[owner]/[name]/index.html +0 -449
  274. package/dist/admin/settings/index.html +0 -410
@@ -1,509 +0,0 @@
1
- <!--
2
- owner: system
3
- locked: true
4
- name:
5
- author:
6
- created:
7
- updated:
8
- -->
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>Pages - Admin</title>
17
- <link rel="stylesheet" href="/kempo-css/kempo.min.css">
18
- <script src="/admin/init.js"></script>
19
-
20
- </head>
21
- <body>
22
- <!--
23
- locked: true
24
- -->
25
-
26
- <k-aside
27
- main="push"
28
- state="expanded"
29
- style="--aside_padding: 0;"
30
- persistent-id="admin-nav"
31
- >
32
- <k-aside-toggle>
33
- <h3 class="m0">Kempo Admin</h3>
34
- </k-aside-toggle>
35
- <k-aside-item
36
- icon="preview"
37
- href="/"
38
- no-expand
39
- >Site</k-aside-item>
40
- <k-aside-item
41
- icon="cards"
42
- href="/admin"
43
- no-expand
44
- >Dashboard</k-aside-item>
45
- <k-aside-menu
46
- icon="manage-accounts"
47
- label="Accounts"
48
- >
49
- <k-aside-item
50
- icon="person"
51
- href="/admin/accounts/users"
52
- no-expand
53
- >Users</k-aside-item>
54
- <k-aside-item
55
- icon="group"
56
- href="/admin/accounts/groups"
57
- no-expand
58
- >Groups</k-aside-item>
59
- <k-aside-item
60
- icon="lock"
61
- href="/admin/accounts/permissions"
62
- no-expand
63
- >Permissions</k-aside-item>
64
- </k-aside-menu>
65
- <k-aside-menu
66
- icon="cards_stack"
67
- label="Content"
68
- >
69
- <k-aside-item
70
- icon="browse"
71
- href="/admin/content/templates"
72
- >Templates</k-aside-item>
73
- <k-aside-item
74
- icon="docs"
75
- href="/admin/content/pages"
76
- >Pages</k-aside-item>
77
- <k-aside-item
78
- icon="content"
79
- href="/admin/content/fragments"
80
- >Fragments</k-aside-item>
81
- <k-aside-item
82
- icon="globe"
83
- href="/admin/content/globals"
84
- >Global Content</k-aside-item>
85
- </k-aside-menu>
86
- <k-aside-item
87
- icon="settings"
88
- href="/admin/settings"
89
- no-expand
90
- >Settings</k-aside-item>
91
- <k-aside-item
92
- icon="extension"
93
- href="/admin/extensions"
94
- no-expand
95
- >Extensions</k-aside-item>
96
- <hr>
97
- <k-aside-spacer></k-aside-spacer>
98
- <k-theme-switcher
99
- labels
100
- style="--padding:var(--spacer_h);margin:var(--spacer_h) auto"
101
- ></k-theme-switcher>
102
- </k-aside>
103
- <script type="module">
104
- import '/kempo-ui/components/ThemeSwitcher.js';
105
- const items = document.querySelectorAll('k-aside-item');
106
- const currentPath = window.location.pathname;
107
-
108
- items.forEach(item => {
109
- const href = item.getAttribute('href');
110
- if (!href) return;
111
- const isExact = href === '/admin' || href === '/';
112
- const match = isExact
113
- ? (currentPath === href || currentPath === href + '/')
114
- : (currentPath === href || currentPath.startsWith(href + '/'));
115
- if (match) {
116
- item.setAttribute('active', '');
117
- const menu = item.closest('k-aside-menu');
118
- if (menu) menu.setAttribute('open', '');
119
- }
120
- });
121
- </script>
122
-
123
- <k-main>
124
-
125
- <script
126
- type="module"
127
- src="/kempo-ui/components/Table.js"
128
- ></script>
129
- <script
130
- type="module"
131
- src="/kempo-ui/components/tableControls/FirstPage.js"
132
- ></script>
133
- <script
134
- type="module"
135
- src="/kempo-ui/components/tableControls/PrevPage.js"
136
- ></script>
137
- <script
138
- type="module"
139
- src="/kempo-ui/components/tableControls/NextPage.js"
140
- ></script>
141
- <script
142
- type="module"
143
- src="/kempo-ui/components/tableControls/LastPage.js"
144
- ></script>
145
- <script
146
- type="module"
147
- src="/kempo-ui/components/tableControls/PageSelect.js"
148
- ></script>
149
- <script
150
- type="module"
151
- src="/kempo-ui/components/tableControls/PageSize.js"
152
- ></script>
153
- <script
154
- type="module"
155
- src="/kempo-ui/components/tableControls/DeleteRecord.js"
156
- ></script>
157
- <script
158
- type="module"
159
- src="/kempo-ui/components/tableControls/DeleteSelected.js"
160
- ></script>
161
- <script
162
- type="module"
163
- src="/kempo-ui/components/Icon.js"
164
- ></script>
165
- <script
166
- type="module"
167
- src="/admin/components/TableRowLink.js"
168
- ></script>
169
- <script
170
- type="module"
171
- src="/kempo/components/Permission.js"
172
- ></script>
173
-
174
- <div
175
- class="d-f mb"
176
- style="align-items: center; gap: var(--spacer);"
177
- >
178
- <h1 class="flex mb0">Pages</h1>
179
- <k-permission has="system:pages:create">
180
- <button
181
- id="createPageBtn"
182
- class="primary"
183
- >Create Page</button>
184
- </k-permission>
185
- </div>
186
-
187
- <h2>Custom Pages</h2>
188
- <k-table
189
- id="customTable"
190
- enable-pages
191
- page-size="25"
192
- page-size-options="[10,25,50,100]"
193
- placeholder="No custom pages have been created yet."
194
- >
195
- <admin-table-row-link
196
- slot="before"
197
- url-pattern="/admin/content/pages/edit?path={editPath}"
198
- field-name="editPath"
199
- ></admin-table-row-link>
200
- <div
201
- slot="top"
202
- class="d-f full"
203
- style="align-items: center;"
204
- >
205
- <div>
206
- <k-permission has="system:pages:delete">
207
- <k-tc-delete-selected></k-tc-delete-selected>
208
- </k-permission>
209
- </div>
210
- </div>
211
- <div
212
- class="d-f full"
213
- style="align-items: center;"
214
- >
215
- <div>
216
- <k-tc-first-page></k-tc-first-page>
217
- <k-tc-prev-page></k-tc-prev-page>
218
- <k-tc-next-page></k-tc-next-page>
219
- <k-tc-last-page></k-tc-last-page>
220
- </div>
221
- <div class="flex"></div>
222
- <div><k-tc-page-select></k-tc-page-select></div>
223
- <div class="flex"></div>
224
- <div><k-tc-page-size></k-tc-page-size></div>
225
- </div>
226
- </k-table>
227
-
228
- <h2>Extension Pages</h2>
229
- <k-table
230
- id="extensionTable"
231
- enable-pages
232
- page-size="25"
233
- page-size-options="[10,25,50,100]"
234
- placeholder="No extension pages installed."
235
- >
236
- <admin-table-row-link
237
- slot="before"
238
- url-pattern="/admin/pages/edit?path={editPath}"
239
- field-name="editPath"
240
- ></admin-table-row-link>
241
- <div
242
- class="d-f full"
243
- style="align-items: center;"
244
- >
245
- <div>
246
- <k-tc-first-page></k-tc-first-page>
247
- <k-tc-prev-page></k-tc-prev-page>
248
- <k-tc-next-page></k-tc-next-page>
249
- <k-tc-last-page></k-tc-last-page>
250
- </div>
251
- <div class="flex"></div>
252
- <div><k-tc-page-select></k-tc-page-select></div>
253
- <div class="flex"></div>
254
- <div><k-tc-page-size></k-tc-page-size></div>
255
- </div>
256
- </k-table>
257
-
258
- <h2>System Pages</h2>
259
- <k-table
260
- id="systemTable"
261
- enable-pages
262
- page-size="25"
263
- page-size-options="[10,25,50,100]"
264
- placeholder="No system pages found."
265
- >
266
- <admin-table-row-link
267
- slot="before"
268
- url-pattern="/admin/pages/edit?path={editPath}"
269
- field-name="editPath"
270
- ></admin-table-row-link>
271
- <div
272
- class="d-f full"
273
- style="align-items: center;"
274
- >
275
- <div>
276
- <k-tc-first-page></k-tc-first-page>
277
- <k-tc-prev-page></k-tc-prev-page>
278
- <k-tc-next-page></k-tc-next-page>
279
- <k-tc-last-page></k-tc-last-page>
280
- </div>
281
- <div class="flex"></div>
282
- <div><k-tc-page-select></k-tc-page-select></div>
283
- <div class="flex"></div>
284
- <div><k-tc-page-size></k-tc-page-size></div>
285
- </div>
286
- </k-table>
287
-
288
- <script type="module">
289
- import { listPages, listTemplates, listDirectories, createPage, deletePages, getAllCurrentUserPermissions } from '/kempo/sdk.js';
290
- import { html } from '/kempo-ui/lit-all.min.js';
291
- import Dialog from '/kempo-ui/components/Dialog.js';
292
- import Toast from '/kempo-ui/components/Toast.js';
293
-
294
- await window.customElements.whenDefined('k-table');
295
-
296
- const [, permData] = await getAllCurrentUserPermissions();
297
- const myPerms = new Set(permData?.permissions ?? []);
298
-
299
- const fields = [
300
- { name: 'lockedBadge', label: '', size: 40, formatter: v => v },
301
- { name: 'name', label: 'Name', size: 200 },
302
- { name: 'url', label: 'URL', size: 250 },
303
- { name: 'author', label: 'Author', size: 150 },
304
- { name: 'description', label: 'Description', size: 300 },
305
- { name: 'updatedAt', label: 'Updated', size: 190, formatter: v => v ? new Date(v).toLocaleString() : '' },
306
- { name: 'createdAt', label: 'Created', size: 190, formatter: v => v ? new Date(v).toLocaleString() : '' }
307
- ];
308
-
309
- const extensionFields = [
310
- { name: 'owner', label: 'Extension', size: 120 },
311
- ...fields
312
- ];
313
-
314
- const $customTable = document.getElementById('customTable');
315
- const $extensionTable = document.getElementById('extensionTable');
316
- const $systemTable = document.getElementById('systemTable');
317
-
318
- const loadPages = async () => {
319
- const [error, data] = await listPages();
320
- if(error){
321
- Toast.error(error.msg || 'Failed to load pages');
322
- return;
323
- }
324
- const toEditPath = p => ({ ...p, editPath: p.file.replace(/\.page\.html$/, ''), lockedBadge: p.locked ? '<k-icon name="lock"></k-icon>' : '' });
325
- const sortPages = pages => pages.slice().sort((a, b) => {
326
- const aPath = a.file.replace(/\.page\.html$/, '');
327
- const bPath = b.file.replace(/\.page\.html$/, '');
328
- const aDir = aPath.includes('/') ? aPath.split('/').slice(0, -1).join('/') : '';
329
- const bDir = bPath.includes('/') ? bPath.split('/').slice(0, -1).join('/') : '';
330
- if(aPath === 'index' || aPath === '') return -1;
331
- if(bPath === 'index' || bPath === '') return 1;
332
- if(aDir !== bDir){
333
- if(!aDir) return -1;
334
- if(!bDir) return 1;
335
- return aDir.localeCompare(bDir);
336
- }
337
- return aPath.localeCompare(bPath);
338
- });
339
- const custom = sortPages(data.pages.filter(p => p.owner === 'custom').map(toEditPath));
340
- const extension = sortPages(data.pages.filter(p => p.owner !== 'custom' && p.owner !== 'system').map(toEditPath));
341
- const system = sortPages(data.pages.filter(p => p.owner === 'system').map(toEditPath));
342
- $customTable.setData({ records: custom, fields });
343
- $extensionTable.setData({ records: extension, fields: extensionFields });
344
- $systemTable.setData({ records: system, fields });
345
- };
346
-
347
- if(myPerms.has('system:pages:delete')){
348
- $customTable.setAttribute('request-delete', '');
349
- $customTable.setAttribute('enable-selection', '');
350
- const del = document.createElement('k-tc-delete-record');
351
- del.setAttribute('slot', 'after');
352
- $customTable.appendChild(del);
353
- }
354
-
355
- await loadPages();
356
-
357
- $customTable.addEventListener('requestDelete', ({ detail: { records, approve, reject } }) => {
358
- const locked = records.filter(r => r.locked);
359
- if(locked.length){
360
- Toast.error(locked.length === 1 ? `"${locked[0].title || locked[0].file}" is locked and cannot be deleted.` : `${locked.length} selected pages are locked and cannot be deleted.`);
361
- reject();
362
- return;
363
- }
364
- const count = records.length;
365
- const msg = count === 1
366
- ? `Delete "${records[0].title || records[0].file}"? This action cannot be undone.`
367
- : `Delete ${count} pages? This action cannot be undone.`;
368
- Dialog.confirm(msg, async (confirmed) => {
369
- if(!confirmed){ reject(); return; }
370
- const files = records.map(r => r.file);
371
- const [error] = await deletePages(files);
372
- if(error){
373
- reject();
374
- Toast.error(error.msg || 'Failed to delete');
375
- return;
376
- }
377
- approve();
378
- Toast.success(count === 1 ? 'Page deleted' : `${count} pages deleted`);
379
- });
380
- });
381
-
382
- /*
383
- Create Page Dialog
384
- */
385
-
386
- const slugify = name => name
387
- .toLowerCase()
388
- .trim()
389
- .replace(/[^\w\s-]/g, '')
390
- .replace(/[\s_]+/g, '-')
391
- .replace(/-+/g, '-')
392
- .replace(/^-|-$/g, '');
393
-
394
- document.getElementById('createPageBtn')?.addEventListener('click', async () => {
395
- const [[tplError, tplData], [dirError, dirData]] = await Promise.all([
396
- listTemplates(),
397
- listDirectories()
398
- ]);
399
- if(tplError){
400
- Toast.error(tplError.msg || 'Failed to load templates');
401
- return;
402
- }
403
- if(dirError){
404
- Toast.error(dirError.msg || 'Failed to load directories');
405
- return;
406
- }
407
-
408
- const directories = dirData.directories;
409
-
410
- const templateOptions = tplData.templates
411
- .map(t => html`<option value="${t.name}" ?selected=${t.name === 'default'}>${t.name} (${t.directory || '/'})</option>`);
412
-
413
- const isValidDir = p => /^\/[a-zA-Z0-9_\-\[\]\/]*$/.test(p) && !p.includes('..') && !p.includes('//');
414
- const dirToInternal = p => { const t = (p || '/').replace(/^\//, '').replace(/\/$/, ''); return t || '.'; };
415
-
416
- const openLearnMore = () => Dialog.alert(html`
417
- <div class="p">
418
- <p>Directory paths define where a page lives in the URL structure.</p>
419
- <p><strong>Examples:</strong></p>
420
- <ul>
421
- <li><code>/</code> — root, e.g. <code>/about</code></li>
422
- <li><code>/blog</code> — e.g. <code>/blog/my-post</code></li>
423
- <li><code>/blog/[slug]</code> — dynamic segment; <code>[slug]</code> matches any value</li>
424
- </ul>
425
- <p>Dynamic segments like <code>[token]</code> allow a single page to handle many URLs. The segment name is available to the page as a URL parameter.</p>
426
- <p>You can nest segments: <code>/store/[category]/[id]</code></p>
427
- </div>
428
- `, null, { title: 'About Directory Paths' });
429
-
430
- const $dialog = Dialog.create(html`
431
- <div class="p">
432
- <div class="mb">
433
- <label class="d-b mb-sm">Location</label>
434
- <input type="text" id="dlg-directory" class="full" list="dlg-dir-list" value="/" placeholder="/">
435
- <datalist id="dlg-dir-list">
436
- ${directories.map(d => html`<option value="${d === '.' ? '/' : '/' + d}">`)}
437
- </datalist>
438
- <p id="dlg-dir-error" class="mt-sm tc-danger d-n"><small>Invalid path — use format: /path/to/directory</small></p>
439
- <p class="mt-sm muted"><small>Supports dynamic segments e.g. <code>/blog/[slug]</code>. <button class="link" @click="${openLearnMore}">Learn more</button></small></p>
440
- </div>
441
- <div class="mb">
442
- <label class="d-b mb-sm">Page Name</label>
443
- <input type="text" id="dlg-name" class="full" placeholder="My New Page" required>
444
- <p class="mt-sm muted"><small id="dlg-slug"></small></p>
445
- </div>
446
- <div>
447
- <label class="d-b mb-sm">Template</label>
448
- <select id="dlg-template" class="full">
449
- ${templateOptions}
450
- </select>
451
- </div>
452
- </div>
453
- `, {
454
- title: 'Create Page',
455
- confirmText: 'Create',
456
- confirmAction: async () => {
457
- const name = $dialog.querySelector('#dlg-name').value.trim();
458
- const dirInput = $dialog.querySelector('#dlg-directory').value.trim() || '/';
459
- const template = $dialog.querySelector('#dlg-template').value;
460
-
461
- if(!name){
462
- Toast.error('Page name is required');
463
- return;
464
- }
465
-
466
- if(!isValidDir(dirInput)){
467
- Toast.error('Invalid directory path');
468
- return;
469
- }
470
-
471
- const directory = dirToInternal(dirInput);
472
-
473
- const [error, data] = await createPage({
474
- directory: directory === '.' ? '' : directory,
475
- name,
476
- template
477
- });
478
-
479
- if(error){
480
- Toast.error(error.msg || 'Failed to create page');
481
- return;
482
- }
483
-
484
- Toast.success('Page created — redirecting to editor...');
485
- setTimeout(() => {
486
- window.location.href = `/admin/pages/edit?path=${encodeURIComponent(data.file.replace(/\.page\.html$/, ''))}`;
487
- }, 1500);
488
- },
489
- cancelText: 'Cancel'
490
- });
491
-
492
- const updateSlug = () => {
493
- const slug = slugify($dialog.querySelector('#dlg-name').value);
494
- const dir = dirToInternal($dialog.querySelector('#dlg-directory').value);
495
- const prefix = dir === '.' ? '/' : '/' + dir + '/';
496
- $dialog.querySelector('#dlg-slug').textContent = slug ? prefix + slug : '';
497
- };
498
- $dialog.querySelector('#dlg-directory').addEventListener('input', e => {
499
- $dialog.querySelector('#dlg-dir-error').classList.toggle('d-n', isValidDir(e.target.value || '/'));
500
- updateSlug();
501
- });
502
- $dialog.querySelector('#dlg-name').addEventListener('input', updateSlug);
503
- });
504
- </script>
505
-
506
- </k-main>
507
-
508
- </body>
509
- </html>
@@ -1,132 +0,0 @@
1
- <!--
2
- owner: system
3
- locked: true
4
- name:
5
- author:
6
- created:
7
- updated:
8
- -->
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>Edit Template - Admin</title>
17
- <link rel="stylesheet" href="/kempo-css/kempo.min.css">
18
- <script src="/admin/init.js"></script>
19
-
20
- <script type="module" src="/admin/components/TemplateEditor.js"></script>
21
-
22
- </head>
23
- <body>
24
- <!--
25
- locked: true
26
- -->
27
-
28
- <k-aside
29
- main="push"
30
- state="expanded"
31
- style="--aside_padding: 0;"
32
- persistent-id="admin-nav"
33
- >
34
- <k-aside-toggle>
35
- <h3 class="m0">Kempo Admin</h3>
36
- </k-aside-toggle>
37
- <k-aside-item
38
- icon="preview"
39
- href="/"
40
- no-expand
41
- >Site</k-aside-item>
42
- <k-aside-item
43
- icon="cards"
44
- href="/admin"
45
- no-expand
46
- >Dashboard</k-aside-item>
47
- <k-aside-menu
48
- icon="manage-accounts"
49
- label="Accounts"
50
- >
51
- <k-aside-item
52
- icon="person"
53
- href="/admin/accounts/users"
54
- no-expand
55
- >Users</k-aside-item>
56
- <k-aside-item
57
- icon="group"
58
- href="/admin/accounts/groups"
59
- no-expand
60
- >Groups</k-aside-item>
61
- <k-aside-item
62
- icon="lock"
63
- href="/admin/accounts/permissions"
64
- no-expand
65
- >Permissions</k-aside-item>
66
- </k-aside-menu>
67
- <k-aside-menu
68
- icon="cards_stack"
69
- label="Content"
70
- >
71
- <k-aside-item
72
- icon="browse"
73
- href="/admin/content/templates"
74
- >Templates</k-aside-item>
75
- <k-aside-item
76
- icon="docs"
77
- href="/admin/content/pages"
78
- >Pages</k-aside-item>
79
- <k-aside-item
80
- icon="content"
81
- href="/admin/content/fragments"
82
- >Fragments</k-aside-item>
83
- <k-aside-item
84
- icon="globe"
85
- href="/admin/content/globals"
86
- >Global Content</k-aside-item>
87
- </k-aside-menu>
88
- <k-aside-item
89
- icon="settings"
90
- href="/admin/settings"
91
- no-expand
92
- >Settings</k-aside-item>
93
- <k-aside-item
94
- icon="extension"
95
- href="/admin/extensions"
96
- no-expand
97
- >Extensions</k-aside-item>
98
- <hr>
99
- <k-aside-spacer></k-aside-spacer>
100
- <k-theme-switcher
101
- labels
102
- style="--padding:var(--spacer_h);margin:var(--spacer_h) auto"
103
- ></k-theme-switcher>
104
- </k-aside>
105
- <script type="module">
106
- import '/kempo-ui/components/ThemeSwitcher.js';
107
- const items = document.querySelectorAll('k-aside-item');
108
- const currentPath = window.location.pathname;
109
-
110
- items.forEach(item => {
111
- const href = item.getAttribute('href');
112
- if (!href) return;
113
- const isExact = href === '/admin' || href === '/';
114
- const match = isExact
115
- ? (currentPath === href || currentPath === href + '/')
116
- : (currentPath === href || currentPath.startsWith(href + '/'));
117
- if (match) {
118
- item.setAttribute('active', '');
119
- const menu = item.closest('k-aside-menu');
120
- if (menu) menu.setAttribute('open', '');
121
- }
122
- });
123
- </script>
124
-
125
- <k-main>
126
-
127
- <admin-template-editor></admin-template-editor>
128
-
129
- </k-main>
130
-
131
- </body>
132
- </html>