includio-cms 0.25.0 → 0.27.0
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/API.md +97 -4
- package/CHANGELOG.md +118 -0
- package/DOCS.md +1 -1
- package/README.md +2 -0
- package/ROADMAP.md +14 -0
- package/dist/admin/auth-client.d.ts +42 -42
- package/dist/admin/client/account/lang.d.ts +1 -0
- package/dist/admin/client/account/lang.js +4 -2
- package/dist/admin/client/account/profile-section.svelte +2 -2
- package/dist/admin/client/account/security-section.svelte +27 -4
- package/dist/admin/client/account/sessions-section.svelte +1 -1
- package/dist/admin/client/admin/admin-after-login-layout-content.svelte +1 -1
- package/dist/admin/client/admin/admin-layout.svelte +12 -2
- package/dist/admin/client/admin/admin-layout.svelte.d.ts +2 -1
- package/dist/admin/client/admin/dashboard-page.svelte +34 -10
- package/dist/admin/client/collection/bulk-actions-bar.svelte +86 -44
- package/dist/admin/client/collection/bulk-actions-bar.svelte.d.ts +3 -1
- package/dist/admin/client/collection/collection-entries.svelte +52 -36
- package/dist/admin/client/collection/collection-entries.svelte.d.ts +3 -0
- package/dist/admin/client/collection/collection.svelte +28 -14
- package/dist/admin/client/collection/collection.svelte.d.ts +3 -0
- package/dist/admin/client/collection/data-table.svelte +240 -130
- package/dist/admin/client/collection/data-table.svelte.d.ts +9 -0
- package/dist/admin/client/collection/date-cell.svelte +4 -4
- package/dist/admin/client/collection/row-actions.svelte +2 -1
- package/dist/admin/client/collection/sortable-header.svelte +33 -9
- package/dist/admin/client/collection/state-display.svelte +102 -0
- package/dist/admin/client/collection/state-display.svelte.d.ts +12 -0
- package/dist/admin/client/collection/status-badge.svelte +99 -11
- package/dist/admin/client/collection/status-badge.svelte.d.ts +15 -1
- package/dist/admin/client/collection/table-pagination.svelte +21 -6
- package/dist/admin/client/collection/table-toolbar.svelte +105 -80
- package/dist/admin/client/collection/table-toolbar.svelte.d.ts +11 -8
- package/dist/admin/client/entry/entry-form.svelte +36 -11
- package/dist/admin/client/entry/entry-form.svelte.d.ts +1 -0
- package/dist/admin/client/entry/entry-header.svelte +22 -15
- package/dist/admin/client/entry/entry-header.svelte.d.ts +1 -0
- package/dist/admin/client/entry/entry.svelte +269 -165
- package/dist/admin/client/entry/header/a11y-header-badge.svelte +47 -0
- package/dist/admin/client/entry/header/a11y-header-badge.svelte.d.ts +8 -0
- package/dist/admin/client/entry/header/publish-panel.svelte +69 -13
- package/dist/admin/client/entry/header/save-indicator.svelte +57 -28
- package/dist/admin/client/entry/header/save-indicator.svelte.d.ts +1 -0
- package/dist/admin/client/entry/header/status-badge.svelte +60 -15
- package/dist/admin/client/entry/header/status-badge.svelte.d.ts +1 -2
- package/dist/admin/client/entry/header/version-history-sheet.svelte +1 -1
- package/dist/admin/client/entry/hybrid/hybrid-layout.svelte +74 -23
- package/dist/admin/client/entry/hybrid/hybrid-preview.svelte +1 -1
- package/dist/admin/client/entry/utils.d.ts +14 -0
- package/dist/admin/client/entry/utils.js +28 -0
- package/dist/admin/client/form/form-submission/form-submission.svelte +2 -2
- package/dist/admin/client/form/form-submissions.svelte +143 -194
- package/dist/admin/client/form/form-submissions.svelte.d.ts +2 -0
- package/dist/admin/client/login/lang.d.ts +3 -0
- package/dist/admin/client/login/lang.js +10 -4
- package/dist/admin/client/login/login-form.svelte +8 -1
- package/dist/admin/client/login/reset-password-page.svelte +24 -3
- package/dist/admin/client/login/schema.d.ts +14 -2
- package/dist/admin/client/login/schema.js +19 -8
- package/dist/admin/client/maintenance/maintenance-page.svelte +16 -17
- package/dist/admin/client/media/media-page.svelte +1 -1
- package/dist/admin/client/shop/coupon-edit-page.svelte +117 -13
- package/dist/admin/client/shop/coupon-form.svelte +282 -138
- package/dist/admin/client/shop/coupon-form.svelte.d.ts +1 -9
- package/dist/admin/client/shop/coupon-new-page.svelte +40 -10
- package/dist/admin/client/shop/coupon-new-page.svelte.d.ts +2 -17
- package/dist/admin/client/shop/coupon-schema.d.ts +28 -0
- package/dist/admin/client/shop/coupon-schema.js +53 -0
- package/dist/admin/client/shop/coupons-list-page.svelte +262 -118
- package/dist/admin/client/shop/coupons-list-page.svelte.d.ts +16 -1
- package/dist/admin/client/shop/refund-dialog.svelte +37 -1
- package/dist/admin/client/shop/refund-dialog.svelte.d.ts +3 -0
- package/dist/admin/client/shop/shipping-method-edit-page.svelte +108 -59
- package/dist/admin/client/shop/shipping-method-form.svelte +36 -9
- package/dist/admin/client/shop/shipping-method-new-page.svelte +44 -13
- package/dist/admin/client/shop/shipping-methods-list-page.svelte +101 -59
- package/dist/admin/client/shop/shop-order-detail-page.svelte +220 -84
- package/dist/admin/client/shop/shop-orders-list-page.svelte +302 -152
- package/dist/admin/client/shop/shop-orders-list-page.svelte.d.ts +18 -1
- package/dist/admin/client/shop/shop-products-list-page.svelte +355 -118
- package/dist/admin/client/shop/shop-products-list-page.svelte.d.ts +19 -1
- package/dist/admin/client/users/accept-invite-page.svelte +24 -3
- package/dist/admin/client/users/create-user-dialog.svelte +3 -8
- package/dist/admin/client/users/lang.d.ts +2 -0
- package/dist/admin/client/users/lang.js +4 -0
- package/dist/admin/client/users/pending-invitations.svelte +2 -9
- package/dist/admin/client/users/user-name-cell.svelte +20 -0
- package/dist/admin/client/users/user-name-cell.svelte.d.ts +9 -0
- package/dist/admin/client/users/user-role-badge.svelte +16 -0
- package/dist/admin/client/users/user-role-badge.svelte.d.ts +7 -0
- package/dist/admin/client/users/user-row-actions.svelte +72 -0
- package/dist/admin/client/users/user-row-actions.svelte.d.ts +20 -0
- package/dist/admin/client/users/user-sessions-sheet.svelte +2 -11
- package/dist/admin/client/users/users-page.svelte +283 -497
- package/dist/admin/client/users/users-page.svelte.d.ts +12 -1
- package/dist/admin/components/dashboard/form-submissions-widget.svelte +59 -74
- package/dist/admin/components/dashboard/recent-activity.svelte +17 -5
- package/dist/admin/components/dashboard/recent-entries.svelte +19 -7
- package/dist/admin/components/dialogs/confirmation-dialog.svelte +105 -0
- package/dist/admin/components/dialogs/confirmation-dialog.svelte.d.ts +13 -0
- package/dist/admin/components/fields/block-picker-modal.svelte +6 -0
- package/dist/admin/components/fields/blocks-field.svelte +46 -1
- package/dist/admin/components/fields/boolean-field.svelte +1 -1
- package/dist/admin/components/fields/field-renderer.svelte +29 -22
- package/dist/admin/components/fields/file-field.svelte +344 -30
- package/dist/admin/components/fields/icon-field.svelte +86 -0
- package/dist/admin/components/fields/icon-field.svelte.d.ts +8 -0
- package/dist/admin/components/fields/icon-picker-dialog.svelte +174 -0
- package/dist/admin/components/fields/icon-picker-dialog.svelte.d.ts +11 -0
- package/dist/admin/components/fields/media-field.svelte +16 -2
- package/dist/admin/components/fields/object-field.svelte +27 -7
- package/dist/admin/components/fields/radio-field.svelte +22 -0
- package/dist/admin/components/fields/relation-field.svelte +123 -97
- package/dist/admin/components/fields/relation-picker-dialog.svelte +2 -2
- package/dist/admin/components/fields/seo-field.svelte +60 -30
- package/dist/admin/components/fields/shop-field.svelte +219 -24
- package/dist/admin/components/fields/simple-array-field.svelte +321 -151
- package/dist/admin/components/fields/simple-array-field.svelte.d.ts +3 -0
- package/dist/admin/components/fields/slug-field.svelte +146 -21
- package/dist/admin/components/fields/text-field-wrapper.svelte +37 -20
- package/dist/admin/components/fields/text-field.svelte +7 -2
- package/dist/admin/components/fields/url-field-wrapper.svelte +10 -0
- package/dist/admin/components/fields/url-field.svelte +36 -23
- package/dist/admin/components/forms/form-error-summary.svelte +143 -0
- package/dist/admin/components/forms/form-error-summary.svelte.d.ts +27 -0
- package/dist/admin/components/layout/app-sidebar.svelte +7 -2
- package/dist/admin/components/layout/detail-page-shell.svelte +71 -0
- package/dist/admin/components/layout/detail-page-shell.svelte.d.ts +24 -0
- package/dist/admin/components/layout/lang.d.ts +5 -0
- package/dist/admin/components/layout/lang.js +10 -0
- package/dist/admin/components/layout/layout-renderer.svelte +71 -2
- package/dist/admin/components/layout/layout-renderer.svelte.d.ts +1 -0
- package/dist/admin/components/layout/layout-tabs.svelte +173 -0
- package/dist/admin/components/layout/layout-tabs.svelte.d.ts +24 -0
- package/dist/admin/components/layout/nav-breadcrumbs.svelte +25 -7
- package/dist/admin/components/layout/nav-collections.svelte +23 -36
- package/dist/admin/components/layout/nav-forms.svelte +19 -35
- package/dist/admin/components/layout/nav-main.svelte +3 -28
- package/dist/admin/components/layout/nav-search.svelte +70 -2
- package/dist/admin/components/layout/nav-section.svelte +77 -0
- package/dist/admin/components/layout/nav-section.svelte.d.ts +22 -0
- package/dist/admin/components/layout/nav-shop.svelte +3 -27
- package/dist/admin/components/layout/nav-singletons.svelte +16 -28
- package/dist/admin/components/layout/page-header.stories.svelte +93 -0
- package/dist/admin/components/layout/page-header.stories.svelte.d.ts +27 -0
- package/dist/admin/components/layout/page-header.svelte +68 -0
- package/dist/admin/components/layout/page-header.svelte.d.ts +17 -0
- package/dist/admin/components/layout/site-header.svelte +9 -0
- package/dist/admin/components/layout/site-header.svelte.d.ts +2 -17
- package/dist/admin/components/media/file/file-name-input.svelte +6 -2
- package/dist/admin/components/media/file/file-preview.svelte +130 -17
- package/dist/admin/components/media/file-upload.svelte +16 -7
- package/dist/admin/components/media/file-upload.svelte.d.ts +1 -0
- package/dist/admin/components/media/files-list.svelte +153 -53
- package/dist/admin/components/media/files-list.svelte.d.ts +1 -0
- package/dist/admin/components/media/media-library.svelte +577 -198
- package/dist/admin/components/media/media-library.svelte.d.ts +4 -0
- package/dist/admin/components/media/media-selector.svelte +4 -2
- package/dist/admin/components/media/media-selector.svelte.d.ts +1 -0
- package/dist/admin/components/media/tag-sidebar.svelte +4 -4
- package/dist/admin/components/tiptap/FigureNodeView.svelte +10 -0
- package/dist/admin/components/tiptap/bubble-menu.svelte +104 -0
- package/dist/admin/components/tiptap/bubble-menu.svelte.d.ts +19 -0
- package/dist/admin/components/tiptap/content-editor.svelte +28 -24
- package/dist/admin/components/tiptap/editor-toolbar.svelte +7 -7
- package/dist/admin/components/tiptap/extensions.js +5 -1
- package/dist/admin/components/tiptap/image-dialog.svelte +5 -1
- package/dist/admin/components/tiptap/link-dialog.svelte +2 -0
- package/dist/admin/components/tiptap/tiptap-editor.svelte +18 -20
- package/dist/admin/components/tiptap/video-dialog.svelte +1 -1
- package/dist/admin/components/variant-form/VariantAttributeRenderer.svelte +109 -0
- package/dist/admin/components/variant-form/VariantAttributeRenderer.svelte.d.ts +9 -0
- package/dist/admin/helpers/build-icon-set-map.d.ts +8 -0
- package/dist/admin/helpers/build-icon-set-map.js +16 -0
- package/dist/admin/helpers/index.d.ts +2 -0
- package/dist/admin/helpers/index.js +2 -0
- package/dist/admin/i18n/errors.d.ts +140 -0
- package/dist/admin/i18n/errors.js +151 -0
- package/dist/admin/remote/entry.remote.d.ts +59 -4
- package/dist/admin/remote/entry.remote.js +239 -62
- package/dist/admin/remote/shop.remote.d.ts +87 -48
- package/dist/admin/remote/shop.remote.js +70 -8
- package/dist/admin/shared/password-generate.d.ts +6 -0
- package/dist/admin/shared/password-generate.js +40 -0
- package/dist/admin/shared/password-schema.d.ts +6 -0
- package/dist/admin/shared/password-schema.js +10 -3
- package/dist/admin/state/icon-sets.svelte.d.ts +9 -0
- package/dist/admin/state/icon-sets.svelte.js +20 -0
- package/dist/admin/styles/admin.css +23 -6
- package/dist/admin/styles/tokens.md +244 -0
- package/dist/admin/utils/accordionActivation.d.ts +13 -0
- package/dist/admin/utils/accordionActivation.js +35 -0
- package/dist/admin/utils/entryLabel.d.ts +23 -0
- package/dist/admin/utils/entryLabel.js +51 -12
- package/dist/admin/utils/field-a11y.d.ts +29 -0
- package/dist/admin/utils/field-a11y.js +23 -0
- package/dist/admin/utils/fieldPathElement.d.ts +9 -0
- package/dist/admin/utils/fieldPathElement.js +18 -0
- package/dist/admin/utils/fileDisplay.d.ts +10 -0
- package/dist/admin/utils/fileDisplay.js +26 -0
- package/dist/admin/utils/flattenFormErrors.d.ts +19 -0
- package/dist/admin/utils/flattenFormErrors.js +102 -0
- package/dist/admin/utils/formatters.d.ts +12 -0
- package/dist/admin/utils/{formatDate.js → formatters.js} +23 -2
- package/dist/admin/utils/scrollWithin.d.ts +9 -0
- package/dist/admin/utils/scrollWithin.js +32 -0
- package/dist/admin/utils/tabActivation.d.ts +12 -0
- package/dist/admin/utils/tabActivation.js +24 -0
- package/dist/cli/scaffold/admin.js +2 -2
- package/dist/cms/runtime/schema.d.ts +1 -0
- package/dist/cms/runtime/schema.js +1 -0
- package/dist/cms/runtime/types.d.ts +80 -7
- package/dist/components/ui/accordion/accordion-content.svelte +17 -3
- package/dist/components/ui/accordion/accordion.stories.svelte +21 -1
- package/dist/components/ui/alert/alert.stories.svelte +14 -0
- package/dist/components/ui/alert-dialog/alert-dialog.stories.svelte +45 -0
- package/dist/components/ui/alert-dialog/alert-dialog.stories.svelte.d.ts +27 -0
- package/dist/components/ui/avatar/avatar.stories.svelte +27 -0
- package/dist/components/ui/badge/badge.stories.svelte +15 -0
- package/dist/components/ui/breadcrumb/breadcrumb.stories.svelte +47 -0
- package/dist/components/ui/breadcrumb/breadcrumb.svelte +1 -1
- package/dist/components/ui/button/button.stories.svelte +53 -6
- package/dist/components/ui/button/button.svelte +39 -5
- package/dist/components/ui/button/button.svelte.d.ts +4 -0
- package/dist/components/ui/button-group/button-group.stories.svelte +44 -0
- package/dist/components/ui/button-group/button-group.stories.svelte.d.ts +27 -0
- package/dist/components/ui/calendar/calendar.stories.svelte +36 -0
- package/dist/components/ui/calendar/calendar.stories.svelte.d.ts +27 -0
- package/dist/components/ui/card/card.stories.svelte +7 -0
- package/dist/components/ui/carousel/carousel.stories.svelte +43 -0
- package/dist/components/ui/carousel/carousel.stories.svelte.d.ts +27 -0
- package/dist/components/ui/checkbox/checkbox.stories.svelte +67 -0
- package/dist/components/ui/checkbox/checkbox.stories.svelte.d.ts +27 -0
- package/dist/components/ui/checkbox/checkbox.svelte +1 -1
- package/dist/components/ui/command/command.stories.svelte +18 -0
- package/dist/components/ui/data-table/data-table.stories.svelte +61 -0
- package/dist/components/ui/data-table/data-table.stories.svelte.d.ts +18 -0
- package/dist/components/ui/dialog/dialog-content.svelte +5 -0
- package/dist/components/ui/dialog/dialog-content.svelte.d.ts +2 -0
- package/dist/components/ui/dialog/dialog.stories.svelte +35 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu.stories.svelte +74 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu.stories.svelte.d.ts +27 -0
- package/dist/components/ui/field/field-context.svelte.d.ts +22 -0
- package/dist/components/ui/field/field-context.svelte.js +9 -0
- package/dist/components/ui/field/field-control.svelte +18 -0
- package/dist/components/ui/field/field-control.svelte.d.ts +8 -0
- package/dist/components/ui/field/field-description.svelte +12 -0
- package/dist/components/ui/field/field-error.svelte +14 -6
- package/dist/components/ui/field/field-label.svelte +10 -0
- package/dist/components/ui/field/field.stories.svelte +95 -9
- package/dist/components/ui/field/field.svelte +57 -0
- package/dist/components/ui/field/field.svelte.d.ts +2 -0
- package/dist/components/ui/field/index.d.ts +3 -1
- package/dist/components/ui/field/index.js +4 -2
- package/dist/components/ui/form/form-field-errors.svelte +1 -1
- package/dist/components/ui/form/form.stories.svelte +25 -0
- package/dist/components/ui/form/form.stories.svelte.d.ts +26 -0
- package/dist/components/ui/input/input.stories.svelte +26 -0
- package/dist/components/ui/input-group/input-group-input.svelte.d.ts +1 -1
- package/dist/components/ui/input-group/input-group.stories.svelte +43 -0
- package/dist/components/ui/input-group/input-group.stories.svelte.d.ts +27 -0
- package/dist/components/ui/item/item.stories.svelte +61 -0
- package/dist/components/ui/item/item.stories.svelte.d.ts +27 -0
- package/dist/components/ui/label/label.stories.svelte +7 -0
- package/dist/components/ui/live-region/index.d.ts +1 -0
- package/dist/components/ui/live-region/index.js +1 -0
- package/dist/components/ui/live-region/live-region-demo.svelte +32 -0
- package/dist/components/ui/live-region/live-region-demo.svelte.d.ts +7 -0
- package/dist/components/ui/live-region/live-region.stories.svelte +23 -0
- package/dist/components/ui/live-region/live-region.stories.svelte.d.ts +26 -0
- package/dist/components/ui/live-region/live-region.svelte +12 -0
- package/dist/components/ui/live-region/live-region.svelte.d.ts +8 -0
- package/dist/components/ui/popover/popover.stories.svelte +34 -0
- package/dist/components/ui/radio-group/radio-group.stories.svelte +58 -0
- package/dist/components/ui/radio-group/radio-group.stories.svelte.d.ts +27 -0
- package/dist/components/ui/resizable/resizable.stories.svelte +56 -0
- package/dist/components/ui/resizable/resizable.stories.svelte.d.ts +27 -0
- package/dist/components/ui/select/select.stories.svelte +49 -0
- package/dist/components/ui/separator/separator.stories.svelte +18 -0
- package/dist/components/ui/sheet/sheet.stories.svelte +34 -0
- package/dist/components/ui/sidebar/sidebar-input.svelte.d.ts +1 -1
- package/dist/components/ui/sidebar/sidebar-menu-button.svelte +1 -0
- package/dist/components/ui/sidebar/sidebar-trigger.svelte +1 -1
- package/dist/components/ui/sidebar/sidebar.stories.svelte +72 -0
- package/dist/components/ui/sidebar/sidebar.stories.svelte.d.ts +27 -0
- package/dist/components/ui/skeleton/skeleton.stories.svelte +39 -0
- package/dist/components/ui/skeleton/skeleton.stories.svelte.d.ts +27 -0
- package/dist/components/ui/skeleton/skeleton.svelte +6 -0
- package/dist/components/ui/sonner/index.d.ts +1 -1
- package/dist/components/ui/sonner/index.js +1 -1
- package/dist/components/ui/sonner/sonner.stories.svelte +7 -0
- package/dist/components/ui/sonner/sonner.svelte +17 -1
- package/dist/components/ui/sonner/sonner.svelte.d.ts +6 -0
- package/dist/components/ui/spinner/spinner.stories.svelte +30 -0
- package/dist/components/ui/spinner/spinner.stories.svelte.d.ts +27 -0
- package/dist/components/ui/switch/switch.stories.svelte +56 -0
- package/dist/components/ui/switch/switch.stories.svelte.d.ts +27 -0
- package/dist/components/ui/table/table-cell.svelte +1 -1
- package/dist/components/ui/table/table-head.svelte +1 -1
- package/dist/components/ui/table/table.stories.svelte +68 -0
- package/dist/components/ui/table/table.stories.svelte.d.ts +27 -0
- package/dist/components/ui/table/table.svelte +1 -1
- package/dist/components/ui/tabs/tabs.stories.svelte +48 -0
- package/dist/components/ui/tabs/tabs.stories.svelte.d.ts +27 -0
- package/dist/components/ui/textarea/textarea.stories.svelte +21 -0
- package/dist/components/ui/toggle/toggle.stories.svelte +23 -0
- package/dist/components/ui/toggle-group/toggle-group.stories.svelte +43 -0
- package/dist/components/ui/tooltip/tooltip.stories.svelte +46 -6
- package/dist/core/cms.d.ts +11 -2
- package/dist/core/cms.js +29 -0
- package/dist/core/fields/fieldSchemaToTs.d.ts +7 -0
- package/dist/core/fields/fieldSchemaToTs.js +241 -90
- package/dist/core/fields/layoutUtils.d.ts +4 -1
- package/dist/core/fields/layoutUtils.js +41 -4
- package/dist/core/fields/resolveSeo.d.ts +70 -0
- package/dist/core/fields/resolveSeo.js +88 -0
- package/dist/core/fields/seoFieldDescriptor.d.ts +43 -0
- package/dist/core/fields/seoFieldDescriptor.js +74 -0
- package/dist/core/fields/slugPath.d.ts +13 -0
- package/dist/core/fields/slugPath.js +32 -0
- package/dist/core/fields/urlUtils.d.ts +8 -0
- package/dist/core/fields/urlUtils.js +27 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.js +1 -0
- package/dist/core/server/entries/operations/create.js +13 -0
- package/dist/core/server/entries/operations/get.d.ts +7 -0
- package/dist/core/server/entries/operations/get.js +10 -6
- package/dist/core/server/entries/operations/slugUniqueness.d.ts +37 -0
- package/dist/core/server/entries/operations/slugUniqueness.js +116 -0
- package/dist/core/server/entries/operations/update.d.ts +6 -1
- package/dist/core/server/entries/operations/update.js +24 -1
- package/dist/core/server/fields/slugResolver.d.ts +3 -13
- package/dist/core/server/fields/slugResolver.js +8 -37
- package/dist/core/server/generator/fields.d.ts +2 -0
- package/dist/core/server/generator/fields.js +44 -18
- package/dist/core/server/generator/formFields.js +2 -1
- package/dist/core/server/generator/generator.js +6 -5
- package/dist/core/server/generator/utils.d.ts +1 -0
- package/dist/core/server/generator/utils.js +4 -0
- package/dist/db-postgres/schema/shop/order.d.ts +37 -1
- package/dist/db-postgres/schema/shop/order.js +3 -1
- package/dist/db-postgres/schema/shop/payment.d.ts +20 -0
- package/dist/db-postgres/schema/shop/payment.js +4 -1
- package/dist/db-postgres/schema/shop/product.d.ts +20 -0
- package/dist/db-postgres/schema/shop/product.js +3 -1
- package/dist/db-postgres/schema/shop/productVariant.d.ts +12 -2
- package/dist/db-postgres/schema/shop/productVariant.js +22 -0
- package/dist/shop/cart/types.d.ts +1 -0
- package/dist/shop/client/index.d.ts +54 -0
- package/dist/shop/client/index.js +5 -1
- package/dist/shop/expiry.d.ts +35 -0
- package/dist/shop/expiry.js +68 -0
- package/dist/shop/http/balance-handler.d.ts +20 -0
- package/dist/shop/http/balance-handler.js +91 -0
- package/dist/shop/http/cart-handler.js +19 -0
- package/dist/shop/http/checkout-handler.js +19 -1
- package/dist/shop/http/index.d.ts +2 -0
- package/dist/shop/http/index.js +2 -0
- package/dist/shop/http/upcoming-handler.d.ts +16 -0
- package/dist/shop/http/upcoming-handler.js +65 -0
- package/dist/shop/http/webhook-handler.js +46 -9
- package/dist/shop/index.d.ts +4 -1
- package/dist/shop/index.js +7 -1
- package/dist/shop/server/balance-payment.d.ts +40 -0
- package/dist/shop/server/balance-payment.js +140 -0
- package/dist/shop/server/cart-hydrate.js +2 -0
- package/dist/shop/server/init.d.ts +14 -0
- package/dist/shop/server/init.js +35 -0
- package/dist/shop/server/orders.d.ts +35 -0
- package/dist/shop/server/orders.js +155 -2
- package/dist/shop/server/payment-policy.d.ts +35 -0
- package/dist/shop/server/payment-policy.js +55 -0
- package/dist/shop/server/payments.d.ts +29 -0
- package/dist/shop/server/payments.js +64 -0
- package/dist/shop/server/populate.d.ts +1 -1
- package/dist/shop/server/refund.d.ts +17 -12
- package/dist/shop/server/refund.js +96 -13
- package/dist/shop/server/shop-data.d.ts +6 -1
- package/dist/shop/server/shop-data.js +44 -7
- package/dist/shop/template.d.ts +13 -0
- package/dist/shop/template.js +98 -0
- package/dist/shop/types.d.ts +142 -1
- package/dist/shop/variant-attributes.d.ts +28 -0
- package/dist/shop/variant-attributes.js +69 -0
- package/dist/sveltekit/server/handle.js +17 -0
- package/dist/sveltekit/server/index.d.ts +1 -0
- package/dist/sveltekit/server/index.js +2 -0
- package/dist/types/cms.d.ts +4 -3
- package/dist/types/cms.schema.d.ts +1 -1
- package/dist/types/cms.schema.js +13 -2
- package/dist/types/fields.d.ts +56 -2
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.js +1 -1
- package/dist/types/layout.d.ts +35 -2
- package/dist/types/plugins.d.ts +40 -0
- package/dist/types/plugins.js +4 -1
- package/dist/updates/0.26.0/index.d.ts +2 -0
- package/dist/updates/0.26.0/index.js +51 -0
- package/dist/updates/0.26.1/index.d.ts +2 -0
- package/dist/updates/0.26.1/index.js +19 -0
- package/dist/updates/0.27.0/index.d.ts +2 -0
- package/dist/updates/0.27.0/index.js +50 -0
- package/dist/updates/index.js +7 -1
- package/package.json +29 -7
- package/dist/admin/client/collection/empty-state.svelte +0 -28
- package/dist/admin/client/collection/empty-state.svelte.d.ts +0 -9
- package/dist/admin/client/form/submission-status-badge.svelte +0 -41
- package/dist/admin/client/form/submission-status-badge.svelte.d.ts +0 -7
- package/dist/admin/components/media/file-preview.svelte +0 -51
- package/dist/admin/components/media/file-preview.svelte.d.ts +0 -6
- package/dist/admin/utils/formatDate.d.ts +0 -5
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import RecentActivity from '../../components/dashboard/recent-activity.svelte';
|
|
7
7
|
import A11yGauge from '../../components/dashboard/a11y-gauge.svelte';
|
|
8
8
|
import TipOfTheDay from '../../components/dashboard/tip-of-the-day.svelte';
|
|
9
|
+
import ConfirmationDialog from '../../components/dialogs/confirmation-dialog.svelte';
|
|
9
10
|
import { sidebarLang } from '../../components/layout/lang.js';
|
|
10
11
|
import { getBreadcrumbs } from '../../state/breadcrumbs.svelte.js';
|
|
11
12
|
import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
|
|
@@ -20,6 +21,23 @@
|
|
|
20
21
|
let orphanedEntries = $state<OrphanedEntry[]>([]);
|
|
21
22
|
let loadingOrphaned = $state(true);
|
|
22
23
|
let deletingOrphaned = $state(false);
|
|
24
|
+
let confirmDeleteOpen = $state(false);
|
|
25
|
+
|
|
26
|
+
const confirmText: Record<
|
|
27
|
+
InterfaceLanguage,
|
|
28
|
+
{ title: string; description: (n: number) => string }
|
|
29
|
+
> = {
|
|
30
|
+
pl: {
|
|
31
|
+
title: 'Usunąć osierocone wpisy?',
|
|
32
|
+
description: (n) =>
|
|
33
|
+
`${n} ${n === 1 ? 'wpis zostanie' : 'wpisy zostaną'} trwale usunięty z bazy. Tej akcji nie cofniesz.`
|
|
34
|
+
},
|
|
35
|
+
en: {
|
|
36
|
+
title: 'Delete orphaned entries?',
|
|
37
|
+
description: (n) =>
|
|
38
|
+
`${n} ${n === 1 ? 'entry' : 'entries'} will be permanently removed. This cannot be undone.`
|
|
39
|
+
}
|
|
40
|
+
};
|
|
23
41
|
|
|
24
42
|
async function fetchOrphanedEntries() {
|
|
25
43
|
try {
|
|
@@ -34,13 +52,11 @@
|
|
|
34
52
|
}
|
|
35
53
|
}
|
|
36
54
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
en: 'Are you sure you want to delete these entries? This cannot be undone.'
|
|
41
|
-
};
|
|
42
|
-
if (!confirm(msg[interfaceLanguage.current])) return;
|
|
55
|
+
function deleteOrphaned() {
|
|
56
|
+
confirmDeleteOpen = true;
|
|
57
|
+
}
|
|
43
58
|
|
|
59
|
+
async function performDeleteOrphaned() {
|
|
44
60
|
deletingOrphaned = true;
|
|
45
61
|
try {
|
|
46
62
|
const res = await fetch('/admin/api/orphaned', { method: 'DELETE' });
|
|
@@ -67,6 +83,14 @@
|
|
|
67
83
|
});
|
|
68
84
|
</script>
|
|
69
85
|
|
|
86
|
+
<ConfirmationDialog
|
|
87
|
+
bind:open={confirmDeleteOpen}
|
|
88
|
+
title={confirmText[interfaceLanguage.current].title}
|
|
89
|
+
description={confirmText[interfaceLanguage.current].description(orphanedEntries.length)}
|
|
90
|
+
loading={deletingOrphaned}
|
|
91
|
+
onConfirm={performDeleteOrphaned}
|
|
92
|
+
/>
|
|
93
|
+
|
|
70
94
|
<main class="dash-main">
|
|
71
95
|
{#if !loadingOrphaned}
|
|
72
96
|
<OrphanedEntriesNotice
|
|
@@ -78,9 +102,9 @@
|
|
|
78
102
|
|
|
79
103
|
<WelcomeHeader />
|
|
80
104
|
|
|
81
|
-
<div class="flex gap-5">
|
|
82
|
-
<div class="flex-1">
|
|
83
|
-
<div class="grid grid-cols-
|
|
105
|
+
<div class="flex flex-col gap-5 lg:flex-row">
|
|
106
|
+
<div class="min-w-0 flex-1">
|
|
107
|
+
<div class="grid grid-cols-1 gap-5 sm:grid-cols-2">
|
|
84
108
|
<RecentEntries />
|
|
85
109
|
<FormSubmissionsWidget />
|
|
86
110
|
</div>
|
|
@@ -88,7 +112,7 @@
|
|
|
88
112
|
<RecentActivity />
|
|
89
113
|
</div>
|
|
90
114
|
</div>
|
|
91
|
-
<div class="max-w-80 flex-1
|
|
115
|
+
<div class="w-full shrink-0 lg:max-w-80 lg:flex-1">
|
|
92
116
|
<A11yGauge />
|
|
93
117
|
<div class="mt-5">
|
|
94
118
|
<TipOfTheDay />
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import { tick, type Snippet } from 'svelte';
|
|
2
3
|
import Archive from '@tabler/icons-svelte/icons/archive';
|
|
3
4
|
import ArchiveOff from '@tabler/icons-svelte/icons/archive-off';
|
|
4
5
|
import Trash from '@tabler/icons-svelte/icons/trash';
|
|
@@ -10,93 +11,134 @@
|
|
|
10
11
|
|
|
11
12
|
type Props = {
|
|
12
13
|
selectedCount: number;
|
|
13
|
-
onArchive
|
|
14
|
+
onArchive?: () => void;
|
|
14
15
|
onDelete?: () => void;
|
|
15
16
|
onClear: () => void;
|
|
16
17
|
onRestore?: () => void;
|
|
18
|
+
actions?: Snippet;
|
|
17
19
|
};
|
|
18
20
|
|
|
19
|
-
let { selectedCount, onArchive, onDelete, onClear, onRestore }: Props = $props();
|
|
21
|
+
let { selectedCount, onArchive, onDelete, onClear, onRestore, actions }: Props = $props();
|
|
20
22
|
|
|
21
23
|
const interfaceLanguage = useInterfaceLanguage();
|
|
22
24
|
|
|
23
|
-
const lang: Record<
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
const lang: Record<
|
|
26
|
+
InterfaceLanguage,
|
|
27
|
+
{
|
|
28
|
+
selected: (n: number) => string;
|
|
29
|
+
archive: string;
|
|
30
|
+
restore: string;
|
|
31
|
+
delete: string;
|
|
32
|
+
bulkActions: string;
|
|
33
|
+
clearSelection: string;
|
|
34
|
+
}
|
|
35
|
+
> = {
|
|
29
36
|
en: {
|
|
30
37
|
selected: (n) => `${n} selected`,
|
|
31
38
|
archive: 'Archive',
|
|
32
39
|
restore: 'Restore',
|
|
33
|
-
delete: 'Delete'
|
|
40
|
+
delete: 'Delete',
|
|
41
|
+
bulkActions: 'Bulk actions',
|
|
42
|
+
clearSelection: 'Clear selection'
|
|
34
43
|
},
|
|
35
44
|
pl: {
|
|
36
45
|
selected: (n) => `Zaznaczono: ${n}`,
|
|
37
46
|
archive: 'Archiwizuj',
|
|
38
47
|
restore: 'Przywróć',
|
|
39
|
-
delete: 'Usuń'
|
|
48
|
+
delete: 'Usuń',
|
|
49
|
+
bulkActions: 'Akcje masowe',
|
|
50
|
+
clearSelection: 'Wyczyść zaznaczenie'
|
|
40
51
|
}
|
|
41
52
|
};
|
|
42
53
|
|
|
43
54
|
const t = $derived(lang[interfaceLanguage.current]);
|
|
55
|
+
|
|
56
|
+
let toolbarRef = $state<HTMLElement | null>(null);
|
|
57
|
+
let prevCount = 0;
|
|
58
|
+
|
|
59
|
+
$effect(() => {
|
|
60
|
+
const count = selectedCount;
|
|
61
|
+
if (prevCount === 0 && count > 0) {
|
|
62
|
+
tick().then(() => {
|
|
63
|
+
const first = toolbarRef?.querySelector<HTMLElement>('button:not([aria-label])');
|
|
64
|
+
first?.focus();
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
prevCount = count;
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
function handleKeydown(e: KeyboardEvent) {
|
|
71
|
+
if (e.key === 'Escape') {
|
|
72
|
+
e.stopPropagation();
|
|
73
|
+
onClear();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
44
76
|
</script>
|
|
45
77
|
|
|
46
78
|
{#if selectedCount > 0}
|
|
47
79
|
<div
|
|
80
|
+
bind:this={toolbarRef}
|
|
48
81
|
class="fixed bottom-6 left-1/2 z-50 -translate-x-1/2"
|
|
49
82
|
transition:fly={{ y: 40, duration: 200 }}
|
|
50
|
-
role="
|
|
51
|
-
aria-
|
|
83
|
+
role="toolbar"
|
|
84
|
+
aria-label={t.bulkActions}
|
|
85
|
+
tabindex="-1"
|
|
86
|
+
onkeydown={handleKeydown}
|
|
52
87
|
>
|
|
53
88
|
<div
|
|
54
|
-
class="flex items-center gap-3 rounded-xl bg-plum-darker px-5 py-3 text-white shadow-xl"
|
|
89
|
+
class="flex max-w-[calc(100vw-2rem)] flex-wrap items-center justify-center gap-3 rounded-xl bg-plum-darker px-5 py-3 text-white shadow-xl"
|
|
55
90
|
>
|
|
56
|
-
<span class="text-sm font-medium">{t.selected(selectedCount)}</span>
|
|
91
|
+
<span class="text-sm font-medium" aria-hidden="true">{t.selected(selectedCount)}</span>
|
|
57
92
|
|
|
58
|
-
<div class="h-5 w-px bg-white/20"></div>
|
|
93
|
+
<div class="h-5 w-px bg-white/20" aria-hidden="true"></div>
|
|
59
94
|
|
|
60
95
|
{#if onRestore}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
{:else}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
96
|
+
<Button
|
|
97
|
+
variant="ghost"
|
|
98
|
+
size="sm"
|
|
99
|
+
class="text-white hover:bg-white/10 hover:text-white"
|
|
100
|
+
onclick={onRestore}
|
|
101
|
+
>
|
|
102
|
+
<ArchiveOff class="mr-1.5 size-3.5" />
|
|
103
|
+
{t.restore}
|
|
104
|
+
</Button>
|
|
105
|
+
{:else if onArchive}
|
|
106
|
+
<Button
|
|
107
|
+
variant="ghost"
|
|
108
|
+
size="sm"
|
|
109
|
+
class="text-white hover:bg-white/10 hover:text-white"
|
|
110
|
+
onclick={onArchive}
|
|
111
|
+
>
|
|
112
|
+
<Archive class="mr-1.5 size-3.5" />
|
|
113
|
+
{t.archive}
|
|
114
|
+
</Button>
|
|
80
115
|
{/if}
|
|
81
116
|
{#if onDelete}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
117
|
+
<Button
|
|
118
|
+
variant="ghost"
|
|
119
|
+
size="sm"
|
|
120
|
+
class="text-white border border-white/20 hover:bg-white/10 hover:text-white"
|
|
121
|
+
onclick={onDelete}
|
|
122
|
+
>
|
|
123
|
+
<Trash class="mr-1.5 size-3.5" />
|
|
124
|
+
{t.delete}
|
|
125
|
+
</Button>
|
|
126
|
+
{/if}
|
|
127
|
+
{#if actions}
|
|
128
|
+
{@render actions()}
|
|
91
129
|
{/if}
|
|
92
130
|
|
|
93
131
|
<button
|
|
132
|
+
type="button"
|
|
94
133
|
class="ml-1 rounded-md p-1 text-white/60 hover:bg-white/10 hover:text-white"
|
|
95
134
|
onclick={onClear}
|
|
96
|
-
aria-label=
|
|
135
|
+
aria-label={t.clearSelection}
|
|
97
136
|
>
|
|
98
137
|
<X class="size-4" />
|
|
99
138
|
</button>
|
|
100
139
|
</div>
|
|
101
140
|
</div>
|
|
141
|
+
<div aria-live="polite" aria-atomic="true" class="sr-only">
|
|
142
|
+
{t.selected(selectedCount)}
|
|
143
|
+
</div>
|
|
102
144
|
{/if}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { type Snippet } from 'svelte';
|
|
1
2
|
type Props = {
|
|
2
3
|
selectedCount: number;
|
|
3
|
-
onArchive
|
|
4
|
+
onArchive?: () => void;
|
|
4
5
|
onDelete?: () => void;
|
|
5
6
|
onClear: () => void;
|
|
6
7
|
onRestore?: () => void;
|
|
8
|
+
actions?: Snippet;
|
|
7
9
|
};
|
|
8
10
|
declare const BulkActionsBar: import("svelte").Component<Props, {}, "">;
|
|
9
11
|
type BulkActionsBar = ReturnType<typeof BulkActionsBar>;
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import {
|
|
2
|
+
import { getCollectionEntryDisplayLabel } from '../../utils/entryLabel.js';
|
|
3
3
|
import { getEntryThumbnail, type MediaThumbnailLookup } from '../../utils/entryThumbnail.js';
|
|
4
4
|
import { arrayMove } from '../../utils/arrayMove.js';
|
|
5
5
|
import { getRemotes } from '../../../sveltekit/index.js';
|
|
6
6
|
import type { CollectionConfigWithType } from '../../../types/collections.js';
|
|
7
7
|
import DataTable from './data-table.svelte';
|
|
8
|
-
import { getContentLanguage } from '../../state/content-language.svelte.js';
|
|
9
8
|
import type { ColumnDef, RowSelectionState, Table } from '@tanstack/table-core';
|
|
10
9
|
import { renderComponent } from '../../../components/ui/data-table/render-helpers.js';
|
|
11
10
|
import EntryLink from './entry-link.svelte';
|
|
@@ -25,10 +24,11 @@
|
|
|
25
24
|
import TablePagination from './table-pagination.svelte';
|
|
26
25
|
import GridView from './grid-view.svelte';
|
|
27
26
|
import BulkActionsBar from './bulk-actions-bar.svelte';
|
|
28
|
-
import
|
|
27
|
+
import StateDisplay from './state-display.svelte';
|
|
29
28
|
import { createCollectionViewState } from './collection-view.svelte.js';
|
|
30
29
|
import type { EntryStatus as EntryStatusType, RawEntry } from '../../../types/entries.js';
|
|
31
30
|
import type { RelationField, SelectField, RadioField } from '../../../types/fields.js';
|
|
31
|
+
import { resolveEntryUrl } from '../../../core/fields/slugPath.js';
|
|
32
32
|
import {
|
|
33
33
|
validateA11y,
|
|
34
34
|
a11yLangPl,
|
|
@@ -37,7 +37,6 @@
|
|
|
37
37
|
import Skeleton from '../../../components/ui/skeleton/skeleton.svelte';
|
|
38
38
|
|
|
39
39
|
const remotes = getRemotes();
|
|
40
|
-
const contentLanguage = getContentLanguage();
|
|
41
40
|
const interfaceLanguage = useInterfaceLanguage();
|
|
42
41
|
|
|
43
42
|
const lang: Record<
|
|
@@ -121,9 +120,13 @@
|
|
|
121
120
|
collection: CollectionConfigWithType;
|
|
122
121
|
onCreateEntry: () => void;
|
|
123
122
|
addLabel: string;
|
|
123
|
+
data?: RawEntry[];
|
|
124
|
+
state?: 'loading' | 'error' | 'ok';
|
|
124
125
|
};
|
|
125
126
|
|
|
126
|
-
let { collection, onCreateEntry, addLabel }: Props = $props();
|
|
127
|
+
let { collection, onCreateEntry, addLabel, data: injectedData, state: injectedState }: Props = $props();
|
|
128
|
+
|
|
129
|
+
const useInjectedData = $derived(injectedData !== undefined);
|
|
127
130
|
|
|
128
131
|
const viewState = createCollectionViewState(collection.slug);
|
|
129
132
|
|
|
@@ -193,14 +196,16 @@
|
|
|
193
196
|
|
|
194
197
|
const hasActiveDataFilter = $derived(Object.values(activeDataFilters).some((v) => v !== null));
|
|
195
198
|
|
|
196
|
-
//
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
//
|
|
199
|
+
// Determine if we need the fetch-all fallback. Server pagination can't honour
|
|
200
|
+
// a client-side status filter (it would only see the current page) or
|
|
201
|
+
// search / sort-by-name, so in those cases we fetch the whole collection and
|
|
202
|
+
// filter / sort / paginate on the client.
|
|
200
203
|
const isSortingByName = $derived(
|
|
201
204
|
viewState.sorting.length > 0 && viewState.sorting[0].id === 'name'
|
|
202
205
|
);
|
|
203
|
-
const useServerPagination = $derived(
|
|
206
|
+
const useServerPagination = $derived(
|
|
207
|
+
!searchQuery && !isSortingByName && !viewState.statusFilter
|
|
208
|
+
);
|
|
204
209
|
|
|
205
210
|
// Is the current filter for archived entries?
|
|
206
211
|
const isArchivedFilter = $derived(viewState.statusFilter === 'archived');
|
|
@@ -240,9 +245,21 @@
|
|
|
240
245
|
}
|
|
241
246
|
);
|
|
242
247
|
|
|
243
|
-
// Reactive query
|
|
248
|
+
// Reactive query (skipped when data is injected via prop)
|
|
244
249
|
const entriesQuery = $derived(remotes.getRawEntries(queryParams));
|
|
245
250
|
|
|
251
|
+
const dataResult = $derived(
|
|
252
|
+
useInjectedData
|
|
253
|
+
? { entries: injectedData ?? [], total: (injectedData ?? []).length }
|
|
254
|
+
: entriesQuery.current
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
const isReady = $derived(
|
|
258
|
+
useInjectedData ? injectedState !== 'loading' : entriesQuery.ready
|
|
259
|
+
);
|
|
260
|
+
|
|
261
|
+
const isError = $derived(useInjectedData && injectedState === 'error');
|
|
262
|
+
|
|
246
263
|
// Track relation labels
|
|
247
264
|
let labelLookup = $state<Record<string, string>>({});
|
|
248
265
|
|
|
@@ -409,7 +426,7 @@
|
|
|
409
426
|
}
|
|
410
427
|
|
|
411
428
|
function getVersionData(entry: RawEntry): Record<string, unknown> | undefined {
|
|
412
|
-
const lang =
|
|
429
|
+
const lang = interfaceLanguage.current;
|
|
413
430
|
const draft = entry.draftVersions[lang];
|
|
414
431
|
const published = entry.publishedVersions[lang];
|
|
415
432
|
if (draft?.data) return draft.data as Record<string, unknown>;
|
|
@@ -444,15 +461,14 @@
|
|
|
444
461
|
return values;
|
|
445
462
|
}
|
|
446
463
|
|
|
447
|
-
function
|
|
448
|
-
if (!seoField) return undefined;
|
|
464
|
+
function extractEntryUrl(entry: RawEntry): string | undefined {
|
|
449
465
|
const data = getVersionData(entry);
|
|
450
466
|
if (!data) return undefined;
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
467
|
+
return resolveEntryUrl({
|
|
468
|
+
slugField: collection.slugField,
|
|
469
|
+
pathTemplate: collection.pathTemplate,
|
|
470
|
+
data: data as Record<string, unknown>
|
|
471
|
+
});
|
|
456
472
|
}
|
|
457
473
|
|
|
458
474
|
function countA11yWarnings(entry: RawEntry): number {
|
|
@@ -474,7 +490,7 @@
|
|
|
474
490
|
}
|
|
475
491
|
for (const entry of entries) {
|
|
476
492
|
// Collect UUIDs from all version sources (draft + published) to match mapEntryToRow
|
|
477
|
-
const lang =
|
|
493
|
+
const lang = interfaceLanguage.current;
|
|
478
494
|
const dataSources = [
|
|
479
495
|
entry.publishedVersions[lang]?.data,
|
|
480
496
|
entry.draftVersions[lang]?.data,
|
|
@@ -545,7 +561,7 @@
|
|
|
545
561
|
function mapEntryToRow(entry: RawEntry, lookup: Record<string, string> = {}, mediaThumbs: MediaThumbnailLookup = {}): CollectionDataTableRow {
|
|
546
562
|
const data = getVersionData(entry) || {};
|
|
547
563
|
// For custom columns, prefer published data (complete) over draft (may be partial)
|
|
548
|
-
const lang =
|
|
564
|
+
const lang = interfaceLanguage.current;
|
|
549
565
|
const columnData = entry.publishedVersions[lang]?.data || entry.draftVersions[lang]?.data || data;
|
|
550
566
|
const customData: Record<string, unknown> = {};
|
|
551
567
|
if (collection.listColumns) {
|
|
@@ -567,9 +583,10 @@
|
|
|
567
583
|
customData[fieldSlug] = '';
|
|
568
584
|
}
|
|
569
585
|
} else if (fieldData && typeof fieldData === 'object' && !Array.isArray(fieldData)) {
|
|
570
|
-
//
|
|
586
|
+
// Localized field — show the value in the UI language (fallback to any)
|
|
571
587
|
const localized = fieldData as Record<string, unknown>;
|
|
572
|
-
customData[fieldSlug] =
|
|
588
|
+
customData[fieldSlug] =
|
|
589
|
+
localized[interfaceLanguage.current] ?? Object.values(localized)[0] ?? '';
|
|
573
590
|
} else {
|
|
574
591
|
customData[fieldSlug] = fieldData ?? '';
|
|
575
592
|
}
|
|
@@ -577,12 +594,10 @@
|
|
|
577
594
|
}
|
|
578
595
|
return {
|
|
579
596
|
id: entry.id,
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
return collection.pathTemplate ? collection.pathTemplate.replace('{slug}', s) : s;
|
|
585
|
-
})(),
|
|
597
|
+
// Entry title in the admin list follows the UI language (with cross-language
|
|
598
|
+
// fallback) — the content-language selector only governs the editor.
|
|
599
|
+
name: getCollectionEntryDisplayLabel(entry, collection, interfaceLanguage.current),
|
|
600
|
+
slug: extractEntryUrl(entry),
|
|
586
601
|
url: `/admin/entries/${entry.id}`,
|
|
587
602
|
status: getEntryStatus(entry),
|
|
588
603
|
createdAt: new Date(entry.createdAt),
|
|
@@ -695,13 +710,15 @@
|
|
|
695
710
|
}
|
|
696
711
|
</script>
|
|
697
712
|
|
|
698
|
-
{#if
|
|
713
|
+
{#if isError}
|
|
714
|
+
<StateDisplay kind="error" />
|
|
715
|
+
{:else if !isReady}
|
|
699
716
|
<div class="space-y-4 p-4">
|
|
700
717
|
<Skeleton class="h-10 w-full" />
|
|
701
718
|
<Skeleton class="h-64 w-full" />
|
|
702
719
|
</div>
|
|
703
|
-
{:else if
|
|
704
|
-
{@const result =
|
|
720
|
+
{:else if dataResult}
|
|
721
|
+
{@const result = dataResult}
|
|
705
722
|
{@const allRows = result.entries.map((e) => mapEntryToRow(e, labelLookup, mediaLookup))}
|
|
706
723
|
{@const filteredRows = (() => {
|
|
707
724
|
let rows = allRows;
|
|
@@ -754,7 +771,7 @@
|
|
|
754
771
|
(viewState.pageIndex + 1) * viewState.pageSize
|
|
755
772
|
)}
|
|
756
773
|
|
|
757
|
-
<div class:opacity-60={entriesQuery.loading} class="transition-opacity duration-200">
|
|
774
|
+
<div class:opacity-60={!useInjectedData && entriesQuery.loading} class="transition-opacity duration-200">
|
|
758
775
|
<TableToolbar
|
|
759
776
|
{searchQuery}
|
|
760
777
|
onSearchChange={(q) => {
|
|
@@ -765,8 +782,6 @@
|
|
|
765
782
|
onStatusFilterChange={(f) => (viewState.statusFilter = f)}
|
|
766
783
|
viewMode={viewState.viewMode}
|
|
767
784
|
onViewModeChange={(m) => (viewState.viewMode = m)}
|
|
768
|
-
{onCreateEntry}
|
|
769
|
-
createLabel={addLabel}
|
|
770
785
|
dataFilters={dataFilterConfigs}
|
|
771
786
|
{activeDataFilters}
|
|
772
787
|
onDataFilterChange={(slug, value) => {
|
|
@@ -776,7 +791,8 @@
|
|
|
776
791
|
/>
|
|
777
792
|
|
|
778
793
|
{#if totalItems === 0 && !searchQuery}
|
|
779
|
-
<
|
|
794
|
+
<StateDisplay
|
|
795
|
+
kind="empty"
|
|
780
796
|
title={lang[interfaceLanguage.current].emptyTitle}
|
|
781
797
|
description={lang[interfaceLanguage.current].emptyDescription}
|
|
782
798
|
ctaLabel={addLabel}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import type { CollectionConfigWithType } from '../../../types/collections.js';
|
|
2
|
+
import type { RawEntry } from '../../../types/entries.js';
|
|
2
3
|
type Props = {
|
|
3
4
|
collection: CollectionConfigWithType;
|
|
4
5
|
onCreateEntry: () => void;
|
|
5
6
|
addLabel: string;
|
|
7
|
+
data?: RawEntry[];
|
|
8
|
+
state?: 'loading' | 'error' | 'ok';
|
|
6
9
|
};
|
|
7
10
|
declare const CollectionEntries: import("svelte").Component<Props, {}, "">;
|
|
8
11
|
type CollectionEntries = ReturnType<typeof CollectionEntries>;
|
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
import { getLocalizedLabel } from '../../utils/collectionLabel.js';
|
|
8
8
|
import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
|
|
9
9
|
import type { InterfaceLanguage } from '../../../types/languages.js';
|
|
10
|
+
import type { RawEntry } from '../../../types/entries.js';
|
|
11
|
+
import PageHeader from '../../components/layout/page-header.svelte';
|
|
12
|
+
import Button from '../../../components/ui/button/button.svelte';
|
|
13
|
+
import Plus from '@tabler/icons-svelte/icons/plus';
|
|
10
14
|
|
|
11
15
|
const remotes = getRemotes();
|
|
12
16
|
const interfaceLanguage = useInterfaceLanguage();
|
|
@@ -18,11 +22,15 @@
|
|
|
18
22
|
|
|
19
23
|
type Props = {
|
|
20
24
|
collection: CollectionConfigWithType;
|
|
25
|
+
data?: RawEntry[];
|
|
26
|
+
state?: 'loading' | 'error' | 'ok';
|
|
21
27
|
};
|
|
22
28
|
|
|
23
|
-
let { collection }: Props = $props();
|
|
29
|
+
let { collection, data: injectedData, state: injectedState }: Props = $props();
|
|
24
30
|
let entryCount = $state<number | null>(null);
|
|
25
31
|
|
|
32
|
+
const useInjectedData = $derived(injectedData !== undefined);
|
|
33
|
+
|
|
26
34
|
async function onCreateEntry() {
|
|
27
35
|
const newEntry = await remotes.createEntry({ type: 'collection', slug: collection.slug });
|
|
28
36
|
goto(`/admin/entries/${newEntry.id}`);
|
|
@@ -46,6 +54,10 @@
|
|
|
46
54
|
});
|
|
47
55
|
|
|
48
56
|
$effect(() => {
|
|
57
|
+
if (useInjectedData) {
|
|
58
|
+
entryCount = injectedData?.length ?? 0;
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
49
61
|
remotes.getRawEntries({ slug: collection.slug }).then(({ total }) => {
|
|
50
62
|
entryCount = total;
|
|
51
63
|
});
|
|
@@ -53,18 +65,20 @@
|
|
|
53
65
|
</script>
|
|
54
66
|
|
|
55
67
|
<div class="p-5 pb-24 md:p-7">
|
|
56
|
-
<
|
|
57
|
-
|
|
58
|
-
<
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
</span>
|
|
65
|
-
{/if}
|
|
66
|
-
</div>
|
|
67
|
-
</header>
|
|
68
|
+
<PageHeader title={collectionLabel} count={entryCount ?? undefined}>
|
|
69
|
+
{#snippet primaryActions()}
|
|
70
|
+
<Button onclick={onCreateEntry} data-testid="create-entry-button">
|
|
71
|
+
<Plus class="mr-1 size-4" />
|
|
72
|
+
{lang[interfaceLanguage.current].add}
|
|
73
|
+
</Button>
|
|
74
|
+
{/snippet}
|
|
75
|
+
</PageHeader>
|
|
68
76
|
|
|
69
|
-
<CollectionEntries
|
|
77
|
+
<CollectionEntries
|
|
78
|
+
{collection}
|
|
79
|
+
{onCreateEntry}
|
|
80
|
+
addLabel={lang[interfaceLanguage.current].add}
|
|
81
|
+
data={injectedData}
|
|
82
|
+
state={injectedState}
|
|
83
|
+
/>
|
|
70
84
|
</div>
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { CollectionConfigWithType } from '../../../types/collections.js';
|
|
2
|
+
import type { RawEntry } from '../../../types/entries.js';
|
|
2
3
|
type Props = {
|
|
3
4
|
collection: CollectionConfigWithType;
|
|
5
|
+
data?: RawEntry[];
|
|
6
|
+
state?: 'loading' | 'error' | 'ok';
|
|
4
7
|
};
|
|
5
8
|
declare const Collection: import("svelte").Component<Props, {}, "">;
|
|
6
9
|
type Collection = ReturnType<typeof Collection>;
|