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
@@ -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>
@@ -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/tableControls/FirstPage.js"></script>
9
+ <script type="module" src="/kempo-ui/components/tableControls/PrevPage.js"></script>
10
+ <script type="module" src="/kempo-ui/components/tableControls/NextPage.js"></script>
11
+ <script type="module" src="/kempo-ui/components/tableControls/LastPage.js"></script>
12
+ <script type="module" src="/kempo-ui/components/tableControls/PageSelect.js"></script>
13
+ <script type="module" src="/kempo-ui/components/tableControls/PageSize.js"></script>
14
+ <script type="module" src="/kempo-ui/components/tableControls/DeleteRecord.js"></script>
15
+ <script type="module" src="/kempo-ui/components/tableControls/DeleteSelected.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
+ <k-tc-delete-selected id="tcDeleteSelected" slot="top" style="display:none;"></k-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
+ <k-tc-first-page></k-tc-first-page>
73
+ <k-tc-prev-page></k-tc-prev-page>
74
+ <k-tc-next-page></k-tc-next-page>
75
+ <k-tc-last-page></k-tc-last-page>
76
+ </div>
77
+ <div class="flex"></div>
78
+ <div><k-tc-page-select></k-tc-page-select></div>
79
+ <div class="flex"></div>
80
+ <div><k-tc-page-size></k-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
+ <k-tc-delete-selected id="tcDeleteSelectedPerm" slot="top" style="display:none;"></k-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
+ <k-tc-first-page></k-tc-first-page>
95
+ <k-tc-prev-page></k-tc-prev-page>
96
+ <k-tc-next-page></k-tc-next-page>
97
+ <k-tc-last-page></k-tc-last-page>
98
+ </div>
99
+ <div class="flex"></div>
100
+ <div><k-tc-page-select></k-tc-page-select></div>
101
+ <div class="flex"></div>
102
+ <div><k-tc-page-size></k-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
@@ -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/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/Edit.js"></script>
14
+ <script type="module" src="/kempo-ui/components/tableControls/DeleteRecord.js"></script>
15
+ <script type="module" src="/kempo-ui/components/tableControls/DeleteSelected.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
+ <k-tc-delete-selected></k-tc-delete-selected>
33
+ </k-permission>
34
+ </div>
35
+ </div>
36
+ <div class="d-f full" style="align-items: center;">
37
+ <div>
38
+ <k-tc-first-page></k-tc-first-page>
39
+ <k-tc-prev-page></k-tc-prev-page>
40
+ <k-tc-next-page></k-tc-next-page>
41
+ <k-tc-last-page></k-tc-last-page>
42
+ </div>
43
+ <div class="flex"></div>
44
+ <div><k-tc-page-select></k-tc-page-select></div>
45
+ <div class="flex"></div>
46
+ <div><k-tc-page-size></k-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
+ <k-tc-first-page></k-tc-first-page>
56
+ <k-tc-prev-page></k-tc-prev-page>
57
+ <k-tc-next-page></k-tc-next-page>
58
+ <k-tc-last-page></k-tc-last-page>
59
+ </div>
60
+ <div class="flex"></div>
61
+ <div><k-tc-page-select></k-tc-page-select></div>
62
+ <div class="flex"></div>
63
+ <div><k-tc-page-size></k-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
+ <k-tc-first-page></k-tc-first-page>
73
+ <k-tc-prev-page></k-tc-prev-page>
74
+ <k-tc-next-page></k-tc-next-page>
75
+ <k-tc-last-page></k-tc-last-page>
76
+ </div>
77
+ <div class="flex"></div>
78
+ <div><k-tc-page-select></k-tc-page-select></div>
79
+ <div class="flex"></div>
80
+ <div><k-tc-page-size></k-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';
@@ -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/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/Edit.js"></script>
14
+ <script type="module" src="/kempo-ui/components/tableControls/DeleteRecord.js"></script>
15
+ <script type="module" src="/kempo-ui/components/tableControls/DeleteSelected.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
+ <k-tc-delete-selected></k-tc-delete-selected>
32
+ </k-permission>
33
+ </div>
34
+ </div>
35
+ <div class="d-f full" style="align-items: center;">
36
+ <div>
37
+ <k-tc-first-page></k-tc-first-page>
38
+ <k-tc-prev-page></k-tc-prev-page>
39
+ <k-tc-next-page></k-tc-next-page>
40
+ <k-tc-last-page></k-tc-last-page>
41
+ </div>
42
+ <div class="flex"></div>
43
+ <div><k-tc-page-select></k-tc-page-select></div>
44
+ <div class="flex"></div>
45
+ <div><k-tc-page-size></k-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
+ <k-tc-first-page></k-tc-first-page>
54
+ <k-tc-prev-page></k-tc-prev-page>
55
+ <k-tc-next-page></k-tc-next-page>
56
+ <k-tc-last-page></k-tc-last-page>
57
+ </div>
58
+ <div class="flex"></div>
59
+ <div><k-tc-page-select></k-tc-page-select></div>
60
+ <div class="flex"></div>
61
+ <div><k-tc-page-size></k-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
+ <k-tc-first-page></k-tc-first-page>
70
+ <k-tc-prev-page></k-tc-prev-page>
71
+ <k-tc-next-page></k-tc-next-page>
72
+ <k-tc-last-page></k-tc-last-page>
73
+ </div>
74
+ <div class="flex"></div>
75
+ <div><k-tc-page-select></k-tc-page-select></div>
76
+ <div class="flex"></div>
77
+ <div><k-tc-page-size></k-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';
@@ -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/tableControls/FirstPage.js"></script>
10
+ <script type="module" src="/kempo-ui/components/tableControls/PrevPage.js"></script>
11
+ <script type="module" src="/kempo-ui/components/tableControls/NextPage.js"></script>
12
+ <script type="module" src="/kempo-ui/components/tableControls/LastPage.js"></script>
13
+ <script type="module" src="/kempo-ui/components/tableControls/PageSelect.js"></script>
14
+ <script type="module" src="/kempo-ui/components/tableControls/PageSize.js"></script>
15
+ <script type="module" src="/kempo-ui/components/tableControls/DeleteRecord.js"></script>
16
+ <script type="module" src="/kempo-ui/components/tableControls/DeleteSelected.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
+ <k-tc-delete-record slot="after"></k-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
+ <k-tc-delete-record slot="after"></k-tc-delete-record>
82
+ <div slot="top" class="d-f full" style="align-items: center;">
83
+ <div><k-tc-delete-selected></k-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
+ <k-tc-first-page></k-tc-first-page>
90
+ <k-tc-prev-page></k-tc-prev-page>
91
+ <k-tc-next-page></k-tc-next-page>
92
+ <k-tc-last-page></k-tc-last-page>
93
+ </div>
94
+ <div class="flex"></div>
95
+ <div><k-tc-page-select></k-tc-page-select></div>
96
+ <div class="flex"></div>
97
+ <div><k-tc-page-size></k-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>