@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.
- package/LICENSE +21 -0
- package/dist/api/api-keys.d.ts +8 -7
- package/dist/api/api-keys.d.ts.map +1 -1
- package/dist/api/assets.d.ts +7 -22
- package/dist/api/assets.d.ts.map +1 -1
- package/dist/api/assets.js +1 -10
- package/dist/api/documents.d.ts +17 -16
- package/dist/api/documents.d.ts.map +1 -1
- package/dist/api/documents.js +2 -2
- package/dist/api/index.d.ts +1 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +1 -0
- package/dist/api/organizations.d.ts +15 -35
- package/dist/api/organizations.d.ts.map +1 -1
- package/dist/api/roles.d.ts +22 -0
- package/dist/api/roles.d.ts.map +1 -0
- package/dist/api/roles.js +26 -0
- package/dist/api/schemas/api-keys.d.ts +62 -0
- package/dist/api/schemas/api-keys.d.ts.map +1 -0
- package/dist/api/schemas/api-keys.js +28 -0
- package/dist/api/schemas/assets.d.ts +174 -0
- package/dist/api/schemas/assets.d.ts.map +1 -0
- package/dist/api/schemas/assets.js +99 -0
- package/dist/api/schemas/documents.d.ts +325 -0
- package/dist/api/schemas/documents.d.ts.map +1 -0
- package/dist/api/schemas/documents.js +161 -0
- package/dist/api/schemas/organizations.d.ts +41 -0
- package/dist/api/schemas/organizations.d.ts.map +1 -0
- package/dist/api/schemas/organizations.js +56 -0
- package/dist/api/schemas/roles.d.ts +77 -0
- package/dist/api/schemas/roles.d.ts.map +1 -0
- package/dist/api/schemas/roles.js +42 -0
- package/dist/api/schemas/user.d.ts +10 -0
- package/dist/api/schemas/user.d.ts.map +1 -0
- package/dist/api/schemas/user.js +11 -0
- package/dist/api/user.d.ts +4 -6
- package/dist/api/user.d.ts.map +1 -1
- package/dist/app-augment.d.ts +32 -0
- package/dist/app-augment.d.ts.map +1 -0
- package/dist/app-augment.js +18 -0
- package/dist/auth/auth-hooks.d.ts +2 -1
- package/dist/auth/auth-hooks.d.ts.map +1 -1
- package/dist/auth/auth-hooks.js +22 -2
- package/dist/auth/provider.d.ts +5 -0
- package/dist/auth/provider.d.ts.map +1 -1
- package/dist/cli/index.js +0 -0
- package/dist/client/index.d.ts +4 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +7 -0
- package/dist/components/AdminApp.svelte +306 -142
- package/dist/components/AdminApp.svelte.d.ts +8 -0
- package/dist/components/AdminApp.svelte.d.ts.map +1 -1
- package/dist/components/admin/DocumentEditor.svelte +653 -365
- package/dist/components/admin/DocumentEditor.svelte.d.ts +2 -0
- package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
- package/dist/components/admin/DocumentVersionPanel.svelte +57 -44
- package/dist/components/admin/DocumentVersionPanel.svelte.d.ts.map +1 -1
- package/dist/components/admin/MediaBrowser.svelte +70 -30
- package/dist/components/admin/MediaBrowser.svelte.d.ts.map +1 -1
- package/dist/components/admin/ObjectModal.svelte +70 -95
- package/dist/components/admin/ObjectModal.svelte.d.ts +1 -2
- package/dist/components/admin/ObjectModal.svelte.d.ts.map +1 -1
- package/dist/components/admin/PermissionsDebug.svelte +119 -0
- package/dist/components/admin/PermissionsDebug.svelte.d.ts +4 -0
- package/dist/components/admin/PermissionsDebug.svelte.d.ts.map +1 -0
- package/dist/components/admin/SchemaField.svelte +3 -1
- package/dist/components/admin/SchemaField.svelte.d.ts.map +1 -1
- package/dist/components/admin/confirm-dialog/ConfirmDialogHost.svelte +35 -0
- package/dist/components/admin/confirm-dialog/ConfirmDialogHost.svelte.d.ts +19 -0
- package/dist/components/admin/confirm-dialog/ConfirmDialogHost.svelte.d.ts.map +1 -0
- package/dist/components/admin/confirm-dialog/confirm-dialog.svelte.d.ts +16 -0
- package/dist/components/admin/confirm-dialog/confirm-dialog.svelte.d.ts.map +1 -0
- package/dist/components/admin/confirm-dialog/confirm-dialog.svelte.js +29 -0
- package/dist/components/admin/fields/ArrayField.svelte +104 -108
- package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/FileField.svelte +22 -17
- package/dist/components/admin/fields/FileField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/ImageField.svelte +21 -15
- package/dist/components/admin/fields/ImageField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/ReferenceField.svelte +142 -112
- package/dist/components/admin/fields/ReferenceField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/TextareaField.svelte +4 -3
- package/dist/components/admin/fields/TextareaField.svelte.d.ts +2 -2
- package/dist/components/admin/fields/TextareaField.svelte.d.ts.map +1 -1
- package/dist/components/layout/Sidebar.svelte +21 -11
- package/dist/components/layout/Sidebar.svelte.d.ts.map +1 -1
- package/dist/components/layout/sidebar/NavMain.svelte +1 -0
- package/dist/db/interfaces/document.d.ts.map +1 -1
- package/dist/db/interfaces/index.d.ts +3 -1
- package/dist/db/interfaces/index.d.ts.map +1 -1
- package/dist/db/interfaces/organization.d.ts +1 -1
- package/dist/db/interfaces/organization.d.ts.map +1 -1
- package/dist/db/interfaces/role.d.ts +25 -0
- package/dist/db/interfaces/role.d.ts.map +1 -0
- package/dist/db/interfaces/role.js +1 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +5 -0
- package/dist/field-access.d.ts +30 -0
- package/dist/field-access.d.ts.map +1 -0
- package/dist/field-access.js +79 -0
- package/dist/hooks.d.ts +2 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +23 -13
- package/dist/lib/api/api-keys.d.ts +8 -7
- package/dist/lib/api/api-keys.d.ts.map +1 -1
- package/dist/lib/api/api-keys.js.map +1 -1
- package/dist/lib/api/assets.d.ts +7 -22
- package/dist/lib/api/assets.d.ts.map +1 -1
- package/dist/lib/api/assets.js +1 -10
- package/dist/lib/api/assets.js.map +1 -1
- package/dist/lib/api/documents.d.ts +17 -16
- package/dist/lib/api/documents.d.ts.map +1 -1
- package/dist/lib/api/documents.js +2 -2
- package/dist/lib/api/documents.js.map +1 -1
- package/dist/lib/api/index.d.ts +1 -0
- package/dist/lib/api/index.d.ts.map +1 -1
- package/dist/lib/api/index.js +1 -0
- package/dist/lib/api/index.js.map +1 -1
- package/dist/lib/api/organizations.d.ts +15 -35
- package/dist/lib/api/organizations.d.ts.map +1 -1
- package/dist/lib/api/organizations.js.map +1 -1
- package/dist/lib/api/roles.d.ts +22 -0
- package/dist/lib/api/roles.d.ts.map +1 -0
- package/dist/lib/api/roles.js +27 -0
- package/dist/lib/api/roles.js.map +1 -0
- package/dist/lib/api/schemas/api-keys.d.ts +62 -0
- package/dist/lib/api/schemas/api-keys.d.ts.map +1 -0
- package/dist/lib/api/schemas/api-keys.js +29 -0
- package/dist/lib/api/schemas/api-keys.js.map +1 -0
- package/dist/lib/api/schemas/assets.d.ts +174 -0
- package/dist/lib/api/schemas/assets.d.ts.map +1 -0
- package/dist/lib/api/schemas/assets.js +100 -0
- package/dist/lib/api/schemas/assets.js.map +1 -0
- package/dist/lib/api/schemas/documents.d.ts +325 -0
- package/dist/lib/api/schemas/documents.d.ts.map +1 -0
- package/dist/lib/api/schemas/documents.js +162 -0
- package/dist/lib/api/schemas/documents.js.map +1 -0
- package/dist/lib/api/schemas/organizations.d.ts +41 -0
- package/dist/lib/api/schemas/organizations.d.ts.map +1 -0
- package/dist/lib/api/schemas/organizations.js +57 -0
- package/dist/lib/api/schemas/organizations.js.map +1 -0
- package/dist/lib/api/schemas/roles.d.ts +77 -0
- package/dist/lib/api/schemas/roles.d.ts.map +1 -0
- package/dist/lib/api/schemas/roles.js +43 -0
- package/dist/lib/api/schemas/roles.js.map +1 -0
- package/dist/lib/api/schemas/user.d.ts +10 -0
- package/dist/lib/api/schemas/user.d.ts.map +1 -0
- package/dist/lib/api/schemas/user.js +12 -0
- package/dist/lib/api/schemas/user.js.map +1 -0
- package/dist/lib/api/user.d.ts +4 -6
- package/dist/lib/api/user.d.ts.map +1 -1
- package/dist/lib/api/user.js.map +1 -1
- package/dist/lib/app-augment.d.ts +32 -0
- package/dist/lib/app-augment.d.ts.map +1 -0
- package/dist/lib/app-augment.js +19 -0
- package/dist/lib/app-augment.js.map +1 -0
- package/dist/lib/auth/auth-hooks.d.ts +2 -1
- package/dist/lib/auth/auth-hooks.d.ts.map +1 -1
- package/dist/lib/auth/auth-hooks.js +22 -2
- package/dist/lib/auth/auth-hooks.js.map +1 -1
- package/dist/lib/auth/provider.d.ts +5 -0
- package/dist/lib/auth/provider.d.ts.map +1 -1
- package/dist/lib/client/index.d.ts +4 -0
- package/dist/lib/client/index.d.ts.map +1 -1
- package/dist/lib/client/index.js +7 -0
- package/dist/lib/client/index.js.map +1 -1
- package/dist/lib/components/admin/confirm-dialog/confirm-dialog.svelte.d.ts +16 -0
- package/dist/lib/components/admin/confirm-dialog/confirm-dialog.svelte.d.ts.map +1 -0
- package/dist/lib/components/admin/confirm-dialog/confirm-dialog.svelte.js +30 -0
- package/dist/lib/components/admin/confirm-dialog/confirm-dialog.svelte.js.map +1 -0
- package/dist/lib/db/interfaces/document.d.ts.map +1 -1
- package/dist/lib/db/interfaces/index.d.ts +3 -1
- package/dist/lib/db/interfaces/index.d.ts.map +1 -1
- package/dist/lib/db/interfaces/organization.d.ts +1 -1
- package/dist/lib/db/interfaces/organization.d.ts.map +1 -1
- package/dist/lib/db/interfaces/role.d.ts +25 -0
- package/dist/lib/db/interfaces/role.d.ts.map +1 -0
- package/dist/lib/db/interfaces/role.js +2 -0
- package/dist/lib/db/interfaces/role.js.map +1 -0
- package/dist/lib/engine.d.ts.map +1 -1
- package/dist/lib/engine.js +5 -0
- package/dist/lib/engine.js.map +1 -1
- package/dist/lib/field-access.d.ts +30 -0
- package/dist/lib/field-access.d.ts.map +1 -0
- package/dist/lib/field-access.js +80 -0
- package/dist/lib/field-access.js.map +1 -0
- package/dist/lib/hooks.d.ts +2 -0
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +23 -13
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/local-api/collection-api.d.ts +2 -0
- package/dist/lib/local-api/collection-api.d.ts.map +1 -1
- package/dist/lib/local-api/collection-api.js +98 -30
- package/dist/lib/local-api/collection-api.js.map +1 -1
- package/dist/lib/local-api/index.d.ts.map +1 -1
- package/dist/lib/local-api/index.js.map +1 -1
- package/dist/lib/local-api/permissions.d.ts +26 -26
- package/dist/lib/local-api/permissions.d.ts.map +1 -1
- package/dist/lib/local-api/permissions.js +122 -80
- package/dist/lib/local-api/permissions.js.map +1 -1
- package/dist/lib/permissions-context.svelte.d.ts +44 -0
- package/dist/lib/permissions-context.svelte.d.ts.map +1 -0
- package/dist/lib/permissions-context.svelte.js +80 -0
- package/dist/lib/permissions-context.svelte.js.map +1 -0
- package/dist/lib/routes/assets-bulk.d.ts.map +1 -1
- package/dist/lib/routes/assets-bulk.js +10 -3
- package/dist/lib/routes/assets-bulk.js.map +1 -1
- package/dist/lib/routes/assets-by-id.d.ts.map +1 -1
- package/dist/lib/routes/assets-by-id.js +11 -1
- package/dist/lib/routes/assets-by-id.js.map +1 -1
- package/dist/lib/routes/assets-references-counts.d.ts.map +1 -1
- package/dist/lib/routes/assets-references-counts.js +12 -2
- package/dist/lib/routes/assets-references-counts.js.map +1 -1
- package/dist/lib/routes/assets.d.ts.map +1 -1
- package/dist/lib/routes/assets.js +14 -13
- package/dist/lib/routes/assets.js.map +1 -1
- package/dist/lib/routes/document-versions.d.ts.map +1 -1
- package/dist/lib/routes/document-versions.js +16 -2
- package/dist/lib/routes/document-versions.js.map +1 -1
- package/dist/lib/routes/documents-by-id.d.ts.map +1 -1
- package/dist/lib/routes/documents-by-id.js +15 -3
- package/dist/lib/routes/documents-by-id.js.map +1 -1
- package/dist/lib/routes/documents-query.d.ts.map +1 -1
- package/dist/lib/routes/documents-query.js +13 -10
- package/dist/lib/routes/documents-query.js.map +1 -1
- package/dist/lib/routes/documents.d.ts.map +1 -1
- package/dist/lib/routes/documents.js +29 -26
- package/dist/lib/routes/documents.js.map +1 -1
- package/dist/lib/routes/organizations-by-id.d.ts.map +1 -1
- package/dist/lib/routes/organizations-by-id.js +17 -4
- package/dist/lib/routes/organizations-by-id.js.map +1 -1
- package/dist/lib/routes/organizations-invitations.d.ts.map +1 -1
- package/dist/lib/routes/organizations-invitations.js +48 -18
- package/dist/lib/routes/organizations-invitations.js.map +1 -1
- package/dist/lib/routes/organizations-members.d.ts.map +1 -1
- package/dist/lib/routes/organizations-members.js +24 -18
- package/dist/lib/routes/organizations-members.js.map +1 -1
- package/dist/lib/routes/organizations-switch.d.ts.map +1 -1
- package/dist/lib/routes/organizations-switch.js +7 -3
- package/dist/lib/routes/organizations-switch.js.map +1 -1
- package/dist/lib/routes/organizations.d.ts.map +1 -1
- package/dist/lib/routes/organizations.js +11 -5
- package/dist/lib/routes/organizations.js.map +1 -1
- package/dist/lib/routes/roles-by-name.d.ts +4 -0
- package/dist/lib/routes/roles-by-name.d.ts.map +1 -0
- package/dist/lib/routes/roles-by-name.js +112 -0
- package/dist/lib/routes/roles-by-name.js.map +1 -0
- package/dist/lib/routes/roles.d.ts +4 -0
- package/dist/lib/routes/roles.d.ts.map +1 -0
- package/dist/lib/routes/roles.js +91 -0
- package/dist/lib/routes/roles.js.map +1 -0
- package/dist/lib/routes/user-preferences.d.ts.map +1 -1
- package/dist/lib/routes/user-preferences.js +7 -13
- package/dist/lib/routes/user-preferences.js.map +1 -1
- package/dist/lib/routes-exports.d.ts +2 -0
- package/dist/lib/routes-exports.d.ts.map +1 -1
- package/dist/lib/routes-exports.js +3 -0
- package/dist/lib/routes-exports.js.map +1 -1
- package/dist/lib/save-state-context.svelte.d.ts +8 -0
- package/dist/lib/save-state-context.svelte.d.ts.map +1 -0
- package/dist/lib/save-state-context.svelte.js +9 -0
- package/dist/lib/save-state-context.svelte.js.map +1 -0
- package/dist/lib/schema-utils/validator.d.ts.map +1 -1
- package/dist/lib/schema-utils/validator.js +14 -0
- package/dist/lib/schema-utils/validator.js.map +1 -1
- package/dist/lib/server/index.d.ts +1 -0
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +1 -0
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/services/index.d.ts +1 -0
- package/dist/lib/services/index.d.ts.map +1 -1
- package/dist/lib/services/index.js +1 -0
- package/dist/lib/services/index.js.map +1 -1
- package/dist/lib/services/roles-service.d.ts +35 -0
- package/dist/lib/services/roles-service.d.ts.map +1 -0
- package/dist/lib/services/roles-service.js +91 -0
- package/dist/lib/services/roles-service.js.map +1 -0
- package/dist/lib/services/version-service.d.ts.map +1 -1
- package/dist/lib/services/version-service.js.map +1 -1
- package/dist/lib/types/auth.d.ts +43 -9
- package/dist/lib/types/auth.d.ts.map +1 -1
- package/dist/lib/types/auth.js +31 -26
- package/dist/lib/types/auth.js.map +1 -1
- package/dist/lib/types/capabilities.d.ts +104 -0
- package/dist/lib/types/capabilities.d.ts.map +1 -0
- package/dist/lib/types/capabilities.js +217 -0
- package/dist/lib/types/capabilities.js.map +1 -0
- package/dist/lib/types/index.d.ts +1 -0
- package/dist/lib/types/index.d.ts.map +1 -1
- package/dist/lib/types/index.js +1 -0
- package/dist/lib/types/index.js.map +1 -1
- package/dist/lib/types/organization.d.ts +13 -4
- package/dist/lib/types/organization.d.ts.map +1 -1
- package/dist/lib/types/schemas.d.ts +71 -0
- package/dist/lib/types/schemas.d.ts.map +1 -1
- package/dist/lib/types/sidebar.d.ts +1 -1
- package/dist/lib/types/sidebar.d.ts.map +1 -1
- package/dist/lib/utils/mime-detect.d.ts.map +1 -1
- package/dist/lib/utils/mime-detect.js +28 -6
- package/dist/lib/utils/mime-detect.js.map +1 -1
- package/dist/local-api/collection-api.d.ts +2 -0
- package/dist/local-api/collection-api.d.ts.map +1 -1
- package/dist/local-api/collection-api.js +98 -30
- package/dist/local-api/index.d.ts.map +1 -1
- package/dist/local-api/permissions.d.ts +26 -26
- package/dist/local-api/permissions.d.ts.map +1 -1
- package/dist/local-api/permissions.js +122 -80
- package/dist/permissions-context.svelte.d.ts +44 -0
- package/dist/permissions-context.svelte.d.ts.map +1 -0
- package/dist/permissions-context.svelte.js +79 -0
- package/dist/plugins/README.md +20 -20
- package/dist/routes/assets-bulk.d.ts.map +1 -1
- package/dist/routes/assets-bulk.js +10 -3
- package/dist/routes/assets-by-id.d.ts.map +1 -1
- package/dist/routes/assets-by-id.js +11 -1
- package/dist/routes/assets-references-counts.d.ts.map +1 -1
- package/dist/routes/assets-references-counts.js +12 -2
- package/dist/routes/assets.d.ts.map +1 -1
- package/dist/routes/assets.js +14 -13
- package/dist/routes/document-versions.d.ts.map +1 -1
- package/dist/routes/document-versions.js +16 -2
- package/dist/routes/documents-by-id.d.ts.map +1 -1
- package/dist/routes/documents-by-id.js +15 -3
- package/dist/routes/documents-query.d.ts.map +1 -1
- package/dist/routes/documents-query.js +13 -10
- package/dist/routes/documents.d.ts.map +1 -1
- package/dist/routes/documents.js +29 -26
- package/dist/routes/organizations-by-id.d.ts.map +1 -1
- package/dist/routes/organizations-by-id.js +17 -4
- package/dist/routes/organizations-invitations.d.ts.map +1 -1
- package/dist/routes/organizations-invitations.js +48 -18
- package/dist/routes/organizations-members.d.ts.map +1 -1
- package/dist/routes/organizations-members.js +24 -18
- package/dist/routes/organizations-switch.d.ts.map +1 -1
- package/dist/routes/organizations-switch.js +7 -3
- package/dist/routes/organizations.d.ts.map +1 -1
- package/dist/routes/organizations.js +11 -5
- package/dist/routes/roles-by-name.d.ts +4 -0
- package/dist/routes/roles-by-name.d.ts.map +1 -0
- package/dist/routes/roles-by-name.js +111 -0
- package/dist/routes/roles.d.ts +4 -0
- package/dist/routes/roles.d.ts.map +1 -0
- package/dist/routes/roles.js +90 -0
- package/dist/routes/user-preferences.d.ts.map +1 -1
- package/dist/routes/user-preferences.js +7 -13
- package/dist/routes-exports.d.ts +2 -0
- package/dist/routes-exports.d.ts.map +1 -1
- package/dist/routes-exports.js +3 -0
- package/dist/save-state-context.svelte.d.ts +8 -0
- package/dist/save-state-context.svelte.d.ts.map +1 -0
- package/dist/save-state-context.svelte.js +8 -0
- package/dist/schema-utils/validator.d.ts.map +1 -1
- package/dist/schema-utils/validator.js +14 -0
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +1 -0
- package/dist/services/roles-service.d.ts +35 -0
- package/dist/services/roles-service.d.ts.map +1 -0
- package/dist/services/roles-service.js +90 -0
- package/dist/services/version-service.d.ts.map +1 -1
- package/dist/types/auth.d.ts +43 -9
- package/dist/types/auth.d.ts.map +1 -1
- package/dist/types/auth.js +31 -26
- package/dist/types/capabilities.d.ts +104 -0
- package/dist/types/capabilities.d.ts.map +1 -0
- package/dist/types/capabilities.js +216 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/organization.d.ts +13 -4
- package/dist/types/organization.d.ts.map +1 -1
- package/dist/types/schemas.d.ts +71 -0
- package/dist/types/schemas.d.ts.map +1 -1
- package/dist/types/sidebar.d.ts +1 -1
- package/dist/types/sidebar.d.ts.map +1 -1
- package/dist/utils/mime-detect.d.ts.map +1 -1
- package/dist/utils/mime-detect.js +28 -6
- package/package.json +142 -138
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Shield, X, Copy } from '@lucide/svelte';
|
|
3
|
+
import { toast } from 'svelte-sonner';
|
|
4
|
+
import { Button } from '@aphexcms/ui/shadcn/button';
|
|
5
|
+
import { Badge } from '@aphexcms/ui/shadcn/badge';
|
|
6
|
+
import { usePermissions } from '../../permissions-context.svelte';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* A floating dev panel that surfaces the caller's resolved RBAC state so
|
|
10
|
+
* you can see exactly what the client thinks you can do. Mirrors the
|
|
11
|
+
* server-side capability set hydrated by the auth hook.
|
|
12
|
+
*
|
|
13
|
+
* Mount once near the root of your admin layout. Hidden by default —
|
|
14
|
+
* clicking the shield toggles the panel open.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
const perms = usePermissions();
|
|
18
|
+
let open = $state(false);
|
|
19
|
+
|
|
20
|
+
const capabilities = $derived([...perms.capabilities].sort());
|
|
21
|
+
const grouped = $derived.by(() => {
|
|
22
|
+
const groups = new Map<string, string[]>();
|
|
23
|
+
for (const cap of capabilities) {
|
|
24
|
+
const prefix = cap.includes('.') ? (cap.split('.')[0] ?? 'other') : 'other';
|
|
25
|
+
if (!groups.has(prefix)) groups.set(prefix, []);
|
|
26
|
+
groups.get(prefix)!.push(cap);
|
|
27
|
+
}
|
|
28
|
+
return Array.from(groups.entries()).sort(([a], [b]) => a.localeCompare(b));
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
async function copyJSON() {
|
|
32
|
+
const payload = {
|
|
33
|
+
role: perms.role,
|
|
34
|
+
capabilities
|
|
35
|
+
};
|
|
36
|
+
try {
|
|
37
|
+
await navigator.clipboard.writeText(JSON.stringify(payload, null, 2));
|
|
38
|
+
toast.success('Copied RBAC snapshot');
|
|
39
|
+
} catch {
|
|
40
|
+
toast.error('Copy failed');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
</script>
|
|
44
|
+
|
|
45
|
+
{#if open}
|
|
46
|
+
<div
|
|
47
|
+
class="bg-background fixed right-4 bottom-4 z-50 w-80 overflow-hidden rounded-lg border shadow-lg"
|
|
48
|
+
role="dialog"
|
|
49
|
+
aria-label="Permissions debug"
|
|
50
|
+
>
|
|
51
|
+
<div class="border-b px-3 py-2">
|
|
52
|
+
<div class="flex items-center justify-between gap-2">
|
|
53
|
+
<div class="flex items-center gap-2">
|
|
54
|
+
<Shield class="h-3.5 w-3.5" />
|
|
55
|
+
<span class="text-sm font-semibold">RBAC</span>
|
|
56
|
+
</div>
|
|
57
|
+
<div class="flex items-center gap-1">
|
|
58
|
+
<Button
|
|
59
|
+
variant="ghost"
|
|
60
|
+
size="sm"
|
|
61
|
+
class="h-6 w-6 p-0"
|
|
62
|
+
onclick={copyJSON}
|
|
63
|
+
title="Copy JSON"
|
|
64
|
+
>
|
|
65
|
+
<Copy class="h-3 w-3" />
|
|
66
|
+
</Button>
|
|
67
|
+
<Button
|
|
68
|
+
variant="ghost"
|
|
69
|
+
size="sm"
|
|
70
|
+
class="h-6 w-6 p-0"
|
|
71
|
+
onclick={() => (open = false)}
|
|
72
|
+
title="Close"
|
|
73
|
+
>
|
|
74
|
+
<X class="h-3 w-3" />
|
|
75
|
+
</Button>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
<div class="mt-1 flex items-center gap-1.5 text-xs">
|
|
79
|
+
<span class="text-muted-foreground">role:</span>
|
|
80
|
+
{#if perms.role}
|
|
81
|
+
<Badge variant="secondary" class="text-[10px]">{perms.role}</Badge>
|
|
82
|
+
{:else}
|
|
83
|
+
<span class="text-muted-foreground italic">none</span>
|
|
84
|
+
{/if}
|
|
85
|
+
</div>
|
|
86
|
+
</div>
|
|
87
|
+
|
|
88
|
+
<div class="max-h-80 space-y-3 overflow-y-auto p-3">
|
|
89
|
+
{#if capabilities.length === 0}
|
|
90
|
+
<p class="text-muted-foreground py-4 text-center text-xs">No capabilities granted.</p>
|
|
91
|
+
{:else}
|
|
92
|
+
{#each grouped as [prefix, caps] (prefix)}
|
|
93
|
+
<div class="space-y-1">
|
|
94
|
+
<p class="text-muted-foreground text-[10px] font-semibold tracking-wider uppercase">
|
|
95
|
+
{prefix}
|
|
96
|
+
</p>
|
|
97
|
+
<div class="flex flex-wrap gap-1">
|
|
98
|
+
{#each caps as cap (cap)}
|
|
99
|
+
<Badge variant="outline" class="font-mono text-[10px]">
|
|
100
|
+
{cap.split('.').slice(1).join('.') || cap}
|
|
101
|
+
</Badge>
|
|
102
|
+
{/each}
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
{/each}
|
|
106
|
+
{/if}
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
{:else}
|
|
110
|
+
<button
|
|
111
|
+
type="button"
|
|
112
|
+
onclick={() => (open = true)}
|
|
113
|
+
class="bg-background hover:bg-muted fixed right-4 bottom-4 z-50 flex h-9 w-9 items-center justify-center rounded-full border shadow-sm transition-colors"
|
|
114
|
+
title="Show permissions"
|
|
115
|
+
aria-label="Show permissions debug"
|
|
116
|
+
>
|
|
117
|
+
<Shield class="h-4 w-4" />
|
|
118
|
+
</button>
|
|
119
|
+
{/if}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PermissionsDebug.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/PermissionsDebug.svelte.ts"],"names":[],"mappings":"AA6GA,QAAA,MAAM,gBAAgB,2DAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
|
|
@@ -264,7 +264,9 @@
|
|
|
264
264
|
<p class="text-destructive text-sm font-medium">
|
|
265
265
|
Failed to render field "{field.name}" ({field.type})
|
|
266
266
|
</p>
|
|
267
|
-
<p class="text-muted-foreground mt-1 text-xs">
|
|
267
|
+
<p class="text-muted-foreground mt-1 text-xs">
|
|
268
|
+
{error instanceof Error ? error.message : 'Unknown error'}
|
|
269
|
+
</p>
|
|
268
270
|
<button class="text-primary mt-2 text-xs underline" onclick={reset}> Try again </button>
|
|
269
271
|
</div>
|
|
270
272
|
{/snippet}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaField.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/SchemaField.svelte.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,KAAK,EAGL,MAAM,qBAAqB,CAAC;AAyB9B,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAG9C,UAAU,KAAK;IACd,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,GAAG,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"SchemaField.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/SchemaField.svelte.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,KAAK,EAGL,MAAM,qBAAqB,CAAC;AAyB9B,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAG9C,UAAU,KAAK;IACd,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,GAAG,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AA6NF,QAAA,MAAM,WAAW;sCA/KgC,GAAG,YAAW,GAAG;MA+KT,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import * as AlertDialog from '@aphexcms/ui/shadcn/alert-dialog';
|
|
3
|
+
import { Button } from '@aphexcms/ui/shadcn/button';
|
|
4
|
+
import { confirmDialogState, resolveConfirmDialog } from './confirm-dialog.svelte';
|
|
5
|
+
|
|
6
|
+
function handleOpenChange(open: boolean) {
|
|
7
|
+
if (!open && confirmDialogState.open) {
|
|
8
|
+
resolveConfirmDialog(false);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<AlertDialog.Root bind:open={confirmDialogState.open} onOpenChange={handleOpenChange}>
|
|
14
|
+
<AlertDialog.Content>
|
|
15
|
+
<AlertDialog.Header>
|
|
16
|
+
<AlertDialog.Title class="break-words">{confirmDialogState.title}</AlertDialog.Title>
|
|
17
|
+
{#if confirmDialogState.description}
|
|
18
|
+
<AlertDialog.Description class="break-words">
|
|
19
|
+
{confirmDialogState.description}
|
|
20
|
+
</AlertDialog.Description>
|
|
21
|
+
{/if}
|
|
22
|
+
</AlertDialog.Header>
|
|
23
|
+
<AlertDialog.Footer>
|
|
24
|
+
<Button variant="outline" onclick={() => resolveConfirmDialog(false)}>
|
|
25
|
+
{confirmDialogState.cancelText}
|
|
26
|
+
</Button>
|
|
27
|
+
<Button
|
|
28
|
+
variant={confirmDialogState.variant === 'destructive' ? 'destructive' : 'default'}
|
|
29
|
+
onclick={() => resolveConfirmDialog(true)}
|
|
30
|
+
>
|
|
31
|
+
{confirmDialogState.confirmText}
|
|
32
|
+
</Button>
|
|
33
|
+
</AlertDialog.Footer>
|
|
34
|
+
</AlertDialog.Content>
|
|
35
|
+
</AlertDialog.Root>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
2
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
3
|
+
$$bindings?: Bindings;
|
|
4
|
+
} & Exports;
|
|
5
|
+
(internal: unknown, props: {
|
|
6
|
+
$$events?: Events;
|
|
7
|
+
$$slots?: Slots;
|
|
8
|
+
}): Exports & {
|
|
9
|
+
$set?: any;
|
|
10
|
+
$on?: any;
|
|
11
|
+
};
|
|
12
|
+
z_$$bindings?: Bindings;
|
|
13
|
+
}
|
|
14
|
+
declare const ConfirmDialogHost: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|
|
15
|
+
[evt: string]: CustomEvent<any>;
|
|
16
|
+
}, {}, {}, string>;
|
|
17
|
+
type ConfirmDialogHost = InstanceType<typeof ConfirmDialogHost>;
|
|
18
|
+
export default ConfirmDialogHost;
|
|
19
|
+
//# sourceMappingURL=ConfirmDialogHost.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfirmDialogHost.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/confirm-dialog/ConfirmDialogHost.svelte.ts"],"names":[],"mappings":"AA0CA,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,iBAAiB;;kBAA+E,CAAC;AACrF,KAAK,iBAAiB,GAAG,YAAY,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAClE,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface ConfirmDialogOptions {
|
|
2
|
+
title: string;
|
|
3
|
+
description?: string;
|
|
4
|
+
confirmText?: string;
|
|
5
|
+
cancelText?: string;
|
|
6
|
+
variant?: 'default' | 'destructive';
|
|
7
|
+
}
|
|
8
|
+
interface ConfirmDialogState extends ConfirmDialogOptions {
|
|
9
|
+
open: boolean;
|
|
10
|
+
resolve: ((value: boolean) => void) | null;
|
|
11
|
+
}
|
|
12
|
+
export declare const confirmDialogState: ConfirmDialogState;
|
|
13
|
+
export declare function confirmDialog(options: ConfirmDialogOptions): Promise<boolean>;
|
|
14
|
+
export declare function resolveConfirmDialog(value: boolean): void;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=confirm-dialog.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirm-dialog.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/confirm-dialog/confirm-dialog.svelte.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC;CACpC;AAED,UAAU,kBAAmB,SAAQ,oBAAoB;IACxD,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;CAC3C;AAED,eAAO,MAAM,kBAAkB,oBAQ7B,CAAC;AAEH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAa7E;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,QAKlD"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export const confirmDialogState = $state({
|
|
2
|
+
open: false,
|
|
3
|
+
title: '',
|
|
4
|
+
description: undefined,
|
|
5
|
+
confirmText: 'Confirm',
|
|
6
|
+
cancelText: 'Cancel',
|
|
7
|
+
variant: 'default',
|
|
8
|
+
resolve: null
|
|
9
|
+
});
|
|
10
|
+
export function confirmDialog(options) {
|
|
11
|
+
return new Promise((resolve) => {
|
|
12
|
+
if (confirmDialogState.resolve) {
|
|
13
|
+
confirmDialogState.resolve(false);
|
|
14
|
+
}
|
|
15
|
+
confirmDialogState.title = options.title;
|
|
16
|
+
confirmDialogState.description = options.description;
|
|
17
|
+
confirmDialogState.confirmText = options.confirmText ?? 'Confirm';
|
|
18
|
+
confirmDialogState.cancelText = options.cancelText ?? 'Cancel';
|
|
19
|
+
confirmDialogState.variant = options.variant ?? 'default';
|
|
20
|
+
confirmDialogState.resolve = resolve;
|
|
21
|
+
confirmDialogState.open = true;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
export function resolveConfirmDialog(value) {
|
|
25
|
+
const r = confirmDialogState.resolve;
|
|
26
|
+
confirmDialogState.resolve = null;
|
|
27
|
+
confirmDialogState.open = false;
|
|
28
|
+
r?.(value);
|
|
29
|
+
}
|
|
@@ -342,7 +342,11 @@
|
|
|
342
342
|
});
|
|
343
343
|
}
|
|
344
344
|
|
|
345
|
-
|
|
345
|
+
// Add to array immediately so document auto-save captures it
|
|
346
|
+
const newArray = [...keyedItems, newItem];
|
|
347
|
+
onUpdate(newArray);
|
|
348
|
+
|
|
349
|
+
editingIndex = newArray.length - 1;
|
|
346
350
|
editingType = selectedType;
|
|
347
351
|
editingSchema = schema;
|
|
348
352
|
editingValue = newItem;
|
|
@@ -369,32 +373,22 @@
|
|
|
369
373
|
onUpdate(newArray);
|
|
370
374
|
}
|
|
371
375
|
|
|
372
|
-
|
|
376
|
+
// Write-through: propagate every field change from the modal to the array immediately
|
|
377
|
+
function handleModalUpdate(updatedData: Record<string, any>) {
|
|
373
378
|
if (editingIndex === null || !editingType) return;
|
|
374
379
|
|
|
375
|
-
const itemData: Record<string, any> = { ...
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
itemData._key = (editingValue as any)._key;
|
|
380
|
+
const itemData: Record<string, any> = { ...updatedData, _type: editingType };
|
|
381
|
+
if (editingValue._key) {
|
|
382
|
+
itemData._key = editingValue._key;
|
|
379
383
|
} else {
|
|
380
384
|
itemData._key = generateKey();
|
|
381
385
|
}
|
|
382
386
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
if (editingIndex >= newArray.length) {
|
|
386
|
-
newArray.push(itemData);
|
|
387
|
-
} else {
|
|
388
|
-
newArray[editingIndex] = itemData;
|
|
389
|
-
}
|
|
387
|
+
editingValue = itemData;
|
|
390
388
|
|
|
389
|
+
const newArray = [...keyedItems];
|
|
390
|
+
newArray[editingIndex] = itemData;
|
|
391
391
|
onUpdate(newArray);
|
|
392
|
-
|
|
393
|
-
modalOpen = false;
|
|
394
|
-
editingIndex = null;
|
|
395
|
-
editingType = null;
|
|
396
|
-
editingSchema = null;
|
|
397
|
-
editingValue = {};
|
|
398
392
|
}
|
|
399
393
|
|
|
400
394
|
function handleModalClose() {
|
|
@@ -440,9 +434,11 @@
|
|
|
440
434
|
{#if isGridLayout}
|
|
441
435
|
<!-- Grid layout for images -->
|
|
442
436
|
{#if arrayValue.length === 0}
|
|
443
|
-
<div
|
|
437
|
+
<div
|
|
438
|
+
class="border-border/50 flex h-32 items-center justify-center rounded-md border border-dashed"
|
|
439
|
+
>
|
|
444
440
|
<div class="text-center">
|
|
445
|
-
<ImageIcon class="mx-auto h-8 w-8
|
|
441
|
+
<ImageIcon class="text-muted-foreground mx-auto h-8 w-8" />
|
|
446
442
|
<p class="text-muted-foreground mt-1 text-xs">No images yet</p>
|
|
447
443
|
</div>
|
|
448
444
|
</div>
|
|
@@ -455,18 +451,16 @@
|
|
|
455
451
|
class="border-border/50 bg-background group relative aspect-square overflow-hidden rounded-md border"
|
|
456
452
|
class:opacity-50={sortable.isDragging}
|
|
457
453
|
>
|
|
458
|
-
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
459
|
-
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
460
|
-
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
461
|
-
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
462
454
|
<div
|
|
463
455
|
class="h-full w-full cursor-pointer"
|
|
464
456
|
onclick={() => handleOpenImageModal(index)}
|
|
465
457
|
>
|
|
466
458
|
{#if item?.asset?._ref}
|
|
467
459
|
{#await assets.getById(item.asset._ref)}
|
|
468
|
-
<div class="flex h-full w-full items-center justify-center
|
|
469
|
-
<div
|
|
460
|
+
<div class="bg-muted flex h-full w-full items-center justify-center">
|
|
461
|
+
<div
|
|
462
|
+
class="border-primary h-4 w-4 animate-spin rounded-full border-b-2"
|
|
463
|
+
></div>
|
|
470
464
|
</div>
|
|
471
465
|
{:then result}
|
|
472
466
|
{#if result.success && result.data?.url}
|
|
@@ -477,40 +471,41 @@
|
|
|
477
471
|
loading="lazy"
|
|
478
472
|
/>
|
|
479
473
|
{:else}
|
|
480
|
-
<div class="flex h-full w-full items-center justify-center
|
|
481
|
-
<ImageIcon class="h-8 w-8
|
|
474
|
+
<div class="bg-muted flex h-full w-full items-center justify-center">
|
|
475
|
+
<ImageIcon class="text-muted-foreground h-8 w-8" />
|
|
482
476
|
</div>
|
|
483
477
|
{/if}
|
|
484
478
|
{:catch}
|
|
485
|
-
<div class="flex h-full w-full items-center justify-center
|
|
486
|
-
<ImageIcon class="h-8 w-8
|
|
479
|
+
<div class="bg-muted flex h-full w-full items-center justify-center">
|
|
480
|
+
<ImageIcon class="text-muted-foreground h-8 w-8" />
|
|
487
481
|
</div>
|
|
488
482
|
{/await}
|
|
489
483
|
{:else}
|
|
490
|
-
<div class="flex h-full w-full items-center justify-center
|
|
491
|
-
<ImageIcon class="h-8 w-8
|
|
484
|
+
<div class="bg-muted flex h-full w-full items-center justify-center">
|
|
485
|
+
<ImageIcon class="text-muted-foreground h-8 w-8" />
|
|
492
486
|
</div>
|
|
493
487
|
{/if}
|
|
494
488
|
</div>
|
|
495
489
|
|
|
496
490
|
<!-- Overlay controls -->
|
|
497
491
|
{#if !readonly}
|
|
498
|
-
<div
|
|
492
|
+
<div
|
|
493
|
+
class="absolute top-1 left-1 opacity-0 transition-opacity group-hover:opacity-100"
|
|
494
|
+
>
|
|
499
495
|
<button
|
|
500
496
|
{@attach sortable.attachHandle}
|
|
501
|
-
class="bg-background/80 rounded p-1
|
|
497
|
+
class="bg-background/80 cursor-grab rounded p-1 active:cursor-grabbing"
|
|
502
498
|
>
|
|
503
499
|
<GripVertical class="h-3.5 w-3.5" />
|
|
504
500
|
</button>
|
|
505
501
|
</div>
|
|
506
|
-
<div
|
|
502
|
+
<div
|
|
503
|
+
class="absolute right-1 bottom-1 opacity-0 transition-opacity group-hover:opacity-100"
|
|
504
|
+
>
|
|
507
505
|
<DropdownMenu.Root>
|
|
508
506
|
<DropdownMenu.Trigger>
|
|
509
507
|
{#snippet child({ props })}
|
|
510
|
-
<button
|
|
511
|
-
{...props}
|
|
512
|
-
class="bg-background/80 rounded p-1"
|
|
513
|
-
>
|
|
508
|
+
<button {...props} class="bg-background/80 rounded p-1">
|
|
514
509
|
<Ellipsis class="h-3.5 w-3.5" />
|
|
515
510
|
</button>
|
|
516
511
|
{/snippet}
|
|
@@ -534,76 +529,74 @@
|
|
|
534
529
|
{/each}
|
|
535
530
|
</div>
|
|
536
531
|
{:else}
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
<div
|
|
542
|
-
{@attach sortable.attach}
|
|
543
|
-
class="border-border/50 bg-background hover:bg-muted/50 flex h-16 items-center gap-1 rounded border px-1 transition-colors"
|
|
544
|
-
class:opacity-50={sortable.isDragging}
|
|
545
|
-
>
|
|
546
|
-
{#if !readonly}
|
|
547
|
-
<button
|
|
548
|
-
{@attach sortable.attachHandle}
|
|
549
|
-
class="text-muted-foreground hover:text-foreground flex h-8 w-6 cursor-grab items-center justify-center active:cursor-grabbing"
|
|
550
|
-
>
|
|
551
|
-
<GripVertical class="h-4 w-4" />
|
|
552
|
-
</button>
|
|
553
|
-
{/if}
|
|
554
|
-
|
|
555
|
-
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
556
|
-
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
532
|
+
<!-- Default list layout for images -->
|
|
533
|
+
<div class="space-y-1">
|
|
534
|
+
{#each arrayValue as item, index (`prim-${index}`)}
|
|
535
|
+
{@const sortable = createSortable({ id: `prim-${index}`, index, disabled: readonly })}
|
|
557
536
|
<div
|
|
558
|
-
|
|
559
|
-
|
|
537
|
+
{@attach sortable.attach}
|
|
538
|
+
class="border-border/50 bg-background hover:bg-muted/50 flex h-16 items-center gap-1 rounded border px-1 transition-colors"
|
|
539
|
+
class:opacity-50={sortable.isDragging}
|
|
560
540
|
>
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
onUpdate={() => {}}
|
|
570
|
-
{readonly}
|
|
571
|
-
arrayItem={true}
|
|
572
|
-
{organizationId}
|
|
573
|
-
/>
|
|
574
|
-
</div>
|
|
541
|
+
{#if !readonly}
|
|
542
|
+
<button
|
|
543
|
+
{@attach sortable.attachHandle}
|
|
544
|
+
class="text-muted-foreground hover:text-foreground flex h-8 w-6 cursor-grab items-center justify-center active:cursor-grabbing"
|
|
545
|
+
>
|
|
546
|
+
<GripVertical class="h-4 w-4" />
|
|
547
|
+
</button>
|
|
548
|
+
{/if}
|
|
575
549
|
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
550
|
+
<div
|
|
551
|
+
class="min-w-0 flex-1 cursor-pointer text-left"
|
|
552
|
+
onclick={() => handleOpenImageModal(index)}
|
|
553
|
+
>
|
|
554
|
+
<ImageField
|
|
555
|
+
field={{
|
|
556
|
+
...field.of?.[0],
|
|
557
|
+
name: `image-${index}`,
|
|
558
|
+
type: 'image',
|
|
559
|
+
title: `Image ${index + 1}`
|
|
560
|
+
}}
|
|
561
|
+
value={item}
|
|
562
|
+
onUpdate={() => {}}
|
|
563
|
+
{readonly}
|
|
564
|
+
arrayItem={true}
|
|
565
|
+
{organizationId}
|
|
566
|
+
/>
|
|
567
|
+
</div>
|
|
568
|
+
|
|
569
|
+
{#if !readonly}
|
|
570
|
+
<DropdownMenu.Root>
|
|
571
|
+
<DropdownMenu.Trigger>
|
|
572
|
+
{#snippet child({ props })}
|
|
573
|
+
<button
|
|
574
|
+
{...props}
|
|
575
|
+
class="text-muted-foreground hover:text-foreground flex h-8 w-8 shrink-0 items-center justify-center rounded transition-colors hover:bg-transparent"
|
|
576
|
+
>
|
|
577
|
+
<Ellipsis class="h-4 w-4" />
|
|
578
|
+
</button>
|
|
579
|
+
{/snippet}
|
|
580
|
+
</DropdownMenu.Trigger>
|
|
581
|
+
<DropdownMenu.Content align="end">
|
|
582
|
+
<DropdownMenu.Item onclick={() => handleOpenImageModal(index)}>
|
|
583
|
+
<Pencil class="mr-2 h-4 w-4" />
|
|
584
|
+
Edit
|
|
585
|
+
</DropdownMenu.Item>
|
|
586
|
+
<DropdownMenu.Separator />
|
|
587
|
+
<DropdownMenu.Item
|
|
588
|
+
class="text-destructive focus:text-destructive"
|
|
589
|
+
onclick={() => handleRemoveItem(index)}
|
|
583
590
|
>
|
|
584
|
-
<
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
<DropdownMenu.Separator />
|
|
594
|
-
<DropdownMenu.Item
|
|
595
|
-
class="text-destructive focus:text-destructive"
|
|
596
|
-
onclick={() => handleRemoveItem(index)}
|
|
597
|
-
>
|
|
598
|
-
<Trash2 class="mr-2 h-4 w-4" />
|
|
599
|
-
Remove
|
|
600
|
-
</DropdownMenu.Item>
|
|
601
|
-
</DropdownMenu.Content>
|
|
602
|
-
</DropdownMenu.Root>
|
|
603
|
-
{/if}
|
|
604
|
-
</div>
|
|
605
|
-
{/each}
|
|
606
|
-
</div>
|
|
591
|
+
<Trash2 class="mr-2 h-4 w-4" />
|
|
592
|
+
Remove
|
|
593
|
+
</DropdownMenu.Item>
|
|
594
|
+
</DropdownMenu.Content>
|
|
595
|
+
</DropdownMenu.Root>
|
|
596
|
+
{/if}
|
|
597
|
+
</div>
|
|
598
|
+
{/each}
|
|
599
|
+
</div>
|
|
607
600
|
{/if}
|
|
608
601
|
</DragDropProvider>
|
|
609
602
|
{/key}
|
|
@@ -787,7 +780,10 @@
|
|
|
787
780
|
</div>
|
|
788
781
|
|
|
789
782
|
<!-- Title (clickable to edit) -->
|
|
790
|
-
<button
|
|
783
|
+
<button
|
|
784
|
+
class="flex-1 cursor-pointer truncate text-left text-sm"
|
|
785
|
+
onclick={() => handleEditItem(index)}
|
|
786
|
+
>
|
|
791
787
|
{getItemTitle(item)}
|
|
792
788
|
</button>
|
|
793
789
|
|
|
@@ -869,7 +865,7 @@
|
|
|
869
865
|
schema={editingSchema}
|
|
870
866
|
value={editingValue}
|
|
871
867
|
onClose={handleModalClose}
|
|
872
|
-
|
|
868
|
+
onUpdate={handleModalUpdate}
|
|
873
869
|
{onOpenReference}
|
|
874
870
|
{readonly}
|
|
875
871
|
{organizationId}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArrayField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/ArrayField.svelte.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,IAAI,cAAc,EAAc,MAAM,wBAAwB,CAAC;AAyBtF,UAAU,KAAK;IACd,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,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;
|
|
1
|
+
{"version":3,"file":"ArrayField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/ArrayField.svelte.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,IAAI,cAAc,EAAc,MAAM,wBAAwB,CAAC;AAyBtF,UAAU,KAAK;IACd,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,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;AA0xBF,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
|