kempo 4.2.4 → 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 (856) hide show
  1. package/LICENSE.md +60 -0
  2. package/README.md +427 -0
  3. package/app-drizzle.config.js +14 -0
  4. package/app-public/.config.json +25 -0
  5. package/app-public/account/index.page.html +110 -0
  6. package/app-public/account/split2.template.html +36 -0
  7. package/app-public/default.template.html +24 -0
  8. package/app-public/forgot-password/index.page.html +79 -0
  9. package/app-public/index.page.html +16 -0
  10. package/app-public/init.js +2 -0
  11. package/app-public/kempo-global.global-disabled.html +0 -0
  12. package/app-public/kempo-global.global.html +6 -0
  13. package/app-public/login/index.page.html +51 -0
  14. package/app-public/manifest.json +87 -0
  15. package/app-public/media/hexagon.svg +22 -0
  16. package/app-public/media/icon-maskable.png +0 -0
  17. package/app-public/media/icon.svg +1 -0
  18. package/app-public/media/icon128.png +0 -0
  19. package/app-public/media/icon144.png +0 -0
  20. package/app-public/media/icon152.png +0 -0
  21. package/app-public/media/icon16-48.svg +19 -0
  22. package/app-public/media/icon16.png +0 -0
  23. package/app-public/media/icon192.png +0 -0
  24. package/app-public/media/icon256.png +0 -0
  25. package/app-public/media/icon32.png +0 -0
  26. package/app-public/media/icon384.png +0 -0
  27. package/app-public/media/icon48.png +0 -0
  28. package/app-public/media/icon512.png +0 -0
  29. package/app-public/media/icon64.png +0 -0
  30. package/app-public/media/icon72.png +0 -0
  31. package/app-public/media/icon96.png +0 -0
  32. package/app-public/media/kempo-fist.svg +21 -0
  33. package/app-public/media/nsx.jpg +0 -0
  34. package/app-public/nav.fragment.html +41 -0
  35. package/app-public/new-page.page.html +17 -0
  36. package/app-public/register/index.page.html +60 -0
  37. package/app-public/reset-password/[token]/index.html +123 -0
  38. package/app-public/reset-password/[token]/index.page.html +75 -0
  39. package/app-public/styles.css +1 -0
  40. package/app-public/test.page.html +20 -0
  41. package/app-public/verify-email/[token]/index.html +107 -0
  42. package/app-public/verify-email/[token]/index.page.html +59 -0
  43. package/app-public/verify-email/index.page.html +21 -0
  44. package/app-server/db/schema.js +19 -0
  45. package/bin/cli.js +468 -0
  46. package/dist/admin/accounts/groups/[name]/index.page.html +286 -0
  47. package/dist/admin/accounts/groups/index.page.html +171 -0
  48. package/dist/admin/accounts/permissions/index.page.html +193 -0
  49. package/dist/admin/accounts/users/[id]/index.page.html +314 -0
  50. package/dist/admin/accounts/users/index.page.html +160 -0
  51. package/dist/admin/components/AddGroupControl.js +6 -0
  52. package/dist/admin/components/AddGroupControl.js.map +1 -0
  53. package/dist/admin/components/ClearExpiredSessionsControl.js +6 -0
  54. package/dist/admin/components/ClearExpiredSessionsControl.js.map +1 -0
  55. package/dist/admin/components/FragmentEditor.js +101 -0
  56. package/dist/admin/components/FragmentEditor.js.map +1 -0
  57. package/dist/admin/components/GlobalContentEditor.js +85 -0
  58. package/dist/admin/components/GlobalContentEditor.js.map +1 -0
  59. package/dist/admin/components/GroupDeleteSelected.js +6 -0
  60. package/dist/admin/components/GroupDeleteSelected.js.map +1 -0
  61. package/dist/admin/components/GroupRemoveRecord.js +6 -0
  62. package/dist/admin/components/GroupRemoveRecord.js.map +1 -0
  63. package/dist/admin/components/Monaco.js +2 -0
  64. package/dist/admin/components/Monaco.js.map +1 -0
  65. package/dist/admin/components/PageEditor.js +138 -0
  66. package/dist/admin/components/PageEditor.js.map +1 -0
  67. package/dist/admin/components/TableRowDelete.js +4 -0
  68. package/dist/admin/components/TableRowDelete.js.map +1 -0
  69. package/dist/admin/components/TableRowLink.js +8 -0
  70. package/dist/admin/components/TableRowLink.js.map +1 -0
  71. package/dist/admin/components/TemplateEditor.js +125 -0
  72. package/dist/admin/components/TemplateEditor.js.map +1 -0
  73. package/dist/admin/components/ValueEditor.js +40 -0
  74. package/dist/admin/components/ValueEditor.js.map +1 -0
  75. package/dist/admin/components/tableControls/AddMember.js +6 -0
  76. package/dist/admin/components/tableControls/AddMember.js.map +1 -0
  77. package/dist/admin/components/tableControls/AddPermission.js +6 -0
  78. package/dist/admin/components/tableControls/AddPermission.js.map +1 -0
  79. package/dist/admin/components/tableControls/InstallExtension.js +6 -0
  80. package/dist/admin/components/tableControls/InstallExtension.js.map +1 -0
  81. package/dist/admin/components/tableControls/UninstallExtension.js +6 -0
  82. package/dist/admin/components/tableControls/UninstallExtension.js.map +1 -0
  83. package/dist/admin/content/fragments/edit/index.page.html +4 -0
  84. package/dist/admin/content/fragments/index.page.html +169 -0
  85. package/dist/admin/content/globals/edit/index.page.html +4 -0
  86. package/dist/admin/content/globals/index.page.html +152 -0
  87. package/dist/admin/content/pages/edit/index.page.html +4 -0
  88. package/dist/admin/content/pages/index.page.html +218 -0
  89. package/dist/admin/content/templates/edit/index.page.html +4 -0
  90. package/dist/admin/content/templates/index.page.html +193 -0
  91. package/dist/admin/default.template.html +9 -0
  92. package/dist/admin/extensions/index.page.html +32 -0
  93. package/dist/admin/icons/article.svg +1 -0
  94. package/dist/admin/icons/browse.svg +1 -0
  95. package/dist/admin/icons/cards_stack.svg +1 -0
  96. package/dist/admin/icons/content.svg +1 -0
  97. package/dist/admin/icons/docs.svg +1 -0
  98. package/dist/admin/icons/drive_file_move.svg +1 -0
  99. package/dist/admin/icons/extension.svg +1 -0
  100. package/dist/admin/icons/globe.svg +1 -0
  101. package/dist/admin/icons/group.svg +1 -0
  102. package/dist/admin/icons/lock.svg +1 -0
  103. package/dist/admin/icons/lock_add.svg +1 -0
  104. package/dist/admin/icons/manage-accounts.svg +1 -0
  105. package/dist/admin/icons/person.svg +1 -0
  106. package/dist/admin/icons/person_add.svg +1 -0
  107. package/dist/admin/icons/preview.svg +1 -0
  108. package/dist/admin/icons/save.svg +1 -0
  109. package/dist/admin/icons/segment.svg +1 -0
  110. package/dist/admin/icons/timer_off.svg +1 -0
  111. package/dist/admin/icons/web.svg +1 -0
  112. package/dist/admin/index.page.html +4 -0
  113. package/dist/admin/init.js +2 -0
  114. package/dist/admin/init.js.map +1 -0
  115. package/dist/admin/known-extensions.json +1 -0
  116. package/dist/admin/nav.fragment.html +20 -0
  117. package/dist/admin/settings/[owner]/[name]/index.page.html +260 -0
  118. package/dist/admin/settings/index.page.html +203 -0
  119. package/dist/kempo/api/admin-globals/DELETE.js +2 -0
  120. package/dist/kempo/api/admin-globals/DELETE.js.map +1 -0
  121. package/dist/kempo/api/admin-globals/GET.js +2 -0
  122. package/dist/kempo/api/admin-globals/GET.js.map +1 -0
  123. package/dist/kempo/api/admin-globals/POST.js +2 -0
  124. package/dist/kempo/api/admin-globals/POST.js.map +1 -0
  125. package/dist/kempo/api/admin-globals/[id]/GET.js +2 -0
  126. package/dist/kempo/api/admin-globals/[id]/GET.js.map +1 -0
  127. package/dist/kempo/api/admin-globals/[id]/PUT.js +2 -0
  128. package/dist/kempo/api/admin-globals/[id]/PUT.js.map +1 -0
  129. package/dist/kempo/api/admin-globals/[id]/disable/PUT.js +2 -0
  130. package/dist/kempo/api/admin-globals/[id]/disable/PUT.js.map +1 -0
  131. package/dist/kempo/api/admin-globals/[id]/enable/PUT.js +2 -0
  132. package/dist/kempo/api/admin-globals/[id]/enable/PUT.js.map +1 -0
  133. package/dist/kempo/api/auth/change-password/POST.js +2 -0
  134. package/dist/kempo/api/auth/change-password/POST.js.map +1 -0
  135. package/dist/kempo/api/auth/login/email/POST.js +2 -0
  136. package/dist/kempo/api/auth/login/email/POST.js.map +1 -0
  137. package/dist/kempo/api/auth/logout/POST.js +2 -0
  138. package/dist/kempo/api/auth/logout/POST.js.map +1 -0
  139. package/dist/kempo/api/auth/register/email/POST.js +2 -0
  140. package/dist/kempo/api/auth/register/email/POST.js.map +1 -0
  141. package/dist/kempo/api/auth/reset-password/POST.js +2 -0
  142. package/dist/kempo/api/auth/reset-password/POST.js.map +1 -0
  143. package/dist/kempo/api/auth/session/GET.js +2 -0
  144. package/dist/kempo/api/auth/session/GET.js.map +1 -0
  145. package/dist/kempo/api/auth/verify-email/POST.js +2 -0
  146. package/dist/kempo/api/auth/verify-email/POST.js.map +1 -0
  147. package/dist/kempo/api/extensions/DELETE.js +2 -0
  148. package/dist/kempo/api/extensions/DELETE.js.map +1 -0
  149. package/dist/kempo/api/extensions/GET.js +2 -0
  150. package/dist/kempo/api/extensions/GET.js.map +1 -0
  151. package/dist/kempo/api/extensions/POST.js +2 -0
  152. package/dist/kempo/api/extensions/POST.js.map +1 -0
  153. package/dist/kempo/api/extensions/[name]/disable/POST.js +2 -0
  154. package/dist/kempo/api/extensions/[name]/disable/POST.js.map +1 -0
  155. package/dist/kempo/api/extensions/[name]/enable/POST.js +2 -0
  156. package/dist/kempo/api/extensions/[name]/enable/POST.js.map +1 -0
  157. package/dist/kempo/api/extensions/[name]/update/POST.js +2 -0
  158. package/dist/kempo/api/extensions/[name]/update/POST.js.map +1 -0
  159. package/dist/kempo/api/extensions/[name]/update-check/GET.js +2 -0
  160. package/dist/kempo/api/extensions/[name]/update-check/GET.js.map +1 -0
  161. package/dist/kempo/api/extensions/available/GET.js +2 -0
  162. package/dist/kempo/api/extensions/available/GET.js.map +1 -0
  163. package/dist/kempo/api/extensions/known/GET.js +2 -0
  164. package/dist/kempo/api/extensions/known/GET.js.map +1 -0
  165. package/dist/kempo/api/forgot-password/POST.js +2 -0
  166. package/dist/kempo/api/forgot-password/POST.js.map +1 -0
  167. package/dist/kempo/api/fragments/DELETE.js +2 -0
  168. package/dist/kempo/api/fragments/DELETE.js.map +1 -0
  169. package/dist/kempo/api/fragments/GET.js +2 -0
  170. package/dist/kempo/api/fragments/GET.js.map +1 -0
  171. package/dist/kempo/api/fragments/POST.js +2 -0
  172. package/dist/kempo/api/fragments/POST.js.map +1 -0
  173. package/dist/kempo/api/fragments/disable/PUT.js +2 -0
  174. package/dist/kempo/api/fragments/disable/PUT.js.map +1 -0
  175. package/dist/kempo/api/fragments/enable/PUT.js +2 -0
  176. package/dist/kempo/api/fragments/enable/PUT.js.map +1 -0
  177. package/dist/kempo/api/fragments/file/GET.js +2 -0
  178. package/dist/kempo/api/fragments/file/GET.js.map +1 -0
  179. package/dist/kempo/api/fragments/file/PATCH.js +2 -0
  180. package/dist/kempo/api/fragments/file/PATCH.js.map +1 -0
  181. package/dist/kempo/api/fragments/file/PUT.js +2 -0
  182. package/dist/kempo/api/fragments/file/PUT.js.map +1 -0
  183. package/dist/kempo/api/globals/DELETE.js +2 -0
  184. package/dist/kempo/api/globals/DELETE.js.map +1 -0
  185. package/dist/kempo/api/globals/GET.js +2 -0
  186. package/dist/kempo/api/globals/GET.js.map +1 -0
  187. package/dist/kempo/api/globals/POST.js +2 -0
  188. package/dist/kempo/api/globals/POST.js.map +1 -0
  189. package/dist/kempo/api/globals/disable/PUT.js +2 -0
  190. package/dist/kempo/api/globals/disable/PUT.js.map +1 -0
  191. package/dist/kempo/api/globals/enable/PUT.js +2 -0
  192. package/dist/kempo/api/globals/enable/PUT.js.map +1 -0
  193. package/dist/kempo/api/globals/entry/GET.js +2 -0
  194. package/dist/kempo/api/globals/entry/GET.js.map +1 -0
  195. package/dist/kempo/api/globals/entry/PUT.js +2 -0
  196. package/dist/kempo/api/globals/entry/PUT.js.map +1 -0
  197. package/dist/kempo/api/groups/DELETE.js +2 -0
  198. package/dist/kempo/api/groups/DELETE.js.map +1 -0
  199. package/dist/kempo/api/groups/GET.js +2 -0
  200. package/dist/kempo/api/groups/GET.js.map +1 -0
  201. package/dist/kempo/api/groups/PATCH.js +2 -0
  202. package/dist/kempo/api/groups/PATCH.js.map +1 -0
  203. package/dist/kempo/api/groups/POST.js +2 -0
  204. package/dist/kempo/api/groups/POST.js.map +1 -0
  205. package/dist/kempo/api/groups/[name]/GET.js +2 -0
  206. package/dist/kempo/api/groups/[name]/GET.js.map +1 -0
  207. package/dist/kempo/api/groups/[name]/members/DELETE.js +2 -0
  208. package/dist/kempo/api/groups/[name]/members/DELETE.js.map +1 -0
  209. package/dist/kempo/api/groups/[name]/members/GET.js +2 -0
  210. package/dist/kempo/api/groups/[name]/members/GET.js.map +1 -0
  211. package/dist/kempo/api/groups/[name]/members/POST.js +2 -0
  212. package/dist/kempo/api/groups/[name]/members/POST.js.map +1 -0
  213. package/dist/kempo/api/groups/[name]/permissions/DELETE.js +2 -0
  214. package/dist/kempo/api/groups/[name]/permissions/DELETE.js.map +1 -0
  215. package/dist/kempo/api/groups/[name]/permissions/GET.js +2 -0
  216. package/dist/kempo/api/groups/[name]/permissions/GET.js.map +1 -0
  217. package/dist/kempo/api/groups/[name]/permissions/POST.js +2 -0
  218. package/dist/kempo/api/groups/[name]/permissions/POST.js.map +1 -0
  219. package/dist/kempo/api/pages/DELETE.js +2 -0
  220. package/dist/kempo/api/pages/DELETE.js.map +1 -0
  221. package/dist/kempo/api/pages/GET.js +2 -0
  222. package/dist/kempo/api/pages/GET.js.map +1 -0
  223. package/dist/kempo/api/pages/POST.js +2 -0
  224. package/dist/kempo/api/pages/POST.js.map +1 -0
  225. package/dist/kempo/api/pages/directories/GET.js +2 -0
  226. package/dist/kempo/api/pages/directories/GET.js.map +1 -0
  227. package/dist/kempo/api/pages/disable/PUT.js +2 -0
  228. package/dist/kempo/api/pages/disable/PUT.js.map +1 -0
  229. package/dist/kempo/api/pages/enable/PUT.js +2 -0
  230. package/dist/kempo/api/pages/enable/PUT.js.map +1 -0
  231. package/dist/kempo/api/pages/file/GET.js +2 -0
  232. package/dist/kempo/api/pages/file/GET.js.map +1 -0
  233. package/dist/kempo/api/pages/file/PATCH.js +2 -0
  234. package/dist/kempo/api/pages/file/PATCH.js.map +1 -0
  235. package/dist/kempo/api/pages/file/PUT.js +2 -0
  236. package/dist/kempo/api/pages/file/PUT.js.map +1 -0
  237. package/dist/kempo/api/pages/templates/GET.js +2 -0
  238. package/dist/kempo/api/pages/templates/GET.js.map +1 -0
  239. package/dist/kempo/api/permissions/DELETE.js +2 -0
  240. package/dist/kempo/api/permissions/DELETE.js.map +1 -0
  241. package/dist/kempo/api/permissions/GET.js +2 -0
  242. package/dist/kempo/api/permissions/GET.js.map +1 -0
  243. package/dist/kempo/api/permissions/PATCH.js +2 -0
  244. package/dist/kempo/api/permissions/PATCH.js.map +1 -0
  245. package/dist/kempo/api/permissions/POST.js +2 -0
  246. package/dist/kempo/api/permissions/POST.js.map +1 -0
  247. package/dist/kempo/api/settings/[owner]/GET.js +2 -0
  248. package/dist/kempo/api/settings/[owner]/GET.js.map +1 -0
  249. package/dist/kempo/api/settings/[owner]/[name]/DELETE.js +2 -0
  250. package/dist/kempo/api/settings/[owner]/[name]/DELETE.js.map +1 -0
  251. package/dist/kempo/api/settings/[owner]/[name]/GET.js +2 -0
  252. package/dist/kempo/api/settings/[owner]/[name]/GET.js.map +1 -0
  253. package/dist/kempo/api/settings/[owner]/[name]/POST.js +2 -0
  254. package/dist/kempo/api/settings/[owner]/[name]/POST.js.map +1 -0
  255. package/dist/kempo/api/settings/public/GET.js +2 -0
  256. package/dist/kempo/api/settings/public/GET.js.map +1 -0
  257. package/dist/kempo/api/templates/DELETE.js +2 -0
  258. package/dist/kempo/api/templates/DELETE.js.map +1 -0
  259. package/dist/kempo/api/templates/GET.js +2 -0
  260. package/dist/kempo/api/templates/GET.js.map +1 -0
  261. package/dist/kempo/api/templates/POST.js +2 -0
  262. package/dist/kempo/api/templates/POST.js.map +1 -0
  263. package/dist/kempo/api/templates/disable/PUT.js +2 -0
  264. package/dist/kempo/api/templates/disable/PUT.js.map +1 -0
  265. package/dist/kempo/api/templates/enable/PUT.js +2 -0
  266. package/dist/kempo/api/templates/enable/PUT.js.map +1 -0
  267. package/dist/kempo/api/templates/file/GET.js +2 -0
  268. package/dist/kempo/api/templates/file/GET.js.map +1 -0
  269. package/dist/kempo/api/templates/file/PATCH.js +2 -0
  270. package/dist/kempo/api/templates/file/PATCH.js.map +1 -0
  271. package/dist/kempo/api/templates/file/PUT.js +2 -0
  272. package/dist/kempo/api/templates/file/PUT.js.map +1 -0
  273. package/dist/kempo/api/user/DELETE.js +2 -0
  274. package/dist/kempo/api/user/DELETE.js.map +1 -0
  275. package/dist/kempo/api/user/GET.js +2 -0
  276. package/dist/kempo/api/user/GET.js.map +1 -0
  277. package/dist/kempo/api/user/PATCH.js +2 -0
  278. package/dist/kempo/api/user/PATCH.js.map +1 -0
  279. package/dist/kempo/api/user/[userid]/GET.js +2 -0
  280. package/dist/kempo/api/user/[userid]/GET.js.map +1 -0
  281. package/dist/kempo/api/user/[userid]/groups/DELETE.js +2 -0
  282. package/dist/kempo/api/user/[userid]/groups/DELETE.js.map +1 -0
  283. package/dist/kempo/api/user/[userid]/groups/GET.js +2 -0
  284. package/dist/kempo/api/user/[userid]/groups/GET.js.map +1 -0
  285. package/dist/kempo/api/user/[userid]/groups/POST.js +2 -0
  286. package/dist/kempo/api/user/[userid]/groups/POST.js.map +1 -0
  287. package/dist/kempo/api/user/[userid]/permissions/GET.js +2 -0
  288. package/dist/kempo/api/user/[userid]/permissions/GET.js.map +1 -0
  289. package/dist/kempo/api/user/[userid]/permissions/all/GET.js +2 -0
  290. package/dist/kempo/api/user/[userid]/permissions/all/GET.js.map +1 -0
  291. package/dist/kempo/api/user/[userid]/permissions/list/GET.js +2 -0
  292. package/dist/kempo/api/user/[userid]/permissions/list/GET.js.map +1 -0
  293. package/dist/kempo/api/user/[userid]/permissions/some/GET.js +2 -0
  294. package/dist/kempo/api/user/[userid]/permissions/some/GET.js.map +1 -0
  295. package/dist/kempo/api/user/[userid]/sessions/DELETE.js +2 -0
  296. package/dist/kempo/api/user/[userid]/sessions/DELETE.js.map +1 -0
  297. package/dist/kempo/api/user/[userid]/sessions/GET.js +2 -0
  298. package/dist/kempo/api/user/[userid]/sessions/GET.js.map +1 -0
  299. package/dist/kempo/api/user/[userid]/sessions/expired/DELETE.js +2 -0
  300. package/dist/kempo/api/user/[userid]/sessions/expired/DELETE.js.map +1 -0
  301. package/dist/kempo/api/user/create/POST.js +2 -0
  302. package/dist/kempo/api/user/create/POST.js.map +1 -0
  303. package/dist/kempo/api/user/search/GET.js +2 -0
  304. package/dist/kempo/api/user/search/GET.js.map +1 -0
  305. package/dist/kempo/components/LogoutBtn.js +2 -0
  306. package/dist/kempo/components/LogoutBtn.js.map +1 -0
  307. package/dist/kempo/components/Menu.js +17 -0
  308. package/dist/kempo/components/Menu.js.map +1 -0
  309. package/dist/kempo/components/Permission.js +2 -0
  310. package/dist/kempo/components/Permission.js.map +1 -0
  311. package/dist/kempo/components/Role.js +2 -0
  312. package/dist/kempo/components/Role.js.map +1 -0
  313. package/dist/kempo/components/UserCreatedAt.js +2 -0
  314. package/dist/kempo/components/UserCreatedAt.js.map +1 -0
  315. package/dist/kempo/components/UserEmail.js +2 -0
  316. package/dist/kempo/components/UserEmail.js.map +1 -0
  317. package/dist/kempo/components/UserEmailVerified.js +2 -0
  318. package/dist/kempo/components/UserEmailVerified.js.map +1 -0
  319. package/dist/kempo/components/UserName.js +2 -0
  320. package/dist/kempo/components/UserName.js.map +1 -0
  321. package/dist/kempo/fetch.js +2 -0
  322. package/dist/kempo/fetch.js.map +1 -0
  323. package/dist/kempo/icons/format_indent_decrease.svg +1 -0
  324. package/dist/kempo/icons/format_indent_increase.svg +1 -0
  325. package/dist/kempo/icons/format_quote.svg +1 -0
  326. package/dist/kempo/icons/redo.svg +1 -0
  327. package/dist/kempo/icons/restart_alt.svg +1 -0
  328. package/dist/kempo/icons/subscript.svg +1 -0
  329. package/dist/kempo/icons/superscript.svg +1 -0
  330. package/dist/kempo/icons/undo.svg +1 -0
  331. package/dist/kempo/sdk.js +2 -0
  332. package/dist/kempo/sdk.js.map +1 -0
  333. package/middleware/extension-scope-router.js +255 -0
  334. package/middleware/kempo-auth.js +26 -0
  335. package/package.json +46 -19
  336. package/scripts/init-db.js +211 -0
  337. package/server/db/index.js +24 -0
  338. package/server/db/schema.js +173 -0
  339. package/server/sdk.js +192 -0
  340. package/server/utils/admin-global-content/createAdminGlobalContent.js +43 -0
  341. package/server/utils/admin-global-content/deleteAdminGlobalContent.js +34 -0
  342. package/server/utils/admin-global-content/deleteAdminGlobalContentByOwner.js +26 -0
  343. package/server/utils/admin-global-content/disableAdminGlobalContent.js +33 -0
  344. package/server/utils/admin-global-content/enableAdminGlobalContent.js +33 -0
  345. package/server/utils/admin-global-content/getAdminGlobalContent.js +28 -0
  346. package/server/utils/admin-global-content/helpers.js +47 -0
  347. package/server/utils/admin-global-content/listAdminGlobalContent.js +20 -0
  348. package/server/utils/admin-global-content/updateAdminGlobalContent.js +41 -0
  349. package/server/utils/auth/changePassword.js +27 -0
  350. package/server/utils/auth/getSession.js +35 -0
  351. package/server/utils/auth/loginEmail.js +66 -0
  352. package/server/utils/auth/logout.js +16 -0
  353. package/server/utils/auth/registerEmail.js +105 -0
  354. package/server/utils/auth/requestPasswordReset.js +62 -0
  355. package/server/utils/auth/resetPassword.js +58 -0
  356. package/server/utils/auth/sendVerificationEmail.js +57 -0
  357. package/server/utils/auth/verifyEmail.js +46 -0
  358. package/server/utils/email/sendEmail.js +42 -0
  359. package/server/utils/email/sendEmailFromTemplate.js +45 -0
  360. package/server/utils/extensions/checkExtensionUpdate.js +56 -0
  361. package/server/utils/extensions/createTablesFromSchema.js +57 -0
  362. package/server/utils/extensions/disableExtension.js +26 -0
  363. package/server/utils/extensions/enableExtension.js +26 -0
  364. package/server/utils/extensions/getExtension.js +34 -0
  365. package/server/utils/extensions/installExtension.js +134 -0
  366. package/server/utils/extensions/listExtensions.js +36 -0
  367. package/server/utils/extensions/scopeCache.js +18 -0
  368. package/server/utils/extensions/uninstallExtension.js +88 -0
  369. package/server/utils/extensions/updateExtension.js +159 -0
  370. package/server/utils/fragments/createFragment.js +57 -0
  371. package/server/utils/fragments/deleteFragment.js +35 -0
  372. package/server/utils/fragments/disableFragment.js +37 -0
  373. package/server/utils/fragments/enableFragment.js +30 -0
  374. package/server/utils/fragments/getFragment.js +36 -0
  375. package/server/utils/fragments/listFragments.js +32 -0
  376. package/server/utils/fragments/moveFragment.js +54 -0
  377. package/server/utils/fragments/updateFragment.js +58 -0
  378. package/server/utils/fs/parseFrontmatter.js +13 -0
  379. package/server/utils/fs/scanDir.js +26 -0
  380. package/server/utils/global-content/createGlobalContent.js +58 -0
  381. package/server/utils/global-content/deleteGlobalContent.js +52 -0
  382. package/server/utils/global-content/disableGlobalContent.js +57 -0
  383. package/server/utils/global-content/enableGlobalContent.js +53 -0
  384. package/server/utils/global-content/getGlobalContent.js +28 -0
  385. package/server/utils/global-content/helpers.js +33 -0
  386. package/server/utils/global-content/listGlobalContent.js +24 -0
  387. package/server/utils/global-content/updateGlobalContent.js +56 -0
  388. package/server/utils/groups/addUserToGroup.js +46 -0
  389. package/server/utils/groups/createGroup.js +32 -0
  390. package/server/utils/groups/deleteGroup.js +29 -0
  391. package/server/utils/groups/getGroup.js +25 -0
  392. package/server/utils/groups/getGroupMembers.js +33 -0
  393. package/server/utils/groups/listGroups.js +21 -0
  394. package/server/utils/groups/removeUserFromGroup.js +31 -0
  395. package/server/utils/groups/updateGroup.js +54 -0
  396. package/server/utils/hooks/createHook.js +29 -0
  397. package/server/utils/hooks/deleteHook.js +19 -0
  398. package/server/utils/hooks/getHook.js +19 -0
  399. package/server/utils/hooks/listHooks.js +30 -0
  400. package/server/utils/hooks/triggerHook.js +61 -0
  401. package/server/utils/hooks/updateHook.js +27 -0
  402. package/server/utils/pages/createPage.js +60 -0
  403. package/server/utils/pages/deletePage.js +35 -0
  404. package/server/utils/pages/disablePage.js +37 -0
  405. package/server/utils/pages/enablePage.js +30 -0
  406. package/server/utils/pages/getPage.js +53 -0
  407. package/server/utils/pages/listDirectories.js +18 -0
  408. package/server/utils/pages/listPages.js +40 -0
  409. package/server/utils/pages/listTemplates.js +52 -0
  410. package/server/utils/pages/movePage.js +54 -0
  411. package/server/utils/pages/updatePage.js +74 -0
  412. package/server/utils/permissions/addPermissionToGroup.js +43 -0
  413. package/server/utils/permissions/createPermission.js +43 -0
  414. package/server/utils/permissions/currentUserHasAllPermissions.js +24 -0
  415. package/server/utils/permissions/currentUserHasPermission.js +24 -0
  416. package/server/utils/permissions/currentUserHasSomePermissions.js +24 -0
  417. package/server/utils/permissions/deletePermission.js +29 -0
  418. package/server/utils/permissions/getAllPermissions.js +21 -0
  419. package/server/utils/permissions/getPermissionsForGroups.js +26 -0
  420. package/server/utils/permissions/getUserGroups.js +31 -0
  421. package/server/utils/permissions/getUserPermission.js +30 -0
  422. package/server/utils/permissions/getUserPermissions.js +16 -0
  423. package/server/utils/permissions/removePermissionFromGroup.js +31 -0
  424. package/server/utils/permissions/updatePermission.js +33 -0
  425. package/server/utils/permissions/userHasAllPermissions.js +31 -0
  426. package/server/utils/permissions/userHasPermission.js +13 -0
  427. package/server/utils/permissions/userHasSomePermissions.js +31 -0
  428. package/server/utils/sessions/createSession.js +36 -0
  429. package/server/utils/sessions/deleteExpiredUserSessions.js +22 -0
  430. package/server/utils/sessions/deleteSession.js +16 -0
  431. package/server/utils/sessions/deleteUserSessions.js +16 -0
  432. package/server/utils/sessions/getSessionById.js +21 -0
  433. package/server/utils/sessions/getSessionByToken.js +21 -0
  434. package/server/utils/sessions/getSessions.js +19 -0
  435. package/server/utils/sessions/getUserSessions.js +30 -0
  436. package/server/utils/settings/deleteSetting.js +24 -0
  437. package/server/utils/settings/getPublicSettings.js +22 -0
  438. package/server/utils/settings/getSetting.js +25 -0
  439. package/server/utils/settings/getSettingWithMetadata.js +33 -0
  440. package/server/utils/settings/getSettingsByOwner.js +23 -0
  441. package/server/utils/settings/helpers.js +29 -0
  442. package/server/utils/settings/listSettings.js +25 -0
  443. package/server/utils/settings/setSetting.js +49 -0
  444. package/server/utils/templates/createTemplate.js +71 -0
  445. package/server/utils/templates/deleteTemplate.js +35 -0
  446. package/server/utils/templates/disableTemplate.js +37 -0
  447. package/server/utils/templates/enableTemplate.js +30 -0
  448. package/server/utils/templates/getTemplate.js +30 -0
  449. package/server/utils/templates/moveTemplate.js +54 -0
  450. package/server/utils/templates/updateTemplate.js +46 -0
  451. package/server/utils/users/createUser.js +60 -0
  452. package/server/utils/users/deleteUser.js +19 -0
  453. package/server/utils/users/findUsersByEmail.js +35 -0
  454. package/server/utils/users/findUsersByName.js +35 -0
  455. package/server/utils/users/getUserByEmail.js +26 -0
  456. package/server/utils/users/getUserById.js +27 -0
  457. package/server/utils/users/getUsers.js +26 -0
  458. package/server/utils/users/searchUsers.js +53 -0
  459. package/server/utils/users/updateUser.js +38 -0
  460. package/.gitattributes +0 -2
  461. package/LICENSE +0 -21
  462. package/dist/components/Accordion.js +0 -1
  463. package/dist/components/Card.js +0 -1
  464. package/dist/components/Collapsible.js +0 -1
  465. package/dist/components/Component.js +0 -1
  466. package/dist/components/ContentSlider.js +0 -1
  467. package/dist/components/Dialog.js +0 -1
  468. package/dist/components/DirectoryViewer.js +0 -1
  469. package/dist/components/FocusCapture.js +0 -1
  470. package/dist/components/Icon.js +0 -1
  471. package/dist/components/Import.js +0 -1
  472. package/dist/components/LazyComponent.js +0 -1
  473. package/dist/components/PersistantCollapsible.js +0 -1
  474. package/dist/components/PhotoViewer.js +0 -1
  475. package/dist/components/ReactiveComponent.js +0 -1
  476. package/dist/components/ReactiveLazyComponent.js +0 -1
  477. package/dist/components/Resize.js +0 -1
  478. package/dist/components/Search.js +0 -1
  479. package/dist/components/ShowMore.js +0 -1
  480. package/dist/components/SideMenu.js +0 -1
  481. package/dist/components/Sortable.js +0 -1
  482. package/dist/components/Split.js +0 -1
  483. package/dist/components/Stacks.js +0 -1
  484. package/dist/components/Table.js +0 -1
  485. package/dist/components/Tabs.js +0 -1
  486. package/dist/components/Tags.js +0 -1
  487. package/dist/components/ThemeSwitcher.js +0 -1
  488. package/dist/components/Timestamp.js +0 -1
  489. package/dist/components/Toast.js +0 -1
  490. package/dist/components/Toggle.js +0 -1
  491. package/dist/components/tableControls/DeleteRecord.js +0 -1
  492. package/dist/components/tableControls/DeleteSelected.js +0 -1
  493. package/dist/components/tableControls/Edit.js +0 -1
  494. package/dist/components/tableControls/ExportCSV.js +0 -1
  495. package/dist/components/tableControls/ExportJson.js +0 -1
  496. package/dist/components/tableControls/FieldSortHide.js +0 -1
  497. package/dist/components/tableControls/Filters.js +0 -1
  498. package/dist/components/tableControls/FirstPage.js +0 -1
  499. package/dist/components/tableControls/HiddenCount.js +0 -1
  500. package/dist/components/tableControls/Hide.js +0 -1
  501. package/dist/components/tableControls/LastPage.js +0 -1
  502. package/dist/components/tableControls/NextPage.js +0 -1
  503. package/dist/components/tableControls/PageSelect.js +0 -1
  504. package/dist/components/tableControls/PageSize.js +0 -1
  505. package/dist/components/tableControls/PrevPage.js +0 -1
  506. package/dist/components/tableControls/Search.js +0 -1
  507. package/dist/components/tableControls/SelectCount.js +0 -1
  508. package/dist/components/tableControls/ShowAll.js +0 -1
  509. package/dist/components/tableControls/ShowHideFields.js +0 -1
  510. package/dist/components/tableControls/TableControl.js +0 -1
  511. package/dist/kempo-hljs.css +0 -1
  512. package/dist/kempo-styles.css +0 -1
  513. package/dist/kempo-vars.css +0 -1
  514. package/dist/utils/Server.js +0 -1
  515. package/dist/utils/cli.js +0 -1
  516. package/dist/utils/cookie.js +0 -1
  517. package/dist/utils/debounce.js +0 -1
  518. package/dist/utils/drag.js +0 -1
  519. package/dist/utils/element.js +0 -1
  520. package/dist/utils/files.js +0 -1
  521. package/dist/utils/formatTimestamp.js +0 -1
  522. package/dist/utils/fs-utils.js +0 -1
  523. package/dist/utils/fuzzyMatch.js +0 -1
  524. package/dist/utils/getPreferredTheme.js +0 -1
  525. package/dist/utils/loadCss.js +0 -1
  526. package/dist/utils/loadScript.js +0 -1
  527. package/dist/utils/minify.js +0 -1
  528. package/dist/utils/object.js +0 -1
  529. package/dist/utils/raf.js +0 -1
  530. package/dist/utils/string.js +0 -1
  531. package/dist/utils/toFunction.js +0 -1
  532. package/dist/utils/type.js +0 -1
  533. package/dist/utils/waitFrames.js +0 -1
  534. package/dist/utils/watchDirectoryHandle.js +0 -1
  535. package/dist/utils/watchWindowSize.js +0 -1
  536. package/docs/components/_template.html +0 -77
  537. package/docs/components/accordion.html +0 -124
  538. package/docs/components/card.html +0 -93
  539. package/docs/components/component.html +0 -92
  540. package/docs/components/content-slider.html +0 -195
  541. package/docs/components/dialog.html +0 -247
  542. package/docs/components/directory-viewer.html +0 -92
  543. package/docs/components/focus-capture.html +0 -70
  544. package/docs/components/icon.html +0 -160
  545. package/docs/components/import.html +0 -79
  546. package/docs/components/lazy-component.html +0 -86
  547. package/docs/components/reactive-component.html +0 -71
  548. package/docs/components/reactive-lazy-component.html +0 -71
  549. package/docs/components/resize.html +0 -154
  550. package/docs/components/search.html +0 -104
  551. package/docs/components/show-more.html +0 -125
  552. package/docs/components/side-menu.html +0 -148
  553. package/docs/components/sortable.html +0 -98
  554. package/docs/components/split.html +0 -128
  555. package/docs/components/table.html +0 -314
  556. package/docs/components/tableControls.html +0 -79
  557. package/docs/components/tableCustomFields.html +0 -115
  558. package/docs/components/tableFetchRecords.html +0 -116
  559. package/docs/components/tableFieldSortHide.html +0 -77
  560. package/docs/components/tablePagination.html +0 -102
  561. package/docs/components/tableRecordEditing.html +0 -146
  562. package/docs/components/tableRecordFiltering.html +0 -77
  563. package/docs/components/tableRecordHiding.html +0 -82
  564. package/docs/components/tableRecordSearching.html +0 -77
  565. package/docs/components/tableRecordSelection.html +0 -77
  566. package/docs/components/tableRowControls.html +0 -80
  567. package/docs/components/tableSorting.html +0 -75
  568. package/docs/components/tabs.html +0 -165
  569. package/docs/components/tags.html +0 -96
  570. package/docs/components/theme-switcher.html +0 -76
  571. package/docs/components/timestamp.html +0 -88
  572. package/docs/components/toast.html +0 -330
  573. package/docs/components/toggle.html +0 -157
  574. package/docs/icons/add.svg +0 -1
  575. package/docs/icons/arrow-back.svg +0 -1
  576. package/docs/icons/arrow-down-double.svg +0 -1
  577. package/docs/icons/arrow-down.svg +0 -1
  578. package/docs/icons/arrow-forward.svg +0 -1
  579. package/docs/icons/arrow-up-double.svg +0 -1
  580. package/docs/icons/arrow-up.svg +0 -1
  581. package/docs/icons/cards.svg +0 -1
  582. package/docs/icons/check.svg +0 -1
  583. package/docs/icons/chevron-left.svg +0 -1
  584. package/docs/icons/chevron-right.svg +0 -1
  585. package/docs/icons/close.svg +0 -2
  586. package/docs/icons/compare.svg +0 -1
  587. package/docs/icons/delete.svg +0 -1
  588. package/docs/icons/drag-handle.svg +0 -1
  589. package/docs/icons/drawing2.svg +0 -124
  590. package/docs/icons/edit.svg +0 -1
  591. package/docs/icons/error.svg +0 -1
  592. package/docs/icons/export-file.svg +0 -1
  593. package/docs/icons/file-text.svg +0 -1
  594. package/docs/icons/file.svg +0 -1
  595. package/docs/icons/filter-off.svg +0 -1
  596. package/docs/icons/filter.svg +0 -1
  597. package/docs/icons/first.svg +0 -1
  598. package/docs/icons/folder-clear.svg +0 -1
  599. package/docs/icons/folder-create.svg +0 -1
  600. package/docs/icons/folder-open.svg +0 -1
  601. package/docs/icons/folder.svg +0 -1
  602. package/docs/icons/hide.svg +0 -1
  603. package/docs/icons/image.svg +0 -1
  604. package/docs/icons/label-add.svg +0 -1
  605. package/docs/icons/label.svg +0 -1
  606. package/docs/icons/last.svg +0 -1
  607. package/docs/icons/menu.svg +0 -1
  608. package/docs/icons/mode-auto.svg +0 -1
  609. package/docs/icons/mode-dark.svg +0 -1
  610. package/docs/icons/mode-light.svg +0 -1
  611. package/docs/icons/open-in-browser.svg +0 -1
  612. package/docs/icons/pause.svg +0 -1
  613. package/docs/icons/play.svg +0 -1
  614. package/docs/icons/refresh.svg +0 -1
  615. package/docs/icons/remove.svg +0 -1
  616. package/docs/icons/save.svg +0 -1
  617. package/docs/icons/search.svg +0 -1
  618. package/docs/icons/settings.svg +0 -1
  619. package/docs/icons/storage.svg +0 -1
  620. package/docs/icons/table-visibility.svg +0 -1
  621. package/docs/icons/tag.svg +0 -1
  622. package/docs/icons/tools.svg +0 -1
  623. package/docs/icons/trash-x.svg +0 -1
  624. package/docs/icons/warning.svg +0 -1
  625. package/docs/index.html +0 -21
  626. package/docs/js/nav.inc.js +0 -4
  627. package/docs/kempo/components/Accordion.js +0 -1
  628. package/docs/kempo/components/Card.js +0 -1
  629. package/docs/kempo/components/Collapsible.js +0 -1
  630. package/docs/kempo/components/Component.js +0 -1
  631. package/docs/kempo/components/ContentSlider.js +0 -1
  632. package/docs/kempo/components/Dialog.js +0 -1
  633. package/docs/kempo/components/DirectoryViewer.js +0 -1
  634. package/docs/kempo/components/FocusCapture.js +0 -1
  635. package/docs/kempo/components/Icon.js +0 -1
  636. package/docs/kempo/components/Import.js +0 -1
  637. package/docs/kempo/components/LazyComponent.js +0 -1
  638. package/docs/kempo/components/PersistantCollapsible.js +0 -1
  639. package/docs/kempo/components/PhotoViewer.js +0 -1
  640. package/docs/kempo/components/ReactiveComponent.js +0 -1
  641. package/docs/kempo/components/ReactiveLazyComponent.js +0 -1
  642. package/docs/kempo/components/Resize.js +0 -1
  643. package/docs/kempo/components/Search.js +0 -1
  644. package/docs/kempo/components/ShowMore.js +0 -1
  645. package/docs/kempo/components/SideMenu.js +0 -1
  646. package/docs/kempo/components/Sortable.js +0 -1
  647. package/docs/kempo/components/Split.js +0 -1
  648. package/docs/kempo/components/Stacks.js +0 -1
  649. package/docs/kempo/components/Table.js +0 -1
  650. package/docs/kempo/components/Tabs.js +0 -1
  651. package/docs/kempo/components/Tags.js +0 -1
  652. package/docs/kempo/components/ThemeSwitcher.js +0 -1
  653. package/docs/kempo/components/Timestamp.js +0 -1
  654. package/docs/kempo/components/Toast.js +0 -1
  655. package/docs/kempo/components/Toggle.js +0 -1
  656. package/docs/kempo/components/tableControls/DeleteRecord.js +0 -1
  657. package/docs/kempo/components/tableControls/DeleteSelected.js +0 -1
  658. package/docs/kempo/components/tableControls/Edit.js +0 -1
  659. package/docs/kempo/components/tableControls/ExportCSV.js +0 -1
  660. package/docs/kempo/components/tableControls/ExportJson.js +0 -1
  661. package/docs/kempo/components/tableControls/FieldSortHide.js +0 -1
  662. package/docs/kempo/components/tableControls/Filters.js +0 -1
  663. package/docs/kempo/components/tableControls/FirstPage.js +0 -1
  664. package/docs/kempo/components/tableControls/HiddenCount.js +0 -1
  665. package/docs/kempo/components/tableControls/Hide.js +0 -1
  666. package/docs/kempo/components/tableControls/LastPage.js +0 -1
  667. package/docs/kempo/components/tableControls/NextPage.js +0 -1
  668. package/docs/kempo/components/tableControls/PageSelect.js +0 -1
  669. package/docs/kempo/components/tableControls/PageSize.js +0 -1
  670. package/docs/kempo/components/tableControls/PrevPage.js +0 -1
  671. package/docs/kempo/components/tableControls/Search.js +0 -1
  672. package/docs/kempo/components/tableControls/SelectCount.js +0 -1
  673. package/docs/kempo/components/tableControls/ShowAll.js +0 -1
  674. package/docs/kempo/components/tableControls/ShowHideFields.js +0 -1
  675. package/docs/kempo/components/tableControls/TableControl.js +0 -1
  676. package/docs/kempo/index.js +0 -1
  677. package/docs/kempo/kempo-hljs.css +0 -1
  678. package/docs/kempo/kempo-styles.css +0 -1
  679. package/docs/kempo/kempo-vars.css +0 -1
  680. package/docs/kempo/utils/Server.js +0 -1
  681. package/docs/kempo/utils/cli.js +0 -1
  682. package/docs/kempo/utils/cookie.js +0 -1
  683. package/docs/kempo/utils/debounce.js +0 -1
  684. package/docs/kempo/utils/drag.js +0 -1
  685. package/docs/kempo/utils/element.js +0 -1
  686. package/docs/kempo/utils/files.js +0 -1
  687. package/docs/kempo/utils/formatTimestamp.js +0 -1
  688. package/docs/kempo/utils/fs-utils.js +0 -1
  689. package/docs/kempo/utils/fuzzyMatch.js +0 -1
  690. package/docs/kempo/utils/getPreferredTheme.js +0 -1
  691. package/docs/kempo/utils/loadCss.js +0 -1
  692. package/docs/kempo/utils/loadScript.js +0 -1
  693. package/docs/kempo/utils/minify.js +0 -1
  694. package/docs/kempo/utils/object.js +0 -1
  695. package/docs/kempo/utils/raf.js +0 -1
  696. package/docs/kempo/utils/string.js +0 -1
  697. package/docs/kempo/utils/toFunction.js +0 -1
  698. package/docs/kempo/utils/type.js +0 -1
  699. package/docs/kempo/utils/waitFrames.js +0 -1
  700. package/docs/kempo/utils/watchDirectoryHandle.js +0 -1
  701. package/docs/kempo/utils/watchWindowSize.js +0 -1
  702. package/docs/nav.inc.html +0 -74
  703. package/docs/search.json +0 -400
  704. package/docs/styles/_template.html +0 -26
  705. package/docs/styles/borders-spacing.html +0 -197
  706. package/docs/styles/buttons.html +0 -117
  707. package/docs/styles/colors.html +0 -69
  708. package/docs/styles/displays-layouts.html +0 -162
  709. package/docs/styles/embed-1.html +0 -40
  710. package/docs/styles/inputs.html +0 -93
  711. package/docs/styles/tables.html +0 -147
  712. package/docs/styles/typography.html +0 -120
  713. package/docs/utils/Server.html +0 -119
  714. package/docs/utils/_template.html +0 -77
  715. package/docs/utils/cli.html +0 -86
  716. package/docs/utils/cookie.html +0 -89
  717. package/docs/utils/debounce.html +0 -63
  718. package/docs/utils/drag.html +0 -87
  719. package/docs/utils/element.html +0 -126
  720. package/docs/utils/format-timestamp.html +0 -66
  721. package/docs/utils/fuzzy-match.html +0 -60
  722. package/icons/add.svg +0 -1
  723. package/icons/arrow-back.svg +0 -1
  724. package/icons/arrow-down-double.svg +0 -1
  725. package/icons/arrow-down.svg +0 -1
  726. package/icons/arrow-forward.svg +0 -1
  727. package/icons/arrow-up-double.svg +0 -1
  728. package/icons/arrow-up.svg +0 -1
  729. package/icons/cards.svg +0 -1
  730. package/icons/check.svg +0 -1
  731. package/icons/chevron-left.svg +0 -1
  732. package/icons/chevron-right.svg +0 -1
  733. package/icons/close.svg +0 -2
  734. package/icons/compare.svg +0 -1
  735. package/icons/delete.svg +0 -1
  736. package/icons/drag-handle.svg +0 -1
  737. package/icons/drawing2.svg +0 -124
  738. package/icons/edit.svg +0 -1
  739. package/icons/error.svg +0 -1
  740. package/icons/export-file.svg +0 -1
  741. package/icons/file-text.svg +0 -1
  742. package/icons/file.svg +0 -1
  743. package/icons/filter-off.svg +0 -1
  744. package/icons/filter.svg +0 -1
  745. package/icons/first.svg +0 -1
  746. package/icons/folder-clear.svg +0 -1
  747. package/icons/folder-create.svg +0 -1
  748. package/icons/folder-open.svg +0 -1
  749. package/icons/folder.svg +0 -1
  750. package/icons/hide.svg +0 -1
  751. package/icons/image.svg +0 -1
  752. package/icons/label-add.svg +0 -1
  753. package/icons/label.svg +0 -1
  754. package/icons/last.svg +0 -1
  755. package/icons/menu.svg +0 -1
  756. package/icons/mode-auto.svg +0 -1
  757. package/icons/mode-dark.svg +0 -1
  758. package/icons/mode-light.svg +0 -1
  759. package/icons/open-in-browser.svg +0 -1
  760. package/icons/pause.svg +0 -1
  761. package/icons/play.svg +0 -1
  762. package/icons/refresh.svg +0 -1
  763. package/icons/remove.svg +0 -1
  764. package/icons/save.svg +0 -1
  765. package/icons/search.svg +0 -1
  766. package/icons/settings.svg +0 -1
  767. package/icons/show.svg +0 -1
  768. package/icons/storage.svg +0 -1
  769. package/icons/table-visibility.svg +0 -1
  770. package/icons/tag.svg +0 -1
  771. package/icons/tools.svg +0 -1
  772. package/icons/trash-x.svg +0 -1
  773. package/icons/warning.svg +0 -1
  774. package/scripts/build.js +0 -154
  775. package/scripts/docs.js +0 -47
  776. package/src/components/Accordion.js +0 -182
  777. package/src/components/Card.js +0 -62
  778. package/src/components/Collapsible.js +0 -104
  779. package/src/components/Component.js +0 -110
  780. package/src/components/ContentSlider.js +0 -192
  781. package/src/components/Dialog.js +0 -338
  782. package/src/components/DirectoryViewer.js +0 -363
  783. package/src/components/FocusCapture.js +0 -31
  784. package/src/components/Icon.js +0 -119
  785. package/src/components/Import.js +0 -48
  786. package/src/components/LazyComponent.js +0 -65
  787. package/src/components/PersistantCollapsible.js +0 -44
  788. package/src/components/PhotoViewer.js +0 -358
  789. package/src/components/ReactiveComponent.js +0 -11
  790. package/src/components/ReactiveLazyComponent.js +0 -11
  791. package/src/components/Resize.js +0 -168
  792. package/src/components/Search.js +0 -140
  793. package/src/components/ShowMore.js +0 -102
  794. package/src/components/SideMenu.js +0 -150
  795. package/src/components/Sortable.js +0 -169
  796. package/src/components/Split.js +0 -164
  797. package/src/components/Table.js +0 -935
  798. package/src/components/Tabs.js +0 -349
  799. package/src/components/Tags.js +0 -224
  800. package/src/components/ThemeSwitcher.js +0 -100
  801. package/src/components/Timestamp.js +0 -28
  802. package/src/components/Toast.js +0 -424
  803. package/src/components/Toggle.js +0 -137
  804. package/src/components/tableControls/DeleteRecord.js +0 -43
  805. package/src/components/tableControls/DeleteSelected.js +0 -70
  806. package/src/components/tableControls/Edit.js +0 -84
  807. package/src/components/tableControls/ExportCSV.js +0 -91
  808. package/src/components/tableControls/ExportJson.js +0 -62
  809. package/src/components/tableControls/FieldSortHide.js +0 -77
  810. package/src/components/tableControls/Filters.js +0 -129
  811. package/src/components/tableControls/FirstPage.js +0 -69
  812. package/src/components/tableControls/HiddenCount.js +0 -37
  813. package/src/components/tableControls/Hide.js +0 -40
  814. package/src/components/tableControls/LastPage.js +0 -67
  815. package/src/components/tableControls/NextPage.js +0 -69
  816. package/src/components/tableControls/PageSelect.js +0 -89
  817. package/src/components/tableControls/PageSize.js +0 -70
  818. package/src/components/tableControls/PrevPage.js +0 -69
  819. package/src/components/tableControls/Search.js +0 -49
  820. package/src/components/tableControls/SelectCount.js +0 -42
  821. package/src/components/tableControls/ShowAll.js +0 -37
  822. package/src/components/tableControls/TableControl.js +0 -51
  823. package/src/kempo-hljs.css +0 -146
  824. package/src/kempo-styles.css +0 -952
  825. package/src/kempo-vars.css +0 -159
  826. package/src/utils/Server.js +0 -189
  827. package/src/utils/cli.js +0 -119
  828. package/src/utils/cookie.js +0 -20
  829. package/src/utils/debounce.js +0 -9
  830. package/src/utils/drag.js +0 -74
  831. package/src/utils/element.js +0 -81
  832. package/src/utils/formatTimestamp.js +0 -27
  833. package/src/utils/fs-utils.js +0 -41
  834. package/src/utils/fuzzyMatch.js +0 -60
  835. package/src/utils/getPreferredTheme.js +0 -1
  836. package/src/utils/loadCss.js +0 -10
  837. package/src/utils/loadScript.js +0 -10
  838. package/src/utils/object.js +0 -198
  839. package/src/utils/raf.js +0 -10
  840. package/src/utils/string.js +0 -66
  841. package/src/utils/toFunction.js +0 -24
  842. package/src/utils/type.js +0 -13
  843. package/src/utils/waitFrames.js +0 -17
  844. package/src/utils/watchDirectoryHandle.js +0 -18
  845. package/src/utils/watchWindowSize.js +0 -15
  846. package/test/components/SuiteList.js +0 -26
  847. package/test/components/Test.js +0 -357
  848. package/test/index.html +0 -49
  849. package/test/index.js +0 -36
  850. package/test/suite.html +0 -45
  851. package/test/suites.inc.html +0 -4
  852. package/test/tests/components/Component.test.js +0 -138
  853. package/test/tests/utils/cli.test.js +0 -113
  854. package/test/tests/utils/cookie.test.js +0 -87
  855. package/test/tests/utils/debounce.test.js +0 -71
  856. /package/{docs/icons/show.svg → dist/admin/icons/visibility.svg} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src\\admin\\components\\FragmentEditor.js","names":["ShadowComponent","html","getFragment","updateFragment","deleteFragments","moveFragment","listDirectories","Dialog","Toast","FragmentEditor","static","loading","state","error","saving","fragment","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","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 { getFragment, updateFragment, deleteFragments, moveFragment, 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 FragmentEditor extends ShadowComponent {\n static properties = {\n loading: { state: true },\n error: { state: true },\n saving: { state: true },\n fragment: { state: true }\n };\n\n constructor() {\n super();\n this.loading = true;\n this.error = false;\n this.saving = false;\n this.fragment = 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('fragment');\n this.file = param ? param + '.fragment.html' : '';\n\n if(!this.file){\n this.loading = false;\n this.error = true;\n return;\n }\n\n const [err, fragment] = await getFragment(this.file);\n this.loading = false;\n\n if(err){\n this.error = true;\n return;\n }\n\n this.fragment = fragment;\n document.title = `Edit: ${fragment.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.fragment.name,\n markup: root.querySelector('k-code-editor')?.getValue() ?? this.fragment.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.fragment?.locked) this.handleSave();\n }\n };\n\n handleDelete = () => {\n Dialog.confirm('Delete this fragment? This action cannot be undone.', async confirmed => {\n if(!confirmed) return;\n const [error] = await deleteFragments([this.file]);\n if(error){\n Toast.error(error.msg || 'Failed to delete fragment');\n return;\n }\n Toast.success('Fragment deleted');\n setTimeout(() => { window.location.href = '/admin/content/fragments'; }, 1000);\n });\n };\n\n handleMove = async () => {\n const [, dirData] = await listDirectories();\n const directories = dirData?.directories || ['.'];\n\n const parts = this.file.replace(/\\.fragment\\.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-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>Fragment 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 Fragment',\n confirmText: 'Save and Move Fragment',\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('Fragment 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}.fragment.html`\n : `${newDir}/${newName}.fragment.html`;\n\n this.saving = true;\n const [saveError] = await updateFragment({ file: this.file, markup: this.getFormState().markup });\n this.saving = false;\n if(saveError){\n Toast.error(saveError.msg || 'Failed to save fragment');\n return;\n }\n\n const [moveError, moved] = await moveFragment({ file: this.file, newFile });\n if(moveError){\n Toast.error(moveError.msg || 'Failed to move fragment');\n return;\n }\n\n Toast.success('Fragment saved and moved');\n const newParam = moved.file.replace(/\\.fragment\\.html$/, '');\n setTimeout(() => {\n window.location.href = `/admin/content/fragments/edit?fragment=${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 handleReset = () => {\n Dialog.confirm('Reset this fragment? Any unsaved changes will be lost.', confirmed => {\n if(!confirmed) return;\n this.fragment = { ...this.fragment };\n });\n };\n\n handleSave = async () => {\n this.saving = true;\n const state = this.getFormState();\n const [saveError, saved] = await updateFragment({ file: this.file, markup: state.markup });\n this.saving = false;\n\n if(saveError){\n Toast.error(saveError.msg || 'Failed to save fragment');\n return;\n }\n\n this.fragment = { ...this.fragment, 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(/\\.fragment\\.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}.fragment.html` : `${newSlug}.fragment.html`;\n const [moveError, moved] = await moveFragment({ file: this.file, newFile });\n if(moveError){\n Toast.error(moveError.msg || 'Failed to rename fragment file');\n return;\n }\n Toast.success('Fragment saved and renamed');\n const newParam = moved.file.replace(/\\.fragment\\.html$/, '');\n setTimeout(() => {\n window.location.href = `/admin/content/fragments/edit?fragment=${encodeURIComponent(newParam)}`;\n }, 1000);\n return;\n }\n\n document.title = `Edit: ${this.fragment.name} - Admin`;\n Toast.success('Fragment saved');\n };\n\n /*\n Render\n */\n\n render() {\n if(this.loading) return html`<div>Loading fragment...</div>`;\n\n if(this.error) return html`\n <div>\n <p>Fragment not found.</p>\n <a href=\"/admin/content/fragments\">Back to Fragments</a>\n </div>\n `;\n\n const { fragment } = this;\n const isCustom = fragment.owner === 'custom';\n const isLocked = fragment.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 fragment is locked and cannot be edited. It is managed by ${isCustom ? 'an extension' : 'the system'}.\n </div>\n ` : ''}\n <div class=\"d-f mb\">\n <div class=\"btn-grp mrh mb\">\n <a href=\"/admin/content/fragments\" class=\"btn\">\n <k-icon name=\"arrow\" direction=\"left\"></k-icon> Fragments\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 Fragment</button>\n </div>\n ` : ''}\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\">Fragment: ${fragment.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=\"${fragment.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(/\\.fragment\\.html$/, '').split('/'); parts.pop(); return parts.length ? parts.join('/') : '/'; })()}</span>\n ${isCustom && !isLocked ? html`\n <button class=\"icon-btn no-btn ph\" title=\"Move Fragment\" @click=\"${this.handleMove}\"><k-icon name=\"drive_file_move\"></k-icon></button>\n ` : ''}\n </div>\n ${fragment.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\">${fragment.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\">${fragment.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\">${fragment.createdAt ? new Date(fragment.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\">${fragment.updatedAt ? new Date(fragment.updatedAt).toLocaleString() : ''}</span>\n </div>\n </div>\n </k-accordion-panel>\n <k-accordion-header for-panel=\"fragment\" active>Fragment</k-accordion-header>\n <k-accordion-panel name=\"fragment\" active>\n <div class=\"p\">\n <k-code-editor\n class=\"r b\"\n language=\"html\"\n .value=\"${fragment.markup || ''}\"\n style=\"height: 500px;\"\n ?disabled=\"${isLocked}\"\n ></k-code-editor>\n </div>\n </k-accordion-panel>\n </k-accordion>\n `;\n }\n}\n\ncustomElements.define('admin-fragment-editor', FragmentEditor);\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,85 @@
1
+ import ShadowComponent from"/kempo-ui/components/ShadowComponent.js";import{html}from"/kempo-ui/lit-all.min.js";import{getGlobalContent,updateGlobalContent,deleteGlobalContent}from"/kempo/sdk.js";import Dialog from"/kempo-ui/components/Dialog.js";import Toast from"/kempo-ui/components/Toast.js";import"/kempo-ui/components/Icon.js";import"/kempo-ui/components/Accordion.js";import"/kempo-ui/components/CodeEditor.js";export default class GlobalContentEditor extends ShadowComponent{static properties={loading:{state:!0},error:{state:!0},saving:{state:!0},entry:{state:!0}};constructor(){super(),this.loading=!0,this.error=!1,this.saving=!1,this.entry=null,this.entryId=""}async connectedCallback(){if(super.connectedCallback(),document.addEventListener("keydown",this.handleKeyDown),this.entryId=new URLSearchParams(window.location.search).get("id")||"",!this.entryId)return this.loading=!1,void(this.error=!0);const[e,t]=await getGlobalContent(this.entryId);this.loading=!1,e?this.error=!0:(this.entry=t,document.title=`Edit: ${t.name||this.entryId} - Admin`)}disconnectedCallback(){super.disconnectedCallback(),document.removeEventListener("keydown",this.handleKeyDown)}handleKeyDown=e=>{(e.ctrlKey||e.metaKey)&&"s"===e.key&&(e.preventDefault(),this.saving||this.entry?.locked||this.handleSave())};handleSave=async()=>{this.saving=!0;const e=this.shadowRoot,t=e.querySelector("#metaName").value,n=e.querySelector("#metaLocation").value,a=e.querySelector("#metaPriority").value,o=e.querySelector("k-code-editor"),i=o?o.getValue():this.entry.markup,[s,l]=await updateGlobalContent({id:this.entryId,name:t,location:n,priority:a,markup:i});this.saving=!1,s?Toast.error(s.msg||"Failed to save global content"):(this.entry={...this.entry,name:t,location:n,priority:a,markup:i,updatedAt:l.updatedAt},document.title=`Edit: ${t||this.entryId} - Admin`,Toast.success("Global content saved"))};handleReset=()=>{Dialog.confirm("Reset this entry? Any unsaved changes will be lost.",e=>{e&&(this.entry={...this.entry})})};handleDelete=()=>{Dialog.confirm("Delete this global content entry? This action cannot be undone.",async e=>{if(!e)return;const[t]=await deleteGlobalContent([this.entryId]);t?Toast.error(t.msg||"Failed to delete global content"):(Toast.success("Global content deleted"),setTimeout(()=>{window.location.href="/admin/content/globals"},1e3))})};render(){if(this.loading)return html`<div>Loading global content...</div>`;if(this.error)return html`
2
+ <div>
3
+ <p>Global content entry not found.</p>
4
+ <a href="/admin/content/globals">Back to Global Content</a>
5
+ </div>
6
+ `;const{entry:e}=this,t="system"===e.owner,n=e.locked;return html`
7
+ ${n?html`
8
+ <div class="p r mb bc-warning tc-warning">
9
+ <k-icon name="lock"></k-icon> This entry is locked and cannot be edited. It is managed by ${t?"the system":"an extension"}.
10
+ </div>
11
+ `:""}
12
+ <div class="d-f mb">
13
+ <div class="btn-grp mrh mb">
14
+ <a href="/admin/content/globals" class="btn">
15
+ <k-icon name="arrow" direction="left"></k-icon> Global Content
16
+ </a>
17
+ </div>
18
+ <div class="flex"></div>
19
+ ${t||n?"":html`
20
+ <div class="btn-grp mrh mb">
21
+ <button class="danger" @click="${this.handleDelete}"><k-icon name="delete"></k-icon> Delete</button>
22
+ </div>
23
+ `}
24
+ ${n?"":html`
25
+ <div class="btn-grp mrh mb">
26
+ <button @click="${this.handleReset}"><k-icon name="restart_alt"></k-icon> Reset</button>
27
+ <button id="saveBtn" class="primary" ?disabled="${this.saving}" @click="${this.handleSave}">
28
+ <k-icon name="save"></k-icon> Save
29
+ </button>
30
+ </div>
31
+ `}
32
+ </div>
33
+ <h1 class="mb">Global Content: ${e.name||this.entryId}</h1>
34
+
35
+ <k-accordion>
36
+ <k-accordion-header for-panel="metadata">Metadata</k-accordion-header>
37
+ <k-accordion-panel name="metadata">
38
+ <div class="p">
39
+ <div class="d-f mb" style="align-items: center; gap: var(--spacer);">
40
+ <label style="min-width: 120px;"><strong>Name</strong></label>
41
+ <input type="text" id="metaName" class="flex" .value="${e.name||""}" ?disabled="${t||n}">
42
+ </div>
43
+ <div class="d-f mb" style="align-items: center; gap: var(--spacer);">
44
+ <label style="min-width: 120px;"><strong>Location</strong></label>
45
+ <input type="text" id="metaLocation" class="flex" .value="${e.location||""}" ?disabled="${t||n}">
46
+ </div>
47
+ <div class="d-f mb" style="align-items: center; gap: var(--spacer);">
48
+ <label style="min-width: 120px;"><strong>Priority</strong></label>
49
+ <input type="number" id="metaPriority" class="flex" .value="${e.priority??0}" ?disabled="${t||n}">
50
+ </div>
51
+ ${t?"":html`
52
+ <div class="d-f mb" style="align-items: center; gap: var(--spacer);">
53
+ <label style="min-width: 120px;"><strong>Author</strong></label>
54
+ <span class="muted">${e.author||""}</span>
55
+ </div>
56
+ `}
57
+ <div class="d-f mb" style="align-items: center; gap: var(--spacer);">
58
+ <label style="min-width: 120px;"><strong>Owner</strong></label>
59
+ <span class="muted">${e.owner||""}</span>
60
+ </div>
61
+ <div class="d-f mb" style="align-items: center; gap: var(--spacer);">
62
+ <label style="min-width: 120px;"><strong>Created</strong></label>
63
+ <span class="muted">${e.createdAt?new Date(e.createdAt).toLocaleString():""}</span>
64
+ </div>
65
+ <div class="d-f" style="align-items: center; gap: var(--spacer);">
66
+ <label style="min-width: 120px;"><strong>Updated</strong></label>
67
+ <span class="muted">${e.updatedAt?new Date(e.updatedAt).toLocaleString():""}</span>
68
+ </div>
69
+ </div>
70
+ </k-accordion-panel>
71
+ <k-accordion-header for-panel="content" active>Content</k-accordion-header>
72
+ <k-accordion-panel name="content" active>
73
+ <div class="p">
74
+ <k-code-editor
75
+ class="r b"
76
+ language="html"
77
+ .value="${e.markup||""}"
78
+ style="height: 500px;"
79
+ ?disabled="${n}"
80
+ ></k-code-editor>
81
+ </div>
82
+ </k-accordion-panel>
83
+ </k-accordion>
84
+ `}}customElements.define("admin-global-content-editor",GlobalContentEditor);
85
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\admin\components\GlobalContentEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src\\admin\\components\\GlobalContentEditor.js","names":["ShadowComponent","html","getGlobalContent","updateGlobalContent","deleteGlobalContent","Dialog","Toast","GlobalContentEditor","static","loading","state","error","saving","entry","constructor","super","this","entryId","connectedCallback","document","addEventListener","handleKeyDown","URLSearchParams","window","location","search","get","err","title","name","disconnectedCallback","removeEventListener","e","ctrlKey","metaKey","key","preventDefault","locked","handleSave","async","root","shadowRoot","querySelector","value","priority","editor","markup","getValue","saveError","saved","id","msg","updatedAt","success","handleReset","confirm","confirmed","handleDelete","setTimeout","href","render","isSystem","owner","isLocked","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 { getGlobalContent, updateGlobalContent, deleteGlobalContent } 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 GlobalContentEditor extends ShadowComponent {\n static properties = {\n loading: { state: true },\n error: { state: true },\n saving: { state: true },\n entry: { state: true }\n };\n\n constructor() {\n super();\n this.loading = true;\n this.error = false;\n this.saving = false;\n this.entry = null;\n this.entryId = '';\n }\n\n async connectedCallback() {\n super.connectedCallback();\n document.addEventListener('keydown', this.handleKeyDown);\n this.entryId = new URLSearchParams(window.location.search).get('id') || '';\n\n if(!this.entryId){\n this.loading = false;\n this.error = true;\n return;\n }\n\n const [err, entry] = await getGlobalContent(this.entryId);\n this.loading = false;\n\n if(err){\n this.error = true;\n return;\n }\n\n this.entry = entry;\n document.title = `Edit: ${entry.name || this.entryId} - Admin`;\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener('keydown', this.handleKeyDown);\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.entry?.locked) this.handleSave();\n }\n };\n\n handleSave = async () => {\n this.saving = true;\n const root = this.shadowRoot;\n const name = root.querySelector('#metaName').value;\n const location = root.querySelector('#metaLocation').value;\n const priority = root.querySelector('#metaPriority').value;\n const editor = root.querySelector('k-code-editor');\n const markup = editor ? editor.getValue() : this.entry.markup;\n\n const [saveError, saved] = await updateGlobalContent({\n id: this.entryId, name, location, priority, markup\n });\n this.saving = false;\n\n if(saveError){\n Toast.error(saveError.msg || 'Failed to save global content');\n return;\n }\n\n this.entry = { ...this.entry, name, location, priority, markup, updatedAt: saved.updatedAt };\n document.title = `Edit: ${name || this.entryId} - Admin`;\n Toast.success('Global content saved');\n };\n\n handleReset = () => {\n Dialog.confirm('Reset this entry? Any unsaved changes will be lost.', confirmed => {\n if(!confirmed) return;\n this.entry = { ...this.entry };\n });\n };\n\n handleDelete = () => {\n Dialog.confirm('Delete this global content entry? This action cannot be undone.', async confirmed => {\n if(!confirmed) return;\n const [error] = await deleteGlobalContent([this.entryId]);\n if(error){\n Toast.error(error.msg || 'Failed to delete global content');\n return;\n }\n Toast.success('Global content deleted');\n setTimeout(() => { window.location.href = '/admin/content/globals'; }, 1000);\n });\n };\n\n /*\n Render\n */\n\n render() {\n if(this.loading) return html`<div>Loading global content...</div>`;\n\n if(this.error) return html`\n <div>\n <p>Global content entry not found.</p>\n <a href=\"/admin/content/globals\">Back to Global Content</a>\n </div>\n `;\n\n const { entry } = this;\n const isSystem = entry.owner === 'system';\n const isLocked = entry.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 entry is locked and cannot be edited. It is managed by ${isSystem ? 'the system' : 'an extension'}.\n </div>\n ` : ''}\n <div class=\"d-f mb\">\n <div class=\"btn-grp mrh mb\">\n <a href=\"/admin/content/globals\" class=\"btn\">\n <k-icon name=\"arrow\" direction=\"left\"></k-icon> Global Content\n </a>\n </div>\n <div class=\"flex\"></div>\n ${!isSystem && !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 </div>\n ` : ''}\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 <h1 class=\"mb\">Global Content: ${entry.name || this.entryId}</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=\"${entry.name || ''}\" ?disabled=\"${isSystem || isLocked}\">\n </div>\n <div class=\"d-f mb\" style=\"align-items: center; gap: var(--spacer);\">\n <label style=\"min-width: 120px;\"><strong>Location</strong></label>\n <input type=\"text\" id=\"metaLocation\" class=\"flex\" .value=\"${entry.location || ''}\" ?disabled=\"${isSystem || isLocked}\">\n </div>\n <div class=\"d-f mb\" style=\"align-items: center; gap: var(--spacer);\">\n <label style=\"min-width: 120px;\"><strong>Priority</strong></label>\n <input type=\"number\" id=\"metaPriority\" class=\"flex\" .value=\"${entry.priority ?? 0}\" ?disabled=\"${isSystem || isLocked}\">\n </div>\n ${!isSystem ? 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\">${entry.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\">${entry.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\">${entry.createdAt ? new Date(entry.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\">${entry.updatedAt ? new Date(entry.updatedAt).toLocaleString() : ''}</span>\n </div>\n </div>\n </k-accordion-panel>\n <k-accordion-header for-panel=\"content\" active>Content</k-accordion-header>\n <k-accordion-panel name=\"content\" active>\n <div class=\"p\">\n <k-code-editor\n class=\"r b\"\n language=\"html\"\n .value=\"${entry.markup || ''}\"\n style=\"height: 500px;\"\n ?disabled=\"${isLocked}\"\n ></k-code-editor>\n </div>\n </k-accordion-panel>\n </k-accordion>\n `;\n }\n}\n\ncustomElements.define('admin-global-content-editor', GlobalContentEditor);\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ import TableControl from"/kempo-ui/components/tableControls/TableControl.js";import{html}from"/kempo-ui/lit-all.min.js";import"/kempo-ui/components/Icon.js";export default class GroupDeleteSelected extends TableControl{constructor(){super({maxWidth:null}),this.selectionChangeHandler=()=>this.requestUpdate()}connectedCallback(){super.connectedCallback(),this.onTableEvent("selectionChange",this.selectionChangeHandler)}disconnectedCallback(){super.disconnectedCallback(),this.table&&this.table.removeEventListener("selectionChange",this.selectionChangeHandler)}deleteSelected=()=>{if(!this.table)return;const e=this.table.getSelectedRecords(),t=e.filter(e=>"system:Users"!==e.name);if(!t.length)return;const l=e.some(e=>"system:Users"===e.name);this.dispatchEvent(new CustomEvent("groupRemoveSelected",{detail:{records:t,systemUsersSkipped:l},bubbles:!0}))};get deletableCount(){return this.table?this.table.getSelectedRecords().filter(e=>"system:Users"!==e.name).length:0}render(){return html`
2
+ <button class="no-btn icon-btn" ?disabled="${0===this.deletableCount}" @click="${this.deleteSelected}">
3
+ <k-icon name="delete"></k-icon>
4
+ </button>
5
+ `}}customElements.define("admin-group-delete-selected",GroupDeleteSelected);
6
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\admin\components\GroupDeleteSelected.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src\\admin\\components\\GroupDeleteSelected.js","names":["TableControl","html","GroupDeleteSelected","constructor","super","maxWidth","this","selectionChangeHandler","requestUpdate","connectedCallback","onTableEvent","disconnectedCallback","table","removeEventListener","deleteSelected","selected","getSelectedRecords","records","filter","r","name","length","systemUsersSkipped","some","dispatchEvent","CustomEvent","detail","bubbles","deletableCount","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 '/kempo-ui/components/Icon.js';\r\n\r\nexport default class GroupDeleteSelected extends TableControl {\r\n constructor() {\r\n super({ maxWidth: null });\r\n this.selectionChangeHandler = () => this.requestUpdate();\r\n }\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.onTableEvent('selectionChange', this.selectionChangeHandler);\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n if(this.table) this.table.removeEventListener('selectionChange', this.selectionChangeHandler);\r\n }\r\n\r\n deleteSelected = () => {\r\n if(!this.table) return;\r\n const selected = this.table.getSelectedRecords();\r\n const records = selected.filter(r => r.name !== 'system:Users');\r\n if(!records.length) return;\r\n const systemUsersSkipped = selected.some(r => r.name === 'system:Users');\r\n this.dispatchEvent(new CustomEvent('groupRemoveSelected', {\r\n detail: { records, systemUsersSkipped },\r\n bubbles: true\r\n }));\r\n };\r\n\r\n get deletableCount() {\r\n if(!this.table) return 0;\r\n return this.table.getSelectedRecords().filter(r => r.name !== 'system:Users').length;\r\n }\r\n\r\n render() {\r\n return html`\r\n <button class=\"no-btn icon-btn\" ?disabled=\"${this.deletableCount === 0}\" @click=\"${this.deleteSelected}\">\r\n <k-icon name=\"delete\"></k-icon>\r\n </button>\r\n `;\r\n }\r\n}\r\n\r\ncustomElements.define('admin-group-delete-selected', GroupDeleteSelected);\r\n"],"mappings":"OAAOA,iBAAkB,4DAChBC,SAAY,iCACd,8CAEQ,MAAMC,4BAA4BF,aAC/C,WAAAG,GACEC,MAAM,CAAEC,SAAU,OAClBC,KAAKC,uBAAyB,IAAMD,KAAKE,eAC3C,CAEA,iBAAAC,GACEL,MAAMK,oBACNH,KAAKI,aAAa,kBAAmBJ,KAAKC,uBAC5C,CAEA,oBAAAI,GACEP,MAAMO,uBACHL,KAAKM,OAAON,KAAKM,MAAMC,oBAAoB,kBAAmBP,KAAKC,uBACxE,CAEAO,eAAiB,KACf,IAAIR,KAAKM,MAAO,OAChB,MAAMG,EAAWT,KAAKM,MAAMI,qBACtBC,EAAUF,EAASG,OAAOC,GAAgB,iBAAXA,EAAEC,MACvC,IAAIH,EAAQI,OAAQ,OACpB,MAAMC,EAAqBP,EAASQ,KAAKJ,GAAgB,iBAAXA,EAAEC,MAChDd,KAAKkB,cAAc,IAAIC,YAAY,sBAAuB,CACxDC,OAAQ,CAAET,UAASK,sBACnBK,SAAS,MAIb,kBAAIC,GACF,OAAItB,KAAKM,MACFN,KAAKM,MAAMI,qBAAqBE,OAAOC,GAAgB,iBAAXA,EAAEC,MAAyBC,OADvD,CAEzB,CAEA,MAAAQ,GACE,OAAO5B,IAAI;mDAC4D,IAAxBK,KAAKsB,2BAAiCtB,KAAKQ;;;KAI5F,EAGFgB,eAAeC,OAAO,8BAA+B7B","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ import TableControl from"/kempo-ui/components/tableControls/TableControl.js";import{html}from"/kempo-ui/lit-all.min.js";import"/kempo-ui/components/Icon.js";export default class GroupRemoveRecord extends TableControl{remove=()=>{this.record&&this.table.deleteRecord(this.record)};render(){return"system:Users"===this.record?.name?html``:html`
2
+ <button class="no-btn icon-btn" @click="${this.remove}">
3
+ <k-icon name="delete"></k-icon>
4
+ </button>
5
+ `}}customElements.define("admin-group-remove-record",GroupRemoveRecord);
6
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\admin\components\GroupRemoveRecord.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src\\admin\\components\\GroupRemoveRecord.js","names":["TableControl","html","GroupRemoveRecord","remove","this","record","table","deleteRecord","render","name","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 '/kempo-ui/components/Icon.js';\r\n\r\nexport default class GroupRemoveRecord extends TableControl {\r\n remove = () => {\r\n if(this.record) this.table.deleteRecord(this.record);\r\n };\r\n\r\n render() {\r\n if(this.record?.name === 'system:Users') return html``;\r\n return html`\r\n <button class=\"no-btn icon-btn\" @click=\"${this.remove}\">\r\n <k-icon name=\"delete\"></k-icon>\r\n </button>\r\n `;\r\n }\r\n}\r\n\r\ncustomElements.define('admin-group-remove-record', GroupRemoveRecord);\r\n"],"mappings":"OAAOA,iBAAkB,4DAChBC,SAAY,iCACd,8CAEQ,MAAMC,0BAA0BF,aAC7CG,OAAS,KACJC,KAAKC,QAAQD,KAAKE,MAAMC,aAAaH,KAAKC,SAG/C,MAAAG,GACE,MAAyB,iBAAtBJ,KAAKC,QAAQI,KAAgCR,IAAI,GAC7CA,IAAI;gDACiCG,KAAKD;;;KAInD,EAGFO,eAAeC,OAAO,4BAA6BT","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ import LightComponent from"/kempo-ui/components/LightComponent.js";import{html}from"/kempo-ui/lit-all.min.js";let monacoLoadPromise=null;const ensureMonacoLoaded=()=>monacoLoadPromise||(monacoLoadPromise=new Promise(e=>{if(window.monaco)return void e();const t=document.createElement("script");t.src="/monaco-editor/vs/loader.js",t.onload=()=>{require.config({paths:{vs:"/monaco-editor/vs"}}),require(["vs/editor/editor.main"],()=>e())},document.head.appendChild(t)}),monacoLoadPromise);export default class Monaco extends LightComponent{static get properties(){return{language:{type:String},readOnly:{type:Boolean,attribute:"readonly"},height:{type:String}}}#e=null;#t=!1;#i="";constructor(){super(),this.language="json",this.readOnly=!1,this.height="400px"}get value(){return this.#e?this.#e.getValue():this.#i}set value(e){this.#e?this.#e.getValue()!==e&&this.#e.setValue(e):this.#i=e}updated(e){super.updated(e),this.#e||this.#t||(this.#t=!0,this.#o()),this.#e&&(e.has("readOnly")&&this.#e.updateOptions({readOnly:this.readOnly}),e.has("language")&&monaco.editor.setModelLanguage(this.#e.getModel(),this.language))}disconnectedCallback(){super.disconnectedCallback(),this.#e&&(this.#e.dispose(),this.#e=null)}#o=async()=>{await ensureMonacoLoaded();const e=this.querySelector("[data-monaco-container]");if(!e)return;const t="dark"===document.documentElement.getAttribute("theme")||"auto"===document.documentElement.getAttribute("theme")&&window.matchMedia("(prefers-color-scheme: dark)").matches;this.#e=monaco.editor.create(e,{value:this.#i,language:this.language,minimap:{enabled:!1},automaticLayout:!0,theme:t?"vs-dark":"vs",scrollBeyondLastLine:!1,fontSize:14,tabSize:2,readOnly:this.readOnly}),this.#e.onDidChangeModelContent(()=>{this.dispatchEvent(new Event("change"))})};renderLightDom(){return html`<div data-monaco-container style="height: ${this.height}; border: 1px solid var(--c_border); border-radius: var(--radius);"></div>`}}customElements.define("admin-monaco",Monaco);
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\admin\components\Monaco.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src\\admin\\components\\Monaco.js","names":["LightComponent","html","monacoLoadPromise","ensureMonacoLoaded","Promise","resolve","window","monaco","script","document","createElement","src","onload","require","config","paths","vs","head","appendChild","Monaco","properties","language","type","String","readOnly","Boolean","attribute","height","editor","initializing","pendingValue","constructor","super","this","value","getValue","v","setValue","updated","changedProperties","initEditor","has","updateOptions","setModelLanguage","getModel","disconnectedCallback","dispose","async","container","querySelector","isDark","documentElement","getAttribute","matchMedia","matches","create","minimap","enabled","automaticLayout","theme","scrollBeyondLastLine","fontSize","tabSize","onDidChangeModelContent","dispatchEvent","Event","renderLightDom","customElements","define"],"sources":["0"],"sourcesContent":["import LightComponent from '/kempo-ui/components/LightComponent.js';\r\nimport { html } from '/kempo-ui/lit-all.min.js';\r\n\r\nlet monacoLoadPromise = null;\r\n\r\nconst ensureMonacoLoaded = () => {\r\n\tif(monacoLoadPromise) return monacoLoadPromise;\r\n\tmonacoLoadPromise = new Promise(resolve => {\r\n\t\tif(window.monaco){\r\n\t\t\tresolve();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst script = document.createElement('script');\r\n\t\tscript.src = '/monaco-editor/vs/loader.js';\r\n\t\tscript.onload = () => {\r\n\t\t\trequire.config({ paths: { vs: '/monaco-editor/vs' } });\r\n\t\t\trequire(['vs/editor/editor.main'], () => resolve());\r\n\t\t};\r\n\t\tdocument.head.appendChild(script);\r\n\t});\r\n\treturn monacoLoadPromise;\r\n};\r\n\r\nexport default class Monaco extends LightComponent {\r\n\tstatic get properties() {\r\n\t\treturn {\r\n\t\t\tlanguage: { type: String },\r\n\t\t\treadOnly: { type: Boolean, attribute: 'readonly' },\r\n\t\t\theight: { type: String }\r\n\t\t};\r\n\t}\r\n\r\n\t#editor = null;\r\n\t#initializing = false;\r\n\t#pendingValue = '';\r\n\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.language = 'json';\r\n\t\tthis.readOnly = false;\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(this.#editor) return this.#editor.getValue();\r\n\t\treturn this.#pendingValue;\r\n\t}\r\n\r\n\tset value(v) {\r\n\t\tif(this.#editor){\r\n\t\t\tif(this.#editor.getValue() !== v) this.#editor.setValue(v);\r\n\t\t} else {\r\n\t\t\tthis.#pendingValue = v;\r\n\t\t}\r\n\t}\r\n\r\n\t/*\r\n\t\tLifecycle\r\n\t*/\r\n\r\n\tupdated(changedProperties) {\r\n\t\tsuper.updated(changedProperties);\r\n\t\tif(!this.#editor && !this.#initializing){\r\n\t\t\tthis.#initializing = true;\r\n\t\t\tthis.#initEditor();\r\n\t\t}\r\n\t\tif(this.#editor){\r\n\t\t\tif(changedProperties.has('readOnly')){\r\n\t\t\t\tthis.#editor.updateOptions({ readOnly: this.readOnly });\r\n\t\t\t}\r\n\t\t\tif(changedProperties.has('language')){\r\n\t\t\t\tmonaco.editor.setModelLanguage(this.#editor.getModel(), this.language);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tdisconnectedCallback() {\r\n\t\tsuper.disconnectedCallback();\r\n\t\tif(this.#editor){\r\n\t\t\tthis.#editor.dispose();\r\n\t\t\tthis.#editor = null;\r\n\t\t}\r\n\t}\r\n\r\n\t/*\r\n\t\tEditor initialization\r\n\t*/\r\n\r\n\t#initEditor = async () => {\r\n\t\tawait ensureMonacoLoaded();\r\n\t\tconst container = this.querySelector('[data-monaco-container]');\r\n\t\tif(!container) return;\r\n\t\tconst isDark = document.documentElement.getAttribute('theme') === 'dark'\r\n\t\t\t|| (document.documentElement.getAttribute('theme') === 'auto'\r\n\t\t\t\t&& window.matchMedia('(prefers-color-scheme: dark)').matches);\r\n\t\tthis.#editor = monaco.editor.create(container, {\r\n\t\t\tvalue: this.#pendingValue,\r\n\t\t\tlanguage: this.language,\r\n\t\t\tminimap: { enabled: false },\r\n\t\t\tautomaticLayout: true,\r\n\t\t\ttheme: isDark ? 'vs-dark' : 'vs',\r\n\t\t\tscrollBeyondLastLine: false,\r\n\t\t\tfontSize: 14,\r\n\t\t\ttabSize: 2,\r\n\t\t\treadOnly: this.readOnly\r\n\t\t});\r\n\t\tthis.#editor.onDidChangeModelContent(() => {\r\n\t\t\tthis.dispatchEvent(new Event('change'));\r\n\t\t});\r\n\t};\r\n\r\n\t/*\r\n\t\tRender\r\n\t*/\r\n\r\n\trenderLightDom() {\r\n\t\treturn html`<div data-monaco-container style=\"height: ${this.height}; border: 1px solid var(--c_border); border-radius: var(--radius);\"></div>`;\r\n\t}\r\n}\r\n\r\ncustomElements.define('admin-monaco', Monaco);\r\n"],"mappings":"OAAOA,mBAAoB,gDAClBC,SAAY,2BAErB,IAAIC,kBAAoB,KAExB,MAAMC,mBAAqB,IACvBD,oBACHA,kBAAoB,IAAIE,QAAQC,IAC/B,GAAGC,OAAOC,OAET,YADAF,IAGD,MAAMG,EAASC,SAASC,cAAc,UACtCF,EAAOG,IAAM,8BACbH,EAAOI,OAAS,KACfC,QAAQC,OAAO,CAAEC,MAAO,CAAEC,GAAI,uBAC9BH,QAAQ,CAAC,yBAA0B,IAAMR,MAE1CI,SAASQ,KAAKC,YAAYV,KAEpBN,kCAGO,MAAMiB,eAAenB,eACnC,qBAAWoB,GACV,MAAO,CACNC,SAAU,CAAEC,KAAMC,QAClBC,SAAU,CAAEF,KAAMG,QAASC,UAAW,YACtCC,OAAQ,CAAEL,KAAMC,QAElB,CAEAK,GAAU,KACVC,IAAgB,EAChBC,GAAgB,GAEhB,WAAAC,GACCC,QACAC,KAAKZ,SAAW,OAChBY,KAAKT,UAAW,EAChBS,KAAKN,OAAS,OACf,CAMA,SAAIO,GACH,OAAGD,MAAKL,EAAgBK,MAAKL,EAAQO,WAC9BF,MAAKH,CACb,CAEA,SAAII,CAAME,GACNH,MAAKL,EACJK,MAAKL,EAAQO,aAAeC,GAAGH,MAAKL,EAAQS,SAASD,GAExDH,MAAKH,EAAgBM,CAEvB,CAMA,OAAAE,CAAQC,GACPP,MAAMM,QAAQC,GACVN,MAAKL,GAAYK,MAAKJ,IACzBI,MAAKJ,GAAgB,EACrBI,MAAKO,KAEHP,MAAKL,IACJW,EAAkBE,IAAI,aACxBR,MAAKL,EAAQc,cAAc,CAAElB,SAAUS,KAAKT,WAE1Ce,EAAkBE,IAAI,aACxBlC,OAAOqB,OAAOe,iBAAiBV,MAAKL,EAAQgB,WAAYX,KAAKZ,UAGhE,CAEA,oBAAAwB,GACCb,MAAMa,uBACHZ,MAAKL,IACPK,MAAKL,EAAQkB,UACbb,MAAKL,EAAU,KAEjB,CAMAY,GAAcO,gBACP5C,qBACN,MAAM6C,EAAYf,KAAKgB,cAAc,2BACrC,IAAID,EAAW,OACf,MAAME,EAA4D,SAAnDzC,SAAS0C,gBAAgBC,aAAa,UACG,SAAnD3C,SAAS0C,gBAAgBC,aAAa,UACtC9C,OAAO+C,WAAW,gCAAgCC,QACvDrB,MAAKL,EAAUrB,OAAOqB,OAAO2B,OAAOP,EAAW,CAC9Cd,MAAOD,MAAKH,EACZT,SAAUY,KAAKZ,SACfmC,QAAS,CAAEC,SAAS,GACpBC,iBAAiB,EACjBC,MAAOT,EAAS,UAAY,KAC5BU,sBAAsB,EACtBC,SAAU,GACVC,QAAS,EACTtC,SAAUS,KAAKT,WAEhBS,MAAKL,EAAQmC,wBAAwB,KACpC9B,KAAK+B,cAAc,IAAIC,MAAM,cAQ/B,cAAAC,GACC,OAAOjE,IAAI,6CAA6CgC,KAAKN,kFAC9D,EAGDwC,eAAeC,OAAO,eAAgBjD","ignoreList":[]}
@@ -0,0 +1,138 @@
1
+ import ShadowComponent from"/kempo-ui/components/ShadowComponent.js";import{html,repeat}from"/kempo-ui/lit-all.min.js";import{getPage,updatePage,listTemplates,deletePages,listDirectories,movePage}from"/kempo/sdk.js";import Dialog from"/kempo-ui/components/Dialog.js";import Toast from"/kempo-ui/components/Toast.js";import"/kempo-ui/components/Icon.js";import"/kempo-ui/components/Accordion.js";import"/kempo-ui/components/HtmlEditor.js";const CODE_MODE_LOCATIONS=new Set(["head","scripts"]),slugify=e=>e.toLowerCase().trim().replace(/[^\w\s-]/g,"").replace(/[\s_]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"");export default class PageEditor extends ShadowComponent{static properties={loading:{state:!0},error:{state:!0},saving:{state:!0},page:{state:!0},templates:{state:!0},contents:{state:!0}};constructor(){super(),this.loading=!0,this.error=!1,this.saving=!1,this.page=null,this.templates=[],this.contents=[],this.file=""}async connectedCallback(){if(super.connectedCallback(),document.addEventListener("keydown",this.handleKeyDown),this.file=new URLSearchParams(window.location.search).get("path")+".page.html",!this.file||".page.html"===this.file)return this.loading=!1,void(this.error=!0);const[[e,t],[,a]]=await Promise.all([getPage(this.file),listTemplates()]);this.loading=!1,e?this.error=!0:(this.templates=a?.templates||[],this.page=t,this.contents=this.buildContents(t.template,t.contents),document.title=`Edit: ${t.name||t.title||this.file} - Admin`)}disconnectedCallback(){super.disconnectedCallback(),document.removeEventListener("keydown",this.handleKeyDown)}getPageUrl(){return"/"+this.file.replace(/\.page\.html$/,"").split("/").filter(Boolean).join("/")}buildContents(e,t){const a=this.templates.find(t=>t.name===e),l=(a?.locations||[{name:"default",label:null}]).map(e=>"string"==typeof e?{name:e,label:null}:e),i=l.map(({name:e,label:a})=>{const l=t.find(t=>t.location===e);return{location:e,label:a||null,content:l?.content||"",orphaned:!1}});for(const e of t)l.some(t=>t.name===e.location)||i.push({location:e.location,label:null,content:e.content,orphaned:!0});return i}getFormState(){const e=this.shadowRoot,t=new Map([...e.querySelectorAll("k-html-editor[data-location]")].map(e=>[e.dataset.location,e.getValue()]));return{name:e.querySelector("#metaName").value,title:e.querySelector("#metaTitle").value,description:e.querySelector("#metaDescription").value,template:e.querySelector("#metaTemplate").value,contents:this.contents.map(({location:e,content:a,orphaned:l})=>({location:e,content:l?t.get(e)?.trim()||a:t.get(e)??a}))}}handleKeyDown=e=>{(e.ctrlKey||e.metaKey)&&"s"===e.key&&(e.preventDefault(),this.saving||this.page?.locked||this.handleSave())};handleTemplateChange=e=>{const t=e.target.value,a=new Map([...this.shadowRoot.querySelectorAll("k-html-editor[data-location]")].map(e=>[e.dataset.location,e.getValue()])),l=this.contents.map(({location:e,content:t})=>({location:e,content:a.get(e)?.trim()||t}));this.contents=this.buildContents(t,l),this.page={...this.page,template:t}};handleDelete=()=>{Dialog.confirm("Delete this page? This action cannot be undone.",async e=>{if(!e)return;const[t]=await deletePages([this.file]);t?Toast.error(t.msg||"Failed to delete page"):(Toast.success("Page deleted"),setTimeout(()=>{window.location.href="/admin/pages"},1e3))})};handleMove=async()=>{const[,e]=await listDirectories(),t=e?.directories||["."],a=this.file.replace(/\.page\.html$/,"").split("/"),l=a.pop(),i=a.join("/")||".",s=e=>/^\/[a-zA-Z0-9_\-\[\]\/]*$/.test(e)&&!e.includes("..")&&!e.includes("//"),n=e=>(e||"/").replace(/^\//,"").replace(/\/$/,"")||".",o="."===i?"/":"/"+i,r=Dialog.create(html`
2
+ <div class="p">
3
+ <div class="mb">
4
+ <label class="d-b mb-sm"><strong>Location</strong></label>
5
+ <input type="text" id="dlg-move-dir" class="full" list="dlg-move-dir-list" .value="${o}" placeholder="/">
6
+ <datalist id="dlg-move-dir-list">
7
+ ${t.map(e=>html`<option value="${"."===e?"/":"/"+e}">`)}
8
+ </datalist>
9
+ <p id="dlg-move-dir-error" class="mt-sm tc-danger d-n"><small>Invalid path — use format: /path/to/directory</small></p>
10
+ <p class="mt-sm muted"><small>Supports dynamic segments e.g. <code>/blog/[slug]</code>. <button class="link" @click="${()=>Dialog.alert(html`
11
+ <div class="p">
12
+ <p>Directory paths define where a page lives in the URL structure.</p>
13
+ <p><strong>Examples:</strong></p>
14
+ <ul>
15
+ <li><code>/</code> — root, e.g. <code>/about</code></li>
16
+ <li><code>/blog</code> — e.g. <code>/blog/my-post</code></li>
17
+ <li><code>/blog/[slug]</code> — dynamic segment; <code>[slug]</code> matches any value</li>
18
+ </ul>
19
+ <p>Dynamic segments like <code>[token]</code> allow a single page to handle many URLs. The segment name is available to the page as a URL parameter.</p>
20
+ <p>You can nest segments: <code>/store/[category]/[id]</code></p>
21
+ </div>
22
+ `,null,{title:"About Directory Paths"})}">Learn more</button></small></p>
23
+ </div>
24
+ <div>
25
+ <label class="d-b mb-sm"><strong>Page Name</strong></label>
26
+ <input type="text" id="dlg-move-name" class="full" .value="${l}">
27
+ <p class="mt-sm muted"><small id="dlg-move-preview"></small></p>
28
+ </div>
29
+ </div>
30
+ `,{title:"Move Page",confirmText:"Save and Move Page",confirmAction:async()=>{const e=r.querySelector("#dlg-move-dir").value.trim()||"/",t=slugify(r.querySelector("#dlg-move-name").value.trim());if(!t)return void Toast.error("Page name is required");if(!s(e))return void Toast.error("Invalid directory path");const a=n(e),l="."===a?`${t}.page.html`:`${a}/${t}.page.html`;this.saving=!0;const[i]=await updatePage({file:this.file,...this.getFormState()});if(this.saving=!1,i)return void Toast.error(i.msg||"Failed to save page");const[o,c]=await movePage({file:this.file,newFile:l});o?Toast.error(o.msg||"Failed to move page"):(Toast.success("Page saved and moved"),setTimeout(()=>{window.location.href=`/admin/pages/edit?path=${encodeURIComponent(c.file.replace(/\.page\.html$/,""))}`},1e3))},cancelText:"Cancel"}),c=()=>{const e=n(r.querySelector("#dlg-move-dir").value||"/"),t=slugify(r.querySelector("#dlg-move-name").value),a="."===e?"/":"/"+e+"/";r.querySelector("#dlg-move-preview").textContent=t?a+t:""};r.querySelector("#dlg-move-dir").addEventListener("input",e=>{r.querySelector("#dlg-move-dir-error").classList.toggle("d-n",s(e.target.value||"/")),c()}),r.querySelector("#dlg-move-name").addEventListener("input",c),c()};handleReset=()=>{Dialog.confirm("Reset this page? Any unsaved changes will be lost.",e=>{e&&(this.contents=this.buildContents(this.page.template,this.page.contents),this.page={...this.page})})};handleSave=async()=>{this.saving=!0;const e=this.getFormState(),[t,a]=await updatePage({file:this.file,...e});this.saving=!1,t?Toast.error(t.msg||"Failed to save page"):(this.contents=this.contents.map(t=>{const a=e.contents.find(e=>e.location===t.location);return a?{...t,content:a.content}:t}),this.page={...this.page,...e,contents:e.contents.filter(e=>e.content.trim()),updatedAt:a.updatedAt},document.title=`Edit: ${e.name||e.title||this.file} - Admin`,Toast.success("Page saved"))};render(){if(this.loading)return html`<div>Loading page...</div>`;if(this.error)return html`
31
+ <div>
32
+ <p>Page not found.</p>
33
+ <a href="/admin/pages">Back to Pages</a>
34
+ </div>
35
+ `;const{page:e,templates:t,contents:a}=this,l="system"===e.owner,i=e.locked;return html`
36
+ ${i?html`
37
+ <div class="p r mb bc-warning tc-warning">
38
+ <k-icon name="lock"></k-icon> This page is locked and cannot be edited. It is managed by an extension.
39
+ </div>
40
+ `:""}
41
+ <div class="d-f mb">
42
+ <div class="btn-grp mrh mb">
43
+ <a href="/admin/content/pages" class="btn">
44
+ <k-icon name="arrow" direction="left"></k-icon> Pages
45
+ </a>
46
+ <a href="${this.getPageUrl()}" id="page-link" class="btn">
47
+ <k-icon name="visibility"></k-icon> View Page
48
+ </a>
49
+ </div>
50
+
51
+ <div class="flex"></div>
52
+ ${l||i?"":html`
53
+ <div class="btn-grp mrh mb">
54
+ <button class="danger" @click="${this.handleDelete}"><k-icon name="delete"></k-icon> Delete</button>
55
+ <button @click="${this.handleMove}"><k-icon name="drive_file_move"></k-icon> Move Page</button>
56
+ </div>
57
+ `}
58
+ ${i?"":html`
59
+ <div class="btn-grp mrh mb">
60
+ <button @click="${this.handleReset}"><k-icon name="restart_alt"></k-icon> Reset</button>
61
+ <button id="saveBtn" class="primary" ?disabled="${this.saving}" @click="${this.handleSave}">
62
+ <k-icon name="save"></k-icon> Save
63
+ </button>
64
+ </div>
65
+ `}
66
+ </div>
67
+ <h1 class="mb0">Page: ${e.name||e.title||this.file}</h1>
68
+
69
+ <a href="${this.getPageUrl()}" class="d-b mb"><code>${this.getPageUrl()}</code></a>
70
+
71
+ <k-accordion>
72
+ <k-accordion-header for-panel="metadata">Metadata</k-accordion-header>
73
+ <k-accordion-panel name="metadata">
74
+ <div class="p">
75
+ <div class="d-f mb" style="align-items: center; gap: var(--spacer);">
76
+ <label style="min-width: 120px;"><strong>Name</strong></label>
77
+ <input type="text" id="metaName" class="flex" .value="${e.name||""}" ?disabled="${l||i}">
78
+ </div>
79
+ <div class="d-f mb" style="align-items: center; gap: var(--spacer);">
80
+ <label style="min-width: 120px;"><strong>Title</strong></label>
81
+ <input type="text" id="metaTitle" class="flex" .value="${e.title||""}" ?disabled="${i}">
82
+ </div>
83
+ <div class="d-f mb" style="align-items: center; gap: var(--spacer);">
84
+ <label style="min-width: 120px;"><strong>Description</strong></label>
85
+ <input type="text" id="metaDescription" class="flex" .value="${e.description||""}" ?disabled="${l||i}">
86
+ </div>
87
+ ${l?"":html`
88
+ <div class="d-f mb" style="align-items: center; gap: var(--spacer);">
89
+ <label style="min-width: 120px;"><strong>Author</strong></label>
90
+ <span class="muted">${e.author||""}</span>
91
+ </div>
92
+ `}
93
+ <div class="d-f mb" style="align-items: center; gap: var(--spacer);">
94
+ <label style="min-width: 120px;"><strong>Template</strong></label>
95
+ ${(()=>{const a=this.file.replace(/\.page\.html$/,"").split("/").slice(0,-1).join("/")||".",l=t.filter(e=>{const t="."===e.directory?"":e.directory,l="."===a?"":a;return""===t||l===t||l.startsWith(t+"/")}),s=l.some(t=>t.name===e.template);return html`
96
+ <select id="metaTemplate" class="flex" @change="${this.handleTemplateChange}" ?disabled="${i}">
97
+ ${s?"":html`<option value="${e.template}" selected>${e.template} (Not Found, using default)</option>`}
98
+ ${l.map(t=>html`
99
+ <option value="${t.name}" ?selected="${t.name===e.template}">${(e=>"."===e.directory?`/${e.name}`:`/${e.directory}/${e.name}`)(t)}</option>
100
+ `)}
101
+ </select>
102
+ `})()}
103
+ </div>
104
+ <div class="d-f mb" style="align-items: center; gap: var(--spacer);">
105
+ <label style="min-width: 120px;"><strong>Owner</strong></label>
106
+ <span class="muted">${e.owner||""}</span>
107
+ </div>
108
+ <div class="d-f mb" style="align-items: center; gap: var(--spacer);">
109
+ <label style="min-width: 120px;"><strong>Created</strong></label>
110
+ <span class="muted">${e.createdAt?new Date(e.createdAt).toLocaleString():""}</span>
111
+ </div>
112
+ <div class="d-f" style="align-items: center; gap: var(--spacer);">
113
+ <label style="min-width: 120px;"><strong>Updated</strong></label>
114
+ <span class="muted">${e.updatedAt?new Date(e.updatedAt).toLocaleString():""}</span>
115
+ </div>
116
+ </div>
117
+ </k-accordion-panel>
118
+ ${repeat(a,e=>e.location,({location:e,label:t,content:a,orphaned:l})=>{const s="default"===e,n=t||(s?"Content":e.slice(0,1).toUpperCase()+e.slice(1));return html`
119
+ <k-accordion-header for-panel="content-${e}" ?active="${s}">
120
+ ${n}${l?html` <span class="tc-warning"><small>(not in template)</small></span>`:""}
121
+ </k-accordion-header>
122
+ <k-accordion-panel name="content-${e}" ?active="${s}">
123
+ <div class="p">
124
+ <k-html-editor
125
+ class="r b"
126
+ data-location="${e}"
127
+ controls="full"
128
+ .value="${a}"
129
+ mode="${CODE_MODE_LOCATIONS.has(e)?"code":"visual"}"
130
+ style="height: 400px;"
131
+ ?disabled="${i}"
132
+ ></k-html-editor>
133
+ </div>
134
+ </k-accordion-panel>
135
+ `})}
136
+ </k-accordion>
137
+ `}}customElements.define("admin-page-editor",PageEditor);
138
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\admin\components\PageEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src\\admin\\components\\PageEditor.js","names":["ShadowComponent","html","repeat","getPage","updatePage","listTemplates","deletePages","listDirectories","movePage","Dialog","Toast","CODE_MODE_LOCATIONS","Set","slugify","name","toLowerCase","trim","replace","PageEditor","static","loading","state","error","saving","page","templates","contents","constructor","super","this","file","connectedCallback","document","addEventListener","handleKeyDown","URLSearchParams","window","location","search","get","err","tmplData","Promise","all","buildContents","template","title","disconnectedCallback","removeEventListener","getPageUrl","split","filter","Boolean","join","templateName","existingContents","tmpl","find","t","locations","label","map","l","result","block","b","content","orphaned","some","push","getFormState","root","shadowRoot","editorMap","Map","querySelectorAll","ed","dataset","getValue","querySelector","value","description","e","ctrlKey","metaKey","key","preventDefault","locked","handleSave","handleTemplateChange","newTemplate","target","currentContents","handleDelete","confirm","async","confirmed","msg","success","setTimeout","href","handleMove","dirData","directories","parts","currentName","pop","currentDir","isValidDir","p","test","includes","dirToInternal","currentDirDisplay","$dialog","create","d","alert","confirmText","confirmAction","dirInput","newName","newDir","newFile","saveError","moveError","moved","encodeURIComponent","cancelText","updatePreview","dir","prefix","textContent","classList","toggle","handleReset","saved","c","current","x","updatedAt","render","isSystem","owner","isLocked","author","pageDir","slice","reachable","tDir","directory","pDir","startsWith","currentFound","templateLabel","createdAt","Date","toLocaleString","isDefault","headerTitle","toUpperCase","has","customElements","define"],"sources":["0"],"sourcesContent":["import ShadowComponent from '/kempo-ui/components/ShadowComponent.js';\nimport { html, repeat } from '/kempo-ui/lit-all.min.js';\nimport { getPage, updatePage, listTemplates, deletePages, listDirectories, movePage } 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/HtmlEditor.js';\n\nconst CODE_MODE_LOCATIONS = new Set(['head', 'scripts']);\n\nconst slugify = name => name\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/[\\s_]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n\nexport default class PageEditor extends ShadowComponent {\n static properties = {\n loading: { state: true },\n error: { state: true },\n saving: { state: true },\n page: { state: true },\n templates: { state: true },\n contents: { state: true }\n };\n\n constructor() {\n super();\n this.loading = true;\n this.error = false;\n this.saving = false;\n this.page = null;\n this.templates = [];\n this.contents = [];\n this.file = '';\n }\n\n async connectedCallback() {\n super.connectedCallback();\n document.addEventListener('keydown', this.handleKeyDown);\n this.file = new URLSearchParams(window.location.search).get('path') + '.page.html';\n\n if (!this.file || this.file === '.page.html') {\n this.loading = false;\n this.error = true;\n return;\n }\n\n const [[err, page], [, tmplData]] = await Promise.all([\n getPage(this.file),\n listTemplates()\n ]);\n\n this.loading = false;\n\n if (err) {\n this.error = true;\n return;\n }\n\n this.templates = tmplData?.templates || [];\n this.page = page;\n this.contents = this.buildContents(page.template, page.contents);\n document.title = `Edit: ${page.name || page.title || this.file} - Admin`;\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener('keydown', this.handleKeyDown);\n }\n\n /*\n Helpers\n */\n\n getPageUrl() {\n const path = this.file.replace(/\\.page\\.html$/, '');\n return '/' + path.split('/').filter(Boolean).join('/');\n }\n\n buildContents(templateName, existingContents) {\n const tmpl = this.templates.find(t => t.name === templateName);\n const raw = tmpl?.locations || [{ name: 'default', label: null }];\n const locations = raw.map(l => typeof l === 'string' ? { name: l, label: null } : l);\n const result = locations.map(({ name, label }) => {\n const block = existingContents.find(b => b.location === name);\n return { location: name, label: label || null, content: block?.content || '', orphaned: false };\n });\n for (const block of existingContents) {\n if (!locations.some(l => l.name === block.location))\n result.push({ location: block.location, label: null, content: block.content, orphaned: true });\n }\n return result;\n }\n\n getFormState() {\n const root = this.shadowRoot;\n const editorMap = new Map(\n [...root.querySelectorAll('k-html-editor[data-location]')].map(ed => [ed.dataset.location, ed.getValue()])\n );\n return {\n name: root.querySelector('#metaName').value,\n title: root.querySelector('#metaTitle').value,\n description: root.querySelector('#metaDescription').value,\n template: root.querySelector('#metaTemplate').value,\n contents: this.contents.map(({ location, content, orphaned }) => ({\n location,\n content: orphaned\n ? (editorMap.get(location)?.trim() || content)\n : (editorMap.get(location) ?? content)\n }))\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.page?.locked) this.handleSave();\n }\n };\n\n handleTemplateChange = e => {\n const newTemplate = e.target.value;\n const editorMap = new Map(\n [...this.shadowRoot.querySelectorAll('k-html-editor[data-location]')].map(ed => [ed.dataset.location, ed.getValue()])\n );\n // Fall back to state content for any editor that hasn't initialized (Monaco lazy-loads)\n const currentContents = this.contents.map(({ location, content }) => ({\n location,\n content: editorMap.get(location)?.trim() || content\n }));\n this.contents = this.buildContents(newTemplate, currentContents);\n this.page = { ...this.page, template: newTemplate };\n };\n\n handleDelete = () => {\n Dialog.confirm('Delete this page? This action cannot be undone.', async confirmed => {\n if (!confirmed) return;\n const [error] = await deletePages([this.file]);\n if (error) {\n Toast.error(error.msg || 'Failed to delete page');\n return;\n }\n Toast.success('Page deleted');\n setTimeout(() => { window.location.href = '/admin/pages'; }, 1000);\n });\n };\n\n handleMove = async () => {\n const [, dirData] = await listDirectories();\n const directories = dirData?.directories || ['.'];\n\n const parts = this.file.replace(/\\.page\\.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 openLearnMore = () => Dialog.alert(html`\n <div class=\"p\">\n <p>Directory paths define where a page lives in the URL structure.</p>\n <p><strong>Examples:</strong></p>\n <ul>\n <li><code>/</code> — root, e.g. <code>/about</code></li>\n <li><code>/blog</code> — e.g. <code>/blog/my-post</code></li>\n <li><code>/blog/[slug]</code> — dynamic segment; <code>[slug]</code> matches any value</li>\n </ul>\n <p>Dynamic segments like <code>[token]</code> allow a single page to handle many URLs. The segment name is available to the page as a URL parameter.</p>\n <p>You can nest segments: <code>/store/[category]/[id]</code></p>\n </div>\n `, null, { title: 'About Directory Paths' });\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-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 <p id=\"dlg-move-dir-error\" class=\"mt-sm tc-danger d-n\"><small>Invalid path — use format: /path/to/directory</small></p>\n <p class=\"mt-sm muted\"><small>Supports dynamic segments e.g. <code>/blog/[slug]</code>. <button class=\"link\" @click=\"${openLearnMore}\">Learn more</button></small></p>\n </div>\n <div>\n <label class=\"d-b mb-sm\"><strong>Page 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 Page',\n confirmText: 'Save and Move Page',\n confirmAction: async () => {\n const dirInput = $dialog.querySelector('#dlg-move-dir').value.trim() || '/';\n const newName = slugify($dialog.querySelector('#dlg-move-name').value.trim());\n if (!newName) {\n Toast.error('Page 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}.page.html`\n : `${newDir}/${newName}.page.html`;\n\n this.saving = true;\n const [saveError] = await updatePage({ file: this.file, ...this.getFormState() });\n this.saving = false;\n if (saveError) {\n Toast.error(saveError.msg || 'Failed to save page');\n return;\n }\n\n const [moveError, moved] = await movePage({ file: this.file, newFile });\n if (moveError) {\n Toast.error(moveError.msg || 'Failed to move page');\n return;\n }\n\n Toast.success('Page saved and moved');\n setTimeout(() => {\n window.location.href = `/admin/pages/edit?path=${encodeURIComponent(moved.file.replace(/\\.page\\.html$/, ''))}`;\n }, 1000);\n },\n cancelText: 'Cancel'\n });\n\n const updatePreview = () => {\n const dir = dirToInternal($dialog.querySelector('#dlg-move-dir').value || '/');\n const name = slugify($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', e => {\n $dialog.querySelector('#dlg-move-dir-error').classList.toggle('d-n', isValidDir(e.target.value || '/'));\n updatePreview();\n });\n $dialog.querySelector('#dlg-move-name').addEventListener('input', updatePreview);\n updatePreview();\n };\n\n handleReset = () => {\n Dialog.confirm('Reset this page? Any unsaved changes will be lost.', confirmed => {\n if (!confirmed) return;\n this.contents = this.buildContents(this.page.template, this.page.contents);\n this.page = { ...this.page };\n });\n };\n\n handleSave = async () => {\n this.saving = true;\n const state = this.getFormState();\n const [saveError, saved] = await updatePage({ file: this.file, ...state });\n this.saving = false;\n\n if (saveError) {\n Toast.error(saveError.msg || 'Failed to save page');\n return;\n }\n\n this.contents = this.contents.map(c => {\n const current = state.contents.find(x => x.location === c.location);\n return current ? { ...c, content: current.content } : c;\n });\n this.page = {\n ...this.page,\n ...state,\n contents: state.contents.filter(b => b.content.trim()),\n updatedAt: saved.updatedAt\n };\n\n document.title = `Edit: ${state.name || state.title || this.file} - Admin`;\n Toast.success('Page saved');\n };\n\n /*\n Render\n */\n\n render() {\n if (this.loading) return html`<div>Loading page...</div>`;\n\n if (this.error) return html`\n <div>\n <p>Page not found.</p>\n <a href=\"/admin/pages\">Back to Pages</a>\n </div>\n `;\n\n const { page, templates, contents } = this;\n const isSystem = page.owner === 'system';\n const isLocked = page.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 page 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/pages\" class=\"btn\">\n <k-icon name=\"arrow\" direction=\"left\"></k-icon> Pages\n </a>\n <a href=\"${this.getPageUrl()}\" id=\"page-link\" class=\"btn\">\n <k-icon name=\"visibility\"></k-icon> View Page\n </a>\n </div>\n \n <div class=\"flex\"></div>\n ${!isSystem && !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 Page</button>\n </div>\n ` : ''}\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 <h1 class=\"mb0\">Page: ${page.name || page.title || this.file}</h1>\n\n <a href=\"${this.getPageUrl()}\" class=\"d-b mb\"><code>${this.getPageUrl()}</code></a>\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=\"${page.name || ''}\" ?disabled=\"${isSystem || isLocked}\">\n </div>\n <div class=\"d-f mb\" style=\"align-items: center; gap: var(--spacer);\">\n <label style=\"min-width: 120px;\"><strong>Title</strong></label>\n <input type=\"text\" id=\"metaTitle\" class=\"flex\" .value=\"${page.title || ''}\" ?disabled=\"${isLocked}\">\n </div>\n <div class=\"d-f mb\" style=\"align-items: center; gap: var(--spacer);\">\n <label style=\"min-width: 120px;\"><strong>Description</strong></label>\n <input type=\"text\" id=\"metaDescription\" class=\"flex\" .value=\"${page.description || ''}\" ?disabled=\"${isSystem || isLocked}\">\n </div>\n ${!isSystem ? 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\">${page.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>Template</strong></label>\n ${(() => {\n const pageDir = this.file.replace(/\\.page\\.html$/, '').split('/').slice(0, -1).join('/') || '.';\n const reachable = templates.filter(t => {\n const tDir = t.directory === '.' ? '' : t.directory;\n const pDir = pageDir === '.' ? '' : pageDir;\n return tDir === '' || pDir === tDir || pDir.startsWith(tDir + '/');\n });\n const templateLabel = t => t.directory === '.' ? `/${t.name}` : `/${t.directory}/${t.name}`;\n const currentFound = reachable.some(t => t.name === page.template);\n return html`\n <select id=\"metaTemplate\" class=\"flex\" @change=\"${this.handleTemplateChange}\" ?disabled=\"${isLocked}\">\n ${!currentFound ? html`<option value=\"${page.template}\" selected>${page.template} (Not Found, using default)</option>` : ''}\n ${reachable.map(t => html`\n <option value=\"${t.name}\" ?selected=\"${t.name === page.template}\">${templateLabel(t)}</option>\n `)}\n </select>\n `;\n })()}\n </div>\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\">${page.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\">${page.createdAt ? new Date(page.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\">${page.updatedAt ? new Date(page.updatedAt).toLocaleString() : ''}</span>\n </div>\n </div>\n </k-accordion-panel>\n ${repeat(contents, c => c.location, ({ location, label, content, orphaned }) => {\n const isDefault = location === 'default';\n const headerTitle = label || (isDefault ? 'Content' : location.slice(0, 1).toUpperCase() + location.slice(1));\n return html`\n <k-accordion-header for-panel=\"content-${location}\" ?active=\"${isDefault}\">\n ${headerTitle}${orphaned ? html` <span class=\"tc-warning\"><small>(not in template)</small></span>` : ''}\n </k-accordion-header>\n <k-accordion-panel name=\"content-${location}\" ?active=\"${isDefault}\">\n <div class=\"p\">\n <k-html-editor\n class=\"r b\"\n data-location=\"${location}\"\n controls=\"full\"\n .value=\"${content}\"\n mode=\"${CODE_MODE_LOCATIONS.has(location) ? 'code' : 'visual'}\"\n style=\"height: 400px;\"\n ?disabled=\"${isLocked}\"\n ></k-html-editor>\n </div>\n </k-accordion-panel>\n `;\n })}\n </k-accordion>\n `;\n }\n}\n\ncustomElements.define('admin-page-editor', PageEditor);\n"],"mappings":"OAAOA,oBAAqB,iDACnBC,KAAMC,WAAc,kCACpBC,QAASC,WAAYC,cAAeC,YAAaC,gBAAiBC,aAAgB,uBACpFC,WAAY,wCACZC,UAAW,sCACX,qCACA,0CACA,qCAEP,MAAMC,oBAAsB,IAAIC,IAAI,CAAC,OAAQ,YAEvCC,QAAUC,GAAQA,EACrBC,cACAC,OACAC,QAAQ,YAAa,IACrBA,QAAQ,UAAW,KACnBA,QAAQ,MAAO,KACfA,QAAQ,SAAU,mBAEN,MAAMC,mBAAmBlB,gBACtCmB,kBAAoB,CAClBC,QAAS,CAAEC,OAAO,GAClBC,MAAO,CAAED,OAAO,GAChBE,OAAQ,CAAEF,OAAO,GACjBG,KAAM,CAAEH,OAAO,GACfI,UAAW,CAAEJ,OAAO,GACpBK,SAAU,CAAEL,OAAO,IAGrB,WAAAM,GACEC,QACAC,KAAKT,SAAU,EACfS,KAAKP,OAAQ,EACbO,KAAKN,QAAS,EACdM,KAAKL,KAAO,KACZK,KAAKJ,UAAY,GACjBI,KAAKH,SAAW,GAChBG,KAAKC,KAAO,EACd,CAEA,uBAAMC,GAKJ,GAJAH,MAAMG,oBACNC,SAASC,iBAAiB,UAAWJ,KAAKK,eAC1CL,KAAKC,KAAO,IAAIK,gBAAgBC,OAAOC,SAASC,QAAQC,IAAI,QAAU,cAEjEV,KAAKC,MAAsB,eAAdD,KAAKC,KAGrB,OAFAD,KAAKT,SAAU,OACfS,KAAKP,OAAQ,GAIf,OAAQkB,EAAKhB,IAAQ,CAAEiB,UAAmBC,QAAQC,IAAI,CACpDxC,QAAQ0B,KAAKC,MACbzB,kBAGFwB,KAAKT,SAAU,EAEXoB,EACFX,KAAKP,OAAQ,GAIfO,KAAKJ,UAAYgB,GAAUhB,WAAa,GACxCI,KAAKL,KAAOA,EACZK,KAAKH,SAAWG,KAAKe,cAAcpB,EAAKqB,SAAUrB,EAAKE,UACvDM,SAASc,MAAQ,SAAStB,EAAKV,MAAQU,EAAKsB,OAASjB,KAAKC,eAC5D,CAEA,oBAAAiB,GACEnB,MAAMmB,uBACNf,SAASgB,oBAAoB,UAAWnB,KAAKK,cAC/C,CAMA,UAAAe,GAEE,MAAO,IADMpB,KAAKC,KAAKb,QAAQ,gBAAiB,IAC9BiC,MAAM,KAAKC,OAAOC,SAASC,KAAK,IACpD,CAEA,aAAAT,CAAcU,EAAcC,GAC1B,MAAMC,EAAO3B,KAAKJ,UAAUgC,KAAKC,GAAKA,EAAE5C,OAASwC,GAE3CK,GADMH,GAAMG,WAAa,CAAC,CAAE7C,KAAM,UAAW8C,MAAO,QACpCC,IAAIC,GAAkB,iBAANA,EAAiB,CAAEhD,KAAMgD,EAAGF,MAAO,MAASE,GAC5EC,EAASJ,EAAUE,IAAI,EAAG/C,OAAM8C,YACpC,MAAMI,EAAQT,EAAiBE,KAAKQ,GAAKA,EAAE5B,WAAavB,GACxD,MAAO,CAAEuB,SAAUvB,EAAM8C,MAAOA,GAAS,KAAMM,QAASF,GAAOE,SAAW,GAAIC,UAAU,KAE1F,IAAK,MAAMH,KAAST,EACbI,EAAUS,KAAKN,GAAKA,EAAEhD,OAASkD,EAAM3B,WACxC0B,EAAOM,KAAK,CAAEhC,SAAU2B,EAAM3B,SAAUuB,MAAO,KAAMM,QAASF,EAAME,QAASC,UAAU,IAE3F,OAAOJ,CACT,CAEA,YAAAO,GACE,MAAMC,EAAO1C,KAAK2C,WACZC,EAAY,IAAIC,IACpB,IAAIH,EAAKI,iBAAiB,iCAAiCd,IAAIe,GAAM,CAACA,EAAGC,QAAQxC,SAAUuC,EAAGE,cAEhG,MAAO,CACLhE,KAAMyD,EAAKQ,cAAc,aAAaC,MACtClC,MAAOyB,EAAKQ,cAAc,cAAcC,MACxCC,YAAaV,EAAKQ,cAAc,oBAAoBC,MACpDnC,SAAU0B,EAAKQ,cAAc,iBAAiBC,MAC9CtD,SAAUG,KAAKH,SAASmC,IAAI,EAAGxB,WAAU6B,UAASC,eAAe,CAC/D9B,WACA6B,QAASC,EACJM,EAAUlC,IAAIF,IAAWrB,QAAUkD,EACnCO,EAAUlC,IAAIF,IAAa6B,KAGtC,CAMAhC,cAAgBgD,KACVA,EAAEC,SAAWD,EAAEE,UAAsB,MAAVF,EAAEG,MAC/BH,EAAEI,iBACEzD,KAAKN,QAAWM,KAAKL,MAAM+D,QAAQ1D,KAAK2D,eAIhDC,qBAAuBP,IACrB,MAAMQ,EAAcR,EAAES,OAAOX,MACvBP,EAAY,IAAIC,IACpB,IAAI7C,KAAK2C,WAAWG,iBAAiB,iCAAiCd,IAAIe,GAAM,CAACA,EAAGC,QAAQxC,SAAUuC,EAAGE,cAGrGc,EAAkB/D,KAAKH,SAASmC,IAAI,EAAGxB,WAAU6B,cAAc,CACnE7B,WACA6B,QAASO,EAAUlC,IAAIF,IAAWrB,QAAUkD,KAE9CrC,KAAKH,SAAWG,KAAKe,cAAc8C,EAAaE,GAChD/D,KAAKL,KAAO,IAAKK,KAAKL,KAAMqB,SAAU6C,IAGxCG,aAAe,KACbpF,OAAOqF,QAAQ,kDAAmDC,UAChE,IAAKC,EAAW,OAChB,MAAO1E,SAAehB,YAAY,CAACuB,KAAKC,OACpCR,EACFZ,MAAMY,MAAMA,EAAM2E,KAAO,0BAG3BvF,MAAMwF,QAAQ,gBACdC,WAAW,KAAQ/D,OAAOC,SAAS+D,KAAO,gBAAmB,SAIjEC,WAAaN,UACX,MAAO,CAAEO,SAAiB/F,kBACpBgG,EAAcD,GAASC,aAAe,CAAC,KAEvCC,EAAQ3E,KAAKC,KAAKb,QAAQ,gBAAiB,IAAIiC,MAAM,KACrDuD,EAAcD,EAAME,MACpBC,EAAaH,EAAMnD,KAAK,MAAQ,IAEhCuD,EAAaC,GAAK,4BAA4BC,KAAKD,KAAOA,EAAEE,SAAS,QAAUF,EAAEE,SAAS,MAC1FC,EAAgBH,IAAkBA,GAAK,KAAK5F,QAAQ,MAAO,IAAIA,QAAQ,MAAO,KAAiB,IAC/FgG,EAAmC,MAAfN,EAAqB,IAAM,IAAMA,EAgBrDO,EAAUzG,OAAO0G,OAAOlH,IAAI;;;;+FAIyDgH;;cAEjFV,EAAY1C,IAAIuD,GAAKnH,IAAI,kBAAwB,MAANmH,EAAY,IAAM,IAAMA;;;iIApBvD,IAAM3G,OAAO4G,MAAMpH,IAAI;;;;;;;;;;;;MAY1C,KAAM,CAAE6C,MAAO;;;;uEAeiD2D;;;;MAIhE,CACD3D,MAAO,YACPwE,YAAa,qBACbC,cAAexB,UACb,MAAMyB,EAAWN,EAAQnC,cAAc,iBAAiBC,MAAMhE,QAAU,IAClEyG,EAAU5G,QAAQqG,EAAQnC,cAAc,kBAAkBC,MAAMhE,QACtE,IAAKyG,EAEH,YADA/G,MAAMY,MAAM,yBAGd,IAAKsF,EAAWY,GAEd,YADA9G,MAAMY,MAAM,0BAGd,MAAMoG,EAASV,EAAcQ,GACvBG,EAAqB,MAAXD,EACZ,GAAGD,cACH,GAAGC,KAAUD,cAEjB5F,KAAKN,QAAS,EACd,MAAOqG,SAAmBxH,WAAW,CAAE0B,KAAMD,KAAKC,QAASD,KAAKyC,iBAEhE,GADAzC,KAAKN,QAAS,EACVqG,EAEF,YADAlH,MAAMY,MAAMsG,EAAU3B,KAAO,uBAI/B,MAAO4B,EAAWC,SAAetH,SAAS,CAAEsB,KAAMD,KAAKC,KAAM6F,YACzDE,EACFnH,MAAMY,MAAMuG,EAAU5B,KAAO,wBAI/BvF,MAAMwF,QAAQ,wBACdC,WAAW,KACT/D,OAAOC,SAAS+D,KAAO,0BAA0B2B,mBAAmBD,EAAMhG,KAAKb,QAAQ,gBAAiB,QACvG,OAEL+G,WAAY,WAGRC,EAAgB,KACpB,MAAMC,EAAMlB,EAAcE,EAAQnC,cAAc,iBAAiBC,OAAS,KACpElE,EAAOD,QAAQqG,EAAQnC,cAAc,kBAAkBC,OACvDmD,EAAiB,MAARD,EAAc,IAAM,IAAMA,EAAM,IAC/ChB,EAAQnC,cAAc,qBAAqBqD,YAActH,EAAOqH,EAASrH,EAAO,IAElFoG,EAAQnC,cAAc,iBAAiB9C,iBAAiB,QAASiD,IAC/DgC,EAAQnC,cAAc,uBAAuBsD,UAAUC,OAAO,MAAO1B,EAAW1B,EAAES,OAAOX,OAAS,MAClGiD,MAEFf,EAAQnC,cAAc,kBAAkB9C,iBAAiB,QAASgG,GAClEA,KAGFM,YAAc,KACZ9H,OAAOqF,QAAQ,qDAAsDE,IAC9DA,IACLnE,KAAKH,SAAWG,KAAKe,cAAcf,KAAKL,KAAKqB,SAAUhB,KAAKL,KAAKE,UACjEG,KAAKL,KAAO,IAAKK,KAAKL,UAI1BgE,WAAaO,UACXlE,KAAKN,QAAS,EACd,MAAMF,EAAQQ,KAAKyC,gBACZsD,EAAWY,SAAepI,WAAW,CAAE0B,KAAMD,KAAKC,QAAST,IAClEQ,KAAKN,QAAS,EAEVqG,EACFlH,MAAMY,MAAMsG,EAAU3B,KAAO,wBAI/BpE,KAAKH,SAAWG,KAAKH,SAASmC,IAAI4E,IAChC,MAAMC,EAAUrH,EAAMK,SAAS+B,KAAKkF,GAAKA,EAAEtG,WAAaoG,EAAEpG,UAC1D,OAAOqG,EAAU,IAAKD,EAAGvE,QAASwE,EAAQxE,SAAYuE,IAExD5G,KAAKL,KAAO,IACPK,KAAKL,QACLH,EACHK,SAAUL,EAAMK,SAASyB,OAAOc,GAAKA,EAAEC,QAAQlD,QAC/C4H,UAAWJ,EAAMI,WAGnB5G,SAASc,MAAQ,SAASzB,EAAMP,MAAQO,EAAMyB,OAASjB,KAAKC,eAC5DpB,MAAMwF,QAAQ,gBAOhB,MAAA2C,GACE,GAAIhH,KAAKT,QAAS,OAAOnB,IAAI,6BAE7B,GAAI4B,KAAKP,MAAO,OAAOrB,IAAI;;;;;MAO3B,MAAMuB,KAAEA,EAAIC,UAAEA,EAASC,SAAEA,GAAaG,KAChCiH,EAA0B,WAAftH,EAAKuH,MAChBC,EAAWxH,EAAK+D,OAEtB,OAAOtF,IAAI;QACP+I,EAAW/I,IAAI;;;;QAIb;;;;;;qBAMW4B,KAAKoB;;;;;;UAMf6F,GAAaE,EAKZ,GALuB/I,IAAI;;6CAEM4B,KAAKgE;8BACpBhE,KAAKwE;;;UAGxB2C,EAOC,GAPU/I,IAAI;;8BAEI4B,KAAK0G;8DAC2B1G,KAAKN,mBAAmBM,KAAK2D;;;;;;8BAM7DhE,EAAKV,MAAQU,EAAKsB,OAASjB,KAAKC;;iBAE7CD,KAAKoB,sCAAsCpB,KAAKoB;;;;;;;;sEAQKzB,EAAKV,MAAQ,kBAAkBgI,GAAYE;;;;uEAI1CxH,EAAKsB,OAAS,kBAAkBkG;;;;6EAI1BxH,EAAKyD,aAAe,kBAAkB6D,GAAYE;;cAEhHF,EAKC,GALU7I,IAAI;;;sCAGQuB,EAAKyH,QAAU;;;;;gBAKrC,MACA,MAAMC,EAAUrH,KAAKC,KAAKb,QAAQ,gBAAiB,IAAIiC,MAAM,KAAKiG,MAAM,GAAI,GAAG9F,KAAK,MAAQ,IACtF+F,EAAY3H,EAAU0B,OAAOO,IACjC,MAAM2F,EAAuB,MAAhB3F,EAAE4F,UAAoB,GAAK5F,EAAE4F,UACpCC,EAAmB,MAAZL,EAAkB,GAAKA,EACpC,MAAgB,KAATG,GAAeE,IAASF,GAAQE,EAAKC,WAAWH,EAAO,OAG1DI,EAAeL,EAAUhF,KAAKV,GAAKA,EAAE5C,OAASU,EAAKqB,UACzD,OAAO5C,IAAI;oEACyC4B,KAAK4D,oCAAoCuD;sBACtFS,EAAsH,GAAvGxJ,IAAI,kBAAkBuB,EAAKqB,sBAAsBrB,EAAKqB;sBACtEuG,EAAUvF,IAAIH,GAAKzD,IAAI;uCACNyD,EAAE5C,oBAAoB4C,EAAE5C,OAASU,EAAKqB,aANvCa,IAAqB,MAAhBA,EAAE4F,UAAoB,IAAI5F,EAAE5C,OAAS,IAAI4C,EAAE4F,aAAa5F,EAAE5C,OAMX4I,CAAchG;;;iBAIzF,EAjBC;;;;oCAqBoBlC,EAAKuH,OAAS;;;;oCAIdvH,EAAKmI,UAAY,IAAIC,KAAKpI,EAAKmI,WAAWE,iBAAmB;;;;oCAI7DrI,EAAKoH,UAAY,IAAIgB,KAAKpI,EAAKoH,WAAWiB,iBAAmB;;;;UAIvF3J,OAAOwB,EAAU+G,GAAKA,EAAEpG,SAAU,EAAGA,WAAUuB,QAAOM,UAASC,eACnE,MAAM2F,EAAyB,YAAbzH,EACZ0H,EAAcnG,IAAUkG,EAAY,UAAYzH,EAAS8G,MAAM,EAAG,GAAGa,cAAgB3H,EAAS8G,MAAM,IAC1G,OAAOlJ,IAAI;qDACoCoC,eAAsByH;gBAC3DC,IAAc5F,EAAWlE,IAAI,oEAAsE;;+CAEpEoC,eAAsByH;;;;mCAIlCzH;;4BAEP6B;0BACFvD,oBAAoBsJ,IAAI5H,GAAY,OAAS;;+BAExC2G;;;;;;KAQ7B,EAGFkB,eAAeC,OAAO,oBAAqBjJ","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ import{html}from"/kempo-ui/lit-all.min.js";import TableControl from"/kempo-ui/components/tableControls/TableControl.js";import Dialog from"/kempo-ui/components/Dialog.js";import Toast from"/kempo-ui/components/Toast.js";import"/kempo-ui/components/Icon.js";export default class TableRowDelete extends TableControl{static properties={maxWidth:{type:Number,attribute:"max-width"},sdkMethod:{type:String,attribute:"sdk-method"},primaryKey:{type:String,attribute:"primary-key"}};constructor(){super(),this.maxWidth=40,this.sdkMethod="deleteUsers",this.idField="id"}delete=()=>{this.record&&Dialog.confirm("Are you sure you want to delete this record? This action cannot be undone.",async e=>{if(!e)return;const t=(await import("../../kempo/sdk.js"))[this.sdkMethod];if(!t)return void Toast.error("Delete method not found");const[o,r]=await t([this.record[this.primaryKey]]);o?Toast.error(o.msg||"Failed to delete record"):(this.table.deleteRecord(this.record),Toast.success("Record deleted successfully"))})};render(){return html`<button class="no-btn icon-btn" @click="${this.delete}">
2
+ <slot><k-icon name="delete"></k-icon></slot>
3
+ </button>`}}customElements.define("admin-table-row-delete",TableRowDelete);
4
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\admin\components\TableRowDelete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src\\admin\\components\\TableRowDelete.js","names":["html","TableControl","Dialog","Toast","TableRowDelete","static","maxWidth","type","Number","attribute","sdkMethod","String","primaryKey","constructor","super","this","idField","delete","record","confirm","async","confirmed","deleteMethod","import","error","result","msg","table","deleteRecord","success","render","customElements","define"],"sources":["0"],"sourcesContent":["import { html } from '/kempo-ui/lit-all.min.js';\r\nimport TableControl from '/kempo-ui/components/tableControls/TableControl.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 TableRowDelete extends TableControl {\r\n static properties = {\r\n maxWidth: { type: Number, attribute: 'max-width' },\r\n sdkMethod: { type: String, attribute: 'sdk-method' },\r\n primaryKey: { type: String, attribute: 'primary-key' }\r\n };\r\n\r\n constructor(){\r\n super();\r\n this.maxWidth = 40;\r\n this.sdkMethod = 'deleteUsers';\r\n this.idField = 'id';\r\n }\r\n\r\n delete = () => {\r\n if(!this.record) return;\r\n\r\n Dialog.confirm('Are you sure you want to delete this record? This action cannot be undone.', async (confirmed) => {\r\n if(!confirmed) return;\r\n\r\n const module = await import('../../kempo/sdk.js');\r\n const deleteMethod = module[this.sdkMethod];\r\n\r\n if(!deleteMethod){\r\n Toast.error('Delete method not found');\r\n return;\r\n }\r\n\r\n const [error, result] = await deleteMethod([this.record[this.primaryKey]]);\r\n\r\n if(error){\r\n Toast.error(error.msg || 'Failed to delete record');\r\n return;\r\n }\r\n\r\n this.table.deleteRecord(this.record);\r\n Toast.success('Record deleted successfully');\r\n });\r\n };\r\n\r\n render(){\r\n return html`<button class=\"no-btn icon-btn\" @click=\"${this.delete}\">\r\n <slot><k-icon name=\"delete\"></k-icon></slot>\r\n </button>`;\r\n }\r\n}\r\n\r\ncustomElements.define('admin-table-row-delete', TableRowDelete);\r\n"],"mappings":"OAASA,SAAY,kCACdC,iBAAkB,4DAClBC,WAAY,wCACZC,UAAW,sCACX,8CAEQ,MAAMC,uBAAuBH,aAC1CI,kBAAoB,CAClBC,SAAU,CAAEC,KAAMC,OAAQC,UAAW,aACrCC,UAAW,CAAEH,KAAMI,OAAQF,UAAW,cACtCG,WAAY,CAAEL,KAAMI,OAAQF,UAAW,gBAGzC,WAAAI,GACEC,QACAC,KAAKT,SAAW,GAChBS,KAAKL,UAAY,cACjBK,KAAKC,QAAU,IACjB,CAEAC,OAAS,KACHF,KAAKG,QAEThB,OAAOiB,QAAQ,6EAA8EC,MAAOC,IAClG,IAAIA,EAAW,OAEf,MACMC,SADeC,OAAO,uBACAR,KAAKL,WAEjC,IAAIY,EAEF,YADAnB,MAAMqB,MAAM,2BAId,MAAOA,EAAOC,SAAgBH,EAAa,CAACP,KAAKG,OAAOH,KAAKH,cAE1DY,EACDrB,MAAMqB,MAAMA,EAAME,KAAO,4BAI3BX,KAAKY,MAAMC,aAAab,KAAKG,QAC7Bf,MAAM0B,QAAQ,mCAIlB,MAAAC,GACE,OAAO9B,IAAI,2CAA2Ce,KAAKE;;cAG7D,EAGFc,eAAeC,OAAO,yBAA0B5B","ignoreList":[]}
@@ -0,0 +1,8 @@
1
+ import TableControl from"/kempo-ui/components/tableControls/TableControl.js";import{html}from"/kempo-ui/lit-all.min.js";import"/kempo-ui/components/Icon.js";export default class TableRowLink extends TableControl{static get properties(){return{urlPattern:{type:String,attribute:"url-pattern"},fieldName:{type:String,attribute:"field-name"}}}constructor(){super(),this.fieldName="id",this.maxWidth=40}navigate=()=>{if(!this.record)return;const t=this.record[this.fieldName];if(!t)return;const e=this.urlPattern.replace(`{${this.fieldName}}`,t);window.location.href=e};render(){return html`
2
+ <button class="no-btn icon-btn" @click="${this.navigate}">
3
+ <slot>
4
+ <k-icon name="visibility"></k-icon>
5
+ </slot>
6
+ </button>
7
+ `}}customElements.define("admin-table-row-link",TableRowLink);
8
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\admin\components\TableRowLink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src\\admin\\components\\TableRowLink.js","names":["TableControl","html","TableRowLink","properties","urlPattern","type","String","attribute","fieldName","constructor","super","this","maxWidth","navigate","record","fieldValue","url","replace","window","location","href","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 '/kempo-ui/components/Icon.js';\r\n\r\nexport default class TableRowLink extends TableControl {\r\n static get properties() {\r\n return {\r\n urlPattern: { type: String, attribute: 'url-pattern' },\r\n fieldName: { type: String, attribute: 'field-name' }\r\n };\r\n }\r\n\r\n constructor() {\r\n super();\r\n this.fieldName = 'id';\r\n this.maxWidth = 40;\r\n }\r\n\r\n navigate = () => {\r\n if(!this.record) return;\r\n\r\n const fieldValue = this.record[this.fieldName];\r\n if(!fieldValue) return;\r\n\r\n const url = this.urlPattern.replace(`{${this.fieldName}}`, fieldValue);\r\n window.location.href = url;\r\n };\r\n\r\n render() {\r\n return html`\r\n <button class=\"no-btn icon-btn\" @click=\"${this.navigate}\">\r\n <slot>\r\n <k-icon name=\"visibility\"></k-icon>\r\n </slot>\r\n </button>\r\n `;\r\n }\r\n}\r\n\r\ncustomElements.define('admin-table-row-link', TableRowLink);\r\n\r\n"],"mappings":"OAAOA,iBAAkB,4DAChBC,SAAY,iCACd,8CAEQ,MAAMC,qBAAqBF,aACxC,qBAAWG,GACT,MAAO,CACLC,WAAY,CAAEC,KAAMC,OAAQC,UAAW,eACvCC,UAAW,CAAEH,KAAMC,OAAQC,UAAW,cAE1C,CAEA,WAAAE,GACEC,QACAC,KAAKH,UAAY,KACjBG,KAAKC,SAAW,EAClB,CAEAC,SAAW,KACT,IAAIF,KAAKG,OAAQ,OAEjB,MAAMC,EAAaJ,KAAKG,OAAOH,KAAKH,WACpC,IAAIO,EAAY,OAEhB,MAAMC,EAAML,KAAKP,WAAWa,QAAQ,IAAIN,KAAKH,aAAcO,GAC3DG,OAAOC,SAASC,KAAOJ,GAGzB,MAAAK,GACE,OAAOpB,IAAI;gDACiCU,KAAKE;;;;;KAMnD,EAGFS,eAAeC,OAAO,uBAAwBrB","ignoreList":[]}