kempo 4.2.5 → 4.2.7

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 (247) hide show
  1. package/bin/cli.js +7 -0
  2. package/dist/admin/components/AddGroupControl.js +1 -1
  3. package/dist/admin/components/AddGroupControl.js.map +1 -1
  4. package/dist/admin/components/ClearExpiredSessionsControl.js +1 -1
  5. package/dist/admin/components/ClearExpiredSessionsControl.js.map +1 -1
  6. package/dist/admin/components/FragmentEditor.js +1 -1
  7. package/dist/admin/components/FragmentEditor.js.map +1 -1
  8. package/dist/admin/components/GlobalContentEditor.js +1 -1
  9. package/dist/admin/components/GlobalContentEditor.js.map +1 -1
  10. package/dist/admin/components/GroupDeleteSelected.js +1 -1
  11. package/dist/admin/components/GroupDeleteSelected.js.map +1 -1
  12. package/dist/admin/components/GroupRemoveRecord.js +1 -1
  13. package/dist/admin/components/GroupRemoveRecord.js.map +1 -1
  14. package/dist/admin/components/Monaco.js +1 -1
  15. package/dist/admin/components/Monaco.js.map +1 -1
  16. package/dist/admin/components/PageEditor.js +1 -1
  17. package/dist/admin/components/PageEditor.js.map +1 -1
  18. package/dist/admin/components/TableRowDelete.js +1 -1
  19. package/dist/admin/components/TableRowDelete.js.map +1 -1
  20. package/dist/admin/components/TableRowLink.js +1 -1
  21. package/dist/admin/components/TableRowLink.js.map +1 -1
  22. package/dist/admin/components/TemplateEditor.js +1 -1
  23. package/dist/admin/components/TemplateEditor.js.map +1 -1
  24. package/dist/admin/components/ValueEditor.js +1 -1
  25. package/dist/admin/components/ValueEditor.js.map +1 -1
  26. package/dist/admin/components/tableControls/AddMember.js +1 -1
  27. package/dist/admin/components/tableControls/AddMember.js.map +1 -1
  28. package/dist/admin/components/tableControls/AddPermission.js +1 -1
  29. package/dist/admin/components/tableControls/AddPermission.js.map +1 -1
  30. package/dist/admin/components/tableControls/InstallExtension.js +1 -1
  31. package/dist/admin/components/tableControls/InstallExtension.js.map +1 -1
  32. package/dist/admin/components/tableControls/UninstallExtension.js +1 -1
  33. package/dist/admin/components/tableControls/UninstallExtension.js.map +1 -1
  34. package/dist/admin/init.js +1 -1
  35. package/dist/admin/init.js.map +1 -1
  36. package/dist/kempo/api/admin-globals/DELETE.js +1 -1
  37. package/dist/kempo/api/admin-globals/DELETE.js.map +1 -1
  38. package/dist/kempo/api/admin-globals/GET.js +1 -1
  39. package/dist/kempo/api/admin-globals/GET.js.map +1 -1
  40. package/dist/kempo/api/admin-globals/POST.js +1 -1
  41. package/dist/kempo/api/admin-globals/POST.js.map +1 -1
  42. package/dist/kempo/api/admin-globals/[id]/GET.js +1 -1
  43. package/dist/kempo/api/admin-globals/[id]/GET.js.map +1 -1
  44. package/dist/kempo/api/admin-globals/[id]/PUT.js +1 -1
  45. package/dist/kempo/api/admin-globals/[id]/PUT.js.map +1 -1
  46. package/dist/kempo/api/admin-globals/[id]/disable/PUT.js +1 -1
  47. package/dist/kempo/api/admin-globals/[id]/disable/PUT.js.map +1 -1
  48. package/dist/kempo/api/admin-globals/[id]/enable/PUT.js +1 -1
  49. package/dist/kempo/api/admin-globals/[id]/enable/PUT.js.map +1 -1
  50. package/dist/kempo/api/auth/change-password/POST.js +1 -1
  51. package/dist/kempo/api/auth/change-password/POST.js.map +1 -1
  52. package/dist/kempo/api/auth/login/email/POST.js +1 -1
  53. package/dist/kempo/api/auth/login/email/POST.js.map +1 -1
  54. package/dist/kempo/api/auth/logout/POST.js +1 -1
  55. package/dist/kempo/api/auth/logout/POST.js.map +1 -1
  56. package/dist/kempo/api/auth/register/email/POST.js +1 -1
  57. package/dist/kempo/api/auth/register/email/POST.js.map +1 -1
  58. package/dist/kempo/api/auth/reset-password/POST.js +1 -1
  59. package/dist/kempo/api/auth/reset-password/POST.js.map +1 -1
  60. package/dist/kempo/api/auth/session/GET.js +1 -1
  61. package/dist/kempo/api/auth/session/GET.js.map +1 -1
  62. package/dist/kempo/api/auth/verify-email/POST.js +1 -1
  63. package/dist/kempo/api/auth/verify-email/POST.js.map +1 -1
  64. package/dist/kempo/api/extensions/DELETE.js +1 -1
  65. package/dist/kempo/api/extensions/DELETE.js.map +1 -1
  66. package/dist/kempo/api/extensions/GET.js +1 -1
  67. package/dist/kempo/api/extensions/GET.js.map +1 -1
  68. package/dist/kempo/api/extensions/POST.js +1 -1
  69. package/dist/kempo/api/extensions/POST.js.map +1 -1
  70. package/dist/kempo/api/extensions/[name]/disable/POST.js +1 -1
  71. package/dist/kempo/api/extensions/[name]/disable/POST.js.map +1 -1
  72. package/dist/kempo/api/extensions/[name]/enable/POST.js +1 -1
  73. package/dist/kempo/api/extensions/[name]/enable/POST.js.map +1 -1
  74. package/dist/kempo/api/extensions/[name]/update/POST.js +1 -1
  75. package/dist/kempo/api/extensions/[name]/update/POST.js.map +1 -1
  76. package/dist/kempo/api/extensions/[name]/update-check/GET.js +1 -1
  77. package/dist/kempo/api/extensions/[name]/update-check/GET.js.map +1 -1
  78. package/dist/kempo/api/extensions/available/GET.js +1 -1
  79. package/dist/kempo/api/extensions/available/GET.js.map +1 -1
  80. package/dist/kempo/api/extensions/known/GET.js +1 -1
  81. package/dist/kempo/api/extensions/known/GET.js.map +1 -1
  82. package/dist/kempo/api/forgot-password/POST.js +1 -1
  83. package/dist/kempo/api/forgot-password/POST.js.map +1 -1
  84. package/dist/kempo/api/fragments/DELETE.js +1 -1
  85. package/dist/kempo/api/fragments/DELETE.js.map +1 -1
  86. package/dist/kempo/api/fragments/GET.js +1 -1
  87. package/dist/kempo/api/fragments/GET.js.map +1 -1
  88. package/dist/kempo/api/fragments/POST.js +1 -1
  89. package/dist/kempo/api/fragments/POST.js.map +1 -1
  90. package/dist/kempo/api/fragments/disable/PUT.js +1 -1
  91. package/dist/kempo/api/fragments/disable/PUT.js.map +1 -1
  92. package/dist/kempo/api/fragments/enable/PUT.js +1 -1
  93. package/dist/kempo/api/fragments/enable/PUT.js.map +1 -1
  94. package/dist/kempo/api/fragments/file/GET.js +1 -1
  95. package/dist/kempo/api/fragments/file/GET.js.map +1 -1
  96. package/dist/kempo/api/fragments/file/PATCH.js +1 -1
  97. package/dist/kempo/api/fragments/file/PATCH.js.map +1 -1
  98. package/dist/kempo/api/fragments/file/PUT.js +1 -1
  99. package/dist/kempo/api/fragments/file/PUT.js.map +1 -1
  100. package/dist/kempo/api/globals/DELETE.js +1 -1
  101. package/dist/kempo/api/globals/DELETE.js.map +1 -1
  102. package/dist/kempo/api/globals/GET.js +1 -1
  103. package/dist/kempo/api/globals/GET.js.map +1 -1
  104. package/dist/kempo/api/globals/POST.js +1 -1
  105. package/dist/kempo/api/globals/POST.js.map +1 -1
  106. package/dist/kempo/api/globals/disable/PUT.js +1 -1
  107. package/dist/kempo/api/globals/disable/PUT.js.map +1 -1
  108. package/dist/kempo/api/globals/enable/PUT.js +1 -1
  109. package/dist/kempo/api/globals/enable/PUT.js.map +1 -1
  110. package/dist/kempo/api/globals/entry/GET.js +1 -1
  111. package/dist/kempo/api/globals/entry/GET.js.map +1 -1
  112. package/dist/kempo/api/globals/entry/PUT.js +1 -1
  113. package/dist/kempo/api/globals/entry/PUT.js.map +1 -1
  114. package/dist/kempo/api/groups/DELETE.js +1 -1
  115. package/dist/kempo/api/groups/DELETE.js.map +1 -1
  116. package/dist/kempo/api/groups/GET.js +1 -1
  117. package/dist/kempo/api/groups/GET.js.map +1 -1
  118. package/dist/kempo/api/groups/PATCH.js +1 -1
  119. package/dist/kempo/api/groups/PATCH.js.map +1 -1
  120. package/dist/kempo/api/groups/POST.js +1 -1
  121. package/dist/kempo/api/groups/POST.js.map +1 -1
  122. package/dist/kempo/api/groups/[name]/GET.js +1 -1
  123. package/dist/kempo/api/groups/[name]/GET.js.map +1 -1
  124. package/dist/kempo/api/groups/[name]/members/DELETE.js +1 -1
  125. package/dist/kempo/api/groups/[name]/members/DELETE.js.map +1 -1
  126. package/dist/kempo/api/groups/[name]/members/GET.js +1 -1
  127. package/dist/kempo/api/groups/[name]/members/GET.js.map +1 -1
  128. package/dist/kempo/api/groups/[name]/members/POST.js +1 -1
  129. package/dist/kempo/api/groups/[name]/members/POST.js.map +1 -1
  130. package/dist/kempo/api/groups/[name]/permissions/DELETE.js +1 -1
  131. package/dist/kempo/api/groups/[name]/permissions/DELETE.js.map +1 -1
  132. package/dist/kempo/api/groups/[name]/permissions/GET.js +1 -1
  133. package/dist/kempo/api/groups/[name]/permissions/GET.js.map +1 -1
  134. package/dist/kempo/api/groups/[name]/permissions/POST.js +1 -1
  135. package/dist/kempo/api/groups/[name]/permissions/POST.js.map +1 -1
  136. package/dist/kempo/api/pages/DELETE.js +1 -1
  137. package/dist/kempo/api/pages/DELETE.js.map +1 -1
  138. package/dist/kempo/api/pages/GET.js +1 -1
  139. package/dist/kempo/api/pages/GET.js.map +1 -1
  140. package/dist/kempo/api/pages/POST.js +1 -1
  141. package/dist/kempo/api/pages/POST.js.map +1 -1
  142. package/dist/kempo/api/pages/directories/GET.js +1 -1
  143. package/dist/kempo/api/pages/directories/GET.js.map +1 -1
  144. package/dist/kempo/api/pages/disable/PUT.js +1 -1
  145. package/dist/kempo/api/pages/disable/PUT.js.map +1 -1
  146. package/dist/kempo/api/pages/enable/PUT.js +1 -1
  147. package/dist/kempo/api/pages/enable/PUT.js.map +1 -1
  148. package/dist/kempo/api/pages/file/GET.js +1 -1
  149. package/dist/kempo/api/pages/file/GET.js.map +1 -1
  150. package/dist/kempo/api/pages/file/PATCH.js +1 -1
  151. package/dist/kempo/api/pages/file/PATCH.js.map +1 -1
  152. package/dist/kempo/api/pages/file/PUT.js +1 -1
  153. package/dist/kempo/api/pages/file/PUT.js.map +1 -1
  154. package/dist/kempo/api/pages/templates/GET.js +1 -1
  155. package/dist/kempo/api/pages/templates/GET.js.map +1 -1
  156. package/dist/kempo/api/permissions/DELETE.js +1 -1
  157. package/dist/kempo/api/permissions/DELETE.js.map +1 -1
  158. package/dist/kempo/api/permissions/GET.js +1 -1
  159. package/dist/kempo/api/permissions/GET.js.map +1 -1
  160. package/dist/kempo/api/permissions/PATCH.js +1 -1
  161. package/dist/kempo/api/permissions/PATCH.js.map +1 -1
  162. package/dist/kempo/api/permissions/POST.js +1 -1
  163. package/dist/kempo/api/permissions/POST.js.map +1 -1
  164. package/dist/kempo/api/settings/[owner]/GET.js +1 -1
  165. package/dist/kempo/api/settings/[owner]/GET.js.map +1 -1
  166. package/dist/kempo/api/settings/[owner]/[name]/DELETE.js +1 -1
  167. package/dist/kempo/api/settings/[owner]/[name]/DELETE.js.map +1 -1
  168. package/dist/kempo/api/settings/[owner]/[name]/GET.js +1 -1
  169. package/dist/kempo/api/settings/[owner]/[name]/GET.js.map +1 -1
  170. package/dist/kempo/api/settings/[owner]/[name]/POST.js +1 -1
  171. package/dist/kempo/api/settings/[owner]/[name]/POST.js.map +1 -1
  172. package/dist/kempo/api/settings/public/GET.js +1 -1
  173. package/dist/kempo/api/settings/public/GET.js.map +1 -1
  174. package/dist/kempo/api/templates/DELETE.js +1 -1
  175. package/dist/kempo/api/templates/DELETE.js.map +1 -1
  176. package/dist/kempo/api/templates/GET.js +1 -1
  177. package/dist/kempo/api/templates/GET.js.map +1 -1
  178. package/dist/kempo/api/templates/POST.js +1 -1
  179. package/dist/kempo/api/templates/POST.js.map +1 -1
  180. package/dist/kempo/api/templates/disable/PUT.js +1 -1
  181. package/dist/kempo/api/templates/disable/PUT.js.map +1 -1
  182. package/dist/kempo/api/templates/enable/PUT.js +1 -1
  183. package/dist/kempo/api/templates/enable/PUT.js.map +1 -1
  184. package/dist/kempo/api/templates/file/GET.js +1 -1
  185. package/dist/kempo/api/templates/file/GET.js.map +1 -1
  186. package/dist/kempo/api/templates/file/PATCH.js +1 -1
  187. package/dist/kempo/api/templates/file/PATCH.js.map +1 -1
  188. package/dist/kempo/api/templates/file/PUT.js +1 -1
  189. package/dist/kempo/api/templates/file/PUT.js.map +1 -1
  190. package/dist/kempo/api/user/DELETE.js +1 -1
  191. package/dist/kempo/api/user/DELETE.js.map +1 -1
  192. package/dist/kempo/api/user/GET.js +1 -1
  193. package/dist/kempo/api/user/GET.js.map +1 -1
  194. package/dist/kempo/api/user/PATCH.js +1 -1
  195. package/dist/kempo/api/user/PATCH.js.map +1 -1
  196. package/dist/kempo/api/user/[userid]/GET.js +1 -1
  197. package/dist/kempo/api/user/[userid]/GET.js.map +1 -1
  198. package/dist/kempo/api/user/[userid]/groups/DELETE.js +1 -1
  199. package/dist/kempo/api/user/[userid]/groups/DELETE.js.map +1 -1
  200. package/dist/kempo/api/user/[userid]/groups/GET.js +1 -1
  201. package/dist/kempo/api/user/[userid]/groups/GET.js.map +1 -1
  202. package/dist/kempo/api/user/[userid]/groups/POST.js +1 -1
  203. package/dist/kempo/api/user/[userid]/groups/POST.js.map +1 -1
  204. package/dist/kempo/api/user/[userid]/permissions/GET.js +1 -1
  205. package/dist/kempo/api/user/[userid]/permissions/GET.js.map +1 -1
  206. package/dist/kempo/api/user/[userid]/permissions/all/GET.js +1 -1
  207. package/dist/kempo/api/user/[userid]/permissions/all/GET.js.map +1 -1
  208. package/dist/kempo/api/user/[userid]/permissions/list/GET.js +1 -1
  209. package/dist/kempo/api/user/[userid]/permissions/list/GET.js.map +1 -1
  210. package/dist/kempo/api/user/[userid]/permissions/some/GET.js +1 -1
  211. package/dist/kempo/api/user/[userid]/permissions/some/GET.js.map +1 -1
  212. package/dist/kempo/api/user/[userid]/sessions/DELETE.js +1 -1
  213. package/dist/kempo/api/user/[userid]/sessions/DELETE.js.map +1 -1
  214. package/dist/kempo/api/user/[userid]/sessions/GET.js +1 -1
  215. package/dist/kempo/api/user/[userid]/sessions/GET.js.map +1 -1
  216. package/dist/kempo/api/user/[userid]/sessions/expired/DELETE.js +1 -1
  217. package/dist/kempo/api/user/[userid]/sessions/expired/DELETE.js.map +1 -1
  218. package/dist/kempo/api/user/create/POST.js +1 -1
  219. package/dist/kempo/api/user/create/POST.js.map +1 -1
  220. package/dist/kempo/api/user/search/GET.js +1 -1
  221. package/dist/kempo/api/user/search/GET.js.map +1 -1
  222. package/dist/kempo/components/LogoutBtn.js +1 -1
  223. package/dist/kempo/components/LogoutBtn.js.map +1 -1
  224. package/dist/kempo/components/Menu.js +1 -1
  225. package/dist/kempo/components/Menu.js.map +1 -1
  226. package/dist/kempo/components/Permission.js +1 -1
  227. package/dist/kempo/components/Permission.js.map +1 -1
  228. package/dist/kempo/components/Role.js +1 -1
  229. package/dist/kempo/components/Role.js.map +1 -1
  230. package/dist/kempo/components/UserCreatedAt.js +1 -1
  231. package/dist/kempo/components/UserCreatedAt.js.map +1 -1
  232. package/dist/kempo/components/UserEmail.js +1 -1
  233. package/dist/kempo/components/UserEmail.js.map +1 -1
  234. package/dist/kempo/components/UserEmailVerified.js +1 -1
  235. package/dist/kempo/components/UserEmailVerified.js.map +1 -1
  236. package/dist/kempo/components/UserName.js +1 -1
  237. package/dist/kempo/components/UserName.js.map +1 -1
  238. package/dist/kempo/fetch.js +1 -1
  239. package/dist/kempo/fetch.js.map +1 -1
  240. package/dist/kempo/sdk.js +1 -1
  241. package/dist/kempo/sdk.js.map +1 -1
  242. package/package.json +1 -1
  243. package/server/db/migrations/0000_initial.sql +0 -91
  244. package/server/db/migrations/0001_soft_master_chief.sql +0 -1
  245. package/server/db/migrations/meta/0000_snapshot.json +0 -588
  246. package/server/db/migrations/meta/0001_snapshot.json +0 -594
  247. package/server/db/migrations/meta/_journal.json +0 -20
@@ -1 +1 @@
1
- {"version":3,"file":"src/admin/components/TemplateEditor.js","names":["ShadowComponent","html","getTemplate","updateTemplate","deleteTemplates","moveTemplate","createTemplate","listDirectories","Dialog","Toast","TemplateEditor","static","loading","state","error","saving","template","constructor","super","this","file","connectedCallback","document","addEventListener","handleKeyDown","param","URLSearchParams","window","location","search","get","err","title","name","disconnectedCallback","removeEventListener","getFormState","root","shadowRoot","querySelector","value","markup","getValue","e","ctrlKey","metaKey","key","preventDefault","locked","handleSave","handleDelete","confirm","async","confirmed","msg","success","setTimeout","href","handleMove","dirData","directories","parts","replace","split","currentName","pop","currentDir","join","dirToInternal","p","currentDirDisplay","$dialog","create","map","d","confirmText","confirmAction","dirInput","trim","newName","test","includes","newDir","newFile","saveError","moveError","moved","newParam","encodeURIComponent","cancelText","updatePreview","dir","prefix","textContent","handleCopy","directory","data","copyFrom","handleReset","saved","updatedAt","currentSlug","newSlug","toLowerCase","render","isCustom","owner","isLocked","length","author","createdAt","Date","toLocaleString","customElements","define"],"sources":["0"],"sourcesContent":["import ShadowComponent from '/kempo-ui/components/ShadowComponent.js';\nimport { html } from '/kempo-ui/lit-all.min.js';\nimport { getTemplate, updateTemplate, deleteTemplates, moveTemplate, createTemplate, listDirectories } from '/kempo/sdk.js';\nimport Dialog from '/kempo-ui/components/Dialog.js';\nimport Toast from '/kempo-ui/components/Toast.js';\nimport '/kempo-ui/components/Icon.js';\nimport '/kempo-ui/components/Accordion.js';\nimport '/kempo-ui/components/CodeEditor.js';\n\nexport default class TemplateEditor extends ShadowComponent {\n static properties = {\n loading: { state: true },\n error: { state: true },\n saving: { state: true },\n template: { state: true }\n };\n\n constructor() {\n super();\n this.loading = true;\n this.error = false;\n this.saving = false;\n this.template = null;\n this.file = '';\n }\n\n async connectedCallback() {\n super.connectedCallback();\n document.addEventListener('keydown', this.handleKeyDown);\n const param = new URLSearchParams(window.location.search).get('template');\n this.file = param + '.template.html';\n\n if (!this.file || this.file === '.template.html') {\n this.loading = false;\n this.error = true;\n return;\n }\n\n const [err, template] = await getTemplate(this.file);\n this.loading = false;\n\n if (err) {\n this.error = true;\n return;\n }\n\n this.template = template;\n document.title = `Edit: ${template.name} - Admin`;\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener('keydown', this.handleKeyDown);\n }\n\n /*\n Helpers\n */\n\n getFormState() {\n const root = this.shadowRoot;\n return {\n name: root.querySelector('#metaName')?.value ?? this.template.name,\n markup: root.querySelector('#templateEditor')?.getValue() ?? this.template.markup\n };\n }\n\n /*\n Event Handlers\n */\n\n handleKeyDown = e => {\n if ((e.ctrlKey || e.metaKey) && e.key === 's') {\n e.preventDefault();\n if (!this.saving && !this.template?.locked) this.handleSave();\n }\n };\n\n handleDelete = () => {\n Dialog.confirm('Delete this template? This action cannot be undone.', async confirmed => {\n if (!confirmed) return;\n const [error] = await deleteTemplates([this.file]);\n if (error) {\n Toast.error(error.msg || 'Failed to delete template');\n return;\n }\n Toast.success('Template deleted');\n setTimeout(() => { window.location.href = '/admin/content/templates'; }, 1000);\n });\n };\n\n handleMove = async () => {\n const [, dirData] = await listDirectories();\n const directories = dirData?.directories || ['.'];\n\n const parts = this.file.replace(/\\.template\\.html$/, '').split('/');\n const currentName = parts.pop();\n const currentDir = parts.join('/') || '.';\n\n const isValidDir = p => /^\\/[a-zA-Z0-9_\\-\\[\\]\\/]*$/.test(p) && !p.includes('..') && !p.includes('//');\n const dirToInternal = p => { const t = (p || '/').replace(/^\\//, '').replace(/\\/$/, ''); return t || '.'; };\n const currentDirDisplay = currentDir === '.' ? '/' : '/' + currentDir;\n\n const $dialog = Dialog.create(html`\n <div class=\"p\">\n <div class=\"p r mb bc-warning tc-warning\">\n <k-icon name=\"warning\"></k-icon>\n <strong>Warning:</strong> Moving a template may break pages that reference it by name.<br />Pages search for templates by name starting from their own directory up to the root.<br />Moving this template could cause those pages to fall back to the <code>default</code> template.\n </div>\n <div class=\"mb\">\n <label class=\"d-b mb-sm\"><strong>Location</strong></label>\n <input type=\"text\" id=\"dlg-move-dir\" class=\"full\" list=\"dlg-move-dir-list\" .value=\"${currentDirDisplay}\" placeholder=\"/\">\n <datalist id=\"dlg-move-dir-list\">\n ${directories.map(d => html`<option value=\"${d === '.' ? '/' : '/' + d}\">`)} \n </datalist>\n </div>\n <div>\n <label class=\"d-b mb-sm\"><strong>Template Name</strong></label>\n <input type=\"text\" id=\"dlg-move-name\" class=\"full\" .value=\"${currentName}\">\n <p class=\"mt-sm muted\"><small id=\"dlg-move-preview\"></small></p>\n </div>\n </div>\n `, {\n title: 'Move Template',\n confirmText: 'Save and Move Template',\n confirmAction: async () => {\n const dirInput = $dialog.querySelector('#dlg-move-dir').value.trim() || '/';\n const newName = $dialog.querySelector('#dlg-move-name').value.trim();\n if (!newName) {\n Toast.error('Template name is required');\n return;\n }\n if (!isValidDir(dirInput)) {\n Toast.error('Invalid directory path');\n return;\n }\n const newDir = dirToInternal(dirInput);\n const newFile = newDir === '.'\n ? `${newName}.template.html`\n : `${newDir}/${newName}.template.html`;\n\n this.saving = true;\n const [saveError] = await updateTemplate({ file: this.file, ...this.getFormState() });\n this.saving = false;\n if (saveError) {\n Toast.error(saveError.msg || 'Failed to save template');\n return;\n }\n\n const [moveError, moved] = await moveTemplate({ file: this.file, newFile });\n if (moveError) {\n Toast.error(moveError.msg || 'Failed to move template');\n return;\n }\n\n Toast.success('Template saved and moved');\n const newParam = moved.file.replace(/\\.template\\.html$/, '');\n setTimeout(() => {\n window.location.href = `/admin/content/templates/edit?template=${encodeURIComponent(newParam)}`;\n }, 1000);\n },\n cancelText: 'Cancel'\n });\n\n const updatePreview = () => {\n const dir = dirToInternal($dialog.querySelector('#dlg-move-dir').value || '/');\n const name = $dialog.querySelector('#dlg-move-name').value;\n const prefix = dir === '.' ? '/' : '/' + dir + '/';\n $dialog.querySelector('#dlg-move-preview').textContent = name ? prefix + name : '';\n };\n $dialog.querySelector('#dlg-move-dir').addEventListener('input', updatePreview);\n $dialog.querySelector('#dlg-move-name').addEventListener('input', updatePreview);\n updatePreview();\n };\n\n handleCopy = async () => {\n const [, dirData] = await listDirectories();\n const directories = dirData?.directories || ['.'];\n\n const parts = this.file.replace(/\\.template\\.html$/, '').split('/');\n const currentName = parts.pop();\n const currentDir = parts.join('/') || '.';\n\n const isValidDir = p => /^\\/[a-zA-Z0-9_\\-\\[\\]\\/]*$/.test(p) && !p.includes('..') && !p.includes('//');\n const dirToInternal = p => { const t = (p || '/').replace(/^\\//, '').replace(/\\/$/, ''); return t || '.'; };\n const currentDirDisplay = currentDir === '.' ? '/' : '/' + currentDir;\n\n const $dialog = Dialog.create(html`\n <div class=\"p\">\n <div class=\"mb\">\n <label class=\"d-b mb-sm\"><strong>Location</strong></label>\n <input type=\"text\" id=\"dlg-copy-dir\" class=\"full\" list=\"dlg-copy-dir-list\" .value=\"${currentDirDisplay}\" placeholder=\"/\">\n <datalist id=\"dlg-copy-dir-list\">\n ${directories.map(d => html`<option value=\"${d === '.' ? '/' : '/' + d}\">`)} \n </datalist>\n </div>\n <div>\n <label class=\"d-b mb-sm\"><strong>Template Name</strong></label>\n <input type=\"text\" id=\"dlg-copy-name\" class=\"full\" .value=\"${currentName}-copy\">\n <p class=\"mt-sm muted\"><small id=\"dlg-copy-preview\"></small></p>\n </div>\n </div>\n `, {\n title: 'Copy Template',\n confirmText: 'Copy Template',\n confirmAction: async () => {\n const dirInput = $dialog.querySelector('#dlg-copy-dir').value.trim() || '/';\n const newName = $dialog.querySelector('#dlg-copy-name').value.trim();\n if(!newName){\n Toast.error('Template name is required');\n return;\n }\n if(!isValidDir(dirInput)){\n Toast.error('Invalid directory path');\n return;\n }\n const directory = dirToInternal(dirInput);\n const [error, data] = await createTemplate({ directory: directory === '.' ? '' : directory, name: newName, copyFrom: this.file });\n if(error){\n Toast.error(error.msg || 'Failed to copy template');\n return;\n }\n Toast.success('Template copied');\n setTimeout(() => {\n window.location.href = `/admin/content/templates/edit?template=${encodeURIComponent(data.file.replace(/\\.template\\.html$/, ''))}`;\n }, 1000);\n },\n cancelText: 'Cancel'\n });\n\n const updatePreview = () => {\n const dir = dirToInternal($dialog.querySelector('#dlg-copy-dir').value || '/');\n const name = $dialog.querySelector('#dlg-copy-name').value;\n const prefix = dir === '.' ? '/' : '/' + dir + '/';\n $dialog.querySelector('#dlg-copy-preview').textContent = name ? prefix + name : '';\n };\n $dialog.querySelector('#dlg-copy-dir').addEventListener('input', updatePreview);\n $dialog.querySelector('#dlg-copy-name').addEventListener('input', updatePreview);\n updatePreview();\n };\n\n handleReset = () => {\n Dialog.confirm('Reset this template? Any unsaved changes will be lost.', confirmed => {\n if (!confirmed) return;\n this.template = { ...this.template };\n });\n };\n\n handleSave = async () => {\n this.saving = true;\n const state = this.getFormState();\n const [saveError, saved] = await updateTemplate({ file: this.file, markup: state.markup });\n this.saving = false;\n\n if(saveError){\n Toast.error(saveError.msg || 'Failed to save template');\n return;\n }\n\n this.template = { ...this.template, markup: state.markup, updatedAt: saved.updatedAt };\n\n const slugify = n => n.toLowerCase().trim().replace(/[^\\w\\s-]/g, '').replace(/[\\s_]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');\n const parts = this.file.replace(/\\.template\\.html$/, '').split('/');\n const currentSlug = parts.pop();\n const dir = parts.join('/');\n const newSlug = slugify(state.name);\n\n if(newSlug && newSlug !== currentSlug){\n const newFile = dir ? `${dir}/${newSlug}.template.html` : `${newSlug}.template.html`;\n const [moveError, moved] = await moveTemplate({ file: this.file, newFile });\n if(moveError){\n Toast.error(moveError.msg || 'Failed to rename template file');\n return;\n }\n Toast.success('Template saved and renamed');\n const newParam = moved.file.replace(/\\.template\\.html$/, '');\n setTimeout(() => {\n window.location.href = `/admin/content/templates/edit?template=${encodeURIComponent(newParam)}`;\n }, 1000);\n return;\n }\n\n document.title = `Edit: ${template.name} - Admin`;\n Toast.success('Template saved');\n };\n\n /*\n Render\n */\n\n render() {\n if (this.loading) return html`<div>Loading template...</div>`;\n\n if (this.error) return html`\n <div>\n <p>Template not found.</p>\n <a href=\"/admin/content/templates\">Back to Templates</a>\n </div>\n `;\n\n const { template } = this;\n const isCustom = template.owner === 'custom';\n const isLocked = template.locked;\n\n return html`\n ${isLocked ? html`\n <div class=\"p r mb bc-warning tc-warning\">\n <k-icon name=\"lock\"></k-icon> This template is locked and cannot be edited. It is managed by an extension.\n </div>\n ` : ''}\n <div class=\"d-f mb\">\n <div class=\"btn-grp mrh mb\">\n <a href=\"/admin/content/templates\" class=\"btn\">\n <k-icon name=\"arrow\" direction=\"left\"></k-icon> Templates\n </a>\n </div>\n <div class=\"flex\"></div>\n ${isCustom && !isLocked ? html`\n <div class=\"btn-grp mrh mb\">\n <button class=\"danger\" @click=\"${this.handleDelete}\"><k-icon name=\"delete\"></k-icon> Delete</button>\n <button @click=\"${this.handleMove}\"><k-icon name=\"drive_file_move\"></k-icon> Move Template</button>\n </div>\n ` : ''}\n <div class=\"btn-grp mrh mb\">\n <button @click=\"${this.handleCopy}\"><k-icon name=\"content_copy\"></k-icon> Copy Template</button>\n </div>\n ${!isLocked ? html`\n <div class=\"btn-grp mrh mb\">\n <button @click=\"${this.handleReset}\"><k-icon name=\"restart_alt\"></k-icon> Reset</button>\n <button id=\"saveBtn\" class=\"primary\" ?disabled=\"${this.saving}\" @click=\"${this.handleSave}\">\n <k-icon name=\"save\"></k-icon> Save\n </button>\n </div>\n ` : ''}\n </div>\n\n <h1 class=\"mb\">Template: ${template.name}</h1>\n\n <k-accordion>\n <k-accordion-header for-panel=\"metadata\">Metadata</k-accordion-header>\n <k-accordion-panel name=\"metadata\">\n <div class=\"p\">\n <div class=\"d-f mb\" style=\"align-items: center; gap: var(--spacer);\">\n <label style=\"min-width: 120px;\"><strong>Name</strong></label>\n <input type=\"text\" id=\"metaName\" class=\"flex\" .value=\"${template.name || ''}\" ?disabled=\"${!isCustom || isLocked}\">\n </div>\n <div class=\"d-f mb\" style=\"align-items: center; gap: var(--spacer);\">\n <label style=\"min-width: 120px;\"><strong>Directory</strong></label>\n <span class=\"muted\">${(() => { const parts = this.file.replace(/\\.template\\.html$/, '').split('/'); parts.pop(); return parts.length ? parts.join('/') : '/'; })()}</span>\n ${isCustom && !isLocked ? html`\n <button class=\"icon-btn no-btn ph\" title=\"Move Template\" @click=\"${this.handleMove}\"><k-icon name=\"drive_file_move\"></k-icon></button>\n ` : ''}\n </div>\n ${template.author ? html`\n <div class=\"d-f mb\" style=\"align-items: center; gap: var(--spacer);\">\n <label style=\"min-width: 120px;\"><strong>Author</strong></label>\n <span class=\"muted\">${template.author}</span>\n </div>\n ` : ''}\n <div class=\"d-f mb\" style=\"align-items: center; gap: var(--spacer);\">\n <label style=\"min-width: 120px;\"><strong>Owner</strong></label>\n <span class=\"muted\">${template.owner || ''}</span>\n </div>\n <div class=\"d-f mb\" style=\"align-items: center; gap: var(--spacer);\">\n <label style=\"min-width: 120px;\"><strong>Created</strong></label>\n <span class=\"muted\">${template.createdAt ? new Date(template.createdAt).toLocaleString() : ''}</span>\n </div>\n <div class=\"d-f\" style=\"align-items: center; gap: var(--spacer);\">\n <label style=\"min-width: 120px;\"><strong>Updated</strong></label>\n <span class=\"muted\">${template.updatedAt ? new Date(template.updatedAt).toLocaleString() : ''}</span>\n </div>\n </div>\n </k-accordion-panel>\n\n <k-accordion-header for-panel=\"template\" active>Template</k-accordion-header>\n <k-accordion-panel name=\"template\" active>\n <div class=\"p\">\n <k-code-editor\n id=\"templateEditor\"\n class=\"r b\"\n language=\"html\"\n .value=\"${template.markup || ''}\"\n style=\"height: 70vh; min-height: 400px;\"\n ?disabled=\"${isLocked}\"\n ></k-code-editor>\n </div>\n </k-accordion-panel>\n </k-accordion>\n `;\n }\n}\n\ncustomElements.define('admin-template-editor', TemplateEditor);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"src\\admin\\components\\TemplateEditor.js","names":["ShadowComponent","html","getTemplate","updateTemplate","deleteTemplates","moveTemplate","createTemplate","listDirectories","Dialog","Toast","TemplateEditor","static","loading","state","error","saving","template","constructor","super","this","file","connectedCallback","document","addEventListener","handleKeyDown","param","URLSearchParams","window","location","search","get","err","title","name","disconnectedCallback","removeEventListener","getFormState","root","shadowRoot","querySelector","value","markup","getValue","e","ctrlKey","metaKey","key","preventDefault","locked","handleSave","handleDelete","confirm","async","confirmed","msg","success","setTimeout","href","handleMove","dirData","directories","parts","replace","split","currentName","pop","currentDir","join","dirToInternal","p","currentDirDisplay","$dialog","create","map","d","confirmText","confirmAction","dirInput","trim","newName","test","includes","newDir","newFile","saveError","moveError","moved","newParam","encodeURIComponent","cancelText","updatePreview","dir","prefix","textContent","handleCopy","directory","data","copyFrom","handleReset","saved","updatedAt","currentSlug","newSlug","toLowerCase","render","isCustom","owner","isLocked","length","author","createdAt","Date","toLocaleString","customElements","define"],"sources":["0"],"sourcesContent":["import ShadowComponent from '/kempo-ui/components/ShadowComponent.js';\nimport { html } from '/kempo-ui/lit-all.min.js';\nimport { getTemplate, updateTemplate, deleteTemplates, moveTemplate, createTemplate, listDirectories } from '/kempo/sdk.js';\nimport Dialog from '/kempo-ui/components/Dialog.js';\nimport Toast from '/kempo-ui/components/Toast.js';\nimport '/kempo-ui/components/Icon.js';\nimport '/kempo-ui/components/Accordion.js';\nimport '/kempo-ui/components/CodeEditor.js';\n\nexport default class TemplateEditor extends ShadowComponent {\n static properties = {\n loading: { state: true },\n error: { state: true },\n saving: { state: true },\n template: { state: true }\n };\n\n constructor() {\n super();\n this.loading = true;\n this.error = false;\n this.saving = false;\n this.template = null;\n this.file = '';\n }\n\n async connectedCallback() {\n super.connectedCallback();\n document.addEventListener('keydown', this.handleKeyDown);\n const param = new URLSearchParams(window.location.search).get('template');\n this.file = param + '.template.html';\n\n if (!this.file || this.file === '.template.html') {\n this.loading = false;\n this.error = true;\n return;\n }\n\n const [err, template] = await getTemplate(this.file);\n this.loading = false;\n\n if (err) {\n this.error = true;\n return;\n }\n\n this.template = template;\n document.title = `Edit: ${template.name} - Admin`;\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener('keydown', this.handleKeyDown);\n }\n\n /*\n Helpers\n */\n\n getFormState() {\n const root = this.shadowRoot;\n return {\n name: root.querySelector('#metaName')?.value ?? this.template.name,\n markup: root.querySelector('#templateEditor')?.getValue() ?? this.template.markup\n };\n }\n\n /*\n Event Handlers\n */\n\n handleKeyDown = e => {\n if ((e.ctrlKey || e.metaKey) && e.key === 's') {\n e.preventDefault();\n if (!this.saving && !this.template?.locked) this.handleSave();\n }\n };\n\n handleDelete = () => {\n Dialog.confirm('Delete this template? This action cannot be undone.', async confirmed => {\n if (!confirmed) return;\n const [error] = await deleteTemplates([this.file]);\n if (error) {\n Toast.error(error.msg || 'Failed to delete template');\n return;\n }\n Toast.success('Template deleted');\n setTimeout(() => { window.location.href = '/admin/content/templates'; }, 1000);\n });\n };\n\n handleMove = async () => {\n const [, dirData] = await listDirectories();\n const directories = dirData?.directories || ['.'];\n\n const parts = this.file.replace(/\\.template\\.html$/, '').split('/');\n const currentName = parts.pop();\n const currentDir = parts.join('/') || '.';\n\n const isValidDir = p => /^\\/[a-zA-Z0-9_\\-\\[\\]\\/]*$/.test(p) && !p.includes('..') && !p.includes('//');\n const dirToInternal = p => { const t = (p || '/').replace(/^\\//, '').replace(/\\/$/, ''); return t || '.'; };\n const currentDirDisplay = currentDir === '.' ? '/' : '/' + currentDir;\n\n const $dialog = Dialog.create(html`\n <div class=\"p\">\n <div class=\"p r mb bc-warning tc-warning\">\n <k-icon name=\"warning\"></k-icon>\n <strong>Warning:</strong> Moving a template may break pages that reference it by name.<br />Pages search for templates by name starting from their own directory up to the root.<br />Moving this template could cause those pages to fall back to the <code>default</code> template.\n </div>\n <div class=\"mb\">\n <label class=\"d-b mb-sm\"><strong>Location</strong></label>\n <input type=\"text\" id=\"dlg-move-dir\" class=\"full\" list=\"dlg-move-dir-list\" .value=\"${currentDirDisplay}\" placeholder=\"/\">\n <datalist id=\"dlg-move-dir-list\">\n ${directories.map(d => html`<option value=\"${d === '.' ? '/' : '/' + d}\">`)} \n </datalist>\n </div>\n <div>\n <label class=\"d-b mb-sm\"><strong>Template Name</strong></label>\n <input type=\"text\" id=\"dlg-move-name\" class=\"full\" .value=\"${currentName}\">\n <p class=\"mt-sm muted\"><small id=\"dlg-move-preview\"></small></p>\n </div>\n </div>\n `, {\n title: 'Move Template',\n confirmText: 'Save and Move Template',\n confirmAction: async () => {\n const dirInput = $dialog.querySelector('#dlg-move-dir').value.trim() || '/';\n const newName = $dialog.querySelector('#dlg-move-name').value.trim();\n if (!newName) {\n Toast.error('Template name is required');\n return;\n }\n if (!isValidDir(dirInput)) {\n Toast.error('Invalid directory path');\n return;\n }\n const newDir = dirToInternal(dirInput);\n const newFile = newDir === '.'\n ? `${newName}.template.html`\n : `${newDir}/${newName}.template.html`;\n\n this.saving = true;\n const [saveError] = await updateTemplate({ file: this.file, ...this.getFormState() });\n this.saving = false;\n if (saveError) {\n Toast.error(saveError.msg || 'Failed to save template');\n return;\n }\n\n const [moveError, moved] = await moveTemplate({ file: this.file, newFile });\n if (moveError) {\n Toast.error(moveError.msg || 'Failed to move template');\n return;\n }\n\n Toast.success('Template saved and moved');\n const newParam = moved.file.replace(/\\.template\\.html$/, '');\n setTimeout(() => {\n window.location.href = `/admin/content/templates/edit?template=${encodeURIComponent(newParam)}`;\n }, 1000);\n },\n cancelText: 'Cancel'\n });\n\n const updatePreview = () => {\n const dir = dirToInternal($dialog.querySelector('#dlg-move-dir').value || '/');\n const name = $dialog.querySelector('#dlg-move-name').value;\n const prefix = dir === '.' ? '/' : '/' + dir + '/';\n $dialog.querySelector('#dlg-move-preview').textContent = name ? prefix + name : '';\n };\n $dialog.querySelector('#dlg-move-dir').addEventListener('input', updatePreview);\n $dialog.querySelector('#dlg-move-name').addEventListener('input', updatePreview);\n updatePreview();\n };\n\n handleCopy = async () => {\n const [, dirData] = await listDirectories();\n const directories = dirData?.directories || ['.'];\n\n const parts = this.file.replace(/\\.template\\.html$/, '').split('/');\n const currentName = parts.pop();\n const currentDir = parts.join('/') || '.';\n\n const isValidDir = p => /^\\/[a-zA-Z0-9_\\-\\[\\]\\/]*$/.test(p) && !p.includes('..') && !p.includes('//');\n const dirToInternal = p => { const t = (p || '/').replace(/^\\//, '').replace(/\\/$/, ''); return t || '.'; };\n const currentDirDisplay = currentDir === '.' ? '/' : '/' + currentDir;\n\n const $dialog = Dialog.create(html`\n <div class=\"p\">\n <div class=\"mb\">\n <label class=\"d-b mb-sm\"><strong>Location</strong></label>\n <input type=\"text\" id=\"dlg-copy-dir\" class=\"full\" list=\"dlg-copy-dir-list\" .value=\"${currentDirDisplay}\" placeholder=\"/\">\n <datalist id=\"dlg-copy-dir-list\">\n ${directories.map(d => html`<option value=\"${d === '.' ? '/' : '/' + d}\">`)} \n </datalist>\n </div>\n <div>\n <label class=\"d-b mb-sm\"><strong>Template Name</strong></label>\n <input type=\"text\" id=\"dlg-copy-name\" class=\"full\" .value=\"${currentName}-copy\">\n <p class=\"mt-sm muted\"><small id=\"dlg-copy-preview\"></small></p>\n </div>\n </div>\n `, {\n title: 'Copy Template',\n confirmText: 'Copy Template',\n confirmAction: async () => {\n const dirInput = $dialog.querySelector('#dlg-copy-dir').value.trim() || '/';\n const newName = $dialog.querySelector('#dlg-copy-name').value.trim();\n if(!newName){\n Toast.error('Template name is required');\n return;\n }\n if(!isValidDir(dirInput)){\n Toast.error('Invalid directory path');\n return;\n }\n const directory = dirToInternal(dirInput);\n const [error, data] = await createTemplate({ directory: directory === '.' ? '' : directory, name: newName, copyFrom: this.file });\n if(error){\n Toast.error(error.msg || 'Failed to copy template');\n return;\n }\n Toast.success('Template copied');\n setTimeout(() => {\n window.location.href = `/admin/content/templates/edit?template=${encodeURIComponent(data.file.replace(/\\.template\\.html$/, ''))}`;\n }, 1000);\n },\n cancelText: 'Cancel'\n });\n\n const updatePreview = () => {\n const dir = dirToInternal($dialog.querySelector('#dlg-copy-dir').value || '/');\n const name = $dialog.querySelector('#dlg-copy-name').value;\n const prefix = dir === '.' ? '/' : '/' + dir + '/';\n $dialog.querySelector('#dlg-copy-preview').textContent = name ? prefix + name : '';\n };\n $dialog.querySelector('#dlg-copy-dir').addEventListener('input', updatePreview);\n $dialog.querySelector('#dlg-copy-name').addEventListener('input', updatePreview);\n updatePreview();\n };\n\n handleReset = () => {\n Dialog.confirm('Reset this template? Any unsaved changes will be lost.', confirmed => {\n if (!confirmed) return;\n this.template = { ...this.template };\n });\n };\n\n handleSave = async () => {\n this.saving = true;\n const state = this.getFormState();\n const [saveError, saved] = await updateTemplate({ file: this.file, markup: state.markup });\n this.saving = false;\n\n if(saveError){\n Toast.error(saveError.msg || 'Failed to save template');\n return;\n }\n\n this.template = { ...this.template, markup: state.markup, updatedAt: saved.updatedAt };\n\n const slugify = n => n.toLowerCase().trim().replace(/[^\\w\\s-]/g, '').replace(/[\\s_]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');\n const parts = this.file.replace(/\\.template\\.html$/, '').split('/');\n const currentSlug = parts.pop();\n const dir = parts.join('/');\n const newSlug = slugify(state.name);\n\n if(newSlug && newSlug !== currentSlug){\n const newFile = dir ? `${dir}/${newSlug}.template.html` : `${newSlug}.template.html`;\n const [moveError, moved] = await moveTemplate({ file: this.file, newFile });\n if(moveError){\n Toast.error(moveError.msg || 'Failed to rename template file');\n return;\n }\n Toast.success('Template saved and renamed');\n const newParam = moved.file.replace(/\\.template\\.html$/, '');\n setTimeout(() => {\n window.location.href = `/admin/content/templates/edit?template=${encodeURIComponent(newParam)}`;\n }, 1000);\n return;\n }\n\n document.title = `Edit: ${template.name} - Admin`;\n Toast.success('Template saved');\n };\n\n /*\n Render\n */\n\n render() {\n if (this.loading) return html`<div>Loading template...</div>`;\n\n if (this.error) return html`\n <div>\n <p>Template not found.</p>\n <a href=\"/admin/content/templates\">Back to Templates</a>\n </div>\n `;\n\n const { template } = this;\n const isCustom = template.owner === 'custom';\n const isLocked = template.locked;\n\n return html`\n ${isLocked ? html`\n <div class=\"p r mb bc-warning tc-warning\">\n <k-icon name=\"lock\"></k-icon> This template is locked and cannot be edited. It is managed by an extension.\n </div>\n ` : ''}\n <div class=\"d-f mb\">\n <div class=\"btn-grp mrh mb\">\n <a href=\"/admin/content/templates\" class=\"btn\">\n <k-icon name=\"arrow\" direction=\"left\"></k-icon> Templates\n </a>\n </div>\n <div class=\"flex\"></div>\n ${isCustom && !isLocked ? html`\n <div class=\"btn-grp mrh mb\">\n <button class=\"danger\" @click=\"${this.handleDelete}\"><k-icon name=\"delete\"></k-icon> Delete</button>\n <button @click=\"${this.handleMove}\"><k-icon name=\"drive_file_move\"></k-icon> Move Template</button>\n </div>\n ` : ''}\n <div class=\"btn-grp mrh mb\">\n <button @click=\"${this.handleCopy}\"><k-icon name=\"content_copy\"></k-icon> Copy Template</button>\n </div>\n ${!isLocked ? html`\n <div class=\"btn-grp mrh mb\">\n <button @click=\"${this.handleReset}\"><k-icon name=\"restart_alt\"></k-icon> Reset</button>\n <button id=\"saveBtn\" class=\"primary\" ?disabled=\"${this.saving}\" @click=\"${this.handleSave}\">\n <k-icon name=\"save\"></k-icon> Save\n </button>\n </div>\n ` : ''}\n </div>\n\n <h1 class=\"mb\">Template: ${template.name}</h1>\n\n <k-accordion>\n <k-accordion-header for-panel=\"metadata\">Metadata</k-accordion-header>\n <k-accordion-panel name=\"metadata\">\n <div class=\"p\">\n <div class=\"d-f mb\" style=\"align-items: center; gap: var(--spacer);\">\n <label style=\"min-width: 120px;\"><strong>Name</strong></label>\n <input type=\"text\" id=\"metaName\" class=\"flex\" .value=\"${template.name || ''}\" ?disabled=\"${!isCustom || isLocked}\">\n </div>\n <div class=\"d-f mb\" style=\"align-items: center; gap: var(--spacer);\">\n <label style=\"min-width: 120px;\"><strong>Directory</strong></label>\n <span class=\"muted\">${(() => { const parts = this.file.replace(/\\.template\\.html$/, '').split('/'); parts.pop(); return parts.length ? parts.join('/') : '/'; })()}</span>\n ${isCustom && !isLocked ? html`\n <button class=\"icon-btn no-btn ph\" title=\"Move Template\" @click=\"${this.handleMove}\"><k-icon name=\"drive_file_move\"></k-icon></button>\n ` : ''}\n </div>\n ${template.author ? html`\n <div class=\"d-f mb\" style=\"align-items: center; gap: var(--spacer);\">\n <label style=\"min-width: 120px;\"><strong>Author</strong></label>\n <span class=\"muted\">${template.author}</span>\n </div>\n ` : ''}\n <div class=\"d-f mb\" style=\"align-items: center; gap: var(--spacer);\">\n <label style=\"min-width: 120px;\"><strong>Owner</strong></label>\n <span class=\"muted\">${template.owner || ''}</span>\n </div>\n <div class=\"d-f mb\" style=\"align-items: center; gap: var(--spacer);\">\n <label style=\"min-width: 120px;\"><strong>Created</strong></label>\n <span class=\"muted\">${template.createdAt ? new Date(template.createdAt).toLocaleString() : ''}</span>\n </div>\n <div class=\"d-f\" style=\"align-items: center; gap: var(--spacer);\">\n <label style=\"min-width: 120px;\"><strong>Updated</strong></label>\n <span class=\"muted\">${template.updatedAt ? new Date(template.updatedAt).toLocaleString() : ''}</span>\n </div>\n </div>\n </k-accordion-panel>\n\n <k-accordion-header for-panel=\"template\" active>Template</k-accordion-header>\n <k-accordion-panel name=\"template\" active>\n <div class=\"p\">\n <k-code-editor\n id=\"templateEditor\"\n class=\"r b\"\n language=\"html\"\n .value=\"${template.markup || ''}\"\n style=\"height: 70vh; min-height: 400px;\"\n ?disabled=\"${isLocked}\"\n ></k-code-editor>\n </div>\n </k-accordion-panel>\n </k-accordion>\n `;\n }\n}\n\ncustomElements.define('admin-template-editor', TemplateEditor);\n"],"mappings":"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","ignoreList":[]}
@@ -37,4 +37,4 @@ import ShadowComponent from"/kempo-ui/components/ShadowComponent.js";import{html
37
37
  @change="${this.#l}"
38
38
  .value="${String(this.#t)}"
39
39
  ></textarea>`}}customElements.define("admin-value-editor",ValueEditor);
40
- //# sourceMappingURL=ValueEditor.js.map
40
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\admin\components\ValueEditor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src/admin/components/ValueEditor.js","names":["ShadowComponent","html","nothing","CODE_TYPES","Set","TYPE_TO_LANG","css","javascript","json","xml","ValueEditor","properties","type","String","reflect","readonly","Boolean","disabled","placeholder","min","max","step","rows","Number","height","value","monacoEl","constructor","super","this","has","el","renderRoot","querySelector","v","requestUpdate","updated","changedProperties","syncEditor","readOnly","disconnectedCallback","destroyMonaco","language","createMonaco","document","createElement","addEventListener","onMonacoChange","appendChild","removeEventListener","remove","emit","name","dispatchEvent","Event","bubbles","composed","onInput","onChange","render","customElements","define"],"sources":["0"],"sourcesContent":["import ShadowComponent from '/kempo-ui/components/ShadowComponent.js';\nimport { html, nothing } from '/kempo-ui/lit-all.min.js';\nimport '/admin/components/Monaco.js';\n\nconst CODE_TYPES = new Set(['html', 'css', 'javascript', 'json', 'xml']);\nconst TYPE_TO_LANG = { html: 'html', css: 'css', javascript: 'javascript', json: 'json', xml: 'xml' };\n\nexport default class ValueEditor extends ShadowComponent {\n\t/*\n\t\tReactive Properties\n\t*/\n\n\tstatic get properties() {\n\t\treturn {\n\t\t\ttype: { type: String, reflect: true },\n\t\t\treadonly: { type: Boolean, reflect: true },\n\t\t\tdisabled: { type: Boolean, reflect: true },\n\t\t\tplaceholder: { type: String },\n\t\t\tmin: { type: String },\n\t\t\tmax: { type: String },\n\t\t\tstep: { type: String },\n\t\t\trows: { type: Number },\n\t\t\theight: { type: String },\n\t\t};\n\t}\n\n\t#value = '';\n\t#monacoEl = null;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.type = 'string';\n\t\tthis.readonly = false;\n\t\tthis.disabled = false;\n\t\tthis.placeholder = '';\n\t\tthis.step = 'any';\n\t\tthis.rows = 12;\n\t\tthis.height = '400px';\n\t}\n\n\t/*\n\t\tValue Accessors\n\t*/\n\n\tget value() {\n\t\tif(CODE_TYPES.has(this.type)){\n\t\t\treturn this.#monacoEl?.value ?? this.#value;\n\t\t}\n\t\tconst el = this.renderRoot?.querySelector('[data-ve-input]');\n\t\tif(!el) return this.#value;\n\t\tif(this.type === 'boolean') return el.value === 'true';\n\t\tif(this.type === 'number') return Number(el.value);\n\t\treturn el.value;\n\t}\n\n\tset value(v) {\n\t\tthis.#value = v ?? '';\n\t\tif(CODE_TYPES.has(this.type) && this.#monacoEl){\n\t\t\tthis.#monacoEl.value = String(this.#value);\n\t\t\treturn;\n\t\t}\n\t\tthis.requestUpdate();\n\t}\n\n\t/*\n\t\tLifecycle\n\t*/\n\n\tupdated(changedProperties) {\n\t\tif(changedProperties.has('type')) this.#syncEditor();\n\t\tif(!this.#monacoEl) return;\n\t\tif(changedProperties.has('readonly') || changedProperties.has('disabled')){\n\t\t\tthis.#monacoEl.readOnly = this.readonly || this.disabled;\n\t\t}\n\t\tif(changedProperties.has('height')){\n\t\t\tthis.#monacoEl.height = this.height;\n\t\t}\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback();\n\t\tthis.#destroyMonaco();\n\t}\n\n\t/*\n\t\tMonaco Management (light DOM child projected via <slot> for style compat)\n\t*/\n\n\t#syncEditor = () => {\n\t\tif(CODE_TYPES.has(this.type)){\n\t\t\tif(this.#monacoEl){\n\t\t\t\tthis.#monacoEl.language = TYPE_TO_LANG[this.type] || 'plaintext';\n\t\t\t} else {\n\t\t\t\tthis.#createMonaco();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#destroyMonaco();\n\t\t}\n\t};\n\n\t#createMonaco = () => {\n\t\tthis.#monacoEl = document.createElement('admin-monaco');\n\t\tthis.#monacoEl.language = TYPE_TO_LANG[this.type] || 'plaintext';\n\t\tthis.#monacoEl.readOnly = this.readonly || this.disabled;\n\t\tthis.#monacoEl.height = this.height;\n\t\tthis.#monacoEl.value = String(this.#value);\n\t\tthis.#monacoEl.addEventListener('change', this.#onMonacoChange);\n\t\tthis.appendChild(this.#monacoEl);\n\t};\n\n\t#destroyMonaco = () => {\n\t\tif(!this.#monacoEl) return;\n\t\tthis.#monacoEl.removeEventListener('change', this.#onMonacoChange);\n\t\tthis.#monacoEl.remove();\n\t\tthis.#monacoEl = null;\n\t};\n\n\t/*\n\t\tEvent Handlers\n\t*/\n\n\t#emit = name => {\n\t\tthis.dispatchEvent(new Event(name, { bubbles: true, composed: true }));\n\t};\n\n\t#onMonacoChange = () => {\n\t\tthis.#value = this.#monacoEl.value;\n\t\tthis.#emit('input');\n\t\tthis.#emit('change');\n\t};\n\n\t#onInput = () => {\n\t\tconst el = this.renderRoot?.querySelector('[data-ve-input]');\n\t\tif(el) this.#value = el.value;\n\t\tthis.#emit('input');\n\t};\n\n\t#onChange = () => {\n\t\tconst el = this.renderRoot?.querySelector('[data-ve-input]');\n\t\tif(el) this.#value = el.value;\n\t\tthis.#emit('change');\n\t};\n\n\t/*\n\t\tRender\n\t*/\n\n\trender() {\n\t\tif(CODE_TYPES.has(this.type)){\n\t\t\treturn html`<slot></slot>`;\n\t\t}\n\n\t\tif(this.type === 'boolean'){\n\t\t\treturn html`<select\n\t\t\t\tdata-ve-input\n\t\t\t\tclass=\"full\"\n\t\t\t\t?disabled=\"${this.disabled || this.readonly}\"\n\t\t\t\t@change=\"${this.#onChange}\"\n\t\t\t>\n\t\t\t\t<option value=\"true\" ?selected=\"${String(this.#value) === 'true'}\">true</option>\n\t\t\t\t<option value=\"false\" ?selected=\"${String(this.#value) !== 'true'}\">false</option>\n\t\t\t</select>`;\n\t\t}\n\n\t\tif(this.type === 'number'){\n\t\t\treturn html`<input\n\t\t\t\tdata-ve-input\n\t\t\t\ttype=\"number\"\n\t\t\t\tclass=\"full\"\n\t\t\t\t.value=\"${String(this.#value ?? 0)}\"\n\t\t\t\tplaceholder=\"${this.placeholder || nothing}\"\n\t\t\t\tstep=\"${this.step || nothing}\"\n\t\t\t\tmin=\"${this.min ?? nothing}\"\n\t\t\t\tmax=\"${this.max ?? nothing}\"\n\t\t\t\t?readonly=\"${this.readonly}\"\n\t\t\t\t?disabled=\"${this.disabled}\"\n\t\t\t\t@input=\"${this.#onInput}\"\n\t\t\t\t@change=\"${this.#onChange}\"\n\t\t\t>`;\n\t\t}\n\n\t\tif(this.type === 'color'){\n\t\t\treturn html`<input\n\t\t\t\tdata-ve-input\n\t\t\t\ttype=\"color\"\n\t\t\t\t.value=\"${this.#value || '#000000'}\"\n\t\t\t\t?disabled=\"${this.disabled || this.readonly}\"\n\t\t\t\t@input=\"${this.#onInput}\"\n\t\t\t\t@change=\"${this.#onChange}\"\n\t\t\t>`;\n\t\t}\n\n\t\treturn html`<textarea\n\t\t\tdata-ve-input\n\t\t\tclass=\"full ff-mono\"\n\t\t\trows=\"${this.rows}\"\n\t\t\tplaceholder=\"${this.placeholder || nothing}\"\n\t\t\t?readonly=\"${this.readonly}\"\n\t\t\t?disabled=\"${this.disabled}\"\n\t\t\t@input=\"${this.#onInput}\"\n\t\t\t@change=\"${this.#onChange}\"\n\t\t\t.value=\"${String(this.#value)}\"\n\t\t></textarea>`;\n\t}\n}\n\ncustomElements.define('admin-value-editor', ValueEditor);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"src\\admin\\components\\ValueEditor.js","names":["ShadowComponent","html","nothing","CODE_TYPES","Set","TYPE_TO_LANG","css","javascript","json","xml","ValueEditor","properties","type","String","reflect","readonly","Boolean","disabled","placeholder","min","max","step","rows","Number","height","value","monacoEl","constructor","super","this","has","el","renderRoot","querySelector","v","requestUpdate","updated","changedProperties","syncEditor","readOnly","disconnectedCallback","destroyMonaco","language","createMonaco","document","createElement","addEventListener","onMonacoChange","appendChild","removeEventListener","remove","emit","name","dispatchEvent","Event","bubbles","composed","onInput","onChange","render","customElements","define"],"sources":["0"],"sourcesContent":["import ShadowComponent from '/kempo-ui/components/ShadowComponent.js';\r\nimport { html, nothing } from '/kempo-ui/lit-all.min.js';\r\nimport '/admin/components/Monaco.js';\r\n\r\nconst CODE_TYPES = new Set(['html', 'css', 'javascript', 'json', 'xml']);\r\nconst TYPE_TO_LANG = { html: 'html', css: 'css', javascript: 'javascript', json: 'json', xml: 'xml' };\r\n\r\nexport default class ValueEditor extends ShadowComponent {\r\n\t/*\r\n\t\tReactive Properties\r\n\t*/\r\n\r\n\tstatic get properties() {\r\n\t\treturn {\r\n\t\t\ttype: { type: String, reflect: true },\r\n\t\t\treadonly: { type: Boolean, reflect: true },\r\n\t\t\tdisabled: { type: Boolean, reflect: true },\r\n\t\t\tplaceholder: { type: String },\r\n\t\t\tmin: { type: String },\r\n\t\t\tmax: { type: String },\r\n\t\t\tstep: { type: String },\r\n\t\t\trows: { type: Number },\r\n\t\t\theight: { type: String },\r\n\t\t};\r\n\t}\r\n\r\n\t#value = '';\r\n\t#monacoEl = null;\r\n\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.type = 'string';\r\n\t\tthis.readonly = false;\r\n\t\tthis.disabled = false;\r\n\t\tthis.placeholder = '';\r\n\t\tthis.step = 'any';\r\n\t\tthis.rows = 12;\r\n\t\tthis.height = '400px';\r\n\t}\r\n\r\n\t/*\r\n\t\tValue Accessors\r\n\t*/\r\n\r\n\tget value() {\r\n\t\tif(CODE_TYPES.has(this.type)){\r\n\t\t\treturn this.#monacoEl?.value ?? this.#value;\r\n\t\t}\r\n\t\tconst el = this.renderRoot?.querySelector('[data-ve-input]');\r\n\t\tif(!el) return this.#value;\r\n\t\tif(this.type === 'boolean') return el.value === 'true';\r\n\t\tif(this.type === 'number') return Number(el.value);\r\n\t\treturn el.value;\r\n\t}\r\n\r\n\tset value(v) {\r\n\t\tthis.#value = v ?? '';\r\n\t\tif(CODE_TYPES.has(this.type) && this.#monacoEl){\r\n\t\t\tthis.#monacoEl.value = String(this.#value);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.requestUpdate();\r\n\t}\r\n\r\n\t/*\r\n\t\tLifecycle\r\n\t*/\r\n\r\n\tupdated(changedProperties) {\r\n\t\tif(changedProperties.has('type')) this.#syncEditor();\r\n\t\tif(!this.#monacoEl) return;\r\n\t\tif(changedProperties.has('readonly') || changedProperties.has('disabled')){\r\n\t\t\tthis.#monacoEl.readOnly = this.readonly || this.disabled;\r\n\t\t}\r\n\t\tif(changedProperties.has('height')){\r\n\t\t\tthis.#monacoEl.height = this.height;\r\n\t\t}\r\n\t}\r\n\r\n\tdisconnectedCallback() {\r\n\t\tsuper.disconnectedCallback();\r\n\t\tthis.#destroyMonaco();\r\n\t}\r\n\r\n\t/*\r\n\t\tMonaco Management (light DOM child projected via <slot> for style compat)\r\n\t*/\r\n\r\n\t#syncEditor = () => {\r\n\t\tif(CODE_TYPES.has(this.type)){\r\n\t\t\tif(this.#monacoEl){\r\n\t\t\t\tthis.#monacoEl.language = TYPE_TO_LANG[this.type] || 'plaintext';\r\n\t\t\t} else {\r\n\t\t\t\tthis.#createMonaco();\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tthis.#destroyMonaco();\r\n\t\t}\r\n\t};\r\n\r\n\t#createMonaco = () => {\r\n\t\tthis.#monacoEl = document.createElement('admin-monaco');\r\n\t\tthis.#monacoEl.language = TYPE_TO_LANG[this.type] || 'plaintext';\r\n\t\tthis.#monacoEl.readOnly = this.readonly || this.disabled;\r\n\t\tthis.#monacoEl.height = this.height;\r\n\t\tthis.#monacoEl.value = String(this.#value);\r\n\t\tthis.#monacoEl.addEventListener('change', this.#onMonacoChange);\r\n\t\tthis.appendChild(this.#monacoEl);\r\n\t};\r\n\r\n\t#destroyMonaco = () => {\r\n\t\tif(!this.#monacoEl) return;\r\n\t\tthis.#monacoEl.removeEventListener('change', this.#onMonacoChange);\r\n\t\tthis.#monacoEl.remove();\r\n\t\tthis.#monacoEl = null;\r\n\t};\r\n\r\n\t/*\r\n\t\tEvent Handlers\r\n\t*/\r\n\r\n\t#emit = name => {\r\n\t\tthis.dispatchEvent(new Event(name, { bubbles: true, composed: true }));\r\n\t};\r\n\r\n\t#onMonacoChange = () => {\r\n\t\tthis.#value = this.#monacoEl.value;\r\n\t\tthis.#emit('input');\r\n\t\tthis.#emit('change');\r\n\t};\r\n\r\n\t#onInput = () => {\r\n\t\tconst el = this.renderRoot?.querySelector('[data-ve-input]');\r\n\t\tif(el) this.#value = el.value;\r\n\t\tthis.#emit('input');\r\n\t};\r\n\r\n\t#onChange = () => {\r\n\t\tconst el = this.renderRoot?.querySelector('[data-ve-input]');\r\n\t\tif(el) this.#value = el.value;\r\n\t\tthis.#emit('change');\r\n\t};\r\n\r\n\t/*\r\n\t\tRender\r\n\t*/\r\n\r\n\trender() {\r\n\t\tif(CODE_TYPES.has(this.type)){\r\n\t\t\treturn html`<slot></slot>`;\r\n\t\t}\r\n\r\n\t\tif(this.type === 'boolean'){\r\n\t\t\treturn html`<select\r\n\t\t\t\tdata-ve-input\r\n\t\t\t\tclass=\"full\"\r\n\t\t\t\t?disabled=\"${this.disabled || this.readonly}\"\r\n\t\t\t\t@change=\"${this.#onChange}\"\r\n\t\t\t>\r\n\t\t\t\t<option value=\"true\" ?selected=\"${String(this.#value) === 'true'}\">true</option>\r\n\t\t\t\t<option value=\"false\" ?selected=\"${String(this.#value) !== 'true'}\">false</option>\r\n\t\t\t</select>`;\r\n\t\t}\r\n\r\n\t\tif(this.type === 'number'){\r\n\t\t\treturn html`<input\r\n\t\t\t\tdata-ve-input\r\n\t\t\t\ttype=\"number\"\r\n\t\t\t\tclass=\"full\"\r\n\t\t\t\t.value=\"${String(this.#value ?? 0)}\"\r\n\t\t\t\tplaceholder=\"${this.placeholder || nothing}\"\r\n\t\t\t\tstep=\"${this.step || nothing}\"\r\n\t\t\t\tmin=\"${this.min ?? nothing}\"\r\n\t\t\t\tmax=\"${this.max ?? nothing}\"\r\n\t\t\t\t?readonly=\"${this.readonly}\"\r\n\t\t\t\t?disabled=\"${this.disabled}\"\r\n\t\t\t\t@input=\"${this.#onInput}\"\r\n\t\t\t\t@change=\"${this.#onChange}\"\r\n\t\t\t>`;\r\n\t\t}\r\n\r\n\t\tif(this.type === 'color'){\r\n\t\t\treturn html`<input\r\n\t\t\t\tdata-ve-input\r\n\t\t\t\ttype=\"color\"\r\n\t\t\t\t.value=\"${this.#value || '#000000'}\"\r\n\t\t\t\t?disabled=\"${this.disabled || this.readonly}\"\r\n\t\t\t\t@input=\"${this.#onInput}\"\r\n\t\t\t\t@change=\"${this.#onChange}\"\r\n\t\t\t>`;\r\n\t\t}\r\n\r\n\t\treturn html`<textarea\r\n\t\t\tdata-ve-input\r\n\t\t\tclass=\"full ff-mono\"\r\n\t\t\trows=\"${this.rows}\"\r\n\t\t\tplaceholder=\"${this.placeholder || nothing}\"\r\n\t\t\t?readonly=\"${this.readonly}\"\r\n\t\t\t?disabled=\"${this.disabled}\"\r\n\t\t\t@input=\"${this.#onInput}\"\r\n\t\t\t@change=\"${this.#onChange}\"\r\n\t\t\t.value=\"${String(this.#value)}\"\r\n\t\t></textarea>`;\r\n\t}\r\n}\r\n\r\ncustomElements.define('admin-value-editor', ValueEditor);\r\n"],"mappings":"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","ignoreList":[]}
@@ -3,4 +3,4 @@ import TableControl from"/kempo-ui/components/tableControls/TableControl.js";imp
3
3
  <k-icon name="person_add"></k-icon>
4
4
  </button>
5
5
  `}}customElements.define("admin-add-member",AddMember);
6
- //# sourceMappingURL=AddMember.js.map
6
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\admin\components\tableControls\AddMember.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src/admin/components/tableControls/AddMember.js","names":["TableControl","html","Dialog","Toast","AddMember","groupName","addMember","selectedUserId","$combobox","document","createElement","setAttribute","addEventListener","async","searching","searchUsers","import","err","data","q","e","detail","value","notInGroup","this","limit","setOptions","users","map","u","label","name","email","id","$wrap","className","appendChild","create","title","confirmText","confirmAction","addMemberToGroup","error","msg","success","dispatchEvent","CustomEvent","bubbles","composed","cancelText","render","customElements","define"],"sources":["0"],"sourcesContent":["import TableControl from '/kempo-ui/components/tableControls/TableControl.js';\nimport { html } from '/kempo-ui/lit-all.min.js';\nimport Dialog from '/kempo-ui/components/Dialog.js';\nimport Toast from '/kempo-ui/components/Toast.js';\nimport '/kempo-ui/components/Icon.js';\nimport '/kempo-ui/components/Combobox.js';\nimport '/kempo-ui/components/Spinner.js';\n\nexport default class AddMember extends TableControl {\n groupName = '';\n\n addMember = () => {\n let selectedUserId = null;\n\n const $combobox = document.createElement('k-combobox');\n $combobox.setAttribute('placeholder', 'Search users...');\n $combobox.setAttribute('debounce-ms', '350');\n $combobox.setAttribute('require-match', '');\n\n $combobox.addEventListener('search', async e => {\n $combobox.searching = true;\n const { searchUsers } = await import('/kempo/sdk.js');\n const [err, data] = await searchUsers({ q: e.detail.value, notInGroup: this.groupName, limit: 20 });\n $combobox.searching = false;\n if(err || !data) return;\n $combobox.setOptions(data.users.map(u => ({ label: `${u.name} (${u.email})`, value: u.id })));\n });\n\n $combobox.addEventListener('select', e => {\n selectedUserId = e.detail.value;\n });\n\n const $wrap = document.createElement('div');\n $wrap.className = 'p';\n $wrap.appendChild($combobox);\n\n Dialog.create($wrap, {\n title: 'Add Member',\n confirmText: 'Add',\n confirmAction: async () => {\n if(!selectedUserId) return;\n const { addMemberToGroup } = await import('/kempo/sdk.js');\n const [err] = await addMemberToGroup(this.groupName, selectedUserId);\n if(err){ Toast.error(err.msg || 'Failed to add member'); return; }\n Toast.success('Member added');\n this.dispatchEvent(new CustomEvent('memberAdded', { bubbles: true, composed: true }));\n },\n cancelText: 'Cancel'\n });\n };\n\n render(){\n return html`\n <button class=\"no-btn icon-btn\" title=\"Add Member\" @click=\"${this.addMember}\">\n <k-icon name=\"person_add\"></k-icon>\n </button>\n `;\n }\n}\n\ncustomElements.define('admin-add-member', AddMember);\n"],"mappings":"OAAOA,iBAAkB,4DAChBC,SAAY,kCACdC,WAAY,wCACZC,UAAW,sCACX,qCACA,yCACA,iDAEQ,MAAMC,kBAAkBJ,aACrCK,UAAY,GAEZC,UAAY,KACV,IAAIC,EAAiB,KAErB,MAAMC,EAAYC,SAASC,cAAc,cACzCF,EAAUG,aAAa,cAAe,mBACtCH,EAAUG,aAAa,cAAe,OACtCH,EAAUG,aAAa,gBAAiB,IAExCH,EAAUI,iBAAiB,SAAUC,UACnCL,EAAUM,WAAY,EACtB,MAAMC,YAAEA,SAAsBC,OAAO,kBAC9BC,EAAKC,SAAcH,EAAY,CAAEI,EAAGC,EAAEC,OAAOC,MAAOC,WAAYC,KAAKnB,UAAWoB,MAAO,KAC9FjB,EAAUM,WAAY,GACnBG,GAAQC,GACXV,EAAUkB,WAAWR,EAAKS,MAAMC,IAAIC,IAAK,CAAGC,MAAO,GAAGD,EAAEE,SAASF,EAAEG,SAAUV,MAAOO,EAAEI,SAGxFzB,EAAUI,iBAAiB,SAAUQ,IACnCb,EAAiBa,EAAEC,OAAOC,QAG5B,MAAMY,EAAQzB,SAASC,cAAc,OACrCwB,EAAMC,UAAY,IAClBD,EAAME,YAAY5B,GAElBN,OAAOmC,OAAOH,EAAO,CACnBI,MAAO,aACPC,YAAa,MACbC,cAAe3B,UACb,IAAIN,EAAgB,OACpB,MAAMkC,iBAAEA,SAA2BzB,OAAO,kBACnCC,SAAawB,EAAiBjB,KAAKnB,UAAWE,GAClDU,EAAMd,MAAMuC,MAAMzB,EAAI0B,KAAO,yBAChCxC,MAAMyC,QAAQ,gBACdpB,KAAKqB,cAAc,IAAIC,YAAY,cAAe,CAAEC,SAAS,EAAMC,UAAU,OAE/EC,WAAY,YAIhB,MAAAC,GACE,OAAOjD,IAAI;mEACoDuB,KAAKlB;;;KAItE,EAGF6C,eAAeC,OAAO,mBAAoBhD","ignoreList":[]}
1
+ {"version":3,"file":"src\\admin\\components\\tableControls\\AddMember.js","names":["TableControl","html","Dialog","Toast","AddMember","groupName","addMember","selectedUserId","$combobox","document","createElement","setAttribute","addEventListener","async","searching","searchUsers","import","err","data","q","e","detail","value","notInGroup","this","limit","setOptions","users","map","u","label","name","email","id","$wrap","className","appendChild","create","title","confirmText","confirmAction","addMemberToGroup","error","msg","success","dispatchEvent","CustomEvent","bubbles","composed","cancelText","render","customElements","define"],"sources":["0"],"sourcesContent":["import TableControl from '/kempo-ui/components/tableControls/TableControl.js';\r\nimport { html } from '/kempo-ui/lit-all.min.js';\r\nimport Dialog from '/kempo-ui/components/Dialog.js';\r\nimport Toast from '/kempo-ui/components/Toast.js';\r\nimport '/kempo-ui/components/Icon.js';\r\nimport '/kempo-ui/components/Combobox.js';\r\nimport '/kempo-ui/components/Spinner.js';\r\n\r\nexport default class AddMember extends TableControl {\r\n groupName = '';\r\n\r\n addMember = () => {\r\n let selectedUserId = null;\r\n\r\n const $combobox = document.createElement('k-combobox');\r\n $combobox.setAttribute('placeholder', 'Search users...');\r\n $combobox.setAttribute('debounce-ms', '350');\r\n $combobox.setAttribute('require-match', '');\r\n\r\n $combobox.addEventListener('search', async e => {\r\n $combobox.searching = true;\r\n const { searchUsers } = await import('/kempo/sdk.js');\r\n const [err, data] = await searchUsers({ q: e.detail.value, notInGroup: this.groupName, limit: 20 });\r\n $combobox.searching = false;\r\n if(err || !data) return;\r\n $combobox.setOptions(data.users.map(u => ({ label: `${u.name} (${u.email})`, value: u.id })));\r\n });\r\n\r\n $combobox.addEventListener('select', e => {\r\n selectedUserId = e.detail.value;\r\n });\r\n\r\n const $wrap = document.createElement('div');\r\n $wrap.className = 'p';\r\n $wrap.appendChild($combobox);\r\n\r\n Dialog.create($wrap, {\r\n title: 'Add Member',\r\n confirmText: 'Add',\r\n confirmAction: async () => {\r\n if(!selectedUserId) return;\r\n const { addMemberToGroup } = await import('/kempo/sdk.js');\r\n const [err] = await addMemberToGroup(this.groupName, selectedUserId);\r\n if(err){ Toast.error(err.msg || 'Failed to add member'); return; }\r\n Toast.success('Member added');\r\n this.dispatchEvent(new CustomEvent('memberAdded', { bubbles: true, composed: true }));\r\n },\r\n cancelText: 'Cancel'\r\n });\r\n };\r\n\r\n render(){\r\n return html`\r\n <button class=\"no-btn icon-btn\" title=\"Add Member\" @click=\"${this.addMember}\">\r\n <k-icon name=\"person_add\"></k-icon>\r\n </button>\r\n `;\r\n }\r\n}\r\n\r\ncustomElements.define('admin-add-member', AddMember);\r\n"],"mappings":"OAAOA,iBAAkB,4DAChBC,SAAY,kCACdC,WAAY,wCACZC,UAAW,sCACX,qCACA,yCACA,iDAEQ,MAAMC,kBAAkBJ,aACrCK,UAAY,GAEZC,UAAY,KACV,IAAIC,EAAiB,KAErB,MAAMC,EAAYC,SAASC,cAAc,cACzCF,EAAUG,aAAa,cAAe,mBACtCH,EAAUG,aAAa,cAAe,OACtCH,EAAUG,aAAa,gBAAiB,IAExCH,EAAUI,iBAAiB,SAAUC,UACnCL,EAAUM,WAAY,EACtB,MAAMC,YAAEA,SAAsBC,OAAO,kBAC9BC,EAAKC,SAAcH,EAAY,CAAEI,EAAGC,EAAEC,OAAOC,MAAOC,WAAYC,KAAKnB,UAAWoB,MAAO,KAC9FjB,EAAUM,WAAY,GACnBG,GAAQC,GACXV,EAAUkB,WAAWR,EAAKS,MAAMC,IAAIC,IAAK,CAAGC,MAAO,GAAGD,EAAEE,SAASF,EAAEG,SAAUV,MAAOO,EAAEI,SAGxFzB,EAAUI,iBAAiB,SAAUQ,IACnCb,EAAiBa,EAAEC,OAAOC,QAG5B,MAAMY,EAAQzB,SAASC,cAAc,OACrCwB,EAAMC,UAAY,IAClBD,EAAME,YAAY5B,GAElBN,OAAOmC,OAAOH,EAAO,CACnBI,MAAO,aACPC,YAAa,MACbC,cAAe3B,UACb,IAAIN,EAAgB,OACpB,MAAMkC,iBAAEA,SAA2BzB,OAAO,kBACnCC,SAAawB,EAAiBjB,KAAKnB,UAAWE,GAClDU,EAAMd,MAAMuC,MAAMzB,EAAI0B,KAAO,yBAChCxC,MAAMyC,QAAQ,gBACdpB,KAAKqB,cAAc,IAAIC,YAAY,cAAe,CAAEC,SAAS,EAAMC,UAAU,OAE/EC,WAAY,YAIhB,MAAAC,GACE,OAAOjD,IAAI;mEACoDuB,KAAKlB;;;KAItE,EAGF6C,eAAeC,OAAO,mBAAoBhD","ignoreList":[]}
@@ -3,4 +3,4 @@ import TableControl from"/kempo-ui/components/tableControls/TableControl.js";imp
3
3
  <k-icon name="lock_add"></k-icon>
4
4
  </button>
5
5
  `}}customElements.define("admin-add-permission",AddPermission);
6
- //# sourceMappingURL=AddPermission.js.map
6
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\admin\components\tableControls\AddPermission.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src/admin/components/tableControls/AddPermission.js","names":["TableControl","html","Dialog","Toast","AddPermission","groupName","addPermission","async","listPermissions","getGroupPermissions","addPermissionToGroup","import","allErr","allData","groupErr","groupPerms","Promise","all","limit","this","error","msg","assigned","Set","permissions","available","filter","p","has","name","selectedPermName","$combobox","document","createElement","setAttribute","setOptions","map","label","value","addEventListener","e","detail","$wrap","className","appendChild","create","title","confirmText","confirmAction","err","success","dispatchEvent","CustomEvent","bubbles","composed","cancelText","render","customElements","define"],"sources":["0"],"sourcesContent":["import TableControl from '/kempo-ui/components/tableControls/TableControl.js';\nimport { html } from '/kempo-ui/lit-all.min.js';\nimport Dialog from '/kempo-ui/components/Dialog.js';\nimport Toast from '/kempo-ui/components/Toast.js';\nimport '/kempo-ui/components/Icon.js';\nimport '/kempo-ui/components/Combobox.js';\n\nexport default class AddPermission extends TableControl {\n groupName = '';\n\n addPermission = async () => {\n const { listPermissions, getGroupPermissions, addPermissionToGroup } = await import('/kempo/sdk.js');\n\n const [[allErr, allData], [groupErr, groupPerms]] = await Promise.all([\n listPermissions({ limit: 1000 }),\n getGroupPermissions(this.groupName)\n ]);\n\n if(allErr){ Toast.error(allErr.msg || 'Failed to load permissions'); return; }\n if(groupErr){ Toast.error(groupErr.msg || 'Failed to load group permissions'); return; }\n\n const assigned = new Set(groupPerms.permissions);\n const available = allData.permissions.filter(p => !assigned.has(p.name));\n\n let selectedPermName = null;\n\n const $combobox = document.createElement('k-combobox');\n $combobox.setAttribute('placeholder', 'Search permissions...');\n $combobox.setAttribute('require-match', '');\n $combobox.setOptions(available.map(p => ({ label: p.name, value: p.name })));\n\n $combobox.addEventListener('select', e => {\n selectedPermName = e.detail.value;\n });\n\n const $wrap = document.createElement('div');\n $wrap.className = 'p';\n $wrap.appendChild($combobox);\n\n Dialog.create($wrap, {\n title: 'Add Permission',\n confirmText: 'Add',\n confirmAction: async () => {\n if(!selectedPermName) return;\n const [err] = await addPermissionToGroup(this.groupName, selectedPermName);\n if(err){ Toast.error(err.msg || 'Failed to add permission'); return; }\n Toast.success('Permission added');\n this.dispatchEvent(new CustomEvent('permissionAdded', { bubbles: true, composed: true }));\n },\n cancelText: 'Cancel'\n });\n };\n\n render(){\n return html`\n <button class=\"no-btn icon-btn\" title=\"Add Permission\" @click=\"${this.addPermission}\">\n <k-icon name=\"lock_add\"></k-icon>\n </button>\n `;\n }\n}\n\ncustomElements.define('admin-add-permission', AddPermission);\n"],"mappings":"OAAOA,iBAAkB,4DAChBC,SAAY,kCACdC,WAAY,wCACZC,UAAW,sCACX,qCACA,kDAEQ,MAAMC,sBAAsBJ,aACzCK,UAAY,GAEZC,cAAgBC,UACd,MAAMC,gBAAEA,EAAeC,oBAAEA,EAAmBC,qBAAEA,SAA+BC,OAAO,mBAE5EC,EAAQC,IAAWC,EAAUC,UAAqBC,QAAQC,IAAI,CACpET,EAAgB,CAAEU,MAAO,MACzBT,EAAoBU,KAAKd,aAG3B,GAAGO,EAAkE,YAAzDT,MAAMiB,MAAMR,EAAOS,KAAO,8BACtC,GAAGP,EAA4E,YAAjEX,MAAMiB,MAAMN,EAASO,KAAO,oCAE1C,MAAMC,EAAW,IAAIC,IAAIR,EAAWS,aAC9BC,EAAYZ,EAAQW,YAAYE,OAAOC,IAAML,EAASM,IAAID,EAAEE,OAElE,IAAIC,EAAmB,KAEvB,MAAMC,EAAYC,SAASC,cAAc,cACzCF,EAAUG,aAAa,cAAe,yBACtCH,EAAUG,aAAa,gBAAiB,IACxCH,EAAUI,WAAWV,EAAUW,IAAIT,IAAK,CAAGU,MAAOV,EAAEE,KAAMS,MAAOX,EAAEE,SAEnEE,EAAUQ,iBAAiB,SAAUC,IACnCV,EAAmBU,EAAEC,OAAOH,QAG9B,MAAMI,EAAQV,SAASC,cAAc,OACrCS,EAAMC,UAAY,IAClBD,EAAME,YAAYb,GAElB7B,OAAO2C,OAAOH,EAAO,CACnBI,MAAO,iBACPC,YAAa,MACbC,cAAezC,UACb,IAAIuB,EAAkB,OACtB,MAAOmB,SAAavC,EAAqBS,KAAKd,UAAWyB,GACtDmB,EAAM9C,MAAMiB,MAAM6B,EAAI5B,KAAO,6BAChClB,MAAM+C,QAAQ,oBACd/B,KAAKgC,cAAc,IAAIC,YAAY,kBAAmB,CAAEC,SAAS,EAAMC,UAAU,OAEnFC,WAAY,YAIhB,MAAAC,GACE,OAAOvD,IAAI;uEACwDkB,KAAKb;;;KAI1E,EAGFmD,eAAeC,OAAO,uBAAwBtD","ignoreList":[]}
1
+ {"version":3,"file":"src\\admin\\components\\tableControls\\AddPermission.js","names":["TableControl","html","Dialog","Toast","AddPermission","groupName","addPermission","async","listPermissions","getGroupPermissions","addPermissionToGroup","import","allErr","allData","groupErr","groupPerms","Promise","all","limit","this","error","msg","assigned","Set","permissions","available","filter","p","has","name","selectedPermName","$combobox","document","createElement","setAttribute","setOptions","map","label","value","addEventListener","e","detail","$wrap","className","appendChild","create","title","confirmText","confirmAction","err","success","dispatchEvent","CustomEvent","bubbles","composed","cancelText","render","customElements","define"],"sources":["0"],"sourcesContent":["import TableControl from '/kempo-ui/components/tableControls/TableControl.js';\r\nimport { html } from '/kempo-ui/lit-all.min.js';\r\nimport Dialog from '/kempo-ui/components/Dialog.js';\r\nimport Toast from '/kempo-ui/components/Toast.js';\r\nimport '/kempo-ui/components/Icon.js';\r\nimport '/kempo-ui/components/Combobox.js';\r\n\r\nexport default class AddPermission extends TableControl {\r\n groupName = '';\r\n\r\n addPermission = async () => {\r\n const { listPermissions, getGroupPermissions, addPermissionToGroup } = await import('/kempo/sdk.js');\r\n\r\n const [[allErr, allData], [groupErr, groupPerms]] = await Promise.all([\r\n listPermissions({ limit: 1000 }),\r\n getGroupPermissions(this.groupName)\r\n ]);\r\n\r\n if(allErr){ Toast.error(allErr.msg || 'Failed to load permissions'); return; }\r\n if(groupErr){ Toast.error(groupErr.msg || 'Failed to load group permissions'); return; }\r\n\r\n const assigned = new Set(groupPerms.permissions);\r\n const available = allData.permissions.filter(p => !assigned.has(p.name));\r\n\r\n let selectedPermName = null;\r\n\r\n const $combobox = document.createElement('k-combobox');\r\n $combobox.setAttribute('placeholder', 'Search permissions...');\r\n $combobox.setAttribute('require-match', '');\r\n $combobox.setOptions(available.map(p => ({ label: p.name, value: p.name })));\r\n\r\n $combobox.addEventListener('select', e => {\r\n selectedPermName = e.detail.value;\r\n });\r\n\r\n const $wrap = document.createElement('div');\r\n $wrap.className = 'p';\r\n $wrap.appendChild($combobox);\r\n\r\n Dialog.create($wrap, {\r\n title: 'Add Permission',\r\n confirmText: 'Add',\r\n confirmAction: async () => {\r\n if(!selectedPermName) return;\r\n const [err] = await addPermissionToGroup(this.groupName, selectedPermName);\r\n if(err){ Toast.error(err.msg || 'Failed to add permission'); return; }\r\n Toast.success('Permission added');\r\n this.dispatchEvent(new CustomEvent('permissionAdded', { bubbles: true, composed: true }));\r\n },\r\n cancelText: 'Cancel'\r\n });\r\n };\r\n\r\n render(){\r\n return html`\r\n <button class=\"no-btn icon-btn\" title=\"Add Permission\" @click=\"${this.addPermission}\">\r\n <k-icon name=\"lock_add\"></k-icon>\r\n </button>\r\n `;\r\n }\r\n}\r\n\r\ncustomElements.define('admin-add-permission', AddPermission);\r\n"],"mappings":"OAAOA,iBAAkB,4DAChBC,SAAY,kCACdC,WAAY,wCACZC,UAAW,sCACX,qCACA,kDAEQ,MAAMC,sBAAsBJ,aACzCK,UAAY,GAEZC,cAAgBC,UACd,MAAMC,gBAAEA,EAAeC,oBAAEA,EAAmBC,qBAAEA,SAA+BC,OAAO,mBAE5EC,EAAQC,IAAWC,EAAUC,UAAqBC,QAAQC,IAAI,CACpET,EAAgB,CAAEU,MAAO,MACzBT,EAAoBU,KAAKd,aAG3B,GAAGO,EAAkE,YAAzDT,MAAMiB,MAAMR,EAAOS,KAAO,8BACtC,GAAGP,EAA4E,YAAjEX,MAAMiB,MAAMN,EAASO,KAAO,oCAE1C,MAAMC,EAAW,IAAIC,IAAIR,EAAWS,aAC9BC,EAAYZ,EAAQW,YAAYE,OAAOC,IAAML,EAASM,IAAID,EAAEE,OAElE,IAAIC,EAAmB,KAEvB,MAAMC,EAAYC,SAASC,cAAc,cACzCF,EAAUG,aAAa,cAAe,yBACtCH,EAAUG,aAAa,gBAAiB,IACxCH,EAAUI,WAAWV,EAAUW,IAAIT,IAAK,CAAGU,MAAOV,EAAEE,KAAMS,MAAOX,EAAEE,SAEnEE,EAAUQ,iBAAiB,SAAUC,IACnCV,EAAmBU,EAAEC,OAAOH,QAG9B,MAAMI,EAAQV,SAASC,cAAc,OACrCS,EAAMC,UAAY,IAClBD,EAAME,YAAYb,GAElB7B,OAAO2C,OAAOH,EAAO,CACnBI,MAAO,iBACPC,YAAa,MACbC,cAAezC,UACb,IAAIuB,EAAkB,OACtB,MAAOmB,SAAavC,EAAqBS,KAAKd,UAAWyB,GACtDmB,EAAM9C,MAAMiB,MAAM6B,EAAI5B,KAAO,6BAChClB,MAAM+C,QAAQ,oBACd/B,KAAKgC,cAAc,IAAIC,YAAY,kBAAmB,CAAEC,SAAS,EAAMC,UAAU,OAEnFC,WAAY,YAIhB,MAAAC,GACE,OAAOvD,IAAI;uEACwDkB,KAAKb;;;KAI1E,EAGFmD,eAAeC,OAAO,uBAAwBtD","ignoreList":[]}
@@ -3,4 +3,4 @@ import TableControl from"/kempo-ui/components/tableControls/TableControl.js";imp
3
3
  <k-icon name="download"></k-icon>
4
4
  </button>
5
5
  `}}customElements.define("admin-install-extension",InstallExtension);
6
- //# sourceMappingURL=InstallExtension.js.map
6
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\admin\components\tableControls\InstallExtension.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src/admin/components/tableControls/InstallExtension.js","names":["TableControl","html","Dialog","Toast","InstallExtension","install","async","this","record","confirm","name","confirmed","installExtension","import","error","success","table","deleteRecord","render","customElements","define"],"sources":["0"],"sourcesContent":["import TableControl from '/kempo-ui/components/tableControls/TableControl.js';\nimport { html } from '/kempo-ui/lit-all.min.js';\nimport Dialog from '/kempo-ui/components/Dialog.js';\nimport Toast from '/kempo-ui/components/Toast.js';\nimport '/kempo-ui/components/Icon.js';\n\nexport default class InstallExtension extends TableControl {\n install = async () => {\n if(!this.record) return;\n\n Dialog.confirm(`Install \"${this.record.name}\"?`, async confirmed => {\n if(!confirmed) return;\n\n const { installExtension } = await import('../../kempo/sdk.js');\n const [error] = await installExtension(this.record.name);\n\n if(error){\n Toast.error(error.error || 'Failed to install extension');\n return;\n }\n\n Toast.success(`\"${this.record.name}\" installed successfully`);\n this.table.deleteRecord(this.record);\n });\n };\n\n render(){\n return html`\n <button class=\"no-btn icon-btn\" title=\"Install Extension\" @click=\"${this.install}\">\n <k-icon name=\"download\"></k-icon>\n </button>\n `;\n }\n}\n\ncustomElements.define('admin-install-extension', InstallExtension);\n"],"mappings":"OAAOA,iBAAkB,4DAChBC,SAAY,kCACdC,WAAY,wCACZC,UAAW,sCACX,8CAEQ,MAAMC,yBAAyBJ,aAC5CK,QAAUC,UACJC,KAAKC,QAETN,OAAOO,QAAQ,YAAYF,KAAKC,OAAOE,SAAUJ,UAC/C,IAAIK,EAAW,OAEf,MAAMC,iBAAEA,SAA2BC,OAAO,uBACnCC,SAAeF,EAAiBL,KAAKC,OAAOE,MAEhDI,EACDX,MAAMW,MAAMA,EAAMA,OAAS,gCAI7BX,MAAMY,QAAQ,IAAIR,KAAKC,OAAOE,gCAC9BH,KAAKS,MAAMC,aAAaV,KAAKC,YAIjC,MAAAU,GACE,OAAOjB,IAAI;0EAC2DM,KAAKF;;;KAI7E,EAGFc,eAAeC,OAAO,0BAA2BhB","ignoreList":[]}
1
+ {"version":3,"file":"src\\admin\\components\\tableControls\\InstallExtension.js","names":["TableControl","html","Dialog","Toast","InstallExtension","install","async","this","record","confirm","name","confirmed","installExtension","import","error","success","table","deleteRecord","render","customElements","define"],"sources":["0"],"sourcesContent":["import TableControl from '/kempo-ui/components/tableControls/TableControl.js';\r\nimport { html } from '/kempo-ui/lit-all.min.js';\r\nimport Dialog from '/kempo-ui/components/Dialog.js';\r\nimport Toast from '/kempo-ui/components/Toast.js';\r\nimport '/kempo-ui/components/Icon.js';\r\n\r\nexport default class InstallExtension extends TableControl {\r\n install = async () => {\r\n if(!this.record) return;\r\n\r\n Dialog.confirm(`Install \"${this.record.name}\"?`, async confirmed => {\r\n if(!confirmed) return;\r\n\r\n const { installExtension } = await import('../../kempo/sdk.js');\r\n const [error] = await installExtension(this.record.name);\r\n\r\n if(error){\r\n Toast.error(error.error || 'Failed to install extension');\r\n return;\r\n }\r\n\r\n Toast.success(`\"${this.record.name}\" installed successfully`);\r\n this.table.deleteRecord(this.record);\r\n });\r\n };\r\n\r\n render(){\r\n return html`\r\n <button class=\"no-btn icon-btn\" title=\"Install Extension\" @click=\"${this.install}\">\r\n <k-icon name=\"download\"></k-icon>\r\n </button>\r\n `;\r\n }\r\n}\r\n\r\ncustomElements.define('admin-install-extension', InstallExtension);\r\n"],"mappings":"OAAOA,iBAAkB,4DAChBC,SAAY,kCACdC,WAAY,wCACZC,UAAW,sCACX,8CAEQ,MAAMC,yBAAyBJ,aAC5CK,QAAUC,UACJC,KAAKC,QAETN,OAAOO,QAAQ,YAAYF,KAAKC,OAAOE,SAAUJ,UAC/C,IAAIK,EAAW,OAEf,MAAMC,iBAAEA,SAA2BC,OAAO,uBACnCC,SAAeF,EAAiBL,KAAKC,OAAOE,MAEhDI,EACDX,MAAMW,MAAMA,EAAMA,OAAS,gCAI7BX,MAAMY,QAAQ,IAAIR,KAAKC,OAAOE,gCAC9BH,KAAKS,MAAMC,aAAaV,KAAKC,YAIjC,MAAAU,GACE,OAAOjB,IAAI;0EAC2DM,KAAKF;;;KAI7E,EAGFc,eAAeC,OAAO,0BAA2BhB","ignoreList":[]}
@@ -3,4 +3,4 @@ import TableControl from"/kempo-ui/components/tableControls/TableControl.js";imp
3
3
  <k-icon name="delete"></k-icon>
4
4
  </button>
5
5
  `}}customElements.define("admin-uninstall-extension",UninstallExtension);
6
- //# sourceMappingURL=UninstallExtension.js.map
6
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\admin\components\tableControls\UninstallExtension.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src/admin/components/tableControls/UninstallExtension.js","names":["TableControl","html","Dialog","Toast","UninstallExtension","uninstall","async","this","record","confirm","name","confirmed","uninstallExtension","import","error","success","table","deleteRecord","render","customElements","define"],"sources":["0"],"sourcesContent":["import TableControl from '/kempo-ui/components/tableControls/TableControl.js';\nimport { html } from '/kempo-ui/lit-all.min.js';\nimport Dialog from '/kempo-ui/components/Dialog.js';\nimport Toast from '/kempo-ui/components/Toast.js';\nimport '/kempo-ui/components/Icon.js';\n\nexport default class UninstallExtension extends TableControl {\n uninstall = async () => {\n if(!this.record) return;\n\n Dialog.confirm(`Uninstall \"${this.record.name}\"? This may delete extension data.`, async confirmed => {\n if(!confirmed) return;\n\n const { uninstallExtension } = await import('../../kempo/sdk.js');\n const [error] = await uninstallExtension(this.record.name);\n\n if(error){\n Toast.error(error.error || 'Failed to uninstall extension');\n return;\n }\n\n Toast.success(`\"${this.record.name}\" uninstalled successfully`);\n this.table.deleteRecord(this.record);\n });\n };\n\n render(){\n return html`\n <button class=\"no-btn icon-btn\" title=\"Uninstall Extension\" @click=\"${this.uninstall}\">\n <k-icon name=\"delete\"></k-icon>\n </button>\n `;\n }\n}\n\ncustomElements.define('admin-uninstall-extension', UninstallExtension);\n"],"mappings":"OAAOA,iBAAkB,4DAChBC,SAAY,kCACdC,WAAY,wCACZC,UAAW,sCACX,8CAEQ,MAAMC,2BAA2BJ,aAC9CK,UAAYC,UACNC,KAAKC,QAETN,OAAOO,QAAQ,cAAcF,KAAKC,OAAOE,yCAA0CJ,UACjF,IAAIK,EAAW,OAEf,MAAMC,mBAAEA,SAA6BC,OAAO,uBACrCC,SAAeF,EAAmBL,KAAKC,OAAOE,MAElDI,EACDX,MAAMW,MAAMA,EAAMA,OAAS,kCAI7BX,MAAMY,QAAQ,IAAIR,KAAKC,OAAOE,kCAC9BH,KAAKS,MAAMC,aAAaV,KAAKC,YAIjC,MAAAU,GACE,OAAOjB,IAAI;4EAC6DM,KAAKF;;;KAI/E,EAGFc,eAAeC,OAAO,4BAA6BhB","ignoreList":[]}
1
+ {"version":3,"file":"src\\admin\\components\\tableControls\\UninstallExtension.js","names":["TableControl","html","Dialog","Toast","UninstallExtension","uninstall","async","this","record","confirm","name","confirmed","uninstallExtension","import","error","success","table","deleteRecord","render","customElements","define"],"sources":["0"],"sourcesContent":["import TableControl from '/kempo-ui/components/tableControls/TableControl.js';\r\nimport { html } from '/kempo-ui/lit-all.min.js';\r\nimport Dialog from '/kempo-ui/components/Dialog.js';\r\nimport Toast from '/kempo-ui/components/Toast.js';\r\nimport '/kempo-ui/components/Icon.js';\r\n\r\nexport default class UninstallExtension extends TableControl {\r\n uninstall = async () => {\r\n if(!this.record) return;\r\n\r\n Dialog.confirm(`Uninstall \"${this.record.name}\"? This may delete extension data.`, async confirmed => {\r\n if(!confirmed) return;\r\n\r\n const { uninstallExtension } = await import('../../kempo/sdk.js');\r\n const [error] = await uninstallExtension(this.record.name);\r\n\r\n if(error){\r\n Toast.error(error.error || 'Failed to uninstall extension');\r\n return;\r\n }\r\n\r\n Toast.success(`\"${this.record.name}\" uninstalled successfully`);\r\n this.table.deleteRecord(this.record);\r\n });\r\n };\r\n\r\n render(){\r\n return html`\r\n <button class=\"no-btn icon-btn\" title=\"Uninstall Extension\" @click=\"${this.uninstall}\">\r\n <k-icon name=\"delete\"></k-icon>\r\n </button>\r\n `;\r\n }\r\n}\r\n\r\ncustomElements.define('admin-uninstall-extension', UninstallExtension);\r\n"],"mappings":"OAAOA,iBAAkB,4DAChBC,SAAY,kCACdC,WAAY,wCACZC,UAAW,sCACX,8CAEQ,MAAMC,2BAA2BJ,aAC9CK,UAAYC,UACNC,KAAKC,QAETN,OAAOO,QAAQ,cAAcF,KAAKC,OAAOE,yCAA0CJ,UACjF,IAAIK,EAAW,OAEf,MAAMC,mBAAEA,SAA6BC,OAAO,uBACrCC,SAAeF,EAAmBL,KAAKC,OAAOE,MAElDI,EACDX,MAAMW,MAAMA,EAAMA,OAAS,kCAI7BX,MAAMY,QAAQ,IAAIR,KAAKC,OAAOE,kCAC9BH,KAAKS,MAAMC,aAAaV,KAAKC,YAIjC,MAAAU,GACE,OAAOjB,IAAI;4EAC6DM,KAAKF;;;KAI/E,EAGFc,eAAeC,OAAO,4BAA6BhB","ignoreList":[]}
@@ -1,2 +1,2 @@
1
1
  window.kempo={pathsToIcons:["/admin/icons","/kempo/icons","/kempo-ui/icons"],monacoUrl:"/monaco-editor"},window.litDisableBundleWarning=!0,import("/kempo-ui/components/Import.js"),import("/kempo-ui/components/Aside.js"),import("/kempo-ui/components/Main.js");
2
- //# sourceMappingURL=init.js.map
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\admin\init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src/admin/init.js","names":["window","kempo","pathsToIcons","monacoUrl","litDisableBundleWarning","import"],"sources":["0"],"sourcesContent":["window.kempo = { pathsToIcons: ['/admin/icons', '/kempo/icons', '/kempo-ui/icons'], monacoUrl: '/monaco-editor' };\nwindow.litDisableBundleWarning = true;\n\n/*\n Dynamic imports are required here becasue static imports are hoisted and resolved before any code runs,\n meaning window.kempo would not yet be set when these components initialize.\n Dynamic import() is called at runtime, after the synchronous assignments above,\n guaranteeing window.kempo.pathsToIcons is available when the components load.\n*/\nimport('/kempo-ui/components/Import.js');\nimport('/kempo-ui/components/Aside.js');\nimport('/kempo-ui/components/Main.js');\n"],"mappings":"AAAAA,OAAOC,MAAQ,CAAEC,aAAc,CAAC,eAAgB,eAAgB,mBAAoBC,UAAW,kBAC/FH,OAAOI,yBAA0B,EAQjCC,OAAO,kCACPA,OAAO,iCACPA,OAAO","ignoreList":[]}
1
+ {"version":3,"file":"src\\admin\\init.js","names":["window","kempo","pathsToIcons","monacoUrl","litDisableBundleWarning","import"],"sources":["0"],"sourcesContent":["window.kempo = { pathsToIcons: ['/admin/icons', '/kempo/icons', '/kempo-ui/icons'], monacoUrl: '/monaco-editor' };\r\nwindow.litDisableBundleWarning = true;\r\n\r\n/*\r\n Dynamic imports are required here becasue static imports are hoisted and resolved before any code runs,\r\n meaning window.kempo would not yet be set when these components initialize.\r\n Dynamic import() is called at runtime, after the synchronous assignments above,\r\n guaranteeing window.kempo.pathsToIcons is available when the components load.\r\n*/\r\nimport('/kempo-ui/components/Import.js');\r\nimport('/kempo-ui/components/Aside.js');\r\nimport('/kempo-ui/components/Main.js');\r\n"],"mappings":"AAAAA,OAAOC,MAAQ,CAAEC,aAAc,CAAC,eAAgB,eAAgB,mBAAoBC,UAAW,kBAC/FH,OAAOI,yBAA0B,EAQjCC,OAAO,kCACPA,OAAO,iCACPA,OAAO","ignoreList":[]}
@@ -1,2 +1,2 @@
1
1
  import{resolve}from"path";import currentUserHasPermission from"../../../../server/utils/permissions/currentUserHasPermission.js";import deleteAdminGlobalContent from"../../../../server/utils/admin-global-content/deleteAdminGlobalContent.js";const adminDir=resolve(import.meta.dirname,"../../../../dist/admin");export default async(s,e)=>{const r=s.cookies.session_token,[t,o]=await currentUserHasPermission(r,"system:globals:delete");if(t)return e.status(t.code).json({error:t.msg});if(!o)return e.status(403).json({error:"Insufficient permissions"});const{ids:i}=s.body,[n,a]=await deleteAdminGlobalContent({adminDir:adminDir,ids:i});if(n)return e.status(n.code).json({error:n.msg});e.json(a)};
2
- //# sourceMappingURL=DELETE.js.map
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\admin-globals\DELETE.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src/kempo/api/admin-globals/DELETE.js","names":["resolve","currentUserHasPermission","deleteAdminGlobalContent","adminDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","ids","body","data"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\nimport currentUserHasPermission from '../../../../server/utils/permissions/currentUserHasPermission.js';\nimport deleteAdminGlobalContent from '../../../../server/utils/admin-global-content/deleteAdminGlobalContent.js';\n\nconst adminDir = resolve(import.meta.dirname, '../../../../dist/admin');\n\nexport default async (request, response) => {\n const token = request.cookies.session_token;\n const [permError, hasPermission] = await currentUserHasPermission(token, 'system:globals:delete');\n\n if(permError){\n return response.status(permError.code).json({ error: permError.msg });\n }\n\n if(!hasPermission){\n return response.status(403).json({ error: 'Insufficient permissions' });\n }\n\n const { ids } = request.body;\n const [error, data] = await deleteAdminGlobalContent({ adminDir, ids });\n\n if(error){\n return response.status(error.code).json({ error: error.msg });\n }\n\n response.json(data);\n};\n"],"mappings":"OAASA,YAAe,cACjBC,6BAA8B,0EAC9BC,6BAA8B,4EAErC,MAAMC,SAAWH,oBAAoBI,QAAS,yCAE/BC,MAAOC,EAASC,KAC7B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBX,yBAAyBO,EAAO,yBAEzE,GAAGG,EACD,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGjE,IAAIL,EACF,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG5C,MAAME,IAAEA,GAAQZ,EAAQa,MACjBH,EAAOI,SAAclB,yBAAyB,CAAEC,kBAAUe,QAEjE,GAAGF,EACD,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGzDV,EAASQ,KAAKK","ignoreList":[]}
1
+ {"version":3,"file":"src\\kempo\\api\\admin-globals\\DELETE.js","names":["resolve","currentUserHasPermission","deleteAdminGlobalContent","adminDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","ids","body","data"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\r\nimport currentUserHasPermission from '../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport deleteAdminGlobalContent from '../../../../server/utils/admin-global-content/deleteAdminGlobalContent.js';\r\n\r\nconst adminDir = resolve(import.meta.dirname, '../../../../dist/admin');\r\n\r\nexport default async (request, response) => {\r\n const token = request.cookies.session_token;\r\n const [permError, hasPermission] = await currentUserHasPermission(token, 'system:globals:delete');\r\n\r\n if(permError){\r\n return response.status(permError.code).json({ error: permError.msg });\r\n }\r\n\r\n if(!hasPermission){\r\n return response.status(403).json({ error: 'Insufficient permissions' });\r\n }\r\n\r\n const { ids } = request.body;\r\n const [error, data] = await deleteAdminGlobalContent({ adminDir, ids });\r\n\r\n if(error){\r\n return response.status(error.code).json({ error: error.msg });\r\n }\r\n\r\n response.json(data);\r\n};\r\n"],"mappings":"OAASA,YAAe,cACjBC,6BAA8B,0EAC9BC,6BAA8B,4EAErC,MAAMC,SAAWH,oBAAoBI,QAAS,yCAE/BC,MAAOC,EAASC,KAC7B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBX,yBAAyBO,EAAO,yBAEzE,GAAGG,EACD,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGjE,IAAIL,EACF,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG5C,MAAME,IAAEA,GAAQZ,EAAQa,MACjBH,EAAOI,SAAclB,yBAAyB,CAAEC,kBAAUe,QAEjE,GAAGF,EACD,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGzDV,EAASQ,KAAKK","ignoreList":[]}
@@ -1,2 +1,2 @@
1
1
  import{resolve}from"path";import currentUserHasPermission from"../../../../server/utils/permissions/currentUserHasPermission.js";import listAdminGlobalContent from"../../../../server/utils/admin-global-content/listAdminGlobalContent.js";const adminDir=resolve(import.meta.dirname,"../../../../dist/admin");export default async(s,r)=>{const t=s.cookies.session_token,[e,i]=await currentUserHasPermission(t,"system:globals:read");if(e)return r.status(e.code).json({error:e.msg});if(!i)return r.status(403).json({error:"Insufficient permissions"});const[n,o]=await listAdminGlobalContent({adminDir:adminDir});if(n)return r.status(n.code).json({error:n.msg});r.json(o)};
2
- //# sourceMappingURL=GET.js.map
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\admin-globals\GET.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src/kempo/api/admin-globals/GET.js","names":["resolve","currentUserHasPermission","listAdminGlobalContent","adminDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","data"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\nimport currentUserHasPermission from '../../../../server/utils/permissions/currentUserHasPermission.js';\nimport listAdminGlobalContent from '../../../../server/utils/admin-global-content/listAdminGlobalContent.js';\n\nconst adminDir = resolve(import.meta.dirname, '../../../../dist/admin');\n\nexport default async (request, response) => {\n const token = request.cookies.session_token;\n const [permError, hasPermission] = await currentUserHasPermission(token, 'system:globals:read');\n\n if(permError){\n return response.status(permError.code).json({ error: permError.msg });\n }\n\n if(!hasPermission){\n return response.status(403).json({ error: 'Insufficient permissions' });\n }\n\n const [error, data] = await listAdminGlobalContent({ adminDir });\n\n if(error){\n return response.status(error.code).json({ error: error.msg });\n }\n\n response.json(data);\n};\n"],"mappings":"OAASA,YAAe,cACjBC,6BAA8B,0EAC9BC,2BAA4B,0EAEnC,MAAMC,SAAWH,oBAAoBI,QAAS,yCAE/BC,MAAOC,EAASC,KAC7B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBX,yBAAyBO,EAAO,uBAEzE,GAAGG,EACD,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGjE,IAAIL,EACF,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG5C,MAAOA,EAAOE,SAAchB,uBAAuB,CAAEC,oBAErD,GAAGa,EACD,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGzDV,EAASQ,KAAKG","ignoreList":[]}
1
+ {"version":3,"file":"src\\kempo\\api\\admin-globals\\GET.js","names":["resolve","currentUserHasPermission","listAdminGlobalContent","adminDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","data"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\r\nimport currentUserHasPermission from '../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport listAdminGlobalContent from '../../../../server/utils/admin-global-content/listAdminGlobalContent.js';\r\n\r\nconst adminDir = resolve(import.meta.dirname, '../../../../dist/admin');\r\n\r\nexport default async (request, response) => {\r\n const token = request.cookies.session_token;\r\n const [permError, hasPermission] = await currentUserHasPermission(token, 'system:globals:read');\r\n\r\n if(permError){\r\n return response.status(permError.code).json({ error: permError.msg });\r\n }\r\n\r\n if(!hasPermission){\r\n return response.status(403).json({ error: 'Insufficient permissions' });\r\n }\r\n\r\n const [error, data] = await listAdminGlobalContent({ adminDir });\r\n\r\n if(error){\r\n return response.status(error.code).json({ error: error.msg });\r\n }\r\n\r\n response.json(data);\r\n};\r\n"],"mappings":"OAASA,YAAe,cACjBC,6BAA8B,0EAC9BC,2BAA4B,0EAEnC,MAAMC,SAAWH,oBAAoBI,QAAS,yCAE/BC,MAAOC,EAASC,KAC7B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBX,yBAAyBO,EAAO,uBAEzE,GAAGG,EACD,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGjE,IAAIL,EACF,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG5C,MAAOA,EAAOE,SAAchB,uBAAuB,CAAEC,oBAErD,GAAGa,EACD,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGzDV,EAASQ,KAAKG","ignoreList":[]}
@@ -1,2 +1,2 @@
1
1
  import{resolve}from"path";import currentUserHasPermission from"../../../../server/utils/permissions/currentUserHasPermission.js";import createAdminGlobalContent from"../../../../server/utils/admin-global-content/createAdminGlobalContent.js";const adminDir=resolve(import.meta.dirname,"../../../../dist/admin");export default async(r,e)=>{const s=r.cookies.session_token,[o,t]=await currentUserHasPermission(s,"system:globals:create");if(o)return e.status(o.code).json({error:o.msg});if(!t)return e.status(403).json({error:"Insufficient permissions"});const{name:n,location:i,priority:a,owner:m,markup:c}=r.body,[l,u]=await createAdminGlobalContent({adminDir:adminDir,name:n,location:i,priority:a,owner:m,markup:c});if(l)return e.status(l.code).json({error:l.msg});e.json(u)};
2
- //# sourceMappingURL=POST.js.map
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\admin-globals\POST.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src/kempo/api/admin-globals/POST.js","names":["resolve","currentUserHasPermission","createAdminGlobalContent","adminDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","name","location","priority","owner","markup","body","data"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\nimport currentUserHasPermission from '../../../../server/utils/permissions/currentUserHasPermission.js';\nimport createAdminGlobalContent from '../../../../server/utils/admin-global-content/createAdminGlobalContent.js';\n\nconst adminDir = resolve(import.meta.dirname, '../../../../dist/admin');\n\nexport default async (request, response) => {\n const token = request.cookies.session_token;\n const [permError, hasPermission] = await currentUserHasPermission(token, 'system:globals:create');\n\n if(permError){\n return response.status(permError.code).json({ error: permError.msg });\n }\n\n if(!hasPermission){\n return response.status(403).json({ error: 'Insufficient permissions' });\n }\n\n const { name, location, priority, owner, markup } = request.body;\n const [error, data] = await createAdminGlobalContent({ adminDir, name, location, priority, owner, markup });\n\n if(error){\n return response.status(error.code).json({ error: error.msg });\n }\n\n response.json(data);\n};\n"],"mappings":"OAASA,YAAe,cACjBC,6BAA8B,0EAC9BC,6BAA8B,4EAErC,MAAMC,SAAWH,oBAAoBI,QAAS,yCAE/BC,MAAOC,EAASC,KAC7B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBX,yBAAyBO,EAAO,yBAEzE,GAAGG,EACD,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGjE,IAAIL,EACF,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG5C,MAAME,KAAEA,EAAIC,SAAEA,EAAQC,SAAEA,EAAQC,MAAEA,EAAKC,OAAEA,GAAWhB,EAAQiB,MACrDP,EAAOQ,SAActB,yBAAyB,CAAEC,kBAAUe,OAAMC,WAAUC,WAAUC,QAAOC,WAElG,GAAGN,EACD,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGzDV,EAASQ,KAAKS","ignoreList":[]}
1
+ {"version":3,"file":"src\\kempo\\api\\admin-globals\\POST.js","names":["resolve","currentUserHasPermission","createAdminGlobalContent","adminDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","name","location","priority","owner","markup","body","data"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\r\nimport currentUserHasPermission from '../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport createAdminGlobalContent from '../../../../server/utils/admin-global-content/createAdminGlobalContent.js';\r\n\r\nconst adminDir = resolve(import.meta.dirname, '../../../../dist/admin');\r\n\r\nexport default async (request, response) => {\r\n const token = request.cookies.session_token;\r\n const [permError, hasPermission] = await currentUserHasPermission(token, 'system:globals:create');\r\n\r\n if(permError){\r\n return response.status(permError.code).json({ error: permError.msg });\r\n }\r\n\r\n if(!hasPermission){\r\n return response.status(403).json({ error: 'Insufficient permissions' });\r\n }\r\n\r\n const { name, location, priority, owner, markup } = request.body;\r\n const [error, data] = await createAdminGlobalContent({ adminDir, name, location, priority, owner, markup });\r\n\r\n if(error){\r\n return response.status(error.code).json({ error: error.msg });\r\n }\r\n\r\n response.json(data);\r\n};\r\n"],"mappings":"OAASA,YAAe,cACjBC,6BAA8B,0EAC9BC,6BAA8B,4EAErC,MAAMC,SAAWH,oBAAoBI,QAAS,yCAE/BC,MAAOC,EAASC,KAC7B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBX,yBAAyBO,EAAO,yBAEzE,GAAGG,EACD,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGjE,IAAIL,EACF,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG5C,MAAME,KAAEA,EAAIC,SAAEA,EAAQC,SAAEA,EAAQC,MAAEA,EAAKC,OAAEA,GAAWhB,EAAQiB,MACrDP,EAAOQ,SAActB,yBAAyB,CAAEC,kBAAUe,OAAMC,WAAUC,WAAUC,QAAOC,WAElG,GAAGN,EACD,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGzDV,EAASQ,KAAKS","ignoreList":[]}
@@ -1,2 +1,2 @@
1
1
  import{resolve}from"path";import currentUserHasPermission from"../../../../../server/utils/permissions/currentUserHasPermission.js";import getAdminGlobalContent from"../../../../../server/utils/admin-global-content/getAdminGlobalContent.js";const adminDir=resolve(import.meta.dirname,"../../../../../dist/admin");export default async(s,r)=>{const e=s.cookies.session_token,[t,i]=await currentUserHasPermission(e,"system:globals:read");if(t)return r.status(t.code).json({error:t.msg});if(!i)return r.status(403).json({error:"Insufficient permissions"});const n=s.params.id,[o,a]=await getAdminGlobalContent({adminDir:adminDir,id:n});if(o)return r.status(o.code).json({error:o.msg});r.json(a)};
2
- //# sourceMappingURL=GET.js.map
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\admin-globals\[id]\GET.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src/kempo/api/admin-globals/[id]/GET.js","names":["resolve","currentUserHasPermission","getAdminGlobalContent","adminDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","id","params","data"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\nimport currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\nimport getAdminGlobalContent from '../../../../../server/utils/admin-global-content/getAdminGlobalContent.js';\n\nconst adminDir = resolve(import.meta.dirname, '../../../../../dist/admin');\n\nexport default async (request, response) => {\n const token = request.cookies.session_token;\n const [permError, hasPermission] = await currentUserHasPermission(token, 'system:globals:read');\n\n if(permError){\n return response.status(permError.code).json({ error: permError.msg });\n }\n\n if(!hasPermission){\n return response.status(403).json({ error: 'Insufficient permissions' });\n }\n\n const id = request.params.id;\n const [error, data] = await getAdminGlobalContent({ adminDir, id });\n\n if(error){\n return response.status(error.code).json({ error: error.msg });\n }\n\n response.json(data);\n};\n"],"mappings":"OAASA,YAAe,cACjBC,6BAA8B,6EAC9BC,0BAA2B,4EAElC,MAAMC,SAAWH,oBAAoBI,QAAS,4CAE/BC,MAAOC,EAASC,KAC7B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBX,yBAAyBO,EAAO,uBAEzE,GAAGG,EACD,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGjE,IAAIL,EACF,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG5C,MAAME,EAAKZ,EAAQa,OAAOD,IACnBF,EAAOI,SAAclB,sBAAsB,CAAEC,kBAAUe,OAE9D,GAAGF,EACD,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGzDV,EAASQ,KAAKK","ignoreList":[]}
1
+ {"version":3,"file":"src\\kempo\\api\\admin-globals\\[id]\\GET.js","names":["resolve","currentUserHasPermission","getAdminGlobalContent","adminDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","id","params","data"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\r\nimport currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport getAdminGlobalContent from '../../../../../server/utils/admin-global-content/getAdminGlobalContent.js';\r\n\r\nconst adminDir = resolve(import.meta.dirname, '../../../../../dist/admin');\r\n\r\nexport default async (request, response) => {\r\n const token = request.cookies.session_token;\r\n const [permError, hasPermission] = await currentUserHasPermission(token, 'system:globals:read');\r\n\r\n if(permError){\r\n return response.status(permError.code).json({ error: permError.msg });\r\n }\r\n\r\n if(!hasPermission){\r\n return response.status(403).json({ error: 'Insufficient permissions' });\r\n }\r\n\r\n const id = request.params.id;\r\n const [error, data] = await getAdminGlobalContent({ adminDir, id });\r\n\r\n if(error){\r\n return response.status(error.code).json({ error: error.msg });\r\n }\r\n\r\n response.json(data);\r\n};\r\n"],"mappings":"OAASA,YAAe,cACjBC,6BAA8B,6EAC9BC,0BAA2B,4EAElC,MAAMC,SAAWH,oBAAoBI,QAAS,4CAE/BC,MAAOC,EAASC,KAC7B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBX,yBAAyBO,EAAO,uBAEzE,GAAGG,EACD,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGjE,IAAIL,EACF,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG5C,MAAME,EAAKZ,EAAQa,OAAOD,IACnBF,EAAOI,SAAclB,sBAAsB,CAAEC,kBAAUe,OAE9D,GAAGF,EACD,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGzDV,EAASQ,KAAKK","ignoreList":[]}
@@ -1,2 +1,2 @@
1
1
  import{resolve}from"path";import currentUserHasPermission from"../../../../../server/utils/permissions/currentUserHasPermission.js";import updateAdminGlobalContent from"../../../../../server/utils/admin-global-content/updateAdminGlobalContent.js";const adminDir=resolve(import.meta.dirname,"../../../../../dist/admin");export default async(r,s)=>{const o=r.cookies.session_token,[t,e]=await currentUserHasPermission(o,"system:globals:update");if(t)return s.status(t.code).json({error:t.msg});if(!e)return s.status(403).json({error:"Insufficient permissions"});const i=r.params.id,{name:n,location:a,priority:m,markup:d}=r.body,[u,l]=await updateAdminGlobalContent({adminDir:adminDir,id:i,name:n,location:a,priority:m,markup:d});if(u)return s.status(u.code).json({error:u.msg});s.json(l)};
2
- //# sourceMappingURL=PUT.js.map
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\admin-globals\[id]\PUT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src/kempo/api/admin-globals/[id]/PUT.js","names":["resolve","currentUserHasPermission","updateAdminGlobalContent","adminDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","id","params","name","location","priority","markup","body","data"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\nimport currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\nimport updateAdminGlobalContent from '../../../../../server/utils/admin-global-content/updateAdminGlobalContent.js';\n\nconst adminDir = resolve(import.meta.dirname, '../../../../../dist/admin');\n\nexport default async (request, response) => {\n const token = request.cookies.session_token;\n const [permError, hasPermission] = await currentUserHasPermission(token, 'system:globals:update');\n\n if(permError){\n return response.status(permError.code).json({ error: permError.msg });\n }\n\n if(!hasPermission){\n return response.status(403).json({ error: 'Insufficient permissions' });\n }\n\n const id = request.params.id;\n const { name, location, priority, markup } = request.body;\n const [error, data] = await updateAdminGlobalContent({ adminDir, id, name, location, priority, markup });\n\n if(error){\n return response.status(error.code).json({ error: error.msg });\n }\n\n response.json(data);\n};\n"],"mappings":"OAASA,YAAe,cACjBC,6BAA8B,6EAC9BC,6BAA8B,+EAErC,MAAMC,SAAWH,oBAAoBI,QAAS,4CAE/BC,MAAOC,EAASC,KAC7B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBX,yBAAyBO,EAAO,yBAEzE,GAAGG,EACD,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGjE,IAAIL,EACF,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG5C,MAAME,EAAKZ,EAAQa,OAAOD,IACpBE,KAAEA,EAAIC,SAAEA,EAAQC,SAAEA,EAAQC,OAAEA,GAAWjB,EAAQkB,MAC9CR,EAAOS,SAAcvB,yBAAyB,CAAEC,kBAAUe,KAAIE,OAAMC,WAAUC,WAAUC,WAE/F,GAAGP,EACD,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGzDV,EAASQ,KAAKU","ignoreList":[]}
1
+ {"version":3,"file":"src\\kempo\\api\\admin-globals\\[id]\\PUT.js","names":["resolve","currentUserHasPermission","updateAdminGlobalContent","adminDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","id","params","name","location","priority","markup","body","data"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\r\nimport currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport updateAdminGlobalContent from '../../../../../server/utils/admin-global-content/updateAdminGlobalContent.js';\r\n\r\nconst adminDir = resolve(import.meta.dirname, '../../../../../dist/admin');\r\n\r\nexport default async (request, response) => {\r\n const token = request.cookies.session_token;\r\n const [permError, hasPermission] = await currentUserHasPermission(token, 'system:globals:update');\r\n\r\n if(permError){\r\n return response.status(permError.code).json({ error: permError.msg });\r\n }\r\n\r\n if(!hasPermission){\r\n return response.status(403).json({ error: 'Insufficient permissions' });\r\n }\r\n\r\n const id = request.params.id;\r\n const { name, location, priority, markup } = request.body;\r\n const [error, data] = await updateAdminGlobalContent({ adminDir, id, name, location, priority, markup });\r\n\r\n if(error){\r\n return response.status(error.code).json({ error: error.msg });\r\n }\r\n\r\n response.json(data);\r\n};\r\n"],"mappings":"OAASA,YAAe,cACjBC,6BAA8B,6EAC9BC,6BAA8B,+EAErC,MAAMC,SAAWH,oBAAoBI,QAAS,4CAE/BC,MAAOC,EAASC,KAC7B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBX,yBAAyBO,EAAO,yBAEzE,GAAGG,EACD,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGjE,IAAIL,EACF,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG5C,MAAME,EAAKZ,EAAQa,OAAOD,IACpBE,KAAEA,EAAIC,SAAEA,EAAQC,SAAEA,EAAQC,OAAEA,GAAWjB,EAAQkB,MAC9CR,EAAOS,SAAcvB,yBAAyB,CAAEC,kBAAUe,KAAIE,OAAMC,WAAUC,WAAUC,WAE/F,GAAGP,EACD,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGzDV,EAASQ,KAAKU","ignoreList":[]}
@@ -1,2 +1,2 @@
1
1
  import{resolve}from"path";import currentUserHasPermission from"../../../../../../server/utils/permissions/currentUserHasPermission.js";import disableAdminGlobalContent from"../../../../../../server/utils/admin-global-content/disableAdminGlobalContent.js";const adminDir=resolve(import.meta.dirname,"../../../../../../dist/admin");export default async(s,r)=>{const e=s.cookies.session_token,[i,n]=await currentUserHasPermission(e,"system:globals:update");if(i)return r.status(i.code).json({error:i.msg});if(!n)return r.status(403).json({error:"Insufficient permissions"});const o=s.params.id,[t,a]=await disableAdminGlobalContent({adminDir:adminDir,id:o});if(t)return r.status(t.code).json({error:t.msg});r.json(a)};
2
- //# sourceMappingURL=PUT.js.map
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\admin-globals\[id]\disable\PUT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src/kempo/api/admin-globals/[id]/disable/PUT.js","names":["resolve","currentUserHasPermission","disableAdminGlobalContent","adminDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","id","params","data"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\nimport currentUserHasPermission from '../../../../../../server/utils/permissions/currentUserHasPermission.js';\nimport disableAdminGlobalContent from '../../../../../../server/utils/admin-global-content/disableAdminGlobalContent.js';\n\nconst adminDir = resolve(import.meta.dirname, '../../../../../../dist/admin');\n\nexport default async (request, response) => {\n const token = request.cookies.session_token;\n const [permError, hasPermission] = await currentUserHasPermission(token, 'system:globals:update');\n\n if(permError){\n return response.status(permError.code).json({ error: permError.msg });\n }\n\n if(!hasPermission){\n return response.status(403).json({ error: 'Insufficient permissions' });\n }\n\n const id = request.params.id;\n const [error, data] = await disableAdminGlobalContent({ adminDir, id });\n\n if(error){\n return response.status(error.code).json({ error: error.msg });\n }\n\n response.json(data);\n};\n"],"mappings":"OAASA,YAAe,cACjBC,6BAA8B,gFAC9BC,8BAA+B,mFAEtC,MAAMC,SAAWH,oBAAoBI,QAAS,+CAE/BC,MAAOC,EAASC,KAC7B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBX,yBAAyBO,EAAO,yBAEzE,GAAGG,EACD,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGjE,IAAIL,EACF,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG5C,MAAME,EAAKZ,EAAQa,OAAOD,IACnBF,EAAOI,SAAclB,0BAA0B,CAAEC,kBAAUe,OAElE,GAAGF,EACD,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGzDV,EAASQ,KAAKK","ignoreList":[]}
1
+ {"version":3,"file":"src\\kempo\\api\\admin-globals\\[id]\\disable\\PUT.js","names":["resolve","currentUserHasPermission","disableAdminGlobalContent","adminDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","id","params","data"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\r\nimport currentUserHasPermission from '../../../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport disableAdminGlobalContent from '../../../../../../server/utils/admin-global-content/disableAdminGlobalContent.js';\r\n\r\nconst adminDir = resolve(import.meta.dirname, '../../../../../../dist/admin');\r\n\r\nexport default async (request, response) => {\r\n const token = request.cookies.session_token;\r\n const [permError, hasPermission] = await currentUserHasPermission(token, 'system:globals:update');\r\n\r\n if(permError){\r\n return response.status(permError.code).json({ error: permError.msg });\r\n }\r\n\r\n if(!hasPermission){\r\n return response.status(403).json({ error: 'Insufficient permissions' });\r\n }\r\n\r\n const id = request.params.id;\r\n const [error, data] = await disableAdminGlobalContent({ adminDir, id });\r\n\r\n if(error){\r\n return response.status(error.code).json({ error: error.msg });\r\n }\r\n\r\n response.json(data);\r\n};\r\n"],"mappings":"OAASA,YAAe,cACjBC,6BAA8B,gFAC9BC,8BAA+B,mFAEtC,MAAMC,SAAWH,oBAAoBI,QAAS,+CAE/BC,MAAOC,EAASC,KAC7B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBX,yBAAyBO,EAAO,yBAEzE,GAAGG,EACD,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGjE,IAAIL,EACF,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG5C,MAAME,EAAKZ,EAAQa,OAAOD,IACnBF,EAAOI,SAAclB,0BAA0B,CAAEC,kBAAUe,OAElE,GAAGF,EACD,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGzDV,EAASQ,KAAKK","ignoreList":[]}
@@ -1,2 +1,2 @@
1
1
  import{resolve}from"path";import currentUserHasPermission from"../../../../../../server/utils/permissions/currentUserHasPermission.js";import enableAdminGlobalContent from"../../../../../../server/utils/admin-global-content/enableAdminGlobalContent.js";const adminDir=resolve(import.meta.dirname,"../../../../../../dist/admin");export default async(s,r)=>{const e=s.cookies.session_token,[n,i]=await currentUserHasPermission(e,"system:globals:update");if(n)return r.status(n.code).json({error:n.msg});if(!i)return r.status(403).json({error:"Insufficient permissions"});const o=s.params.id,[t,a]=await enableAdminGlobalContent({adminDir:adminDir,id:o});if(t)return r.status(t.code).json({error:t.msg});r.json(a)};
2
- //# sourceMappingURL=PUT.js.map
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\admin-globals\[id]\enable\PUT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src/kempo/api/admin-globals/[id]/enable/PUT.js","names":["resolve","currentUserHasPermission","enableAdminGlobalContent","adminDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","id","params","data"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\nimport currentUserHasPermission from '../../../../../../server/utils/permissions/currentUserHasPermission.js';\nimport enableAdminGlobalContent from '../../../../../../server/utils/admin-global-content/enableAdminGlobalContent.js';\n\nconst adminDir = resolve(import.meta.dirname, '../../../../../../dist/admin');\n\nexport default async (request, response) => {\n const token = request.cookies.session_token;\n const [permError, hasPermission] = await currentUserHasPermission(token, 'system:globals:update');\n\n if(permError){\n return response.status(permError.code).json({ error: permError.msg });\n }\n\n if(!hasPermission){\n return response.status(403).json({ error: 'Insufficient permissions' });\n }\n\n const id = request.params.id;\n const [error, data] = await enableAdminGlobalContent({ adminDir, id });\n\n if(error){\n return response.status(error.code).json({ error: error.msg });\n }\n\n response.json(data);\n};\n"],"mappings":"OAASA,YAAe,cACjBC,6BAA8B,gFAC9BC,6BAA8B,kFAErC,MAAMC,SAAWH,oBAAoBI,QAAS,+CAE/BC,MAAOC,EAASC,KAC7B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBX,yBAAyBO,EAAO,yBAEzE,GAAGG,EACD,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGjE,IAAIL,EACF,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG5C,MAAME,EAAKZ,EAAQa,OAAOD,IACnBF,EAAOI,SAAclB,yBAAyB,CAAEC,kBAAUe,OAEjE,GAAGF,EACD,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGzDV,EAASQ,KAAKK","ignoreList":[]}
1
+ {"version":3,"file":"src\\kempo\\api\\admin-globals\\[id]\\enable\\PUT.js","names":["resolve","currentUserHasPermission","enableAdminGlobalContent","adminDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","id","params","data"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\r\nimport currentUserHasPermission from '../../../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport enableAdminGlobalContent from '../../../../../../server/utils/admin-global-content/enableAdminGlobalContent.js';\r\n\r\nconst adminDir = resolve(import.meta.dirname, '../../../../../../dist/admin');\r\n\r\nexport default async (request, response) => {\r\n const token = request.cookies.session_token;\r\n const [permError, hasPermission] = await currentUserHasPermission(token, 'system:globals:update');\r\n\r\n if(permError){\r\n return response.status(permError.code).json({ error: permError.msg });\r\n }\r\n\r\n if(!hasPermission){\r\n return response.status(403).json({ error: 'Insufficient permissions' });\r\n }\r\n\r\n const id = request.params.id;\r\n const [error, data] = await enableAdminGlobalContent({ adminDir, id });\r\n\r\n if(error){\r\n return response.status(error.code).json({ error: error.msg });\r\n }\r\n\r\n response.json(data);\r\n};\r\n"],"mappings":"OAASA,YAAe,cACjBC,6BAA8B,gFAC9BC,6BAA8B,kFAErC,MAAMC,SAAWH,oBAAoBI,QAAS,+CAE/BC,MAAOC,EAASC,KAC7B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBX,yBAAyBO,EAAO,yBAEzE,GAAGG,EACD,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGjE,IAAIL,EACF,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG5C,MAAME,EAAKZ,EAAQa,OAAOD,IACnBF,EAAOI,SAAclB,yBAAyB,CAAEC,kBAAUe,OAEjE,GAAGF,EACD,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGzDV,EAASQ,KAAKK","ignoreList":[]}
@@ -1,2 +1,2 @@
1
1
  import changePassword from"../../../../../server/utils/auth/changePassword.js";import getSession from"../../../../../server/utils/auth/getSession.js";import bcrypt from"bcrypt";export default async(s,r)=>{try{const e=s.cookies.session_token,[t,o]=await getSession({token:e});if(t||!o||!o.user)return r.status(401).json({error:"Not authenticated"});const{currentPassword:a,newPassword:n}=s.body;if(!a||!n)return r.status(400).json({error:"Current password and new password are required"});if(n.length<8)return r.status(400).json({error:"New password must be at least 8 characters"});if(!await bcrypt.compare(a,o.user.passwordHash))return r.status(400).json({error:"Current password is incorrect"});const[c,u]=await changePassword(o.user.id,n);if(c)return r.status(c.code).json({error:c.msg});r.json({success:!0,message:"Password changed successfully"})}catch(s){console.error("Change password error:",s),r.status(500).json({error:s.message||"Failed to change password"})}};
2
- //# sourceMappingURL=POST.js.map
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\auth\change-password\POST.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src/kempo/api/auth/change-password/POST.js","names":["changePassword","getSession","bcrypt","async","request","response","sessionToken","cookies","session_token","sessionError","session","token","user","status","json","error","currentPassword","newPassword","body","length","compare","passwordHash","changeError","result","id","code","msg","success","message","console"],"sources":["0"],"sourcesContent":["import changePassword from '../../../../../server/utils/auth/changePassword.js';\nimport getSession from '../../../../../server/utils/auth/getSession.js';\nimport bcrypt from 'bcrypt';\n\nexport default async (request, response) => {\n try {\n const sessionToken = request.cookies.session_token;\n const [sessionError, session] = await getSession({ token: sessionToken });\n \n if(sessionError || !session || !session.user){\n return response.status(401).json({ error: 'Not authenticated' });\n }\n \n const { currentPassword, newPassword } = request.body;\n\n if(!currentPassword || !newPassword){\n return response.status(400).json({ error: 'Current password and new password are required' });\n }\n\n if(newPassword.length < 8){\n return response.status(400).json({ error: 'New password must be at least 8 characters' });\n }\n\n const isValid = await bcrypt.compare(currentPassword, session.user.passwordHash);\n \n if(!isValid){\n return response.status(400).json({ error: 'Current password is incorrect' });\n }\n\n const [changeError, result] = await changePassword(session.user.id, newPassword);\n\n if(changeError){\n return response.status(changeError.code).json({ error: changeError.msg });\n }\n\n response.json({ success: true, message: 'Password changed successfully' });\n } catch(error){\n console.error('Change password error:', error);\n response.status(500).json({ \n error: error.message || 'Failed to change password'\n });\n }\n};\n"],"mappings":"OAAOA,mBAAoB,4DACpBC,eAAgB,wDAChBC,WAAY,wBAEJC,MAAOC,EAASC,KAC7B,IACE,MAAMC,EAAeF,EAAQG,QAAQC,eAC9BC,EAAcC,SAAiBT,WAAW,CAAEU,MAAOL,IAE1D,GAAGG,IAAiBC,IAAYA,EAAQE,KACtC,OAAOP,EAASQ,OAAO,KAAKC,KAAK,CAAEC,MAAO,sBAG5C,MAAMC,gBAAEA,EAAeC,YAAEA,GAAgBb,EAAQc,KAEjD,IAAIF,IAAoBC,EACtB,OAAOZ,EAASQ,OAAO,KAAKC,KAAK,CAAEC,MAAO,mDAG5C,GAAGE,EAAYE,OAAS,EACtB,OAAOd,EAASQ,OAAO,KAAKC,KAAK,CAAEC,MAAO,+CAK5C,UAFsBb,OAAOkB,QAAQJ,EAAiBN,EAAQE,KAAKS,cAGjE,OAAOhB,EAASQ,OAAO,KAAKC,KAAK,CAAEC,MAAO,kCAG5C,MAAOO,EAAaC,SAAgBvB,eAAeU,EAAQE,KAAKY,GAAIP,GAEpE,GAAGK,EACD,OAAOjB,EAASQ,OAAOS,EAAYG,MAAMX,KAAK,CAAEC,MAAOO,EAAYI,MAGrErB,EAASS,KAAK,CAAEa,SAAS,EAAMC,QAAS,iCAC1C,CAAE,MAAMb,GACNc,QAAQd,MAAM,yBAA0BA,GACxCV,EAASQ,OAAO,KAAKC,KAAK,CACxBC,MAAOA,EAAMa,SAAW,6BAE5B","ignoreList":[]}
1
+ {"version":3,"file":"src\\kempo\\api\\auth\\change-password\\POST.js","names":["changePassword","getSession","bcrypt","async","request","response","sessionToken","cookies","session_token","sessionError","session","token","user","status","json","error","currentPassword","newPassword","body","length","compare","passwordHash","changeError","result","id","code","msg","success","message","console"],"sources":["0"],"sourcesContent":["import changePassword from '../../../../../server/utils/auth/changePassword.js';\r\nimport getSession from '../../../../../server/utils/auth/getSession.js';\r\nimport bcrypt from 'bcrypt';\r\n\r\nexport default async (request, response) => {\r\n try {\r\n const sessionToken = request.cookies.session_token;\r\n const [sessionError, session] = await getSession({ token: sessionToken });\r\n \r\n if(sessionError || !session || !session.user){\r\n return response.status(401).json({ error: 'Not authenticated' });\r\n }\r\n \r\n const { currentPassword, newPassword } = request.body;\r\n\r\n if(!currentPassword || !newPassword){\r\n return response.status(400).json({ error: 'Current password and new password are required' });\r\n }\r\n\r\n if(newPassword.length < 8){\r\n return response.status(400).json({ error: 'New password must be at least 8 characters' });\r\n }\r\n\r\n const isValid = await bcrypt.compare(currentPassword, session.user.passwordHash);\r\n \r\n if(!isValid){\r\n return response.status(400).json({ error: 'Current password is incorrect' });\r\n }\r\n\r\n const [changeError, result] = await changePassword(session.user.id, newPassword);\r\n\r\n if(changeError){\r\n return response.status(changeError.code).json({ error: changeError.msg });\r\n }\r\n\r\n response.json({ success: true, message: 'Password changed successfully' });\r\n } catch(error){\r\n console.error('Change password error:', error);\r\n response.status(500).json({ \r\n error: error.message || 'Failed to change password'\r\n });\r\n }\r\n};\r\n"],"mappings":"OAAOA,mBAAoB,4DACpBC,eAAgB,wDAChBC,WAAY,wBAEJC,MAAOC,EAASC,KAC7B,IACE,MAAMC,EAAeF,EAAQG,QAAQC,eAC9BC,EAAcC,SAAiBT,WAAW,CAAEU,MAAOL,IAE1D,GAAGG,IAAiBC,IAAYA,EAAQE,KACtC,OAAOP,EAASQ,OAAO,KAAKC,KAAK,CAAEC,MAAO,sBAG5C,MAAMC,gBAAEA,EAAeC,YAAEA,GAAgBb,EAAQc,KAEjD,IAAIF,IAAoBC,EACtB,OAAOZ,EAASQ,OAAO,KAAKC,KAAK,CAAEC,MAAO,mDAG5C,GAAGE,EAAYE,OAAS,EACtB,OAAOd,EAASQ,OAAO,KAAKC,KAAK,CAAEC,MAAO,+CAK5C,UAFsBb,OAAOkB,QAAQJ,EAAiBN,EAAQE,KAAKS,cAGjE,OAAOhB,EAASQ,OAAO,KAAKC,KAAK,CAAEC,MAAO,kCAG5C,MAAOO,EAAaC,SAAgBvB,eAAeU,EAAQE,KAAKY,GAAIP,GAEpE,GAAGK,EACD,OAAOjB,EAASQ,OAAOS,EAAYG,MAAMX,KAAK,CAAEC,MAAOO,EAAYI,MAGrErB,EAASS,KAAK,CAAEa,SAAS,EAAMC,QAAS,iCAC1C,CAAE,MAAMb,GACNc,QAAQd,MAAM,yBAA0BA,GACxCV,EAASQ,OAAO,KAAKC,KAAK,CACxBC,MAAOA,EAAMa,SAAW,6BAE5B","ignoreList":[]}
@@ -1,2 +1,2 @@
1
1
  import loginEmail from"../../../../../../server/utils/auth/loginEmail.js";export default async(e,r)=>{try{const{email:o,password:s}=e.body,[t,n]=await loginEmail(o,s);if(t)return r.status(t.code).json({error:t.msg});r.cookie("session_token",n.sessionToken,{httpOnly:!0,secure:"production"===process.env.NODE_ENV,sameSite:"lax",path:"/",maxAge:n.expiresAt.getTime()-Date.now()}),r.json({user:n.user})}catch(e){console.error("Login error:",e),r.status(500).json({error:"Internal server error"})}};
2
- //# sourceMappingURL=POST.js.map
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\auth\login\email\POST.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src/kempo/api/auth/login/email/POST.js","names":["loginEmail","async","request","response","email","password","body","error","result","status","code","json","msg","cookie","sessionToken","httpOnly","secure","process","env","NODE_ENV","sameSite","path","maxAge","expiresAt","getTime","Date","now","user","console"],"sources":["0"],"sourcesContent":["import loginEmail from '../../../../../../server/utils/auth/loginEmail.js';\n\nexport default async (request, response) => {\n try {\n const { email, password } = request.body;\n \n const [error, result] = await loginEmail(email, password);\n \n if(error){\n return response.status(error.code).json({ error: error.msg });\n }\n\n response.cookie('session_token', result.sessionToken, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n path: '/',\n maxAge: result.expiresAt.getTime() - Date.now()\n });\n \n response.json({ user: result.user });\n } catch(error){\n console.error('Login error:', error);\n response.status(500).json({ error: 'Internal server error' });\n }\n};\n"],"mappings":"OAAOA,eAAgB,mEAERC,MAAOC,EAASC,KAC7B,IACE,MAAMC,MAAEA,EAAKC,SAAEA,GAAaH,EAAQI,MAE7BC,EAAOC,SAAgBR,WAAWI,EAAOC,GAEhD,GAAGE,EACD,OAAOJ,EAASM,OAAOF,EAAMG,MAAMC,KAAK,CAAEJ,MAAOA,EAAMK,MAGzDT,EAASU,OAAO,gBAAiBL,EAAOM,aAAc,CACpDC,UAAU,EACVC,OAAiC,eAAzBC,QAAQC,IAAIC,SACpBC,SAAU,MACVC,KAAM,IACNC,OAAQd,EAAOe,UAAUC,UAAYC,KAAKC,QAG5CvB,EAASQ,KAAK,CAAEgB,KAAMnB,EAAOmB,MAC/B,CAAE,MAAMpB,GACNqB,QAAQrB,MAAM,eAAgBA,GAC9BJ,EAASM,OAAO,KAAKE,KAAK,CAAEJ,MAAO,yBACrC","ignoreList":[]}
1
+ {"version":3,"file":"src\\kempo\\api\\auth\\login\\email\\POST.js","names":["loginEmail","async","request","response","email","password","body","error","result","status","code","json","msg","cookie","sessionToken","httpOnly","secure","process","env","NODE_ENV","sameSite","path","maxAge","expiresAt","getTime","Date","now","user","console"],"sources":["0"],"sourcesContent":["import loginEmail from '../../../../../../server/utils/auth/loginEmail.js';\r\n\r\nexport default async (request, response) => {\r\n try {\r\n const { email, password } = request.body;\r\n \r\n const [error, result] = await loginEmail(email, password);\r\n \r\n if(error){\r\n return response.status(error.code).json({ error: error.msg });\r\n }\r\n\r\n response.cookie('session_token', result.sessionToken, {\r\n httpOnly: true,\r\n secure: process.env.NODE_ENV === 'production',\r\n sameSite: 'lax',\r\n path: '/',\r\n maxAge: result.expiresAt.getTime() - Date.now()\r\n });\r\n \r\n response.json({ user: result.user });\r\n } catch(error){\r\n console.error('Login error:', error);\r\n response.status(500).json({ error: 'Internal server error' });\r\n }\r\n};\r\n"],"mappings":"OAAOA,eAAgB,mEAERC,MAAOC,EAASC,KAC7B,IACE,MAAMC,MAAEA,EAAKC,SAAEA,GAAaH,EAAQI,MAE7BC,EAAOC,SAAgBR,WAAWI,EAAOC,GAEhD,GAAGE,EACD,OAAOJ,EAASM,OAAOF,EAAMG,MAAMC,KAAK,CAAEJ,MAAOA,EAAMK,MAGzDT,EAASU,OAAO,gBAAiBL,EAAOM,aAAc,CACpDC,UAAU,EACVC,OAAiC,eAAzBC,QAAQC,IAAIC,SACpBC,SAAU,MACVC,KAAM,IACNC,OAAQd,EAAOe,UAAUC,UAAYC,KAAKC,QAG5CvB,EAASQ,KAAK,CAAEgB,KAAMnB,EAAOmB,MAC/B,CAAE,MAAMpB,GACNqB,QAAQrB,MAAM,eAAgBA,GAC9BJ,EAASM,OAAO,KAAKE,KAAK,CAAEJ,MAAO,yBACrC","ignoreList":[]}
@@ -1,2 +1,2 @@
1
1
  import logout from"../../../../../server/utils/auth/logout.js";export default async(t,e)=>{try{const o=t.cookies.session_token,[s,r]=await logout({token:o});if(s)return e.status(s.code).json({error:s.msg});e.setHeader("Set-Cookie","session_token=; Path=/; HttpOnly; Secure; SameSite=Strict; Max-Age=0"),e.json(r)}catch(t){e.status(500).json({error:t.message})}};
2
- //# sourceMappingURL=POST.js.map
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\auth\logout\POST.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src/kempo/api/auth/logout/POST.js","names":["logout","async","request","response","token","cookies","session_token","error","result","status","code","json","msg","setHeader","message"],"sources":["0"],"sourcesContent":["import logout from '../../../../../server/utils/auth/logout.js';\n\nexport default async (request, response) => {\n try {\n const token = request.cookies.session_token;\n const [error, result] = await logout({ token });\n \n if(error){\n return response.status(error.code).json({ error: error.msg });\n }\n \n response.setHeader('Set-Cookie', 'session_token=; Path=/; HttpOnly; Secure; SameSite=Strict; Max-Age=0');\n response.json(result);\n } catch(error) {\n response.status(500).json({ error: error.message });\n }\n};\n"],"mappings":"OAAOA,WAAY,4DAEJC,MAAOC,EAASC,KAC7B,IACE,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAOC,SAAgBR,OAAO,CAAEI,UAEvC,GAAGG,EACD,OAAOJ,EAASM,OAAOF,EAAMG,MAAMC,KAAK,CAAEJ,MAAOA,EAAMK,MAGzDT,EAASU,UAAU,aAAc,wEACjCV,EAASQ,KAAKH,EAChB,CAAE,MAAMD,GACNJ,EAASM,OAAO,KAAKE,KAAK,CAAEJ,MAAOA,EAAMO,SAC3C","ignoreList":[]}
1
+ {"version":3,"file":"src\\kempo\\api\\auth\\logout\\POST.js","names":["logout","async","request","response","token","cookies","session_token","error","result","status","code","json","msg","setHeader","message"],"sources":["0"],"sourcesContent":["import logout from '../../../../../server/utils/auth/logout.js';\r\n\r\nexport default async (request, response) => {\r\n try {\r\n const token = request.cookies.session_token;\r\n const [error, result] = await logout({ token });\r\n \r\n if(error){\r\n return response.status(error.code).json({ error: error.msg });\r\n }\r\n \r\n response.setHeader('Set-Cookie', 'session_token=; Path=/; HttpOnly; Secure; SameSite=Strict; Max-Age=0');\r\n response.json(result);\r\n } catch(error) {\r\n response.status(500).json({ error: error.message });\r\n }\r\n};\r\n"],"mappings":"OAAOA,WAAY,4DAEJC,MAAOC,EAASC,KAC7B,IACE,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAOC,SAAgBR,OAAO,CAAEI,UAEvC,GAAGG,EACD,OAAOJ,EAASM,OAAOF,EAAMG,MAAMC,KAAK,CAAEJ,MAAOA,EAAMK,MAGzDT,EAASU,UAAU,aAAc,wEACjCV,EAASQ,KAAKH,EAChB,CAAE,MAAMD,GACNJ,EAASM,OAAO,KAAKE,KAAK,CAAEJ,MAAOA,EAAMO,SAC3C","ignoreList":[]}
@@ -1,2 +1,2 @@
1
1
  import registerEmail from"../../../../../../server/utils/auth/registerEmail.js";export default async(e,r)=>{try{const{email:s,password:i,name:o}=e.body,[t,a]=await registerEmail({email:s,password:i,name:o});if(t)return r.status(t.code).json({error:t.msg});if(a.requiresVerification)return r.json({user:a.user,requiresVerification:a.requiresVerification});r.cookie("session_token",a.sessionToken,{httpOnly:!0,secure:"production"===process.env.NODE_ENV,sameSite:"lax",path:"/",maxAge:a.expiresAt.getTime()-Date.now()}),r.json({user:a.user})}catch(e){console.error("Registration error:",e),r.status(500).json({error:"Internal server error"})}};
2
- //# sourceMappingURL=POST.js.map
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\auth\register\email\POST.js.map