@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
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
import elementEvents from '../../../utils/element-events';
|
|
18
18
|
import { copyUrlToClipboard, downloadFile } from '../../../utils/asset-actions';
|
|
19
19
|
import AssetBrowserModal from '../AssetBrowserModal.svelte';
|
|
20
|
+
import { usePermissions } from '../../../permissions-context.svelte';
|
|
20
21
|
|
|
21
22
|
interface Props {
|
|
22
23
|
field: FileFieldType;
|
|
@@ -44,6 +45,12 @@
|
|
|
44
45
|
organizationId
|
|
45
46
|
}: Props = $props();
|
|
46
47
|
|
|
48
|
+
// Read-only when forced by caller OR the user lacks asset.upload. Keeps
|
|
49
|
+
// the `readonly` prop as an explicit override for hosts that want to
|
|
50
|
+
// neutralise the field regardless of RBAC state.
|
|
51
|
+
const perms = usePermissions();
|
|
52
|
+
const isReadOnly = $derived(readonly || !perms.can('asset.upload'));
|
|
53
|
+
|
|
47
54
|
let isDragging = $state(false);
|
|
48
55
|
let isUploading = $state(false);
|
|
49
56
|
let uploadError = $state<string | null>(null);
|
|
@@ -97,7 +104,7 @@
|
|
|
97
104
|
}
|
|
98
105
|
|
|
99
106
|
async function handleFileSelect(files: FileList | null) {
|
|
100
|
-
if (
|
|
107
|
+
if (isReadOnly || !files || files.length === 0) return;
|
|
101
108
|
|
|
102
109
|
const file = files[0]!;
|
|
103
110
|
|
|
@@ -115,37 +122,37 @@
|
|
|
115
122
|
}
|
|
116
123
|
|
|
117
124
|
function handleDragOver(event: DragEvent) {
|
|
118
|
-
if (
|
|
125
|
+
if (isReadOnly) return;
|
|
119
126
|
event.preventDefault();
|
|
120
127
|
isDragging = true;
|
|
121
128
|
}
|
|
122
129
|
|
|
123
130
|
function handleDragLeave(event: DragEvent) {
|
|
124
|
-
if (
|
|
131
|
+
if (isReadOnly) return;
|
|
125
132
|
event.preventDefault();
|
|
126
133
|
isDragging = false;
|
|
127
134
|
}
|
|
128
135
|
|
|
129
136
|
function handleDrop(event: DragEvent) {
|
|
130
|
-
if (
|
|
137
|
+
if (isReadOnly) return;
|
|
131
138
|
event.preventDefault();
|
|
132
139
|
isDragging = false;
|
|
133
140
|
handleFileSelect(event.dataTransfer?.files || null);
|
|
134
141
|
}
|
|
135
142
|
|
|
136
143
|
function handleFileInputChange(event: Event) {
|
|
137
|
-
if (
|
|
144
|
+
if (isReadOnly) return;
|
|
138
145
|
const target = event.target as HTMLInputElement;
|
|
139
146
|
handleFileSelect(target.files);
|
|
140
147
|
}
|
|
141
148
|
|
|
142
149
|
function openFileDialog() {
|
|
143
|
-
if (
|
|
150
|
+
if (isReadOnly) return;
|
|
144
151
|
fileInputRef?.click();
|
|
145
152
|
}
|
|
146
153
|
|
|
147
154
|
function removeFile() {
|
|
148
|
-
if (
|
|
155
|
+
if (isReadOnly) return;
|
|
149
156
|
onUpdate(null);
|
|
150
157
|
uploadError = null;
|
|
151
158
|
}
|
|
@@ -271,7 +278,7 @@
|
|
|
271
278
|
{/if}
|
|
272
279
|
</div>
|
|
273
280
|
|
|
274
|
-
{#if !
|
|
281
|
+
{#if !isReadOnly}
|
|
275
282
|
<DropdownMenu>
|
|
276
283
|
<DropdownMenuTrigger>
|
|
277
284
|
<Button variant="ghost" size="sm" class="h-8 w-8 p-0">
|
|
@@ -312,7 +319,7 @@
|
|
|
312
319
|
variant="outline"
|
|
313
320
|
class="w-full justify-start"
|
|
314
321
|
onclick={openFileDialog}
|
|
315
|
-
disabled={isUploading ||
|
|
322
|
+
disabled={isUploading || isReadOnly}
|
|
316
323
|
type="button"
|
|
317
324
|
>
|
|
318
325
|
{#if isUploading}
|
|
@@ -330,9 +337,7 @@
|
|
|
330
337
|
<div class="border-border overflow-hidden rounded-md border {validationClasses}">
|
|
331
338
|
<!-- File info card -->
|
|
332
339
|
<div class="flex items-center gap-4 p-4">
|
|
333
|
-
<div
|
|
334
|
-
class="bg-muted flex h-14 w-14 flex-shrink-0 items-center justify-center rounded-lg"
|
|
335
|
-
>
|
|
340
|
+
<div class="bg-muted flex h-14 w-14 flex-shrink-0 items-center justify-center rounded-lg">
|
|
336
341
|
{#if loadingAsset}
|
|
337
342
|
<div class="border-primary h-6 w-6 animate-spin rounded-full border-b-2"></div>
|
|
338
343
|
{:else}
|
|
@@ -353,7 +358,7 @@
|
|
|
353
358
|
</div>
|
|
354
359
|
|
|
355
360
|
<!-- Controls -->
|
|
356
|
-
{#if !
|
|
361
|
+
{#if !isReadOnly}
|
|
357
362
|
<DropdownMenu>
|
|
358
363
|
<DropdownMenuTrigger>
|
|
359
364
|
<Button variant="secondary" size="icon" class="h-8 w-8">
|
|
@@ -404,7 +409,7 @@
|
|
|
404
409
|
{:else}
|
|
405
410
|
<!-- Upload bar -->
|
|
406
411
|
<div
|
|
407
|
-
class="border-border flex h-10 items-center overflow-hidden rounded-md border transition-colors {validationClasses} {
|
|
412
|
+
class="border-border flex h-10 items-center overflow-hidden rounded-md border transition-colors {validationClasses} {isReadOnly
|
|
408
413
|
? ''
|
|
409
414
|
: isDragging
|
|
410
415
|
? 'bg-primary/5'
|
|
@@ -426,7 +431,7 @@
|
|
|
426
431
|
{:else}
|
|
427
432
|
<FileIcon size={16} class="text-muted-foreground" />
|
|
428
433
|
<span class="text-muted-foreground text-sm">
|
|
429
|
-
{
|
|
434
|
+
{isReadOnly ? 'No file' : isDragging ? 'Drop file here' : 'Drag or select a file'}
|
|
430
435
|
</span>
|
|
431
436
|
{/if}
|
|
432
437
|
</div>
|
|
@@ -434,7 +439,7 @@
|
|
|
434
439
|
<div class="flex items-center gap-1 pr-2">
|
|
435
440
|
<button
|
|
436
441
|
onclick={openFileDialog}
|
|
437
|
-
disabled={isUploading ||
|
|
442
|
+
disabled={isUploading || isReadOnly}
|
|
438
443
|
type="button"
|
|
439
444
|
class="text-muted-foreground hover:text-foreground flex items-center gap-1 px-2 py-1 text-sm transition-colors disabled:opacity-50"
|
|
440
445
|
>
|
|
@@ -442,7 +447,7 @@
|
|
|
442
447
|
Upload
|
|
443
448
|
</button>
|
|
444
449
|
<button
|
|
445
|
-
disabled={isUploading ||
|
|
450
|
+
disabled={isUploading || isReadOnly}
|
|
446
451
|
type="button"
|
|
447
452
|
onclick={() => {
|
|
448
453
|
showAssetBrowser = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/FileField.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"FileField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/FileField.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAkBxE,UAAU,KAAK;IACd,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAuaF,QAAA,MAAM,SAAS,2CAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
import { copyUrlToClipboard, downloadFile } from '../../../utils/asset-actions';
|
|
19
19
|
import AssetBrowserModal from '../AssetBrowserModal.svelte';
|
|
20
20
|
import { Input } from '@aphexcms/ui/shadcn/input';
|
|
21
|
+
import { usePermissions } from '../../../permissions-context.svelte';
|
|
21
22
|
|
|
22
23
|
interface Props {
|
|
23
24
|
field: ImageFieldType;
|
|
@@ -45,6 +46,11 @@
|
|
|
45
46
|
organizationId
|
|
46
47
|
}: Props = $props();
|
|
47
48
|
|
|
49
|
+
// Treat the field as read-only when the explicit prop is set OR the user
|
|
50
|
+
// lacks asset.upload — both paths land the user at the same UX.
|
|
51
|
+
const perms = usePermissions();
|
|
52
|
+
const isReadOnly = $derived(readonly || !perms.can('asset.upload'));
|
|
53
|
+
|
|
48
54
|
// Component state
|
|
49
55
|
let isDragging = $state(false);
|
|
50
56
|
let isUploading = $state(false);
|
|
@@ -95,7 +101,7 @@
|
|
|
95
101
|
|
|
96
102
|
// Handle file selection
|
|
97
103
|
async function handleFileSelect(files: FileList | null) {
|
|
98
|
-
if (
|
|
104
|
+
if (isReadOnly || !files || files.length === 0) return;
|
|
99
105
|
|
|
100
106
|
const file = files[0]!;
|
|
101
107
|
|
|
@@ -107,19 +113,19 @@
|
|
|
107
113
|
|
|
108
114
|
// Drag and drop handlers
|
|
109
115
|
function handleDragOver(event: DragEvent) {
|
|
110
|
-
if (
|
|
116
|
+
if (isReadOnly) return;
|
|
111
117
|
event.preventDefault();
|
|
112
118
|
isDragging = true;
|
|
113
119
|
}
|
|
114
120
|
|
|
115
121
|
function handleDragLeave(event: DragEvent) {
|
|
116
|
-
if (
|
|
122
|
+
if (isReadOnly) return;
|
|
117
123
|
event.preventDefault();
|
|
118
124
|
isDragging = false;
|
|
119
125
|
}
|
|
120
126
|
|
|
121
127
|
function handleDrop(event: DragEvent) {
|
|
122
|
-
if (
|
|
128
|
+
if (isReadOnly) return;
|
|
123
129
|
event.preventDefault();
|
|
124
130
|
isDragging = false;
|
|
125
131
|
handleFileSelect(event.dataTransfer?.files || null);
|
|
@@ -127,19 +133,19 @@
|
|
|
127
133
|
|
|
128
134
|
// File input handlers
|
|
129
135
|
function handleFileInputChange(event: Event) {
|
|
130
|
-
if (
|
|
136
|
+
if (isReadOnly) return;
|
|
131
137
|
const target = event.target as HTMLInputElement;
|
|
132
138
|
handleFileSelect(target.files);
|
|
133
139
|
}
|
|
134
140
|
|
|
135
141
|
function openFileDialog() {
|
|
136
|
-
if (
|
|
142
|
+
if (isReadOnly) return;
|
|
137
143
|
fileInputRef?.click();
|
|
138
144
|
}
|
|
139
145
|
|
|
140
146
|
// Remove image
|
|
141
147
|
function removeImage() {
|
|
142
|
-
if (
|
|
148
|
+
if (isReadOnly) return;
|
|
143
149
|
onUpdate(null);
|
|
144
150
|
uploadError = null;
|
|
145
151
|
}
|
|
@@ -299,7 +305,7 @@
|
|
|
299
305
|
</div>
|
|
300
306
|
|
|
301
307
|
<!-- Options menu -->
|
|
302
|
-
{#if !
|
|
308
|
+
{#if !isReadOnly}
|
|
303
309
|
<DropdownMenu>
|
|
304
310
|
<DropdownMenuTrigger>
|
|
305
311
|
<Button variant="ghost" size="sm" class="h-8 w-8 p-0">
|
|
@@ -341,7 +347,7 @@
|
|
|
341
347
|
variant="outline"
|
|
342
348
|
class="w-full justify-start"
|
|
343
349
|
onclick={openFileDialog}
|
|
344
|
-
disabled={isUploading ||
|
|
350
|
+
disabled={isUploading || isReadOnly}
|
|
345
351
|
type="button"
|
|
346
352
|
>
|
|
347
353
|
{#if isUploading}
|
|
@@ -383,7 +389,7 @@
|
|
|
383
389
|
</div>
|
|
384
390
|
|
|
385
391
|
<!-- Overlay controls (hidden for read-only) -->
|
|
386
|
-
{#if !
|
|
392
|
+
{#if !isReadOnly}
|
|
387
393
|
<div class="absolute inset-2 flex items-start justify-end gap-2">
|
|
388
394
|
<DropdownMenu>
|
|
389
395
|
<DropdownMenuTrigger>
|
|
@@ -443,14 +449,14 @@
|
|
|
443
449
|
placeholder="Describe this image..."
|
|
444
450
|
value={altText}
|
|
445
451
|
oninput={(e) => updateAltText(e.currentTarget.value)}
|
|
446
|
-
disabled={
|
|
452
|
+
disabled={isReadOnly}
|
|
447
453
|
/>
|
|
448
454
|
</div>
|
|
449
455
|
</div>
|
|
450
456
|
{:else}
|
|
451
457
|
<!-- Sanity-style upload bar -->
|
|
452
458
|
<div
|
|
453
|
-
class="border-border flex h-10 items-center overflow-hidden rounded-md border transition-colors {validationClasses} {
|
|
459
|
+
class="border-border flex h-10 items-center overflow-hidden rounded-md border transition-colors {validationClasses} {isReadOnly
|
|
454
460
|
? ''
|
|
455
461
|
: isDragging
|
|
456
462
|
? 'bg-primary/5'
|
|
@@ -473,7 +479,7 @@
|
|
|
473
479
|
{:else}
|
|
474
480
|
<FileImage size={16} class="text-muted-foreground" />
|
|
475
481
|
<span class="text-muted-foreground text-sm">
|
|
476
|
-
{
|
|
482
|
+
{isReadOnly ? 'No image' : isDragging ? 'Drop image here' : 'Drag or paste image here'}
|
|
477
483
|
</span>
|
|
478
484
|
{/if}
|
|
479
485
|
</div>
|
|
@@ -482,7 +488,7 @@
|
|
|
482
488
|
<div class="flex items-center gap-1 pr-2">
|
|
483
489
|
<button
|
|
484
490
|
onclick={openFileDialog}
|
|
485
|
-
disabled={isUploading ||
|
|
491
|
+
disabled={isUploading || isReadOnly}
|
|
486
492
|
type="button"
|
|
487
493
|
class="text-muted-foreground hover:text-foreground flex items-center gap-1 px-2 py-1 text-sm transition-colors disabled:opacity-50"
|
|
488
494
|
>
|
|
@@ -490,7 +496,7 @@
|
|
|
490
496
|
Upload
|
|
491
497
|
</button>
|
|
492
498
|
<button
|
|
493
|
-
disabled={isUploading ||
|
|
499
|
+
disabled={isUploading || isReadOnly}
|
|
494
500
|
type="button"
|
|
495
501
|
onclick={() => {
|
|
496
502
|
showAssetBrowser = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/ImageField.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"ImageField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/ImageField.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAmB1E,UAAU,KAAK;IACd,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,KAAK,IAAI,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AA6bF,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import CheckIcon from '@lucide/svelte/icons/check';
|
|
3
|
-
import ChevronsUpDownIcon from '@lucide/svelte/icons/chevrons-up-down';
|
|
4
3
|
import PlusIcon from '@lucide/svelte/icons/plus';
|
|
5
|
-
import XIcon from '@lucide/svelte/icons/x';
|
|
6
4
|
import { tick } from 'svelte';
|
|
7
5
|
import * as Command from '@aphexcms/ui/shadcn/command';
|
|
8
6
|
import * as Popover from '@aphexcms/ui/shadcn/popover';
|
|
7
|
+
import * as DropdownMenu from '@aphexcms/ui/shadcn/dropdown-menu';
|
|
9
8
|
import { Button } from '@aphexcms/ui/shadcn/button';
|
|
10
9
|
import { cn } from '@aphexcms/ui/utils';
|
|
10
|
+
import { ExternalLink, Ellipsis, Trash2, FileText } from '@lucide/svelte';
|
|
11
11
|
import type { Field, ReferenceField as ReferenceFieldType } from '../../../types/schemas';
|
|
12
12
|
import { documents } from '../../../api/documents';
|
|
13
|
+
import { getSchemaContext } from '../../../schema-context.svelte';
|
|
14
|
+
import { getSchemaByName } from '../../../schema-utils/utils';
|
|
13
15
|
import { toast } from 'svelte-sonner';
|
|
14
16
|
import { cmsLogger } from '../../../utils/logger';
|
|
15
17
|
import { pluralize } from '../../../utils/pluralize';
|
|
@@ -28,6 +30,10 @@
|
|
|
28
30
|
const referenceField = field as ReferenceFieldType;
|
|
29
31
|
const targetType = referenceField.to?.[0]?.type;
|
|
30
32
|
|
|
33
|
+
const schemas = getSchemaContext();
|
|
34
|
+
const targetSchema = $derived(targetType ? getSchemaByName(schemas, targetType) : null);
|
|
35
|
+
const TargetIcon = $derived(targetSchema?.icon ?? null);
|
|
36
|
+
|
|
31
37
|
// State
|
|
32
38
|
let open = $state(false);
|
|
33
39
|
let searchResults = $state<any[]>([]);
|
|
@@ -143,123 +149,147 @@
|
|
|
143
149
|
</script>
|
|
144
150
|
|
|
145
151
|
{#if selectedDocument}
|
|
146
|
-
<!-- Selected document
|
|
147
|
-
<div
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
152
|
+
<!-- Selected document — row styled like an ArrayField item -->
|
|
153
|
+
<div
|
|
154
|
+
class="border-border/50 bg-background hover:bg-muted/50 flex h-10 items-center gap-1 rounded border px-1 transition-colors"
|
|
155
|
+
>
|
|
156
|
+
<!-- Type icon -->
|
|
157
|
+
<div class="text-muted-foreground flex h-8 w-8 shrink-0 items-center justify-center">
|
|
158
|
+
{#if TargetIcon}
|
|
159
|
+
<TargetIcon class="h-4 w-4" />
|
|
160
|
+
{:else}
|
|
161
|
+
<FileText class="h-4 w-4" />
|
|
162
|
+
{/if}
|
|
154
163
|
</div>
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
164
|
+
|
|
165
|
+
<!-- Title + status dot (clickable to open referenced document) -->
|
|
166
|
+
<button
|
|
167
|
+
class="flex min-w-0 flex-1 cursor-pointer items-center gap-2 text-left"
|
|
158
168
|
onclick={openReference}
|
|
159
|
-
|
|
160
|
-
title="Edit referenced document"
|
|
169
|
+
title="Open referenced document"
|
|
161
170
|
>
|
|
162
|
-
<
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
class="text-muted-foreground hover:text-destructive h-8 w-8 p-0"
|
|
177
|
-
title="Clear selection"
|
|
178
|
-
>
|
|
179
|
-
<XIcon class="h-4 w-4" />
|
|
180
|
-
</Button>
|
|
181
|
-
{/if}
|
|
182
|
-
</div>
|
|
183
|
-
{:else}
|
|
184
|
-
<!-- Search/select interface -->
|
|
185
|
-
{#if readonly}
|
|
186
|
-
<!-- Read-only state: show placeholder -->
|
|
187
|
-
<div
|
|
188
|
-
class="border-input bg-muted/50 flex h-10 w-full items-center justify-between rounded-md border px-3 py-2 text-sm"
|
|
189
|
-
>
|
|
190
|
-
<span class="text-muted-foreground">No reference selected</span>
|
|
191
|
-
</div>
|
|
192
|
-
{:else}
|
|
193
|
-
<Popover.Root bind:open>
|
|
194
|
-
<Popover.Trigger bind:ref={triggerRef}>
|
|
171
|
+
<span class="truncate text-sm">{getDocumentTitle(selectedDocument)}</span>
|
|
172
|
+
{#if selectedDocument.status === 'published'}
|
|
173
|
+
<span class="h-1.5 w-1.5 shrink-0 rounded-full bg-green-500" title="Published"></span>
|
|
174
|
+
{:else if selectedDocument.status === 'unpublished'}
|
|
175
|
+
<span class="bg-muted-foreground/60 h-1.5 w-1.5 shrink-0 rounded-full" title="Unpublished"
|
|
176
|
+
></span>
|
|
177
|
+
{:else}
|
|
178
|
+
<span class="h-1.5 w-1.5 shrink-0 rounded-full bg-amber-500" title="Draft"></span>
|
|
179
|
+
{/if}
|
|
180
|
+
</button>
|
|
181
|
+
|
|
182
|
+
<!-- Context menu -->
|
|
183
|
+
<DropdownMenu.Root>
|
|
184
|
+
<DropdownMenu.Trigger>
|
|
195
185
|
{#snippet child({ props })}
|
|
196
|
-
<
|
|
186
|
+
<button
|
|
197
187
|
{...props}
|
|
198
|
-
|
|
199
|
-
class="w-full justify-between"
|
|
200
|
-
role="combobox"
|
|
201
|
-
aria-expanded={open}
|
|
188
|
+
class="text-muted-foreground hover:text-foreground flex h-8 w-8 shrink-0 cursor-pointer items-center justify-center rounded transition-colors"
|
|
202
189
|
>
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
</Button>
|
|
190
|
+
<Ellipsis class="h-4 w-4" />
|
|
191
|
+
</button>
|
|
206
192
|
{/snippet}
|
|
207
|
-
</
|
|
208
|
-
<
|
|
209
|
-
<
|
|
210
|
-
<
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
193
|
+
</DropdownMenu.Trigger>
|
|
194
|
+
<DropdownMenu.Content align="end">
|
|
195
|
+
<DropdownMenu.Item onclick={openReference}>
|
|
196
|
+
<ExternalLink class="mr-2 h-4 w-4" />
|
|
197
|
+
Open
|
|
198
|
+
</DropdownMenu.Item>
|
|
199
|
+
{#if !readonly}
|
|
200
|
+
<DropdownMenu.Separator />
|
|
201
|
+
<DropdownMenu.Item
|
|
202
|
+
class="text-destructive focus:text-destructive"
|
|
203
|
+
onclick={clearSelection}
|
|
204
|
+
>
|
|
205
|
+
<Trash2 class="mr-2 h-4 w-4" />
|
|
206
|
+
Remove
|
|
207
|
+
</DropdownMenu.Item>
|
|
208
|
+
{/if}
|
|
209
|
+
</DropdownMenu.Content>
|
|
210
|
+
</DropdownMenu.Root>
|
|
211
|
+
</div>
|
|
212
|
+
{:else if readonly}
|
|
213
|
+
<!-- Read-only empty state -->
|
|
214
|
+
<div
|
|
215
|
+
class="border-border/50 bg-muted/30 flex items-center justify-center rounded border border-dashed p-6"
|
|
216
|
+
>
|
|
217
|
+
<p class="text-muted-foreground text-sm">No reference selected</p>
|
|
218
|
+
</div>
|
|
219
|
+
{:else}
|
|
220
|
+
<!-- Empty state: dashed "Add reference" button that opens a search popover -->
|
|
221
|
+
<Popover.Root bind:open>
|
|
222
|
+
<Popover.Trigger bind:ref={triggerRef}>
|
|
223
|
+
{#snippet child({ props })}
|
|
224
|
+
<button
|
|
225
|
+
{...props}
|
|
226
|
+
class="border-border/50 text-muted-foreground hover:text-foreground hover:bg-muted/50 flex h-10 w-full cursor-pointer items-center justify-center gap-2 rounded border border-dashed text-sm transition-colors"
|
|
227
|
+
role="combobox"
|
|
228
|
+
aria-expanded={open}
|
|
229
|
+
>
|
|
230
|
+
<PlusIcon class="h-4 w-4" />
|
|
231
|
+
Add {targetType || 'reference'}...
|
|
232
|
+
</button>
|
|
233
|
+
{/snippet}
|
|
234
|
+
</Popover.Trigger>
|
|
235
|
+
<Popover.Content class="!z-[9999] w-[400px] p-0">
|
|
236
|
+
<Command.Root>
|
|
237
|
+
<Command.List>
|
|
238
|
+
{#if loading}
|
|
239
|
+
<Command.Loading>Loading...</Command.Loading>
|
|
240
|
+
{:else if searchResults.length === 0}
|
|
241
|
+
<Command.Empty>
|
|
242
|
+
<div class="flex flex-col items-center gap-2 py-4">
|
|
243
|
+
<p class="text-muted-foreground text-sm">
|
|
244
|
+
No {pluralize(targetType || '')} found
|
|
245
|
+
</p>
|
|
246
|
+
<Button size="sm" onclick={createNewDocument} disabled={creating} class="gap-1">
|
|
247
|
+
<PlusIcon class="h-3 w-3" />
|
|
248
|
+
{creating ? 'Creating...' : `Create new ${targetType}`}
|
|
249
|
+
</Button>
|
|
250
|
+
</div>
|
|
251
|
+
</Command.Empty>
|
|
252
|
+
{:else}
|
|
253
|
+
<Command.Group>
|
|
254
|
+
{#each searchResults as doc (doc.id)}
|
|
255
|
+
<Command.Item
|
|
256
|
+
value={doc.id}
|
|
257
|
+
onSelect={() => selectDocument(doc)}
|
|
258
|
+
class="flex items-center justify-between"
|
|
259
|
+
>
|
|
260
|
+
<div class="flex min-w-0 flex-1 items-center gap-2">
|
|
261
|
+
<CheckIcon
|
|
262
|
+
class={cn('h-4 w-4 shrink-0', value !== doc.id && 'text-transparent')}
|
|
263
|
+
/>
|
|
264
|
+
<span class="truncate text-sm">{getDocumentTitle(doc)}</span>
|
|
252
265
|
</div>
|
|
266
|
+
{#if doc.status === 'published'}
|
|
267
|
+
<span class="h-1.5 w-1.5 shrink-0 rounded-full bg-green-500" title="Published"
|
|
268
|
+
></span>
|
|
269
|
+
{:else if doc.status === 'unpublished'}
|
|
270
|
+
<span
|
|
271
|
+
class="bg-muted-foreground/60 h-1.5 w-1.5 shrink-0 rounded-full"
|
|
272
|
+
title="Unpublished"
|
|
273
|
+
></span>
|
|
274
|
+
{:else}
|
|
275
|
+
<span class="h-1.5 w-1.5 shrink-0 rounded-full bg-amber-500" title="Draft"
|
|
276
|
+
></span>
|
|
277
|
+
{/if}
|
|
253
278
|
</Command.Item>
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
279
|
+
{/each}
|
|
280
|
+
</Command.Group>
|
|
281
|
+
<Command.Separator />
|
|
282
|
+
<Command.Group>
|
|
283
|
+
<Command.Item onSelect={createNewDocument} class="justify-center">
|
|
284
|
+
<div class="flex items-center gap-1">
|
|
285
|
+
<PlusIcon class="h-3 w-3" />
|
|
286
|
+
{creating ? 'Creating...' : `Create new ${targetType}`}
|
|
287
|
+
</div>
|
|
288
|
+
</Command.Item>
|
|
289
|
+
</Command.Group>
|
|
290
|
+
{/if}
|
|
291
|
+
</Command.List>
|
|
292
|
+
</Command.Root>
|
|
293
|
+
</Popover.Content>
|
|
294
|
+
</Popover.Root>
|
|
265
295
|
{/if}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReferenceField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/ReferenceField.svelte.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,KAAK,EAAwC,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"ReferenceField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/ReferenceField.svelte.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,KAAK,EAAwC,MAAM,wBAAwB,CAAC;AASzF,UAAU,KAAK;IACd,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACzC,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAqQF,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { Textarea } from '@aphexcms/ui/shadcn/textarea';
|
|
3
|
-
import type {
|
|
3
|
+
import type { TextField } from '../../../types/schemas';
|
|
4
4
|
|
|
5
5
|
interface Props {
|
|
6
|
-
field:
|
|
6
|
+
field: TextField;
|
|
7
7
|
value: any;
|
|
8
8
|
onUpdate: (value: any) => void;
|
|
9
9
|
validationClasses?: string;
|
|
@@ -32,9 +32,10 @@
|
|
|
32
32
|
id={field.name}
|
|
33
33
|
value={value || ''}
|
|
34
34
|
placeholder={field.title}
|
|
35
|
+
rows={field.rows}
|
|
35
36
|
oninput={handleInputChange}
|
|
36
37
|
onblur={onBlur}
|
|
37
38
|
onfocus={onFocus}
|
|
38
|
-
class="min-h-[100px] {validationClasses}"
|
|
39
|
+
class="{field.rows ? 'field-sizing-fixed' : 'min-h-[100px]'} {validationClasses}"
|
|
39
40
|
disabled={readonly}
|
|
40
41
|
/>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextareaField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/TextareaField.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"TextareaField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/TextareaField.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGvD,UAAU,KAAK;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AA0BF,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
|