@aphexcms/cms-core 2.0.9 → 2.0.11

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 (381) hide show
  1. package/LICENSE +21 -0
  2. package/dist/api/api-keys.d.ts +8 -7
  3. package/dist/api/api-keys.d.ts.map +1 -1
  4. package/dist/api/assets.d.ts +7 -22
  5. package/dist/api/assets.d.ts.map +1 -1
  6. package/dist/api/assets.js +1 -10
  7. package/dist/api/documents.d.ts +17 -16
  8. package/dist/api/documents.d.ts.map +1 -1
  9. package/dist/api/documents.js +2 -2
  10. package/dist/api/index.d.ts +1 -0
  11. package/dist/api/index.d.ts.map +1 -1
  12. package/dist/api/index.js +1 -0
  13. package/dist/api/organizations.d.ts +15 -35
  14. package/dist/api/organizations.d.ts.map +1 -1
  15. package/dist/api/roles.d.ts +22 -0
  16. package/dist/api/roles.d.ts.map +1 -0
  17. package/dist/api/roles.js +26 -0
  18. package/dist/api/schemas/api-keys.d.ts +62 -0
  19. package/dist/api/schemas/api-keys.d.ts.map +1 -0
  20. package/dist/api/schemas/api-keys.js +28 -0
  21. package/dist/api/schemas/assets.d.ts +174 -0
  22. package/dist/api/schemas/assets.d.ts.map +1 -0
  23. package/dist/api/schemas/assets.js +99 -0
  24. package/dist/api/schemas/documents.d.ts +325 -0
  25. package/dist/api/schemas/documents.d.ts.map +1 -0
  26. package/dist/api/schemas/documents.js +161 -0
  27. package/dist/api/schemas/organizations.d.ts +41 -0
  28. package/dist/api/schemas/organizations.d.ts.map +1 -0
  29. package/dist/api/schemas/organizations.js +56 -0
  30. package/dist/api/schemas/roles.d.ts +77 -0
  31. package/dist/api/schemas/roles.d.ts.map +1 -0
  32. package/dist/api/schemas/roles.js +42 -0
  33. package/dist/api/schemas/user.d.ts +10 -0
  34. package/dist/api/schemas/user.d.ts.map +1 -0
  35. package/dist/api/schemas/user.js +11 -0
  36. package/dist/api/user.d.ts +4 -6
  37. package/dist/api/user.d.ts.map +1 -1
  38. package/dist/app-augment.d.ts +32 -0
  39. package/dist/app-augment.d.ts.map +1 -0
  40. package/dist/app-augment.js +18 -0
  41. package/dist/auth/auth-hooks.d.ts +2 -1
  42. package/dist/auth/auth-hooks.d.ts.map +1 -1
  43. package/dist/auth/auth-hooks.js +22 -2
  44. package/dist/auth/provider.d.ts +5 -0
  45. package/dist/auth/provider.d.ts.map +1 -1
  46. package/dist/cli/index.js +0 -0
  47. package/dist/client/index.d.ts +4 -0
  48. package/dist/client/index.d.ts.map +1 -1
  49. package/dist/client/index.js +7 -0
  50. package/dist/components/AdminApp.svelte +306 -142
  51. package/dist/components/AdminApp.svelte.d.ts +8 -0
  52. package/dist/components/AdminApp.svelte.d.ts.map +1 -1
  53. package/dist/components/admin/DocumentEditor.svelte +653 -365
  54. package/dist/components/admin/DocumentEditor.svelte.d.ts +2 -0
  55. package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
  56. package/dist/components/admin/DocumentVersionPanel.svelte +57 -44
  57. package/dist/components/admin/DocumentVersionPanel.svelte.d.ts.map +1 -1
  58. package/dist/components/admin/MediaBrowser.svelte +70 -30
  59. package/dist/components/admin/MediaBrowser.svelte.d.ts.map +1 -1
  60. package/dist/components/admin/ObjectModal.svelte +70 -95
  61. package/dist/components/admin/ObjectModal.svelte.d.ts +1 -2
  62. package/dist/components/admin/ObjectModal.svelte.d.ts.map +1 -1
  63. package/dist/components/admin/PermissionsDebug.svelte +119 -0
  64. package/dist/components/admin/PermissionsDebug.svelte.d.ts +4 -0
  65. package/dist/components/admin/PermissionsDebug.svelte.d.ts.map +1 -0
  66. package/dist/components/admin/SchemaField.svelte +3 -1
  67. package/dist/components/admin/SchemaField.svelte.d.ts.map +1 -1
  68. package/dist/components/admin/confirm-dialog/ConfirmDialogHost.svelte +35 -0
  69. package/dist/components/admin/confirm-dialog/ConfirmDialogHost.svelte.d.ts +19 -0
  70. package/dist/components/admin/confirm-dialog/ConfirmDialogHost.svelte.d.ts.map +1 -0
  71. package/dist/components/admin/confirm-dialog/confirm-dialog.svelte.d.ts +16 -0
  72. package/dist/components/admin/confirm-dialog/confirm-dialog.svelte.d.ts.map +1 -0
  73. package/dist/components/admin/confirm-dialog/confirm-dialog.svelte.js +29 -0
  74. package/dist/components/admin/fields/ArrayField.svelte +104 -108
  75. package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -1
  76. package/dist/components/admin/fields/FileField.svelte +22 -17
  77. package/dist/components/admin/fields/FileField.svelte.d.ts.map +1 -1
  78. package/dist/components/admin/fields/ImageField.svelte +21 -15
  79. package/dist/components/admin/fields/ImageField.svelte.d.ts.map +1 -1
  80. package/dist/components/admin/fields/ReferenceField.svelte +142 -112
  81. package/dist/components/admin/fields/ReferenceField.svelte.d.ts.map +1 -1
  82. package/dist/components/admin/fields/TextareaField.svelte +4 -3
  83. package/dist/components/admin/fields/TextareaField.svelte.d.ts +2 -2
  84. package/dist/components/admin/fields/TextareaField.svelte.d.ts.map +1 -1
  85. package/dist/components/layout/Sidebar.svelte +21 -11
  86. package/dist/components/layout/Sidebar.svelte.d.ts.map +1 -1
  87. package/dist/components/layout/sidebar/NavMain.svelte +1 -0
  88. package/dist/db/interfaces/document.d.ts.map +1 -1
  89. package/dist/db/interfaces/index.d.ts +3 -1
  90. package/dist/db/interfaces/index.d.ts.map +1 -1
  91. package/dist/db/interfaces/organization.d.ts +1 -1
  92. package/dist/db/interfaces/organization.d.ts.map +1 -1
  93. package/dist/db/interfaces/role.d.ts +25 -0
  94. package/dist/db/interfaces/role.d.ts.map +1 -0
  95. package/dist/db/interfaces/role.js +1 -0
  96. package/dist/engine.d.ts.map +1 -1
  97. package/dist/engine.js +5 -0
  98. package/dist/field-access.d.ts +30 -0
  99. package/dist/field-access.d.ts.map +1 -0
  100. package/dist/field-access.js +79 -0
  101. package/dist/hooks.d.ts +2 -0
  102. package/dist/hooks.d.ts.map +1 -1
  103. package/dist/hooks.js +23 -13
  104. package/dist/lib/api/api-keys.d.ts +8 -7
  105. package/dist/lib/api/api-keys.d.ts.map +1 -1
  106. package/dist/lib/api/api-keys.js.map +1 -1
  107. package/dist/lib/api/assets.d.ts +7 -22
  108. package/dist/lib/api/assets.d.ts.map +1 -1
  109. package/dist/lib/api/assets.js +1 -10
  110. package/dist/lib/api/assets.js.map +1 -1
  111. package/dist/lib/api/documents.d.ts +17 -16
  112. package/dist/lib/api/documents.d.ts.map +1 -1
  113. package/dist/lib/api/documents.js +2 -2
  114. package/dist/lib/api/documents.js.map +1 -1
  115. package/dist/lib/api/index.d.ts +1 -0
  116. package/dist/lib/api/index.d.ts.map +1 -1
  117. package/dist/lib/api/index.js +1 -0
  118. package/dist/lib/api/index.js.map +1 -1
  119. package/dist/lib/api/organizations.d.ts +15 -35
  120. package/dist/lib/api/organizations.d.ts.map +1 -1
  121. package/dist/lib/api/organizations.js.map +1 -1
  122. package/dist/lib/api/roles.d.ts +22 -0
  123. package/dist/lib/api/roles.d.ts.map +1 -0
  124. package/dist/lib/api/roles.js +27 -0
  125. package/dist/lib/api/roles.js.map +1 -0
  126. package/dist/lib/api/schemas/api-keys.d.ts +62 -0
  127. package/dist/lib/api/schemas/api-keys.d.ts.map +1 -0
  128. package/dist/lib/api/schemas/api-keys.js +29 -0
  129. package/dist/lib/api/schemas/api-keys.js.map +1 -0
  130. package/dist/lib/api/schemas/assets.d.ts +174 -0
  131. package/dist/lib/api/schemas/assets.d.ts.map +1 -0
  132. package/dist/lib/api/schemas/assets.js +100 -0
  133. package/dist/lib/api/schemas/assets.js.map +1 -0
  134. package/dist/lib/api/schemas/documents.d.ts +325 -0
  135. package/dist/lib/api/schemas/documents.d.ts.map +1 -0
  136. package/dist/lib/api/schemas/documents.js +162 -0
  137. package/dist/lib/api/schemas/documents.js.map +1 -0
  138. package/dist/lib/api/schemas/organizations.d.ts +41 -0
  139. package/dist/lib/api/schemas/organizations.d.ts.map +1 -0
  140. package/dist/lib/api/schemas/organizations.js +57 -0
  141. package/dist/lib/api/schemas/organizations.js.map +1 -0
  142. package/dist/lib/api/schemas/roles.d.ts +77 -0
  143. package/dist/lib/api/schemas/roles.d.ts.map +1 -0
  144. package/dist/lib/api/schemas/roles.js +43 -0
  145. package/dist/lib/api/schemas/roles.js.map +1 -0
  146. package/dist/lib/api/schemas/user.d.ts +10 -0
  147. package/dist/lib/api/schemas/user.d.ts.map +1 -0
  148. package/dist/lib/api/schemas/user.js +12 -0
  149. package/dist/lib/api/schemas/user.js.map +1 -0
  150. package/dist/lib/api/user.d.ts +4 -6
  151. package/dist/lib/api/user.d.ts.map +1 -1
  152. package/dist/lib/api/user.js.map +1 -1
  153. package/dist/lib/app-augment.d.ts +32 -0
  154. package/dist/lib/app-augment.d.ts.map +1 -0
  155. package/dist/lib/app-augment.js +19 -0
  156. package/dist/lib/app-augment.js.map +1 -0
  157. package/dist/lib/auth/auth-hooks.d.ts +2 -1
  158. package/dist/lib/auth/auth-hooks.d.ts.map +1 -1
  159. package/dist/lib/auth/auth-hooks.js +22 -2
  160. package/dist/lib/auth/auth-hooks.js.map +1 -1
  161. package/dist/lib/auth/provider.d.ts +5 -0
  162. package/dist/lib/auth/provider.d.ts.map +1 -1
  163. package/dist/lib/client/index.d.ts +4 -0
  164. package/dist/lib/client/index.d.ts.map +1 -1
  165. package/dist/lib/client/index.js +7 -0
  166. package/dist/lib/client/index.js.map +1 -1
  167. package/dist/lib/components/admin/confirm-dialog/confirm-dialog.svelte.d.ts +16 -0
  168. package/dist/lib/components/admin/confirm-dialog/confirm-dialog.svelte.d.ts.map +1 -0
  169. package/dist/lib/components/admin/confirm-dialog/confirm-dialog.svelte.js +30 -0
  170. package/dist/lib/components/admin/confirm-dialog/confirm-dialog.svelte.js.map +1 -0
  171. package/dist/lib/db/interfaces/document.d.ts.map +1 -1
  172. package/dist/lib/db/interfaces/index.d.ts +3 -1
  173. package/dist/lib/db/interfaces/index.d.ts.map +1 -1
  174. package/dist/lib/db/interfaces/organization.d.ts +1 -1
  175. package/dist/lib/db/interfaces/organization.d.ts.map +1 -1
  176. package/dist/lib/db/interfaces/role.d.ts +25 -0
  177. package/dist/lib/db/interfaces/role.d.ts.map +1 -0
  178. package/dist/lib/db/interfaces/role.js +2 -0
  179. package/dist/lib/db/interfaces/role.js.map +1 -0
  180. package/dist/lib/engine.d.ts.map +1 -1
  181. package/dist/lib/engine.js +5 -0
  182. package/dist/lib/engine.js.map +1 -1
  183. package/dist/lib/field-access.d.ts +30 -0
  184. package/dist/lib/field-access.d.ts.map +1 -0
  185. package/dist/lib/field-access.js +80 -0
  186. package/dist/lib/field-access.js.map +1 -0
  187. package/dist/lib/hooks.d.ts +2 -0
  188. package/dist/lib/hooks.d.ts.map +1 -1
  189. package/dist/lib/hooks.js +23 -13
  190. package/dist/lib/hooks.js.map +1 -1
  191. package/dist/lib/local-api/collection-api.d.ts +2 -0
  192. package/dist/lib/local-api/collection-api.d.ts.map +1 -1
  193. package/dist/lib/local-api/collection-api.js +98 -30
  194. package/dist/lib/local-api/collection-api.js.map +1 -1
  195. package/dist/lib/local-api/index.d.ts.map +1 -1
  196. package/dist/lib/local-api/index.js.map +1 -1
  197. package/dist/lib/local-api/permissions.d.ts +26 -26
  198. package/dist/lib/local-api/permissions.d.ts.map +1 -1
  199. package/dist/lib/local-api/permissions.js +122 -80
  200. package/dist/lib/local-api/permissions.js.map +1 -1
  201. package/dist/lib/permissions-context.svelte.d.ts +44 -0
  202. package/dist/lib/permissions-context.svelte.d.ts.map +1 -0
  203. package/dist/lib/permissions-context.svelte.js +80 -0
  204. package/dist/lib/permissions-context.svelte.js.map +1 -0
  205. package/dist/lib/routes/assets-bulk.d.ts.map +1 -1
  206. package/dist/lib/routes/assets-bulk.js +10 -3
  207. package/dist/lib/routes/assets-bulk.js.map +1 -1
  208. package/dist/lib/routes/assets-by-id.d.ts.map +1 -1
  209. package/dist/lib/routes/assets-by-id.js +11 -1
  210. package/dist/lib/routes/assets-by-id.js.map +1 -1
  211. package/dist/lib/routes/assets-references-counts.d.ts.map +1 -1
  212. package/dist/lib/routes/assets-references-counts.js +12 -2
  213. package/dist/lib/routes/assets-references-counts.js.map +1 -1
  214. package/dist/lib/routes/assets.d.ts.map +1 -1
  215. package/dist/lib/routes/assets.js +14 -13
  216. package/dist/lib/routes/assets.js.map +1 -1
  217. package/dist/lib/routes/document-versions.d.ts.map +1 -1
  218. package/dist/lib/routes/document-versions.js +16 -2
  219. package/dist/lib/routes/document-versions.js.map +1 -1
  220. package/dist/lib/routes/documents-by-id.d.ts.map +1 -1
  221. package/dist/lib/routes/documents-by-id.js +15 -3
  222. package/dist/lib/routes/documents-by-id.js.map +1 -1
  223. package/dist/lib/routes/documents-query.d.ts.map +1 -1
  224. package/dist/lib/routes/documents-query.js +13 -10
  225. package/dist/lib/routes/documents-query.js.map +1 -1
  226. package/dist/lib/routes/documents.d.ts.map +1 -1
  227. package/dist/lib/routes/documents.js +29 -26
  228. package/dist/lib/routes/documents.js.map +1 -1
  229. package/dist/lib/routes/organizations-by-id.d.ts.map +1 -1
  230. package/dist/lib/routes/organizations-by-id.js +17 -4
  231. package/dist/lib/routes/organizations-by-id.js.map +1 -1
  232. package/dist/lib/routes/organizations-invitations.d.ts.map +1 -1
  233. package/dist/lib/routes/organizations-invitations.js +48 -18
  234. package/dist/lib/routes/organizations-invitations.js.map +1 -1
  235. package/dist/lib/routes/organizations-members.d.ts.map +1 -1
  236. package/dist/lib/routes/organizations-members.js +24 -18
  237. package/dist/lib/routes/organizations-members.js.map +1 -1
  238. package/dist/lib/routes/organizations-switch.d.ts.map +1 -1
  239. package/dist/lib/routes/organizations-switch.js +7 -3
  240. package/dist/lib/routes/organizations-switch.js.map +1 -1
  241. package/dist/lib/routes/organizations.d.ts.map +1 -1
  242. package/dist/lib/routes/organizations.js +11 -5
  243. package/dist/lib/routes/organizations.js.map +1 -1
  244. package/dist/lib/routes/roles-by-name.d.ts +4 -0
  245. package/dist/lib/routes/roles-by-name.d.ts.map +1 -0
  246. package/dist/lib/routes/roles-by-name.js +112 -0
  247. package/dist/lib/routes/roles-by-name.js.map +1 -0
  248. package/dist/lib/routes/roles.d.ts +4 -0
  249. package/dist/lib/routes/roles.d.ts.map +1 -0
  250. package/dist/lib/routes/roles.js +91 -0
  251. package/dist/lib/routes/roles.js.map +1 -0
  252. package/dist/lib/routes/user-preferences.d.ts.map +1 -1
  253. package/dist/lib/routes/user-preferences.js +7 -13
  254. package/dist/lib/routes/user-preferences.js.map +1 -1
  255. package/dist/lib/routes-exports.d.ts +2 -0
  256. package/dist/lib/routes-exports.d.ts.map +1 -1
  257. package/dist/lib/routes-exports.js +3 -0
  258. package/dist/lib/routes-exports.js.map +1 -1
  259. package/dist/lib/save-state-context.svelte.d.ts +8 -0
  260. package/dist/lib/save-state-context.svelte.d.ts.map +1 -0
  261. package/dist/lib/save-state-context.svelte.js +9 -0
  262. package/dist/lib/save-state-context.svelte.js.map +1 -0
  263. package/dist/lib/schema-utils/validator.d.ts.map +1 -1
  264. package/dist/lib/schema-utils/validator.js +14 -0
  265. package/dist/lib/schema-utils/validator.js.map +1 -1
  266. package/dist/lib/server/index.d.ts +1 -0
  267. package/dist/lib/server/index.d.ts.map +1 -1
  268. package/dist/lib/server/index.js +1 -0
  269. package/dist/lib/server/index.js.map +1 -1
  270. package/dist/lib/services/index.d.ts +1 -0
  271. package/dist/lib/services/index.d.ts.map +1 -1
  272. package/dist/lib/services/index.js +1 -0
  273. package/dist/lib/services/index.js.map +1 -1
  274. package/dist/lib/services/roles-service.d.ts +35 -0
  275. package/dist/lib/services/roles-service.d.ts.map +1 -0
  276. package/dist/lib/services/roles-service.js +91 -0
  277. package/dist/lib/services/roles-service.js.map +1 -0
  278. package/dist/lib/services/version-service.d.ts.map +1 -1
  279. package/dist/lib/services/version-service.js.map +1 -1
  280. package/dist/lib/types/auth.d.ts +43 -9
  281. package/dist/lib/types/auth.d.ts.map +1 -1
  282. package/dist/lib/types/auth.js +31 -26
  283. package/dist/lib/types/auth.js.map +1 -1
  284. package/dist/lib/types/capabilities.d.ts +104 -0
  285. package/dist/lib/types/capabilities.d.ts.map +1 -0
  286. package/dist/lib/types/capabilities.js +217 -0
  287. package/dist/lib/types/capabilities.js.map +1 -0
  288. package/dist/lib/types/index.d.ts +1 -0
  289. package/dist/lib/types/index.d.ts.map +1 -1
  290. package/dist/lib/types/index.js +1 -0
  291. package/dist/lib/types/index.js.map +1 -1
  292. package/dist/lib/types/organization.d.ts +13 -4
  293. package/dist/lib/types/organization.d.ts.map +1 -1
  294. package/dist/lib/types/schemas.d.ts +71 -0
  295. package/dist/lib/types/schemas.d.ts.map +1 -1
  296. package/dist/lib/types/sidebar.d.ts +1 -1
  297. package/dist/lib/types/sidebar.d.ts.map +1 -1
  298. package/dist/lib/utils/mime-detect.d.ts.map +1 -1
  299. package/dist/lib/utils/mime-detect.js +28 -6
  300. package/dist/lib/utils/mime-detect.js.map +1 -1
  301. package/dist/local-api/collection-api.d.ts +2 -0
  302. package/dist/local-api/collection-api.d.ts.map +1 -1
  303. package/dist/local-api/collection-api.js +98 -30
  304. package/dist/local-api/index.d.ts.map +1 -1
  305. package/dist/local-api/permissions.d.ts +26 -26
  306. package/dist/local-api/permissions.d.ts.map +1 -1
  307. package/dist/local-api/permissions.js +122 -80
  308. package/dist/permissions-context.svelte.d.ts +44 -0
  309. package/dist/permissions-context.svelte.d.ts.map +1 -0
  310. package/dist/permissions-context.svelte.js +79 -0
  311. package/dist/plugins/README.md +20 -20
  312. package/dist/routes/assets-bulk.d.ts.map +1 -1
  313. package/dist/routes/assets-bulk.js +10 -3
  314. package/dist/routes/assets-by-id.d.ts.map +1 -1
  315. package/dist/routes/assets-by-id.js +11 -1
  316. package/dist/routes/assets-references-counts.d.ts.map +1 -1
  317. package/dist/routes/assets-references-counts.js +12 -2
  318. package/dist/routes/assets.d.ts.map +1 -1
  319. package/dist/routes/assets.js +14 -13
  320. package/dist/routes/document-versions.d.ts.map +1 -1
  321. package/dist/routes/document-versions.js +16 -2
  322. package/dist/routes/documents-by-id.d.ts.map +1 -1
  323. package/dist/routes/documents-by-id.js +15 -3
  324. package/dist/routes/documents-query.d.ts.map +1 -1
  325. package/dist/routes/documents-query.js +13 -10
  326. package/dist/routes/documents.d.ts.map +1 -1
  327. package/dist/routes/documents.js +29 -26
  328. package/dist/routes/organizations-by-id.d.ts.map +1 -1
  329. package/dist/routes/organizations-by-id.js +17 -4
  330. package/dist/routes/organizations-invitations.d.ts.map +1 -1
  331. package/dist/routes/organizations-invitations.js +48 -18
  332. package/dist/routes/organizations-members.d.ts.map +1 -1
  333. package/dist/routes/organizations-members.js +24 -18
  334. package/dist/routes/organizations-switch.d.ts.map +1 -1
  335. package/dist/routes/organizations-switch.js +7 -3
  336. package/dist/routes/organizations.d.ts.map +1 -1
  337. package/dist/routes/organizations.js +11 -5
  338. package/dist/routes/roles-by-name.d.ts +4 -0
  339. package/dist/routes/roles-by-name.d.ts.map +1 -0
  340. package/dist/routes/roles-by-name.js +111 -0
  341. package/dist/routes/roles.d.ts +4 -0
  342. package/dist/routes/roles.d.ts.map +1 -0
  343. package/dist/routes/roles.js +90 -0
  344. package/dist/routes/user-preferences.d.ts.map +1 -1
  345. package/dist/routes/user-preferences.js +7 -13
  346. package/dist/routes-exports.d.ts +2 -0
  347. package/dist/routes-exports.d.ts.map +1 -1
  348. package/dist/routes-exports.js +3 -0
  349. package/dist/save-state-context.svelte.d.ts +8 -0
  350. package/dist/save-state-context.svelte.d.ts.map +1 -0
  351. package/dist/save-state-context.svelte.js +8 -0
  352. package/dist/schema-utils/validator.d.ts.map +1 -1
  353. package/dist/schema-utils/validator.js +14 -0
  354. package/dist/server/index.d.ts +1 -0
  355. package/dist/server/index.d.ts.map +1 -1
  356. package/dist/server/index.js +1 -0
  357. package/dist/services/index.d.ts +1 -0
  358. package/dist/services/index.d.ts.map +1 -1
  359. package/dist/services/index.js +1 -0
  360. package/dist/services/roles-service.d.ts +35 -0
  361. package/dist/services/roles-service.d.ts.map +1 -0
  362. package/dist/services/roles-service.js +90 -0
  363. package/dist/services/version-service.d.ts.map +1 -1
  364. package/dist/types/auth.d.ts +43 -9
  365. package/dist/types/auth.d.ts.map +1 -1
  366. package/dist/types/auth.js +31 -26
  367. package/dist/types/capabilities.d.ts +104 -0
  368. package/dist/types/capabilities.d.ts.map +1 -0
  369. package/dist/types/capabilities.js +216 -0
  370. package/dist/types/index.d.ts +1 -0
  371. package/dist/types/index.d.ts.map +1 -1
  372. package/dist/types/index.js +1 -0
  373. package/dist/types/organization.d.ts +13 -4
  374. package/dist/types/organization.d.ts.map +1 -1
  375. package/dist/types/schemas.d.ts +71 -0
  376. package/dist/types/schemas.d.ts.map +1 -1
  377. package/dist/types/sidebar.d.ts +1 -1
  378. package/dist/types/sidebar.d.ts.map +1 -1
  379. package/dist/utils/mime-detect.d.ts.map +1 -1
  380. package/dist/utils/mime-detect.js +28 -6
  381. package/package.json +142 -138
@@ -9,6 +9,8 @@ interface Props {
9
9
  onAutoSaved?: (documentId: string, title: string) => void;
10
10
  onDeleted?: () => void;
11
11
  onPublished?: (documentId: string) => void;
12
+ onUnpublished?: (documentId: string) => void;
13
+ onRestored?: (documentId: string) => void;
12
14
  onOpenReference?: (documentId: string, documentType: string) => void;
13
15
  onOpenVersionHistory?: (documentId: string) => void;
14
16
  externalVersionPreview?: {
@@ -1 +1 @@
1
- {"version":3,"file":"DocumentEditor.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/DocumentEditor.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAWxD,UAAU,KAAK;IACd,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,sBAAsB,CAAC,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5H,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAkrCF,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"DocumentEditor.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/DocumentEditor.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAaxD,UAAU,KAAK;IACd,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,sBAAsB,CAAC,EAAE;QACxB,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI,CAAC;IACT,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AA+5CF,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -8,10 +8,18 @@
8
8
  documentId: string;
9
9
  onClose: () => void;
10
10
  onRestored?: () => void;
11
- onPreviewVersion?: (version: { versionNumber: number; data: Record<string, any>; eventType: string; createdAt?: string } | null) => void;
11
+ onPreviewVersion?: (
12
+ version: {
13
+ versionNumber: number;
14
+ data: Record<string, any>;
15
+ eventType: string;
16
+ createdAt?: string;
17
+ } | null
18
+ ) => void;
12
19
  }
13
20
 
14
21
  let { documentId, onClose, onRestored, onPreviewVersion }: Props = $props();
22
+ void onRestored;
15
23
 
16
24
  let versions = $state<any[]>([]);
17
25
  let loading = $state(true);
@@ -44,61 +52,51 @@
44
52
  try {
45
53
  const res = await documents.getVersion(documentId, version.versionNumber);
46
54
  if (res.success && res.data) {
47
- previewVersion = { ...version, data: res.data.data };
55
+ previewVersion = { ...version, data: res.data.data ?? {} };
48
56
  onPreviewVersion?.({
49
57
  versionNumber: version.versionNumber,
50
- data: res.data.data,
58
+ data: res.data.data ?? {},
51
59
  eventType: version.eventType,
52
- createdAt: version.createdAt
60
+ createdAt: version.createdAt ?? undefined
53
61
  });
54
62
  }
55
63
  } catch {
56
64
  toast.error('Failed to load version');
57
65
  }
58
66
  }
59
-
60
- function clearPreview() {
61
- previewVersion = null;
62
- onPreviewVersion?.(null);
63
- }
64
-
65
- async function restoreVersion() {
66
- if (!previewVersion) return;
67
- try {
68
- await documents.restoreVersion(documentId, previewVersion.versionNumber);
69
- toast.success(`Restored to v${previewVersion.versionNumber}`);
70
- clearPreview();
71
- onRestored?.();
72
- await loadVersions();
73
- } catch {
74
- toast.error('Failed to restore');
75
- }
76
- }
77
67
  </script>
78
68
 
79
69
  <div class="flex h-full flex-col">
80
70
  <!-- Header -->
81
71
  <div class="border-border bg-background flex h-14 items-center justify-between border-b px-3">
82
72
  <h3 class="text-sm font-medium">History</h3>
83
- <button
84
- class="hover:bg-muted rounded p-1 transition-colors"
85
- onclick={onClose}
86
- >
73
+ <Button class="hover:bg-muted rounded p-1 transition-colors" variant="ghost" onclick={onClose}>
87
74
  <svg class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
88
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
75
+ <path
76
+ stroke-linecap="round"
77
+ stroke-linejoin="round"
78
+ stroke-width="2"
79
+ d="M6 18L18 6M6 6l12 12"
80
+ />
89
81
  </svg>
90
- </button>
82
+ </Button>
91
83
  </div>
92
84
 
93
85
  <!-- Filter tabs -->
94
86
  <div class="border-border flex border-b">
95
87
  {#each [{ value: 'all', label: 'All' }, { value: 'publish', label: 'Published' }, { value: 'draft', label: 'Drafts' }] as tab}
96
- <button
97
- class="flex-1 px-2 py-2 text-xs font-medium transition-colors {filter === tab.value ? 'border-b-2 border-primary text-foreground' : 'text-muted-foreground hover:text-foreground'}"
98
- onclick={() => { filter = tab.value as any; }}
88
+ <Button
89
+ variant="ghost"
90
+ class="flex-1 cursor-pointer rounded-none px-2 py-2 text-xs font-medium transition-colors {filter ===
91
+ tab.value
92
+ ? 'border-primary text-foreground border-b-2'
93
+ : 'text-muted-foreground hover:text-foreground'}"
94
+ onclick={() => {
95
+ filter = tab.value as any;
96
+ }}
99
97
  >
100
98
  {tab.label}
101
- </button>
99
+ </Button>
102
100
  {/each}
103
101
  </div>
104
102
 
@@ -110,28 +108,43 @@
110
108
  </div>
111
109
  {:else if filteredVersions.length === 0}
112
110
  <div class="p-4 text-center">
113
- <span class="text-muted-foreground text-xs">No {filter === 'all' ? '' : filter} versions</span>
111
+ <span class="text-muted-foreground text-xs"
112
+ >No {filter === 'all' ? '' : filter} versions</span
113
+ >
114
114
  </div>
115
115
  {:else}
116
- {#each filteredVersions as version}
117
- <button
118
- class="w-full border-b px-3 py-2.5 text-left transition-colors hover:bg-muted {previewVersion?.versionNumber === version.versionNumber ? 'bg-muted border-l-2 border-l-primary' : ''}"
116
+ {#each filteredVersions as version, i}
117
+ <div
118
+ data-version-id={i}
119
+ class="hover:bg-muted w-full cursor-pointer border-b px-3 py-2.5 text-left transition-colors {previewVersion?.versionNumber ===
120
+ version.versionNumber
121
+ ? 'bg-muted border-l-primary border-l-2'
122
+ : ''}"
119
123
  onclick={() => previewVersionData(version)}
120
124
  >
121
125
  <div class="flex items-center justify-between">
122
126
  <span class="text-muted-foreground text-[11px]">
123
- {new Date(version.createdAt).toLocaleString(undefined, { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit', hour12: true })}
127
+ {new Date(version.createdAt).toLocaleString(undefined, {
128
+ month: 'short',
129
+ day: 'numeric',
130
+ hour: 'numeric',
131
+ minute: '2-digit',
132
+ hour12: true
133
+ })}
124
134
  </span>
125
- <Badge variant={version.eventType === 'publish' ? 'default' : 'secondary'} class="text-[9px] px-1.5 py-0">
135
+ <Badge
136
+ variant={version.eventType === 'publish' ? 'default' : 'secondary'}
137
+ class="px-1.5 py-0 text-[9px]"
138
+ >
126
139
  {version.eventType}
127
140
  </Badge>
128
141
  </div>
129
- {#if version.createdByName || version.createdBy}
130
- <p class="text-muted-foreground mt-0.5 truncate text-[10px]">
131
- {version.createdByName || version.createdBy}
132
- </p>
133
- {/if}
134
- </button>
142
+ {#if version.createdByName}
143
+ <p class="text-muted-foreground mt-0.5 truncate text-[10px]">
144
+ {version.createdByName}
145
+ </p>
146
+ {/if}
147
+ </div>
135
148
  {/each}
136
149
  {/if}
137
150
  </div>
@@ -1 +1 @@
1
- {"version":3,"file":"DocumentVersionPanel.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/DocumentVersionPanel.svelte.ts"],"names":[],"mappings":"AASC,UAAU,KAAK;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,KAAK,IAAI,CAAC;CACzI;AA+HF,QAAA,MAAM,oBAAoB,2CAAwC,CAAC;AACnE,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACpE,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"DocumentVersionPanel.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/DocumentVersionPanel.svelte.ts"],"names":[],"mappings":"AASC,UAAU,KAAK;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,gBAAgB,CAAC,EAAE,CAClB,OAAO,EAAE;QACR,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI,KACJ,IAAI,CAAC;CACV;AA4HF,QAAA,MAAM,oBAAoB,2CAAwC,CAAC;AACnE,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACpE,eAAe,oBAAoB,CAAC"}
@@ -33,6 +33,8 @@
33
33
  import { copyUrlToClipboard, downloadFile } from '../../utils/asset-actions';
34
34
  import { cmsLogger } from '../../utils/logger';
35
35
  import { SvelteSet } from 'svelte/reactivity';
36
+ import { confirmDialog } from './confirm-dialog/confirm-dialog.svelte';
37
+ import { usePermissions } from '../../permissions-context.svelte';
36
38
 
37
39
  interface Props {
38
40
  /** When true, shows a "Select" button for picking an asset */
@@ -71,6 +73,10 @@
71
73
  let viewMode = $state<'grid' | 'list'>('grid');
72
74
  let sortOrder = $state<'newest' | 'oldest' | 'name-asc' | 'name-desc'>('newest');
73
75
 
76
+ const perms = usePermissions();
77
+ const canUpload = $derived(perms.can('asset.upload'));
78
+ const canDeleteAssets = $derived(perms.can('asset.delete'));
79
+
74
80
  let selectedAsset = $state<Asset | null>(null);
75
81
  let lightboxOpen = $state(false);
76
82
  let currentPage = $state(1);
@@ -292,7 +298,13 @@
292
298
  }
293
299
 
294
300
  const count = selectedIds.size;
295
- if (!confirm(`Delete ${count} asset${count > 1 ? 's' : ''}? This cannot be undone.`)) return;
301
+ const confirmed = await confirmDialog({
302
+ title: `Delete ${count} asset${count > 1 ? 's' : ''}?`,
303
+ description: 'This cannot be undone.',
304
+ confirmText: 'Delete',
305
+ variant: 'destructive'
306
+ });
307
+ if (!confirmed) return;
296
308
 
297
309
  isBulkDeleting = true;
298
310
  try {
@@ -428,7 +440,13 @@
428
440
  );
429
441
  return;
430
442
  }
431
- if (!confirm(`Delete "${asset.originalFilename}"? This cannot be undone.`)) return;
443
+ const confirmed = await confirmDialog({
444
+ title: 'Delete asset?',
445
+ description: `"${asset.originalFilename}" will be permanently deleted. This cannot be undone.`,
446
+ confirmText: 'Delete',
447
+ variant: 'destructive'
448
+ });
449
+ if (!confirmed) return;
432
450
  try {
433
451
  const result = await assets.delete(asset.id);
434
452
  if (result.success) {
@@ -566,16 +584,18 @@
566
584
  <!-- Header -->
567
585
  <div class="border-border flex items-center justify-between border-b px-4 py-3 sm:px-6 sm:py-4">
568
586
  <h2 class="text-base font-semibold sm:text-lg">Browse Assets</h2>
569
- <Button
570
- size="sm"
571
- onclick={() => {
572
- showUploadModal = true;
573
- uploadQueue = [];
574
- }}
575
- >
576
- <Upload size={16} class="sm:mr-2" />
577
- <span class="hidden sm:inline">Upload assets</span>
578
- </Button>
587
+ {#if canUpload}
588
+ <Button
589
+ size="sm"
590
+ onclick={() => {
591
+ showUploadModal = true;
592
+ uploadQueue = [];
593
+ }}
594
+ >
595
+ <Upload size={16} class="sm:mr-2" />
596
+ <span class="hidden sm:inline">Upload assets</span>
597
+ </Button>
598
+ {/if}
579
599
  </div>
580
600
 
581
601
  <!-- Toolbar -->
@@ -641,8 +661,9 @@
641
661
  </button>
642
662
  </div>
643
663
 
644
- <!-- Select mode toggle -->
645
- {#if !selectable}
664
+ <!-- Select mode toggle — only useful when the user can actually act on
665
+ the selection (delete). Hidden otherwise so it doesn't dead-end. -->
666
+ {#if !selectable && canDeleteAssets}
646
667
  <button
647
668
  onclick={toggleSelectMode}
648
669
  class="rounded p-1.5 transition-colors {isSelectMode
@@ -703,15 +724,17 @@
703
724
  <span class="text-sm font-medium">
704
725
  {selectedIds.size} selected
705
726
  </span>
706
- <Button
707
- variant="destructive"
708
- size="sm"
709
- onclick={bulkDelete}
710
- disabled={isBulkDeleting}
711
- >
712
- <Trash2 size={14} class="mr-1.5" />
713
- {isBulkDeleting ? 'Deleting...' : 'Delete'}
714
- </Button>
727
+ {#if canDeleteAssets}
728
+ <Button
729
+ variant="destructive"
730
+ size="sm"
731
+ onclick={bulkDelete}
732
+ disabled={isBulkDeleting}
733
+ >
734
+ <Trash2 size={14} class="mr-1.5" />
735
+ {isBulkDeleting ? 'Deleting...' : 'Delete'}
736
+ </Button>
737
+ {/if}
715
738
  <button
716
739
  onclick={() => (selectedIds = new Set())}
717
740
  class="text-muted-foreground hover:text-foreground text-sm transition-colors"
@@ -805,12 +828,25 @@
805
828
  {#if selectable}
806
829
  <!-- Info button to view details without selecting -->
807
830
  <button
808
- onclick={(e) => { e.stopPropagation(); openAssetDetail(asset); }}
809
- class="absolute top-1.5 right-1.5 rounded bg-background/80 p-1 opacity-0 transition-opacity group-hover:opacity-100"
831
+ onclick={(e) => {
832
+ e.stopPropagation();
833
+ openAssetDetail(asset);
834
+ }}
835
+ class="bg-background/80 absolute top-1.5 right-1.5 rounded p-1 opacity-0 transition-opacity group-hover:opacity-100"
810
836
  title="View details"
811
837
  >
812
- <svg class="h-3.5 w-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
813
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
838
+ <svg
839
+ class="h-3.5 w-3.5"
840
+ fill="none"
841
+ viewBox="0 0 24 24"
842
+ stroke="currentColor"
843
+ >
844
+ <path
845
+ stroke-linecap="round"
846
+ stroke-linejoin="round"
847
+ stroke-width="2"
848
+ d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"
849
+ />
814
850
  </svg>
815
851
  </button>
816
852
  {:else if isSelectMode}
@@ -1042,7 +1078,9 @@
1042
1078
  {#snippet failed(error, reset)}
1043
1079
  <div class="border-destructive/30 bg-destructive/5 rounded-md border p-4 text-center">
1044
1080
  <p class="text-destructive font-medium">Media browser encountered an error</p>
1045
- <p class="text-muted-foreground mt-1 text-sm">{error instanceof Error ? error.message : 'Unknown error'}</p>
1081
+ <p class="text-muted-foreground mt-1 text-sm">
1082
+ {error instanceof Error ? error.message : 'Unknown error'}
1083
+ </p>
1046
1084
  <button
1047
1085
  class="bg-primary text-primary-foreground mt-3 rounded px-4 py-2 text-sm"
1048
1086
  onclick={reset}
@@ -1077,7 +1115,7 @@
1077
1115
  {selectedAsset.originalFilename}
1078
1116
  </p>
1079
1117
  <div class="flex items-center gap-1">
1080
- {#if !selectable}
1118
+ {#if !selectable && canDeleteAssets}
1081
1119
  <Button
1082
1120
  variant="ghost"
1083
1121
  size="sm"
@@ -1105,7 +1143,9 @@
1105
1143
  <Button
1106
1144
  size="sm"
1107
1145
  class="w-full"
1108
- onclick={() => { if (selectedAsset && onSelect) onSelect(selectedAsset); }}
1146
+ onclick={() => {
1147
+ if (selectedAsset && onSelect) onSelect(selectedAsset);
1148
+ }}
1109
1149
  >
1110
1150
  Select
1111
1151
  </Button>
@@ -1 +1 @@
1
- {"version":3,"file":"MediaBrowser.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/MediaBrowser.svelte.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAO9C,UAAU,KAAK;IACd,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yEAAyE;IACzE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAClC,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IAC7C,oCAAoC;IACpC,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACnC,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC/B;AAmoCF,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"MediaBrowser.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/MediaBrowser.svelte.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAS9C,UAAU,KAAK;IACd,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yEAAyE;IACzE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAClC,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IAC7C,oCAAoC;IACpC,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACnC,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC/B;AAgqCF,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
@@ -1,70 +1,33 @@
1
1
  <script lang="ts">
2
2
  import { Button } from '@aphexcms/ui/shadcn/button';
3
- import * as Card from '@aphexcms/ui/shadcn/card';
4
3
  import type { SchemaType } from '../../types/schemas.js';
5
4
  import SchemaField from './SchemaField.svelte';
6
- import { getDefaultValueForFieldType } from '../../utils/field-defaults';
5
+ import { getSaveStateContext } from '../../save-state-context.svelte';
6
+
7
+ const saveState = getSaveStateContext();
7
8
 
8
9
  interface Props {
9
10
  open: boolean;
10
11
  schema: SchemaType;
11
12
  value: Record<string, any>;
12
13
  onClose: () => void;
13
- onSave: (value: Record<string, any>) => void;
14
- onUpdate?: (value: Record<string, any>) => void; // For real-time updates
14
+ onUpdate: (value: Record<string, any>) => void;
15
15
  onOpenReference?: (documentId: string, documentType: string) => void;
16
16
  readonly?: boolean;
17
- organizationId?: string; // For asset uploads to org-specific storage
17
+ organizationId?: string;
18
18
  }
19
19
 
20
- // TODO: add onUpdate to auto save
21
20
  let {
22
21
  open,
23
22
  schema,
24
23
  value,
25
24
  onClose,
26
- onSave,
25
+ onUpdate,
27
26
  onOpenReference,
28
27
  readonly = false,
29
28
  organizationId
30
29
  }: Props = $props();
31
30
 
32
- // Initialize editing data with defaults and existing values
33
- function initializeData() {
34
- const initialData: Record<string, any> = {};
35
-
36
- if (schema?.fields) {
37
- schema.fields.forEach((field: any) => {
38
- if ('initialValue' in field && field.initialValue !== undefined) {
39
- // Only use literal initialValue (skip functions to keep this synchronous)
40
- if (typeof field.initialValue !== 'function') {
41
- initialData[field.name] = field.initialValue;
42
- } else {
43
- // Function-based initialValues are skipped for nested items
44
- // They will use field type defaults instead
45
- initialData[field.name] = getDefaultValueForFieldType(field.type);
46
- }
47
- } else {
48
- initialData[field.name] = getDefaultValueForFieldType(field.type);
49
- }
50
- });
51
- }
52
-
53
- return { ...initialData, ...value };
54
- }
55
-
56
- // Local state for editing
57
- let editingData = $state<Record<string, any>>(initializeData());
58
-
59
- function handleSave() {
60
- onSave(editingData);
61
- onClose();
62
- }
63
-
64
- function handleCancel() {
65
- onClose();
66
- }
67
-
68
31
  // Handle backdrop click
69
32
  function handleBackdropClick(e: MouseEvent) {
70
33
  if (e.target === e.currentTarget) {
@@ -81,65 +44,77 @@
81
44
  </script>
82
45
 
83
46
  {#if open}
84
- <!-- Backdrop - fixed to viewport on mobile (below navbar), relative to parent on desktop -->
47
+ <!-- Backdrop: full-editor overlay -->
85
48
  <div
86
- class="bg-background/80 fixed top-12 right-0 bottom-0 left-0 z-[100] flex items-center justify-center p-6 backdrop-blur-sm sm:absolute sm:top-0 sm:p-4"
49
+ class="bg-background/80 absolute inset-0 z-50 backdrop-blur-xs"
87
50
  onclick={handleBackdropClick}
88
51
  onkeydown={handleKeydown}
89
52
  role="button"
90
53
  tabindex="-1"
91
- >
92
- <!-- Modal Content -->
93
- <Card.Root class="flex max-h-[85vh] w-full max-w-2xl flex-col overflow-hidden shadow-lg">
94
- <Card.Header class="border-b">
95
- <div class="flex items-center justify-between">
96
- <div>
97
- <Card.Title>{schema.title}</Card.Title>
98
- {#if schema.description}
99
- <Card.Description>{schema.description}</Card.Description>
100
- {/if}
101
- </div>
102
- <Button variant="ghost" size="icon" onclick={onClose}>
103
- <svg class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
104
- <path
105
- stroke-linecap="round"
106
- stroke-linejoin="round"
107
- stroke-width="2"
108
- d="M6 18L18 6M6 6l12 12"
109
- />
110
- </svg>
111
- </Button>
112
- </div>
113
- </Card.Header>
54
+ ></div>
114
55
 
115
- <Card.Content class="flex-1 overflow-auto p-6">
116
- <div class="space-y-4">
117
- {#if schema.fields}
118
- {#each schema.fields as field, index (index)}
119
- <SchemaField
120
- {field}
121
- value={editingData[field.name]}
122
- documentData={editingData}
123
- onUpdate={(newValue) => {
124
- editingData = { ...editingData, [field.name]: newValue };
125
- }}
126
- {onOpenReference}
127
- {readonly}
128
- {organizationId}
129
- />
130
- {/each}
56
+ <!-- Panel: centered dialog with max-width and max-height -->
57
+ <div
58
+ class="border-border bg-background absolute top-1/2 left-1/2 z-50 flex max-h-[calc(100%-4rem)] w-[calc(100%-2rem)] max-w-3xl -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-lg border shadow-lg"
59
+ >
60
+ <div
61
+ class="border-border bg-background flex items-center justify-between gap-3 border-b px-4 py-2"
62
+ >
63
+ <span class="text-sm font-medium">Edit {schema.title}</span>
64
+ <div class="flex items-center gap-2">
65
+ {#if saveState}
66
+ {#if saveState.saving}
67
+ <span
68
+ class="text-muted-foreground inline-flex items-center gap-1.5 text-[10px] font-medium tracking-wider whitespace-nowrap uppercase"
69
+ >
70
+ <span class="bg-muted-foreground/60 h-1.5 w-1.5 animate-pulse rounded-full"></span>
71
+ Saving
72
+ </span>
73
+ {:else if saveState.hasUnsavedChanges}
74
+ <span
75
+ class="text-muted-foreground inline-flex items-center gap-1.5 text-[10px] font-medium tracking-wider whitespace-nowrap uppercase"
76
+ >
77
+ <span class="bg-muted-foreground/60 h-1.5 w-1.5 rounded-full"></span>
78
+ Unsaved
79
+ </span>
80
+ {:else if saveState.savedAgoText}
81
+ <span
82
+ class="text-muted-foreground inline-flex items-center gap-1.5 text-[10px] font-medium tracking-wider whitespace-nowrap uppercase"
83
+ >
84
+ <span class="bg-muted-foreground/60 h-1.5 w-1.5 rounded-full"></span>
85
+ Auto-saved
86
+ </span>
131
87
  {/if}
132
- </div>
133
- </Card.Content>
134
-
135
- <Card.Footer class="flex justify-end gap-2 border-t">
136
- {#if readonly}
137
- <Button onclick={onClose}>Close</Button>
138
- {:else}
139
- <Button variant="outline" onclick={handleCancel}>Cancel</Button>
140
- <Button onclick={handleSave}>Save Changes</Button>
141
88
  {/if}
142
- </Card.Footer>
143
- </Card.Root>
89
+ <Button variant="ghost" size="icon" class="h-7 w-7" onclick={onClose}>
90
+ <svg class="h-3.5 w-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
91
+ <path
92
+ stroke-linecap="round"
93
+ stroke-linejoin="round"
94
+ stroke-width="2"
95
+ d="M6 18L18 6M6 6l12 12"
96
+ />
97
+ </svg>
98
+ </Button>
99
+ </div>
100
+ </div>
101
+
102
+ <div class="bg-background flex-1 space-y-3 overflow-auto p-4">
103
+ {#if schema.fields}
104
+ {#each schema.fields as field, index (index)}
105
+ <SchemaField
106
+ {field}
107
+ value={(value ?? {})[field.name]}
108
+ documentData={value ?? {}}
109
+ onUpdate={(newValue) => {
110
+ onUpdate({ ...value, [field.name]: newValue });
111
+ }}
112
+ {onOpenReference}
113
+ {readonly}
114
+ {organizationId}
115
+ />
116
+ {/each}
117
+ {/if}
118
+ </div>
144
119
  </div>
145
120
  {/if}
@@ -4,8 +4,7 @@ interface Props {
4
4
  schema: SchemaType;
5
5
  value: Record<string, any>;
6
6
  onClose: () => void;
7
- onSave: (value: Record<string, any>) => void;
8
- onUpdate?: (value: Record<string, any>) => void;
7
+ onUpdate: (value: Record<string, any>) => void;
9
8
  onOpenReference?: (documentId: string, documentType: string) => void;
10
9
  readonly?: boolean;
11
10
  organizationId?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectModal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/ObjectModal.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAKxD,UAAU,KAAK;IACd,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAChD,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAuHF,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"ObjectModal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/ObjectModal.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAKxD,UAAU,KAAK;IACd,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAC/C,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAqFF,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}