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.
- package/app-public/CATCH.page.html +15 -0
- package/app-public/kempo-global.global.html +0 -6
- package/bin/cli.js +4 -21
- package/dist/admin/accounts/groups/[name]/index.page.html +114 -4
- package/dist/admin/accounts/groups/index.page.html +89 -4
- package/dist/admin/accounts/permissions/index.page.html +86 -4
- package/dist/admin/accounts/users/[id]/index.page.html +117 -3
- package/dist/admin/accounts/users/index.page.html +118 -4
- package/dist/admin/components/AddGroupControl.js +1 -5
- package/dist/admin/components/AddGroupControl.js.map +1 -1
- package/dist/admin/components/AdminTableControl.js +2 -0
- package/dist/admin/components/AdminTableControl.js.map +1 -0
- package/dist/admin/components/ClearExpiredSessionsControl.js +1 -5
- package/dist/admin/components/ClearExpiredSessionsControl.js.map +1 -1
- package/dist/admin/components/GroupDeleteSelected.js +1 -5
- package/dist/admin/components/GroupDeleteSelected.js.map +1 -1
- package/dist/admin/components/GroupRemoveRecord.js +1 -5
- package/dist/admin/components/GroupRemoveRecord.js.map +1 -1
- package/dist/admin/components/TableRowDelete.js +1 -3
- package/dist/admin/components/TableRowDelete.js.map +1 -1
- package/dist/admin/components/TableRowLink.js +1 -7
- package/dist/admin/components/TableRowLink.js.map +1 -1
- package/dist/admin/components/tableControls/AddMember.js +1 -5
- package/dist/admin/components/tableControls/AddMember.js.map +1 -1
- package/dist/admin/components/tableControls/AddPermission.js +1 -5
- package/dist/admin/components/tableControls/AddPermission.js.map +1 -1
- package/dist/admin/components/tableControls/InstallExtension.js +1 -5
- package/dist/admin/components/tableControls/InstallExtension.js.map +1 -1
- package/dist/admin/components/tableControls/UninstallExtension.js +1 -5
- package/dist/admin/components/tableControls/UninstallExtension.js.map +1 -1
- package/dist/admin/content/fragments/edit/index.page.html +8 -1
- package/dist/admin/content/fragments/index.page.html +88 -3
- package/dist/admin/content/globals/edit/index.page.html +8 -1
- package/dist/admin/content/globals/index.page.html +103 -8
- package/dist/admin/content/pages/edit/index.page.html +8 -1
- package/dist/admin/content/pages/index.page.html +225 -28
- package/dist/admin/content/templates/edit/index.page.html +8 -1
- package/dist/admin/content/templates/index.page.html +117 -3
- package/dist/admin/default.template.html +20 -1
- package/dist/admin/extensions/index.page.html +59 -2
- package/dist/admin/icons/extension_add.svg +1 -0
- package/dist/admin/icons/extension_remove.svg +1 -0
- package/dist/admin/index.page.html +5 -1
- package/dist/admin/init.js.map +1 -1
- package/dist/admin/nav.fragment.html +84 -2
- package/dist/admin/settings/[owner]/[name]/index.page.html +110 -4
- package/dist/admin/settings/index.page.html +89 -4
- package/dist/kempo/api/admin-globals/DELETE.js +1 -1
- package/dist/kempo/api/admin-globals/DELETE.js.map +1 -1
- package/dist/kempo/api/admin-globals/GET.js +1 -1
- package/dist/kempo/api/admin-globals/GET.js.map +1 -1
- package/dist/kempo/api/admin-globals/POST.js +1 -1
- package/dist/kempo/api/admin-globals/POST.js.map +1 -1
- package/dist/kempo/api/admin-globals/[id]/GET.js +1 -1
- package/dist/kempo/api/admin-globals/[id]/GET.js.map +1 -1
- package/dist/kempo/api/admin-globals/[id]/PUT.js +1 -1
- package/dist/kempo/api/admin-globals/[id]/PUT.js.map +1 -1
- package/dist/kempo/api/admin-globals/[id]/disable/PUT.js +1 -1
- package/dist/kempo/api/admin-globals/[id]/disable/PUT.js.map +1 -1
- package/dist/kempo/api/admin-globals/[id]/enable/PUT.js +1 -1
- package/dist/kempo/api/admin-globals/[id]/enable/PUT.js.map +1 -1
- package/dist/kempo/api/extensions/DELETE.js +1 -1
- package/dist/kempo/api/extensions/DELETE.js.map +1 -1
- package/dist/kempo/api/extensions/POST.js +1 -1
- package/dist/kempo/api/extensions/POST.js.map +1 -1
- package/dist/kempo/api/extensions/[name]/disable/POST.js +1 -1
- package/dist/kempo/api/extensions/[name]/disable/POST.js.map +1 -1
- package/dist/kempo/api/extensions/[name]/enable/POST.js +1 -1
- package/dist/kempo/api/extensions/[name]/enable/POST.js.map +1 -1
- package/dist/kempo/api/extensions/[name]/update/POST.js +1 -1
- package/dist/kempo/api/extensions/[name]/update/POST.js.map +1 -1
- package/dist/kempo/api/extensions/[name]/update-check/GET.js +1 -1
- package/dist/kempo/api/extensions/[name]/update-check/GET.js.map +1 -1
- package/dist/kempo/api/fragments/DELETE.js +1 -1
- package/dist/kempo/api/fragments/DELETE.js.map +1 -1
- package/dist/kempo/api/fragments/GET.js +1 -1
- package/dist/kempo/api/fragments/GET.js.map +1 -1
- package/dist/kempo/api/fragments/POST.js +1 -1
- package/dist/kempo/api/fragments/POST.js.map +1 -1
- package/dist/kempo/api/fragments/disable/PUT.js +1 -1
- package/dist/kempo/api/fragments/disable/PUT.js.map +1 -1
- package/dist/kempo/api/fragments/enable/PUT.js +1 -1
- package/dist/kempo/api/fragments/enable/PUT.js.map +1 -1
- package/dist/kempo/api/fragments/file/GET.js +1 -1
- package/dist/kempo/api/fragments/file/GET.js.map +1 -1
- package/dist/kempo/api/fragments/file/PATCH.js +1 -1
- package/dist/kempo/api/fragments/file/PATCH.js.map +1 -1
- package/dist/kempo/api/fragments/file/PUT.js +1 -1
- package/dist/kempo/api/fragments/file/PUT.js.map +1 -1
- package/dist/kempo/api/fragments/lock/PUT.js +1 -1
- package/dist/kempo/api/fragments/lock/PUT.js.map +1 -1
- package/dist/kempo/api/globals/DELETE.js +1 -1
- package/dist/kempo/api/globals/DELETE.js.map +1 -1
- package/dist/kempo/api/globals/GET.js +1 -1
- package/dist/kempo/api/globals/GET.js.map +1 -1
- package/dist/kempo/api/globals/POST.js +1 -1
- package/dist/kempo/api/globals/POST.js.map +1 -1
- package/dist/kempo/api/globals/disable/PUT.js +1 -1
- package/dist/kempo/api/globals/disable/PUT.js.map +1 -1
- package/dist/kempo/api/globals/enable/PUT.js +1 -1
- package/dist/kempo/api/globals/enable/PUT.js.map +1 -1
- package/dist/kempo/api/globals/entry/GET.js +1 -1
- package/dist/kempo/api/globals/entry/GET.js.map +1 -1
- package/dist/kempo/api/globals/entry/PUT.js +1 -1
- package/dist/kempo/api/globals/entry/PUT.js.map +1 -1
- package/dist/kempo/api/globals/lock/PUT.js +1 -1
- package/dist/kempo/api/globals/lock/PUT.js.map +1 -1
- package/dist/kempo/api/pages/DELETE.js +1 -1
- package/dist/kempo/api/pages/DELETE.js.map +1 -1
- package/dist/kempo/api/pages/GET.js +1 -1
- package/dist/kempo/api/pages/GET.js.map +1 -1
- package/dist/kempo/api/pages/POST.js +1 -1
- package/dist/kempo/api/pages/POST.js.map +1 -1
- package/dist/kempo/api/pages/directories/GET.js +1 -1
- package/dist/kempo/api/pages/directories/GET.js.map +1 -1
- package/dist/kempo/api/pages/disable/PUT.js +1 -1
- package/dist/kempo/api/pages/disable/PUT.js.map +1 -1
- package/dist/kempo/api/pages/enable/PUT.js +1 -1
- package/dist/kempo/api/pages/enable/PUT.js.map +1 -1
- package/dist/kempo/api/pages/file/GET.js +1 -1
- package/dist/kempo/api/pages/file/GET.js.map +1 -1
- package/dist/kempo/api/pages/file/PATCH.js +1 -1
- package/dist/kempo/api/pages/file/PATCH.js.map +1 -1
- package/dist/kempo/api/pages/file/PUT.js +1 -1
- package/dist/kempo/api/pages/file/PUT.js.map +1 -1
- package/dist/kempo/api/pages/lock/PUT.js +1 -1
- package/dist/kempo/api/pages/lock/PUT.js.map +1 -1
- package/dist/kempo/api/pages/rescan/POST.js +2 -0
- package/dist/kempo/api/pages/rescan/POST.js.map +1 -0
- package/dist/kempo/api/pages/search/GET.js +1 -1
- package/dist/kempo/api/pages/search/GET.js.map +1 -1
- package/dist/kempo/api/pages/templates/GET.js +1 -1
- package/dist/kempo/api/pages/templates/GET.js.map +1 -1
- package/dist/kempo/api/templates/DELETE.js +1 -1
- package/dist/kempo/api/templates/DELETE.js.map +1 -1
- package/dist/kempo/api/templates/GET.js +1 -1
- package/dist/kempo/api/templates/GET.js.map +1 -1
- package/dist/kempo/api/templates/POST.js +1 -1
- package/dist/kempo/api/templates/POST.js.map +1 -1
- package/dist/kempo/api/templates/disable/PUT.js +1 -1
- package/dist/kempo/api/templates/disable/PUT.js.map +1 -1
- package/dist/kempo/api/templates/enable/PUT.js +1 -1
- package/dist/kempo/api/templates/enable/PUT.js.map +1 -1
- package/dist/kempo/api/templates/file/GET.js +1 -1
- package/dist/kempo/api/templates/file/GET.js.map +1 -1
- package/dist/kempo/api/templates/file/PATCH.js +1 -1
- package/dist/kempo/api/templates/file/PATCH.js.map +1 -1
- package/dist/kempo/api/templates/file/PUT.js +1 -1
- package/dist/kempo/api/templates/file/PUT.js.map +1 -1
- package/dist/kempo/api/templates/lock/PUT.js +1 -1
- package/dist/kempo/api/templates/lock/PUT.js.map +1 -1
- package/dist/kempo/api/user/[userid]/name/GET.js +2 -0
- package/dist/kempo/api/user/[userid]/name/GET.js.map +1 -0
- package/dist/kempo/components/UserDisplayName.js +2 -0
- package/dist/kempo/components/UserDisplayName.js.map +1 -0
- package/dist/kempo/sdk.js +1 -1
- package/dist/kempo/sdk.js.map +1 -1
- package/middleware/kempo.js +99 -25
- package/package.json +16 -9
- package/server/utils/admin-global-content/createAdminGlobalContent.js +4 -3
- package/server/utils/admin-global-content/deleteAdminGlobalContent.js +2 -2
- package/server/utils/admin-global-content/deleteAdminGlobalContentByOwner.js +2 -2
- package/server/utils/admin-global-content/disableAdminGlobalContent.js +2 -2
- package/server/utils/admin-global-content/enableAdminGlobalContent.js +2 -2
- package/server/utils/admin-global-content/getAdminGlobalContent.js +2 -2
- package/server/utils/admin-global-content/helpers.js +12 -1
- package/server/utils/admin-global-content/listAdminGlobalContent.js +2 -2
- package/server/utils/admin-global-content/updateAdminGlobalContent.js +2 -2
- package/server/utils/email/sendEmail.js +9 -3
- package/server/utils/extensions/uninstallExtension.js +54 -21
- package/server/utils/fragments/listFragments.js +10 -1
- package/server/utils/hooks/triggerHook.js +15 -13
- package/server/utils/pages/listPages.js +57 -7
- package/app-public/kempo-global.global-disabled.html +0 -0
- package/app-public/new-page.page.html +0 -17
- 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"
|
|
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('
|
|
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('
|
|
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
|
-
}
|
|
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"
|
|
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('
|
|
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('
|
|
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
|
-
}
|
|
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"
|
|
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('
|
|
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('
|
|
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
|
-
}
|
|
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"
|
|
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
|
-
|
|
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
|
-
}
|
|
424
|
+
}
|
|
425
|
+
</script>
|
|
426
|
+
|
|
427
|
+
</content>
|
|
428
|
+
</page>
|