kempo 4.2.19 → 4.2.21

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 (176) hide show
  1. package/app-public/CATCH.page.html +15 -0
  2. package/app-public/kempo-global.global.html +0 -6
  3. package/bin/cli.js +4 -21
  4. package/dist/admin/accounts/groups/[name]/index.page.html +114 -4
  5. package/dist/admin/accounts/groups/index.page.html +89 -4
  6. package/dist/admin/accounts/permissions/index.page.html +86 -4
  7. package/dist/admin/accounts/users/[id]/index.page.html +117 -3
  8. package/dist/admin/accounts/users/index.page.html +118 -4
  9. package/dist/admin/components/AddGroupControl.js +1 -5
  10. package/dist/admin/components/AddGroupControl.js.map +1 -1
  11. package/dist/admin/components/AdminTableControl.js +2 -0
  12. package/dist/admin/components/AdminTableControl.js.map +1 -0
  13. package/dist/admin/components/ClearExpiredSessionsControl.js +1 -5
  14. package/dist/admin/components/ClearExpiredSessionsControl.js.map +1 -1
  15. package/dist/admin/components/GroupDeleteSelected.js +1 -5
  16. package/dist/admin/components/GroupDeleteSelected.js.map +1 -1
  17. package/dist/admin/components/GroupRemoveRecord.js +1 -5
  18. package/dist/admin/components/GroupRemoveRecord.js.map +1 -1
  19. package/dist/admin/components/TableRowDelete.js +1 -3
  20. package/dist/admin/components/TableRowDelete.js.map +1 -1
  21. package/dist/admin/components/TableRowLink.js +1 -7
  22. package/dist/admin/components/TableRowLink.js.map +1 -1
  23. package/dist/admin/components/tableControls/AddMember.js +1 -5
  24. package/dist/admin/components/tableControls/AddMember.js.map +1 -1
  25. package/dist/admin/components/tableControls/AddPermission.js +1 -5
  26. package/dist/admin/components/tableControls/AddPermission.js.map +1 -1
  27. package/dist/admin/components/tableControls/InstallExtension.js +1 -5
  28. package/dist/admin/components/tableControls/InstallExtension.js.map +1 -1
  29. package/dist/admin/components/tableControls/UninstallExtension.js +1 -5
  30. package/dist/admin/components/tableControls/UninstallExtension.js.map +1 -1
  31. package/dist/admin/content/fragments/edit/index.page.html +8 -1
  32. package/dist/admin/content/fragments/index.page.html +88 -3
  33. package/dist/admin/content/globals/edit/index.page.html +8 -1
  34. package/dist/admin/content/globals/index.page.html +103 -8
  35. package/dist/admin/content/pages/edit/index.page.html +8 -1
  36. package/dist/admin/content/pages/index.page.html +225 -28
  37. package/dist/admin/content/templates/edit/index.page.html +8 -1
  38. package/dist/admin/content/templates/index.page.html +117 -3
  39. package/dist/admin/default.template.html +20 -1
  40. package/dist/admin/extensions/index.page.html +59 -2
  41. package/dist/admin/icons/extension_add.svg +1 -0
  42. package/dist/admin/icons/extension_remove.svg +1 -0
  43. package/dist/admin/index.page.html +5 -1
  44. package/dist/admin/init.js.map +1 -1
  45. package/dist/admin/nav.fragment.html +84 -2
  46. package/dist/admin/settings/[owner]/[name]/index.page.html +110 -4
  47. package/dist/admin/settings/index.page.html +89 -4
  48. package/dist/kempo/api/admin-globals/DELETE.js +1 -1
  49. package/dist/kempo/api/admin-globals/DELETE.js.map +1 -1
  50. package/dist/kempo/api/admin-globals/GET.js +1 -1
  51. package/dist/kempo/api/admin-globals/GET.js.map +1 -1
  52. package/dist/kempo/api/admin-globals/POST.js +1 -1
  53. package/dist/kempo/api/admin-globals/POST.js.map +1 -1
  54. package/dist/kempo/api/admin-globals/[id]/GET.js +1 -1
  55. package/dist/kempo/api/admin-globals/[id]/GET.js.map +1 -1
  56. package/dist/kempo/api/admin-globals/[id]/PUT.js +1 -1
  57. package/dist/kempo/api/admin-globals/[id]/PUT.js.map +1 -1
  58. package/dist/kempo/api/admin-globals/[id]/disable/PUT.js +1 -1
  59. package/dist/kempo/api/admin-globals/[id]/disable/PUT.js.map +1 -1
  60. package/dist/kempo/api/admin-globals/[id]/enable/PUT.js +1 -1
  61. package/dist/kempo/api/admin-globals/[id]/enable/PUT.js.map +1 -1
  62. package/dist/kempo/api/extensions/DELETE.js +1 -1
  63. package/dist/kempo/api/extensions/DELETE.js.map +1 -1
  64. package/dist/kempo/api/extensions/POST.js +1 -1
  65. package/dist/kempo/api/extensions/POST.js.map +1 -1
  66. package/dist/kempo/api/extensions/[name]/disable/POST.js +1 -1
  67. package/dist/kempo/api/extensions/[name]/disable/POST.js.map +1 -1
  68. package/dist/kempo/api/extensions/[name]/enable/POST.js +1 -1
  69. package/dist/kempo/api/extensions/[name]/enable/POST.js.map +1 -1
  70. package/dist/kempo/api/extensions/[name]/update/POST.js +1 -1
  71. package/dist/kempo/api/extensions/[name]/update/POST.js.map +1 -1
  72. package/dist/kempo/api/extensions/[name]/update-check/GET.js +1 -1
  73. package/dist/kempo/api/extensions/[name]/update-check/GET.js.map +1 -1
  74. package/dist/kempo/api/fragments/DELETE.js +1 -1
  75. package/dist/kempo/api/fragments/DELETE.js.map +1 -1
  76. package/dist/kempo/api/fragments/GET.js +1 -1
  77. package/dist/kempo/api/fragments/GET.js.map +1 -1
  78. package/dist/kempo/api/fragments/POST.js +1 -1
  79. package/dist/kempo/api/fragments/POST.js.map +1 -1
  80. package/dist/kempo/api/fragments/disable/PUT.js +1 -1
  81. package/dist/kempo/api/fragments/disable/PUT.js.map +1 -1
  82. package/dist/kempo/api/fragments/enable/PUT.js +1 -1
  83. package/dist/kempo/api/fragments/enable/PUT.js.map +1 -1
  84. package/dist/kempo/api/fragments/file/GET.js +1 -1
  85. package/dist/kempo/api/fragments/file/GET.js.map +1 -1
  86. package/dist/kempo/api/fragments/file/PATCH.js +1 -1
  87. package/dist/kempo/api/fragments/file/PATCH.js.map +1 -1
  88. package/dist/kempo/api/fragments/file/PUT.js +1 -1
  89. package/dist/kempo/api/fragments/file/PUT.js.map +1 -1
  90. package/dist/kempo/api/fragments/lock/PUT.js +1 -1
  91. package/dist/kempo/api/fragments/lock/PUT.js.map +1 -1
  92. package/dist/kempo/api/globals/DELETE.js +1 -1
  93. package/dist/kempo/api/globals/DELETE.js.map +1 -1
  94. package/dist/kempo/api/globals/GET.js +1 -1
  95. package/dist/kempo/api/globals/GET.js.map +1 -1
  96. package/dist/kempo/api/globals/POST.js +1 -1
  97. package/dist/kempo/api/globals/POST.js.map +1 -1
  98. package/dist/kempo/api/globals/disable/PUT.js +1 -1
  99. package/dist/kempo/api/globals/disable/PUT.js.map +1 -1
  100. package/dist/kempo/api/globals/enable/PUT.js +1 -1
  101. package/dist/kempo/api/globals/enable/PUT.js.map +1 -1
  102. package/dist/kempo/api/globals/entry/GET.js +1 -1
  103. package/dist/kempo/api/globals/entry/GET.js.map +1 -1
  104. package/dist/kempo/api/globals/entry/PUT.js +1 -1
  105. package/dist/kempo/api/globals/entry/PUT.js.map +1 -1
  106. package/dist/kempo/api/globals/lock/PUT.js +1 -1
  107. package/dist/kempo/api/globals/lock/PUT.js.map +1 -1
  108. package/dist/kempo/api/pages/DELETE.js +1 -1
  109. package/dist/kempo/api/pages/DELETE.js.map +1 -1
  110. package/dist/kempo/api/pages/GET.js +1 -1
  111. package/dist/kempo/api/pages/GET.js.map +1 -1
  112. package/dist/kempo/api/pages/POST.js +1 -1
  113. package/dist/kempo/api/pages/POST.js.map +1 -1
  114. package/dist/kempo/api/pages/directories/GET.js +1 -1
  115. package/dist/kempo/api/pages/directories/GET.js.map +1 -1
  116. package/dist/kempo/api/pages/disable/PUT.js +1 -1
  117. package/dist/kempo/api/pages/disable/PUT.js.map +1 -1
  118. package/dist/kempo/api/pages/enable/PUT.js +1 -1
  119. package/dist/kempo/api/pages/enable/PUT.js.map +1 -1
  120. package/dist/kempo/api/pages/file/GET.js +1 -1
  121. package/dist/kempo/api/pages/file/GET.js.map +1 -1
  122. package/dist/kempo/api/pages/file/PATCH.js +1 -1
  123. package/dist/kempo/api/pages/file/PATCH.js.map +1 -1
  124. package/dist/kempo/api/pages/file/PUT.js +1 -1
  125. package/dist/kempo/api/pages/file/PUT.js.map +1 -1
  126. package/dist/kempo/api/pages/lock/PUT.js +1 -1
  127. package/dist/kempo/api/pages/lock/PUT.js.map +1 -1
  128. package/dist/kempo/api/pages/rescan/POST.js +2 -0
  129. package/dist/kempo/api/pages/rescan/POST.js.map +1 -0
  130. package/dist/kempo/api/pages/search/GET.js +1 -1
  131. package/dist/kempo/api/pages/search/GET.js.map +1 -1
  132. package/dist/kempo/api/pages/templates/GET.js +1 -1
  133. package/dist/kempo/api/pages/templates/GET.js.map +1 -1
  134. package/dist/kempo/api/templates/DELETE.js +1 -1
  135. package/dist/kempo/api/templates/DELETE.js.map +1 -1
  136. package/dist/kempo/api/templates/GET.js +1 -1
  137. package/dist/kempo/api/templates/GET.js.map +1 -1
  138. package/dist/kempo/api/templates/POST.js +1 -1
  139. package/dist/kempo/api/templates/POST.js.map +1 -1
  140. package/dist/kempo/api/templates/disable/PUT.js +1 -1
  141. package/dist/kempo/api/templates/disable/PUT.js.map +1 -1
  142. package/dist/kempo/api/templates/enable/PUT.js +1 -1
  143. package/dist/kempo/api/templates/enable/PUT.js.map +1 -1
  144. package/dist/kempo/api/templates/file/GET.js +1 -1
  145. package/dist/kempo/api/templates/file/GET.js.map +1 -1
  146. package/dist/kempo/api/templates/file/PATCH.js +1 -1
  147. package/dist/kempo/api/templates/file/PATCH.js.map +1 -1
  148. package/dist/kempo/api/templates/file/PUT.js +1 -1
  149. package/dist/kempo/api/templates/file/PUT.js.map +1 -1
  150. package/dist/kempo/api/templates/lock/PUT.js +1 -1
  151. package/dist/kempo/api/templates/lock/PUT.js.map +1 -1
  152. package/dist/kempo/api/user/[userid]/name/GET.js +2 -0
  153. package/dist/kempo/api/user/[userid]/name/GET.js.map +1 -0
  154. package/dist/kempo/components/UserDisplayName.js +2 -0
  155. package/dist/kempo/components/UserDisplayName.js.map +1 -0
  156. package/dist/kempo/sdk.js +1 -1
  157. package/dist/kempo/sdk.js.map +1 -1
  158. package/middleware/kempo.js +99 -25
  159. package/package.json +16 -9
  160. package/server/utils/admin-global-content/createAdminGlobalContent.js +4 -3
  161. package/server/utils/admin-global-content/deleteAdminGlobalContent.js +2 -2
  162. package/server/utils/admin-global-content/deleteAdminGlobalContentByOwner.js +2 -2
  163. package/server/utils/admin-global-content/disableAdminGlobalContent.js +2 -2
  164. package/server/utils/admin-global-content/enableAdminGlobalContent.js +2 -2
  165. package/server/utils/admin-global-content/getAdminGlobalContent.js +2 -2
  166. package/server/utils/admin-global-content/helpers.js +12 -1
  167. package/server/utils/admin-global-content/listAdminGlobalContent.js +2 -2
  168. package/server/utils/admin-global-content/updateAdminGlobalContent.js +2 -2
  169. package/server/utils/email/sendEmail.js +9 -3
  170. package/server/utils/extensions/uninstallExtension.js +54 -21
  171. package/server/utils/fragments/listFragments.js +10 -1
  172. package/server/utils/hooks/triggerHook.js +15 -13
  173. package/server/utils/pages/listPages.js +57 -7
  174. package/app-public/kempo-global.global-disabled.html +0 -0
  175. package/app-public/new-page.page.html +0 -17
  176. package/app-public/test.page.html +0 -21
@@ -0,0 +1,15 @@
1
+ <!--
2
+ owner: system
3
+ name: Not Found
4
+ title: 404 — Not Found
5
+ description: Page not found
6
+ -->
7
+ <page template="default" title="404 — Not Found">
8
+ <content>
9
+ <main class="container py ta-center">
10
+ <h1 style="font-size:6rem;margin-bottom:0">404</h1>
11
+ <p class="large tc-muted">Page not found</p>
12
+ <a href="{{pathToRoot}}">Go back home</a>
13
+ </main>
14
+ </content>
15
+ </page>
@@ -1,6 +0,0 @@
1
- <content id="25d548d5-d75d-49ab-9018-4724abda1805" name="hello world script" owner="custom" author="Copilot Admin" created="2026-04-17T00:44:15.891Z" updated="2026-04-17T00:45:00.331Z" locked="false" location="scripts" priority="100">
2
- <script>console.log('Hello World');</script>
3
- </content>
4
- <content id="bb0e979c-39e5-4d5e-a78c-ea49d1334144" name="foobar" owner="custom" author="Copilot Admin" created="2026-04-17T00:45:31.328Z" updated="2026-04-17T00:46:31.983Z" locked="false" location="head" priority="101">
5
- <script>console.log('foobar')</script>
6
- </content>
package/bin/cli.js CHANGED
@@ -289,18 +289,6 @@ if(!useDefaults){
289
289
  }
290
290
  }
291
291
 
292
- let wantsDrizzleStudio = false;
293
-
294
- if(!useDefaults){
295
- const { drizzleStudio } = await inquirer.prompt([{
296
- type: 'confirm',
297
- name: 'drizzleStudio',
298
- message: 'Would you like to install drizzle-studio? It is used for interacting with the database during development, not recommended for production.',
299
- default: true
300
- }]);
301
- wantsDrizzleStudio = drizzleStudio;
302
- }
303
-
304
292
  /*
305
293
  Step 3: Scaffold project files
306
294
  */
@@ -309,19 +297,15 @@ console.log('\n--- Scaffolding project files ---\n');
309
297
 
310
298
  const pkgPath = join(projectDir, 'package.json');
311
299
  if(!existsSync(pkgPath)){
312
- const scripts = {
313
- dev: 'kempo-server --root public --port 9876',
314
- start: 'kempo-server --root public --port 9876'
315
- };
316
- if(wantsDrizzleStudio){
317
- scripts['db:studio'] = 'drizzle-kit studio';
318
- }
319
300
  writeFileSync(pkgPath, JSON.stringify({
320
301
  name: projectName,
321
302
  version: '1.0.0',
322
303
  type: 'module',
323
304
  private: true,
324
- scripts
305
+ scripts: {
306
+ dev: 'kempo-server --root public --port 9876',
307
+ start: 'kempo-server --root public --port 9876'
308
+ }
325
309
  }, null, 2) + '\n');
326
310
  console.log('Created package.json');
327
311
  }
@@ -527,5 +511,4 @@ Next steps:
527
511
  Then open:
528
512
  http://localhost:9876 (your site)
529
513
  http://localhost:9876/admin (admin panel)
530
- ${wantsDrizzleStudio ? '\nTo view your database:\n npm run db:studio\n' : ''}
531
514
  `);
@@ -1,7 +1,113 @@
1
1
  <!--
2
2
  locked: true
3
3
  -->
4
- <page title="Group - Admin"><content><script type="module" src="/kempo-ui/components/Icon.js"></script><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="/admin/components/tableControls/AddMember.js"></script><script type="module" src="/admin/components/tableControls/AddPermission.js"></script><script type="module" src="/admin/components/TableRowLink.js"></script><div class="mb d-f" style="align-items: flex-start; justify-content: space-between;"><div><a href="/admin/accounts/groups" class="no-link"><button class="mbh"><k-icon name="arrow" direction="left"></k-icon>Groups</button></a><h1 class="mb0" id="pageTitle">Group</h1></div><button id="saveBtn" class="primary" disabled="disabled" style="display:none;"><k-icon name="save"></k-icon>Save</button></div><div id="loading">Loading group...</div><div id="notFound" style="display: none;"><p>Group not found.</p><a href="/admin/accounts/groups">Back to Groups</a></div><div id="content" style="display: none;"><div class="card"><h2>Information</h2><div class="d-f mb"><label style="min-width: 120px;"><strong>Owner</strong></label> <span id="groupOwner"></span></div><div class="d-f mb"><label for="groupNameInput" style="min-width: 120px;"><strong>Name</strong></label> <input id="groupNameInput" style="max-width: 400px;"></div><div class="d-f mb"><label for="groupDescription" style="min-width: 120px;"><strong>Description</strong></label> <input id="groupDescription" style="max-width: 400px;"></div><div class="d-f mb"><label style="min-width: 120px;"><strong>Created</strong></label> <span id="groupCreatedAt"></span></div><div class="d-f mb"><label style="min-width: 120px;"><strong>Updated</strong></label> <span id="groupUpdatedAt"></span></div></div><div class="card"><h2>Members</h2><p id="usersMembersMsg" style="display:none">All users are automatically members of this group.</p><k-table id="membersTable" enable-pages page-size="10" page-size-options="[10,25,50]" placeholder="This group has no members."><admin-table-row-link slot="before" url-pattern="/admin/accounts/users/{id}" field-name="id"></admin-table-row-link><k-tc-delete-selected id="tcDeleteSelected" slot="top" style="display:none;"></k-tc-delete-selected><admin-add-member id="tcAddMember" slot="top" style="display:none;"></admin-add-member><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></div><div class="card"><h2>Permissions</h2><p id="adminPermsMsg" style="display:none">Members of this group automatically have all permissions.</p><k-table id="permissionsTable" enable-pages page-size="10" page-size-options="[10,25,50]" placeholder="No permissions assigned to this group."><k-tc-delete-selected id="tcDeleteSelectedPerm" slot="top" style="display:none;"></k-tc-delete-selected><admin-add-permission id="tcAddPermission" slot="top" style="display:none;"></admin-add-permission><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></div></div><script type="module">import {
4
+ <page title="Group - Admin">
5
+ <content>
6
+ <script type="module" src="/kempo-ui/components/Icon.js"></script>
7
+ <script type="module" src="/kempo-ui/components/Table.js"></script>
8
+ <script type="module" src="/kempo-ui/components/controls/TcFirstPage.js"></script>
9
+ <script type="module" src="/kempo-ui/components/controls/TcPrevPage.js"></script>
10
+ <script type="module" src="/kempo-ui/components/controls/TcNextPage.js"></script>
11
+ <script type="module" src="/kempo-ui/components/controls/TcLastPage.js"></script>
12
+ <script type="module" src="/kempo-ui/components/controls/TcPageSelect.js"></script>
13
+ <script type="module" src="/kempo-ui/components/controls/TcPageSize.js"></script>
14
+ <script type="module" src="/kempo-ui/components/controls/TcDeleteRecord.js"></script>
15
+ <script type="module" src="/kempo-ui/components/controls/TcDeleteSelected.js"></script>
16
+ <script type="module" src="/admin/components/tableControls/AddMember.js"></script>
17
+ <script type="module" src="/admin/components/tableControls/AddPermission.js"></script>
18
+ <script type="module" src="/admin/components/TableRowLink.js"></script>
19
+
20
+ <div class="mb d-f" style="align-items: flex-start; justify-content: space-between;">
21
+ <div>
22
+ <a href="/admin/accounts/groups" class="no-link">
23
+ <button class="mbh"><k-icon name="arrow" direction="left"></k-icon> Groups</button>
24
+ </a>
25
+ <h1 class="mb0" id="pageTitle">Group</h1>
26
+ </div>
27
+ <button id="saveBtn" class="primary" disabled style="display:none;"><k-icon name="save"></k-icon> Save</button>
28
+ </div>
29
+
30
+ <div id="loading">Loading group...</div>
31
+ <div id="notFound" style="display: none;">
32
+ <p>Group not found.</p>
33
+ <a href="/admin/accounts/groups">Back to Groups</a>
34
+ </div>
35
+ <div id="content" style="display: none;">
36
+
37
+ <!-- Group Information -->
38
+ <div class="card">
39
+ <h2>Information</h2>
40
+ <div class="d-f mb">
41
+ <label style="min-width: 120px;"><strong>Owner</strong></label>
42
+ <span id="groupOwner"></span>
43
+ </div>
44
+ <div class="d-f mb">
45
+ <label for="groupNameInput" style="min-width: 120px;"><strong>Name</strong></label>
46
+ <input type="text" id="groupNameInput" style="max-width: 400px;">
47
+ </div>
48
+ <div class="d-f mb">
49
+ <label for="groupDescription" style="min-width: 120px;"><strong>Description</strong></label>
50
+ <input type="text" id="groupDescription" style="max-width: 400px;">
51
+ </div>
52
+ <div class="d-f mb">
53
+ <label style="min-width: 120px;"><strong>Created</strong></label>
54
+ <span id="groupCreatedAt"></span>
55
+ </div>
56
+ <div class="d-f mb">
57
+ <label style="min-width: 120px;"><strong>Updated</strong></label>
58
+ <span id="groupUpdatedAt"></span>
59
+ </div>
60
+ </div>
61
+
62
+ <!-- Members -->
63
+ <div class="card">
64
+ <h2>Members</h2>
65
+ <p id="usersMembersMsg" style="display:none">All users are automatically members of this group.</p>
66
+ <k-table id="membersTable" enable-pages page-size="10" page-size-options="[10,25,50]" placeholder="This group has no members.">
67
+ <admin-table-row-link slot="before" url-pattern="/admin/accounts/users/{id}" field-name="id"></admin-table-row-link>
68
+ <kc-tc-delete-selected id="tcDeleteSelected" slot="top" style="display:none;"></kc-tc-delete-selected>
69
+ <admin-add-member id="tcAddMember" slot="top" style="display:none;"></admin-add-member>
70
+ <div class="d-f full" style="align-items: center;">
71
+ <div>
72
+ <kc-tc-first-page></kc-tc-first-page>
73
+ <kc-tc-prev-page></kc-tc-prev-page>
74
+ <kc-tc-next-page></kc-tc-next-page>
75
+ <kc-tc-last-page></kc-tc-last-page>
76
+ </div>
77
+ <div class="flex"></div>
78
+ <div><kc-tc-page-select></kc-tc-page-select></div>
79
+ <div class="flex"></div>
80
+ <div><kc-tc-page-size></kc-tc-page-size></div>
81
+ </div>
82
+ </k-table>
83
+ </div>
84
+
85
+ <!-- Permissions -->
86
+ <div class="card">
87
+ <h2>Permissions</h2>
88
+ <p id="adminPermsMsg" style="display:none">Members of this group automatically have all permissions.</p>
89
+ <k-table id="permissionsTable" enable-pages page-size="10" page-size-options="[10,25,50]" placeholder="No permissions assigned to this group.">
90
+ <kc-tc-delete-selected id="tcDeleteSelectedPerm" slot="top" style="display:none;"></kc-tc-delete-selected>
91
+ <admin-add-permission id="tcAddPermission" slot="top" style="display:none;"></admin-add-permission>
92
+ <div class="d-f full" style="align-items: center;">
93
+ <div>
94
+ <kc-tc-first-page></kc-tc-first-page>
95
+ <kc-tc-prev-page></kc-tc-prev-page>
96
+ <kc-tc-next-page></kc-tc-next-page>
97
+ <kc-tc-last-page></kc-tc-last-page>
98
+ </div>
99
+ <div class="flex"></div>
100
+ <div><kc-tc-page-select></kc-tc-page-select></div>
101
+ <div class="flex"></div>
102
+ <div><kc-tc-page-size></kc-tc-page-size></div>
103
+ </div>
104
+ </k-table>
105
+ </div>
106
+
107
+ </div>
108
+
109
+ <script type="module">
110
+ import {
5
111
  getGroup, updateGroup, deleteGroups, getGroupMembers,
6
112
  removeMemberFromGroup, getGroupPermissions, removePermissionFromGroup,
7
113
  getAllCurrentUserPermissions
@@ -133,7 +239,7 @@
133
239
  $tcDeleteSelected.style.display = '';
134
240
  $tcAddMember.style.display = '';
135
241
 
136
- const del = document.createElement('k-tc-delete-record');
242
+ const del = document.createElement('kc-tc-delete-record');
137
243
  del.setAttribute('slot', 'after');
138
244
  $membersTable.appendChild(del);
139
245
  }
@@ -212,7 +318,7 @@
212
318
  $tcAddPermission.groupName = groupName;
213
319
  $tcAddPermission.style.display = '';
214
320
 
215
- const delPerm = document.createElement('k-tc-delete-record');
321
+ const delPerm = document.createElement('kc-tc-delete-record');
216
322
  delPerm.setAttribute('slot', 'after');
217
323
  $permissionsTable.appendChild(delPerm);
218
324
 
@@ -283,4 +389,8 @@
283
389
  } else {
284
390
  $permissionsTable.closest('.card').style.display = 'none';
285
391
  }
286
- }</script></content></page>
392
+ }
393
+ </script>
394
+
395
+ </content>
396
+ </page>
@@ -1,7 +1,88 @@
1
1
  <!--
2
2
  locked: true
3
3
  -->
4
- <page title="Groups - 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/Edit.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="/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">Groups</h1><k-permission has="system:group:create"><button id="createGroupBtn" class="primary">Create Group</button></k-permission></div><h2>Custom Groups</h2><k-table id="customTable" enable-pages page-size="10" page-size-options="[10,25,50]" placeholder="No custom groups have been created yet."><admin-table-row-link slot="before" url-pattern="/admin/accounts/groups/{name}" field-name="name"></admin-table-row-link><div slot="top" class="d-f full" style="align-items: center;"><div><k-permission has="system:group: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 Groups</h2><k-table id="extensionTable" enable-pages page-size="10" page-size-options="[10,25,50]" placeholder="No extension groups found."><admin-table-row-link slot="before" url-pattern="/admin/accounts/groups/{name}" field-name="name"></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 Groups</h2><k-table id="systemTable" enable-pages page-size="10" page-size-options="[10,25,50]" placeholder="No system groups found."><admin-table-row-link slot="before" url-pattern="/admin/accounts/groups/{name}" field-name="name"></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 { listGroups, createGroup, updateGroup, deleteGroups, getAllCurrentUserPermissions } from '/kempo/sdk.js';
4
+ <page title="Groups - Admin">
5
+ <content>
6
+ <script type="module" src="/kempo-ui/components/Table.js"></script>
7
+ <script type="module" src="/kempo-ui/components/controls/TcFirstPage.js"></script>
8
+ <script type="module" src="/kempo-ui/components/controls/TcPrevPage.js"></script>
9
+ <script type="module" src="/kempo-ui/components/controls/TcNextPage.js"></script>
10
+ <script type="module" src="/kempo-ui/components/controls/TcLastPage.js"></script>
11
+ <script type="module" src="/kempo-ui/components/controls/TcPageSelect.js"></script>
12
+ <script type="module" src="/kempo-ui/components/controls/TcPageSize.js"></script>
13
+ <script type="module" src="/kempo-ui/components/controls/TcEdit.js"></script>
14
+ <script type="module" src="/kempo-ui/components/controls/TcDeleteRecord.js"></script>
15
+ <script type="module" src="/kempo-ui/components/controls/TcDeleteSelected.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">Groups</h1>
21
+ <k-permission has="system:group:create">
22
+ <button id="createGroupBtn" class="primary">Create Group</button>
23
+ </k-permission>
24
+ </div>
25
+
26
+ <h2>Custom Groups</h2>
27
+ <k-table id="customTable" enable-pages page-size="10" page-size-options="[10,25,50]" placeholder="No custom groups have been created yet.">
28
+ <admin-table-row-link slot="before" url-pattern="/admin/accounts/groups/{name}" field-name="name"></admin-table-row-link>
29
+ <div slot="top" class="d-f full" style="align-items: center;">
30
+ <div>
31
+ <k-permission has="system:group:delete">
32
+ <kc-tc-delete-selected></kc-tc-delete-selected>
33
+ </k-permission>
34
+ </div>
35
+ </div>
36
+ <div class="d-f full" style="align-items: center;">
37
+ <div>
38
+ <kc-tc-first-page></kc-tc-first-page>
39
+ <kc-tc-prev-page></kc-tc-prev-page>
40
+ <kc-tc-next-page></kc-tc-next-page>
41
+ <kc-tc-last-page></kc-tc-last-page>
42
+ </div>
43
+ <div class="flex"></div>
44
+ <div><kc-tc-page-select></kc-tc-page-select></div>
45
+ <div class="flex"></div>
46
+ <div><kc-tc-page-size></kc-tc-page-size></div>
47
+ </div>
48
+ </k-table>
49
+
50
+ <h2>Extension Groups</h2>
51
+ <k-table id="extensionTable" enable-pages page-size="10" page-size-options="[10,25,50]" placeholder="No extension groups found.">
52
+ <admin-table-row-link slot="before" url-pattern="/admin/accounts/groups/{name}" field-name="name"></admin-table-row-link>
53
+ <div class="d-f full" style="align-items: center;">
54
+ <div>
55
+ <kc-tc-first-page></kc-tc-first-page>
56
+ <kc-tc-prev-page></kc-tc-prev-page>
57
+ <kc-tc-next-page></kc-tc-next-page>
58
+ <kc-tc-last-page></kc-tc-last-page>
59
+ </div>
60
+ <div class="flex"></div>
61
+ <div><kc-tc-page-select></kc-tc-page-select></div>
62
+ <div class="flex"></div>
63
+ <div><kc-tc-page-size></kc-tc-page-size></div>
64
+ </div>
65
+ </k-table>
66
+
67
+ <h2>System Groups</h2>
68
+ <k-table id="systemTable" enable-pages page-size="10" page-size-options="[10,25,50]" placeholder="No system groups found.">
69
+ <admin-table-row-link slot="before" url-pattern="/admin/accounts/groups/{name}" field-name="name"></admin-table-row-link>
70
+ <div class="d-f full" style="align-items: center;">
71
+ <div>
72
+ <kc-tc-first-page></kc-tc-first-page>
73
+ <kc-tc-prev-page></kc-tc-prev-page>
74
+ <kc-tc-next-page></kc-tc-next-page>
75
+ <kc-tc-last-page></kc-tc-last-page>
76
+ </div>
77
+ <div class="flex"></div>
78
+ <div><kc-tc-page-select></kc-tc-page-select></div>
79
+ <div class="flex"></div>
80
+ <div><kc-tc-page-size></kc-tc-page-size></div>
81
+ </div>
82
+ </k-table>
83
+
84
+ <script type="module">
85
+ import { listGroups, createGroup, updateGroup, deleteGroups, getAllCurrentUserPermissions } from '/kempo/sdk.js';
5
86
  import { html } from '/kempo-ui/lit-all.min.js';
6
87
  import Toast from '/kempo-ui/components/Toast.js';
7
88
  import Dialog from '/kempo-ui/components/Dialog.js';
@@ -48,7 +129,7 @@
48
129
  const setupTable = ($table, owner, loadFn) => {
49
130
  if(canEdit && owner !== 'system') { // Prevent editor control for system groups
50
131
  $table.setAttribute('request-edit', '');
51
- const edit = document.createElement('k-tc-edit');
132
+ const edit = document.createElement('kc-tc-edit');
52
133
  edit.setAttribute('slot', 'after');
53
134
  $table.appendChild(edit);
54
135
  }
@@ -56,7 +137,7 @@
56
137
  if(canDelete && owner === 'custom'){
57
138
  $table.setAttribute('request-delete', '');
58
139
  $table.setAttribute('enable-selection', '');
59
- const del = document.createElement('k-tc-delete-record');
140
+ const del = document.createElement('kc-tc-delete-record');
60
141
  del.setAttribute('slot', 'after');
61
142
  $table.appendChild(del);
62
143
  }
@@ -168,4 +249,8 @@
168
249
  cancelText: 'Cancel'
169
250
  });
170
251
  });
171
- }</script></content></page>
252
+ }
253
+ </script>
254
+
255
+ </content>
256
+ </page>
@@ -1,7 +1,85 @@
1
1
  <!--
2
2
  locked: true
3
3
  -->
4
- <page title="Permissions - 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/Edit.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/Tags.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">Permissions</h1><k-permission has="system:permissions:manage"><button id="createPermBtn" class="primary">Create Permissions</button></k-permission></div><h2>Custom Permissions</h2><k-table id="customTable" enable-pages page-size="25" page-size-options="[10,25,50,100]" placeholder="No custom permissions have been created yet."><div slot="top" class="d-f full" style="align-items: center;"><div><k-permission has="system:permissions:manage"><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 Permissions</h2><k-table id="extensionTable" enable-pages page-size="25" page-size-options="[10,25,50,100]" placeholder="No extension permissions installed."><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 Permissions</h2><k-table id="systemTable" enable-pages page-size="25" page-size-options="[10,25,50,100]" placeholder="No system permissions found."><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 { listPermissions, createPermissions, updatePermission, deletePermissions, getAllCurrentUserPermissions } from '/kempo/sdk.js';
4
+ <page title="Permissions - Admin">
5
+ <content>
6
+ <script type="module" src="/kempo-ui/components/Table.js"></script>
7
+ <script type="module" src="/kempo-ui/components/controls/TcFirstPage.js"></script>
8
+ <script type="module" src="/kempo-ui/components/controls/TcPrevPage.js"></script>
9
+ <script type="module" src="/kempo-ui/components/controls/TcNextPage.js"></script>
10
+ <script type="module" src="/kempo-ui/components/controls/TcLastPage.js"></script>
11
+ <script type="module" src="/kempo-ui/components/controls/TcPageSelect.js"></script>
12
+ <script type="module" src="/kempo-ui/components/controls/TcPageSize.js"></script>
13
+ <script type="module" src="/kempo-ui/components/controls/TcEdit.js"></script>
14
+ <script type="module" src="/kempo-ui/components/controls/TcDeleteRecord.js"></script>
15
+ <script type="module" src="/kempo-ui/components/controls/TcDeleteSelected.js"></script>
16
+ <script type="module" src="/kempo-ui/components/Tags.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">Permissions</h1>
21
+ <k-permission has="system:permissions:manage">
22
+ <button id="createPermBtn" class="primary">Create Permissions</button>
23
+ </k-permission>
24
+ </div>
25
+
26
+ <h2>Custom Permissions</h2>
27
+ <k-table id="customTable" enable-pages page-size="25" page-size-options="[10,25,50,100]" placeholder="No custom permissions have been created yet.">
28
+ <div slot="top" class="d-f full" style="align-items: center;">
29
+ <div>
30
+ <k-permission has="system:permissions:manage">
31
+ <kc-tc-delete-selected></kc-tc-delete-selected>
32
+ </k-permission>
33
+ </div>
34
+ </div>
35
+ <div class="d-f full" style="align-items: center;">
36
+ <div>
37
+ <kc-tc-first-page></kc-tc-first-page>
38
+ <kc-tc-prev-page></kc-tc-prev-page>
39
+ <kc-tc-next-page></kc-tc-next-page>
40
+ <kc-tc-last-page></kc-tc-last-page>
41
+ </div>
42
+ <div class="flex"></div>
43
+ <div><kc-tc-page-select></kc-tc-page-select></div>
44
+ <div class="flex"></div>
45
+ <div><kc-tc-page-size></kc-tc-page-size></div>
46
+ </div>
47
+ </k-table>
48
+
49
+ <h2>Extension Permissions</h2>
50
+ <k-table id="extensionTable" enable-pages page-size="25" page-size-options="[10,25,50,100]" placeholder="No extension permissions installed.">
51
+ <div class="d-f full" style="align-items: center;">
52
+ <div>
53
+ <kc-tc-first-page></kc-tc-first-page>
54
+ <kc-tc-prev-page></kc-tc-prev-page>
55
+ <kc-tc-next-page></kc-tc-next-page>
56
+ <kc-tc-last-page></kc-tc-last-page>
57
+ </div>
58
+ <div class="flex"></div>
59
+ <div><kc-tc-page-select></kc-tc-page-select></div>
60
+ <div class="flex"></div>
61
+ <div><kc-tc-page-size></kc-tc-page-size></div>
62
+ </div>
63
+ </k-table>
64
+
65
+ <h2>System Permissions</h2>
66
+ <k-table id="systemTable" enable-pages page-size="25" page-size-options="[10,25,50,100]" placeholder="No system permissions found.">
67
+ <div class="d-f full" style="align-items: center;">
68
+ <div>
69
+ <kc-tc-first-page></kc-tc-first-page>
70
+ <kc-tc-prev-page></kc-tc-prev-page>
71
+ <kc-tc-next-page></kc-tc-next-page>
72
+ <kc-tc-last-page></kc-tc-last-page>
73
+ </div>
74
+ <div class="flex"></div>
75
+ <div><kc-tc-page-select></kc-tc-page-select></div>
76
+ <div class="flex"></div>
77
+ <div><kc-tc-page-size></kc-tc-page-size></div>
78
+ </div>
79
+ </k-table>
80
+
81
+ <script type="module">
82
+ import { listPermissions, createPermissions, updatePermission, deletePermissions, getAllCurrentUserPermissions } from '/kempo/sdk.js';
5
83
  import { html } from '/kempo-ui/lit-all.min.js';
6
84
  import Toast from '/kempo-ui/components/Toast.js';
7
85
  import Dialog from '/kempo-ui/components/Dialog.js';
@@ -48,7 +126,7 @@
48
126
  const setupTable = ($table, owner, loadFn) => {
49
127
  if(canManage && owner !== 'system'){
50
128
  $table.setAttribute('request-edit', '');
51
- const edit = document.createElement('k-tc-edit');
129
+ const edit = document.createElement('kc-tc-edit');
52
130
  edit.setAttribute('slot', 'after');
53
131
  $table.appendChild(edit);
54
132
  }
@@ -56,7 +134,7 @@
56
134
  if(canManage && owner === 'custom'){
57
135
  $table.setAttribute('request-delete', '');
58
136
  $table.setAttribute('enable-selection', '');
59
- const del = document.createElement('k-tc-delete-record');
137
+ const del = document.createElement('kc-tc-delete-record');
60
138
  del.setAttribute('slot', 'after');
61
139
  $table.appendChild(del);
62
140
  }
@@ -190,4 +268,8 @@
190
268
  cancelText: 'Cancel'
191
269
  });
192
270
  });
193
- }</script></content></page>
271
+ }
272
+ </script>
273
+
274
+ </content>
275
+ </page>
@@ -1,7 +1,108 @@
1
1
  <!--
2
2
  locked: true
3
3
  -->
4
- <page title="User - Admin"><content><script type="module" src="/kempo-ui/components/Toggle.js"></script><script type="module" src="/kempo-ui/components/Icon.js"></script><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="/admin/components/GroupDeleteSelected.js"></script><script type="module" src="/admin/components/AddGroupControl.js"></script><script type="module" src="/admin/components/ClearExpiredSessionsControl.js"></script><script type="module" src="/admin/components/TableRowLink.js"></script><div class="d-f"><div><a href="/admin/accounts/users" class="no-link mb"><button class="mbh"><k-icon name="arrow" direction="left"></k-icon>Users</button></a></div><div class="flex"></div><div><button id="deleteUserBtn" class="danger mb mrh" style="display:none;">Delete User</button> <button id="saveBtn" class="primary mb" disabled="disabled" style="display:none;"><k-icon name="save"></k-icon>Save</button></div></div><h1 id="pageTitle">User</h1><div id="loading">Loading user...</div><div id="notFound" style="display: none;"><p>User not found.</p><a href="/admin/accounts/users">Back to Users</a></div><div id="content" style="display: none;"><div class="card"><h2>Information</h2><div class="d-f mb" style="align-items: center; gap: var(--spacer);"><label for="userName" style="min-width: 120px;"><strong>Name</strong></label> <input id="userName" style="max-width: 400px;"></div><div class="d-f mb" style="align-items: center; gap: var(--spacer);"><label for="userEmail" style="min-width: 120px;"><strong>Email</strong></label> <input type="email" id="userEmail" style="max-width: 400px;"></div><div class="d-f mb" style="align-items: center; gap: var(--spacer);"><label style="min-width: 120px;"><strong>Verified</strong></label><k-toggle id="emailVerified"></k-toggle></div><div class="d-f mb" style="align-items: center; gap: var(--spacer);"><label style="min-width: 120px;"><strong>Created</strong></label> <span id="userCreatedAt"></span></div></div><div class="card"><h2>Groups</h2><k-table id="groupsTable" request-delete placeholder="Not a member of any groups."><admin-table-row-link slot="before" url-pattern="/admin/accounts/groups/{name}" field-name="name"></admin-table-row-link><k-tc-delete-record slot="after"></k-tc-delete-record><div slot="top" id="groupsTableTop" class="d-f full" style="display:none; align-items: center;"><div><admin-group-delete-selected></admin-group-delete-selected></div><div class="flex"></div><div><admin-add-group-control id="addGroupBtn"></admin-add-group-control></div></div></k-table></div><div class="card"><h2>Sessions</h2><k-table id="sessionsTable" enable-pages page-size="10" page-size-options="[10,25,50]" placeholder="No active sessions."><k-tc-delete-record slot="after"></k-tc-delete-record><div slot="top" class="d-f full" style="align-items: center;"><div><k-tc-delete-selected></k-tc-delete-selected></div><div class="flex"></div><div><admin-clear-expired-sessions id="clearExpiredBtn" style="display:none;"></admin-clear-expired-sessions></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></div></div><script type="module">import {
4
+ <page title="User - Admin">
5
+ <content>
6
+ <script type="module" src="/kempo-ui/components/Toggle.js"></script>
7
+ <script type="module" src="/kempo-ui/components/Icon.js"></script>
8
+ <script type="module" src="/kempo-ui/components/Table.js"></script>
9
+ <script type="module" src="/kempo-ui/components/controls/TcFirstPage.js"></script>
10
+ <script type="module" src="/kempo-ui/components/controls/TcPrevPage.js"></script>
11
+ <script type="module" src="/kempo-ui/components/controls/TcNextPage.js"></script>
12
+ <script type="module" src="/kempo-ui/components/controls/TcLastPage.js"></script>
13
+ <script type="module" src="/kempo-ui/components/controls/TcPageSelect.js"></script>
14
+ <script type="module" src="/kempo-ui/components/controls/TcPageSize.js"></script>
15
+ <script type="module" src="/kempo-ui/components/controls/TcDeleteRecord.js"></script>
16
+ <script type="module" src="/kempo-ui/components/controls/TcDeleteSelected.js"></script>
17
+ <script type="module" src="/admin/components/GroupDeleteSelected.js"></script>
18
+ <script type="module" src="/admin/components/AddGroupControl.js"></script>
19
+ <script type="module" src="/admin/components/ClearExpiredSessionsControl.js"></script>
20
+ <script type="module" src="/admin/components/TableRowLink.js"></script>
21
+ <div class="d-f">
22
+ <div>
23
+ <a href="/admin/accounts/users" class="no-link mb">
24
+ <button class="mbh"><k-icon name="arrow" direction="left"></k-icon> Users</button>
25
+ </a>
26
+ </div>
27
+ <div class="flex"></div>
28
+ <div>
29
+ <button id="deleteUserBtn" class="danger mb mrh" style="display:none;">Delete User</button>
30
+ <button id="saveBtn" class="primary mb" disabled style="display:none;"><k-icon name="save"></k-icon> Save</button>
31
+ </div>
32
+ </div>
33
+ <h1 id="pageTitle">User</h1>
34
+
35
+ <div id="loading">Loading user...</div>
36
+ <div id="notFound" style="display: none;">
37
+ <p>User not found.</p>
38
+ <a href="/admin/accounts/users">Back to Users</a>
39
+ </div>
40
+ <div id="content" style="display: none;">
41
+
42
+ <!-- User Information -->
43
+ <div class="card">
44
+ <h2>Information</h2>
45
+ <div class="d-f mb" style="align-items: center; gap: var(--spacer);">
46
+ <label for="userName" style="min-width: 120px;"><strong>Name</strong></label>
47
+ <input type="text" id="userName" style="max-width: 400px;">
48
+ </div>
49
+ <div class="d-f mb" style="align-items: center; gap: var(--spacer);">
50
+ <label for="userEmail" style="min-width: 120px;"><strong>Email</strong></label>
51
+ <input type="email" id="userEmail" style="max-width: 400px;">
52
+ </div>
53
+ <div class="d-f mb" style="align-items: center; gap: var(--spacer);">
54
+ <label style="min-width: 120px;"><strong>Verified</strong></label>
55
+ <k-toggle id="emailVerified"></k-toggle>
56
+ </div>
57
+ <div class="d-f mb" style="align-items: center; gap: var(--spacer);">
58
+ <label style="min-width: 120px;"><strong>Created</strong></label>
59
+ <span id="userCreatedAt"></span>
60
+ </div>
61
+ </div>
62
+
63
+ <!-- Groups -->
64
+ <div class="card">
65
+ <h2>Groups</h2>
66
+ <k-table id="groupsTable" request-delete placeholder="Not a member of any groups.">
67
+ <admin-table-row-link slot="before" url-pattern="/admin/accounts/groups/{name}" field-name="name"></admin-table-row-link>
68
+ <kc-tc-delete-record slot="after"></kc-tc-delete-record>
69
+ <div slot="top" id="groupsTableTop" class="d-f full" style="display:none; align-items: center;">
70
+ <div><admin-group-delete-selected></admin-group-delete-selected></div>
71
+ <div class="flex"></div>
72
+ <div><admin-add-group-control id="addGroupBtn"></admin-add-group-control></div>
73
+ </div>
74
+ </k-table>
75
+ </div>
76
+
77
+ <!-- Sessions -->
78
+ <div class="card">
79
+ <h2>Sessions</h2>
80
+ <k-table id="sessionsTable" enable-pages page-size="10" page-size-options="[10,25,50]" placeholder="No active sessions.">
81
+ <kc-tc-delete-record slot="after"></kc-tc-delete-record>
82
+ <div slot="top" class="d-f full" style="align-items: center;">
83
+ <div><kc-tc-delete-selected></kc-tc-delete-selected></div>
84
+ <div class="flex"></div>
85
+ <div><admin-clear-expired-sessions id="clearExpiredBtn" style="display:none;"></admin-clear-expired-sessions></div>
86
+ </div>
87
+ <div class="d-f full" style="align-items: center;">
88
+ <div>
89
+ <kc-tc-first-page></kc-tc-first-page>
90
+ <kc-tc-prev-page></kc-tc-prev-page>
91
+ <kc-tc-next-page></kc-tc-next-page>
92
+ <kc-tc-last-page></kc-tc-last-page>
93
+ </div>
94
+ <div class="flex"></div>
95
+ <div><kc-tc-page-select></kc-tc-page-select></div>
96
+ <div class="flex"></div>
97
+ <div><kc-tc-page-size></kc-tc-page-size></div>
98
+ </div>
99
+ </k-table>
100
+ </div>
101
+
102
+ </div>
103
+
104
+ <script type="module">
105
+ import {
5
106
  getSession, getUser, updateUser, deleteUsers,
6
107
  getUserSessions, deleteUserSession, deleteExpiredUserSessions,
7
108
  getUserGroups, addUserToGroup, removeUserFromGroup,
@@ -105,7 +206,7 @@
105
206
  $userEmail.addEventListener('input', checkDirty);
106
207
  $emailVerified.addEventListener('change', checkDirty);
107
208
 
108
- $saveBtn.addEventListener('click', async () => {
209
+ const handleSave = async () => {
109
210
  const [error] = await updateUser({
110
211
  id: userData.id,
111
212
  name: $userName.value,
@@ -121,6 +222,15 @@
121
222
  document.title = `${$userName.value} - Admin`;
122
223
  $saveBtn.disabled = true;
123
224
  Toast.success('User saved');
225
+ };
226
+
227
+ $saveBtn.addEventListener('click', handleSave);
228
+
229
+ document.addEventListener('keydown', e => {
230
+ if((e.ctrlKey || e.metaKey) && e.key === 's'){
231
+ e.preventDefault();
232
+ if(!$saveBtn.disabled) handleSave();
233
+ }
124
234
  });
125
235
  }
126
236
 
@@ -311,4 +421,8 @@
311
421
  };
312
422
 
313
423
  loadSessions();
314
- }</script></content></page>
424
+ }
425
+ </script>
426
+
427
+ </content>
428
+ </page>