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
|
@@ -5,35 +5,108 @@
|
|
|
5
5
|
import { Button } from '../../../components/ui/button/index.js';
|
|
6
6
|
import TrashIcon from '@tabler/icons-svelte/icons/trash';
|
|
7
7
|
import ShippingMethodForm, { type ShippingFormPayload } from './shipping-method-form.svelte';
|
|
8
|
+
import DetailPageShell from '../../components/layout/detail-page-shell.svelte';
|
|
9
|
+
import StateDisplay from '../collection/state-display.svelte';
|
|
10
|
+
import ConfirmationDialog from '../../components/dialogs/confirmation-dialog.svelte';
|
|
11
|
+
import SaveIndicator from '../entry/header/save-indicator.svelte';
|
|
12
|
+
import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
|
|
13
|
+
import { getBreadcrumbs } from '../../state/breadcrumbs.svelte.js';
|
|
14
|
+
import { sidebarLang } from '../../components/layout/lang.js';
|
|
15
|
+
import { resolveI18n } from '../../../shop/pricing.js';
|
|
16
|
+
import type { InterfaceLanguage } from '../../../types/languages.js';
|
|
8
17
|
|
|
9
18
|
const remotes = getRemotes();
|
|
19
|
+
const interfaceLanguage = useInterfaceLanguage();
|
|
20
|
+
const breadcrumbs = getBreadcrumbs();
|
|
10
21
|
|
|
11
22
|
const methodId = $derived(page.params.id ?? '');
|
|
12
23
|
const methodQuery = $derived(remotes.getShippingMethodForAdmin(methodId));
|
|
13
24
|
const configQuery = $derived(remotes.getShopConfig());
|
|
14
25
|
|
|
26
|
+
$effect(() => {
|
|
27
|
+
const s = sidebarLang[interfaceLanguage.current].shop;
|
|
28
|
+
const name = methodQuery.current?.name as Record<string, string> | undefined;
|
|
29
|
+
const label = name ? resolveI18n(name, interfaceLanguage.current, '') : '…';
|
|
30
|
+
breadcrumbs.state = [
|
|
31
|
+
{ label: s.title },
|
|
32
|
+
{ label: s.shipping, href: '/admin/shop/shipping-methods' },
|
|
33
|
+
{ label: label || '…' }
|
|
34
|
+
];
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
type SaveStatus = 'idle' | 'saving' | 'saved' | 'unsaved' | 'error';
|
|
38
|
+
|
|
15
39
|
let saving = $state(false);
|
|
40
|
+
let saveStatus = $state<SaveStatus>('idle');
|
|
41
|
+
let lastSavedAt = $state<Date | null>(null);
|
|
16
42
|
let deleting = $state(false);
|
|
17
43
|
let errorMessage = $state<string | null>(null);
|
|
18
|
-
let
|
|
19
|
-
|
|
44
|
+
let confirmDeleteOpen = $state(false);
|
|
45
|
+
|
|
46
|
+
const lang: Record<
|
|
47
|
+
InterfaceLanguage,
|
|
48
|
+
{
|
|
49
|
+
title: string;
|
|
50
|
+
description: string;
|
|
51
|
+
deleteLabel: string;
|
|
52
|
+
confirmDeleteTitle: string;
|
|
53
|
+
confirmDeleteDescription: string;
|
|
54
|
+
notFoundTitle: string;
|
|
55
|
+
notFoundDescription: string;
|
|
56
|
+
backToList: string;
|
|
57
|
+
loading: string;
|
|
58
|
+
}
|
|
59
|
+
> = {
|
|
60
|
+
pl: {
|
|
61
|
+
title: 'Edycja metody wysyłki',
|
|
62
|
+
description: 'Zmień nazwę, cenę, VAT lub zasady doręczenia.',
|
|
63
|
+
deleteLabel: 'Usuń metodę',
|
|
64
|
+
confirmDeleteTitle: 'Usunąć metodę wysyłki?',
|
|
65
|
+
confirmDeleteDescription:
|
|
66
|
+
'Aktywne zamówienia z tą metodą pozostaną nienaruszone, ale nie pojawi się więcej w koszyku. Tej akcji nie cofniesz.',
|
|
67
|
+
notFoundTitle: 'Nie znaleziono metody',
|
|
68
|
+
notFoundDescription: 'Mogła zostać usunięta lub link jest nieaktualny.',
|
|
69
|
+
backToList: 'Wróć do listy',
|
|
70
|
+
loading: 'Wczytuję…'
|
|
71
|
+
},
|
|
72
|
+
en: {
|
|
73
|
+
title: 'Edit shipping method',
|
|
74
|
+
description: 'Update the name, price, VAT or delivery rules.',
|
|
75
|
+
deleteLabel: 'Delete method',
|
|
76
|
+
confirmDeleteTitle: 'Delete shipping method?',
|
|
77
|
+
confirmDeleteDescription:
|
|
78
|
+
'Existing orders with this method stay intact, but it will no longer appear at checkout. This cannot be undone.',
|
|
79
|
+
notFoundTitle: 'Method not found',
|
|
80
|
+
notFoundDescription: 'It may have been deleted or the link is outdated.',
|
|
81
|
+
backToList: 'Back to list',
|
|
82
|
+
loading: 'Loading…'
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const t = $derived(lang[interfaceLanguage.current]);
|
|
20
87
|
|
|
21
88
|
async function handleSubmit(payload: ShippingFormPayload) {
|
|
22
89
|
saving = true;
|
|
90
|
+
saveStatus = 'saving';
|
|
23
91
|
errorMessage = null;
|
|
24
|
-
successMessage = null;
|
|
25
92
|
try {
|
|
26
93
|
await remotes.updateShippingMethodCmd({ id: methodId, input: payload });
|
|
27
94
|
await methodQuery.refresh();
|
|
28
|
-
|
|
95
|
+
saveStatus = 'saved';
|
|
96
|
+
lastSavedAt = new Date();
|
|
29
97
|
} catch (err) {
|
|
30
98
|
errorMessage = err instanceof Error ? err.message : 'Nie udało się zapisać';
|
|
99
|
+
saveStatus = 'error';
|
|
31
100
|
} finally {
|
|
32
101
|
saving = false;
|
|
33
102
|
}
|
|
34
103
|
}
|
|
35
104
|
|
|
36
|
-
|
|
105
|
+
function handleDelete() {
|
|
106
|
+
confirmDeleteOpen = true;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
async function performDelete() {
|
|
37
110
|
deleting = true;
|
|
38
111
|
try {
|
|
39
112
|
await remotes.deleteShippingMethodCmd(methodId);
|
|
@@ -45,59 +118,27 @@
|
|
|
45
118
|
}
|
|
46
119
|
</script>
|
|
47
120
|
|
|
48
|
-
{
|
|
49
|
-
|
|
50
|
-
{
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
<Button
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
<div class="flex items-start justify-between gap-4">
|
|
58
|
-
<div>
|
|
59
|
-
<h1 class="text-2xl font-extrabold tracking-tight">Edycja metody wysyłki</h1>
|
|
60
|
-
<a href="/admin/shop/shipping-methods" class="text-muted-foreground text-sm hover:underline"
|
|
61
|
-
>← Wróć do listy</a
|
|
62
|
-
>
|
|
63
|
-
</div>
|
|
64
|
-
<div>
|
|
65
|
-
{#if confirmingDelete}
|
|
66
|
-
<div class="flex items-center gap-2">
|
|
67
|
-
<span class="text-sm">Na pewno?</span>
|
|
68
|
-
<Button
|
|
69
|
-
type="button"
|
|
70
|
-
variant="destructive"
|
|
71
|
-
size="sm"
|
|
72
|
-
onclick={handleDelete}
|
|
73
|
-
disabled={deleting}
|
|
74
|
-
>
|
|
75
|
-
{deleting ? 'Usuwanie…' : 'Usuń'}
|
|
76
|
-
</Button>
|
|
77
|
-
<Button
|
|
78
|
-
type="button"
|
|
79
|
-
variant="outline"
|
|
80
|
-
size="sm"
|
|
81
|
-
onclick={() => (confirmingDelete = false)}>Anuluj</Button
|
|
82
|
-
>
|
|
83
|
-
</div>
|
|
84
|
-
{:else}
|
|
85
|
-
<Button
|
|
86
|
-
type="button"
|
|
87
|
-
variant="outline"
|
|
88
|
-
size="sm"
|
|
89
|
-
onclick={() => (confirmingDelete = true)}
|
|
90
|
-
>
|
|
91
|
-
<TrashIcon class="mr-1 size-4" /> Usuń
|
|
92
|
-
</Button>
|
|
93
|
-
{/if}
|
|
94
|
-
</div>
|
|
95
|
-
</div>
|
|
96
|
-
|
|
97
|
-
{#if successMessage}
|
|
98
|
-
<div class="rounded-lg bg-green-50 p-3 text-sm text-green-800">{successMessage}</div>
|
|
99
|
-
{/if}
|
|
121
|
+
<DetailPageShell title={t.title} description={t.description}>
|
|
122
|
+
{#snippet secondaryActions()}
|
|
123
|
+
<SaveIndicator status={saveStatus} {lastSavedAt} />
|
|
124
|
+
{/snippet}
|
|
125
|
+
{#snippet primaryActions()}
|
|
126
|
+
<Button type="button" variant="outline" size="sm" onclick={handleDelete}>
|
|
127
|
+
<TrashIcon class="mr-1 size-4" /> {t.deleteLabel}
|
|
128
|
+
</Button>
|
|
129
|
+
{/snippet}
|
|
100
130
|
|
|
131
|
+
{#if !methodQuery.ready || !configQuery.ready}
|
|
132
|
+
<StateDisplay kind="loading" />
|
|
133
|
+
{:else if !methodQuery.current || !configQuery.current}
|
|
134
|
+
<StateDisplay
|
|
135
|
+
kind="error"
|
|
136
|
+
title={t.notFoundTitle}
|
|
137
|
+
description={t.notFoundDescription}
|
|
138
|
+
ctaLabel={t.backToList}
|
|
139
|
+
onCta={() => goto('/admin/shop/shipping-methods')}
|
|
140
|
+
/>
|
|
141
|
+
{:else}
|
|
101
142
|
<ShippingMethodForm
|
|
102
143
|
languages={configQuery.current.languages}
|
|
103
144
|
vatRates={configQuery.current.vatRates}
|
|
@@ -107,5 +148,13 @@
|
|
|
107
148
|
{errorMessage}
|
|
108
149
|
onsubmit={handleSubmit}
|
|
109
150
|
/>
|
|
110
|
-
|
|
111
|
-
|
|
151
|
+
{/if}
|
|
152
|
+
</DetailPageShell>
|
|
153
|
+
|
|
154
|
+
<ConfirmationDialog
|
|
155
|
+
bind:open={confirmDeleteOpen}
|
|
156
|
+
title={t.confirmDeleteTitle}
|
|
157
|
+
description={t.confirmDeleteDescription}
|
|
158
|
+
loading={deleting}
|
|
159
|
+
onConfirm={performDelete}
|
|
160
|
+
/>
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { Button } from '../../../components/ui/button/index.js';
|
|
3
3
|
import { Switch } from '../../../components/ui/switch/index.js';
|
|
4
|
+
import FormErrorSummary, {
|
|
5
|
+
type FormErrorEntry
|
|
6
|
+
} from '../../components/forms/form-error-summary.svelte';
|
|
4
7
|
|
|
5
8
|
type CarrierType = 'none' | 'inpost';
|
|
6
9
|
type InpostServiceType =
|
|
@@ -135,6 +138,29 @@
|
|
|
135
138
|
? (initial.conditions.freeAbove / 100).toFixed(2)
|
|
136
139
|
: '200.00'
|
|
137
140
|
);
|
|
141
|
+
const summaryErrors = $derived.by<FormErrorEntry[]>(() => {
|
|
142
|
+
const list: FormErrorEntry[] = [];
|
|
143
|
+
if (errorMessage) {
|
|
144
|
+
list.push({ path: '_form', label: 'Formularz', message: errorMessage });
|
|
145
|
+
}
|
|
146
|
+
if (restrictPayments && allowedPaymentIds.length === 0) {
|
|
147
|
+
list.push({
|
|
148
|
+
path: 'allowedPaymentMethods',
|
|
149
|
+
label: 'Metody płatności',
|
|
150
|
+
message: 'Wybierz przynajmniej jedną metodę, inaczej checkout dla tej dostawy będzie zablokowany.'
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
const firstLang = languages[0] ?? 'pl';
|
|
154
|
+
if (!names[firstLang]?.trim()) {
|
|
155
|
+
list.push({
|
|
156
|
+
path: `name-${firstLang}`,
|
|
157
|
+
label: `Nazwa (${firstLang.toUpperCase()})`,
|
|
158
|
+
message: 'Wpisz nazwę widoczną w koszyku.'
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
return list;
|
|
162
|
+
});
|
|
163
|
+
|
|
138
164
|
async function handleSubmit(e: SubmitEvent) {
|
|
139
165
|
e.preventDefault();
|
|
140
166
|
await onsubmit({
|
|
@@ -158,15 +184,13 @@
|
|
|
158
184
|
</script>
|
|
159
185
|
|
|
160
186
|
<form onsubmit={handleSubmit} class="space-y-6">
|
|
161
|
-
{
|
|
162
|
-
<div class="rounded-lg bg-red-50 p-3 text-sm text-red-800">{errorMessage}</div>
|
|
163
|
-
{/if}
|
|
187
|
+
<FormErrorSummary errors={summaryErrors} />
|
|
164
188
|
|
|
165
189
|
<section class="border-border bg-card space-y-4 rounded-xl border p-6">
|
|
166
190
|
<h2 class="text-lg font-bold">Podstawowe informacje</h2>
|
|
167
191
|
|
|
168
192
|
{#each languages as lang (lang)}
|
|
169
|
-
<label class="block">
|
|
193
|
+
<label class="block" data-field-path={`name-${lang}`}>
|
|
170
194
|
<span class="mb-1 block text-sm font-semibold">Nazwa ({lang})</span>
|
|
171
195
|
<input
|
|
172
196
|
type="text"
|
|
@@ -276,8 +300,11 @@
|
|
|
276
300
|
</section>
|
|
277
301
|
|
|
278
302
|
{#if paymentMethods.length > 0}
|
|
279
|
-
<
|
|
280
|
-
|
|
303
|
+
<fieldset
|
|
304
|
+
class="border-border bg-card space-y-4 rounded-xl border p-6"
|
|
305
|
+
data-field-path="allowedPaymentMethods"
|
|
306
|
+
>
|
|
307
|
+
<legend class="text-lg font-bold">Dozwolone metody płatności</legend>
|
|
281
308
|
<p class="text-muted-foreground text-sm">
|
|
282
309
|
Ogranicz metody płatności dla tej dostawy (np. wyłącz płatność za pobraniem dla paczkomatu).
|
|
283
310
|
Jeśli wyłączone — wszystkie skonfigurowane metody są dostępne.
|
|
@@ -301,13 +328,13 @@
|
|
|
301
328
|
</label>
|
|
302
329
|
{/each}
|
|
303
330
|
{#if allowedPaymentIds.length === 0}
|
|
304
|
-
<p class="text-
|
|
331
|
+
<p class="text-warning text-xs" role="alert">
|
|
305
332
|
Wybierz co najmniej jedną metodę, inaczej checkout dla tej dostawy będzie zablokowany.
|
|
306
333
|
</p>
|
|
307
334
|
{/if}
|
|
308
335
|
</div>
|
|
309
336
|
{/if}
|
|
310
|
-
</
|
|
337
|
+
</fieldset>
|
|
311
338
|
{/if}
|
|
312
339
|
|
|
313
340
|
<section class="border-border bg-card space-y-4 rounded-xl border p-6">
|
|
@@ -321,7 +348,7 @@
|
|
|
321
348
|
</label>
|
|
322
349
|
|
|
323
350
|
{#if carrierType === 'inpost'}
|
|
324
|
-
<div class="border-primary/30 space-y-4 border-l-2 pl-4">
|
|
351
|
+
<div class="border-primary/30 space-y-4 border-l-2 pl-4" aria-live="polite">
|
|
325
352
|
<p class="text-muted-foreground text-sm">
|
|
326
353
|
Wymaga skonfigurowanego adaptera <code>inpostAdapter</code> w <code>cms.config.ts</code>.
|
|
327
354
|
</p>
|
|
@@ -2,10 +2,46 @@
|
|
|
2
2
|
import { goto } from '$app/navigation';
|
|
3
3
|
import { getRemotes } from '../../../sveltekit/index.js';
|
|
4
4
|
import ShippingMethodForm, { type ShippingFormPayload } from './shipping-method-form.svelte';
|
|
5
|
+
import DetailPageShell from '../../components/layout/detail-page-shell.svelte';
|
|
6
|
+
import StateDisplay from '../collection/state-display.svelte';
|
|
7
|
+
import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
|
|
8
|
+
import { getBreadcrumbs } from '../../state/breadcrumbs.svelte.js';
|
|
9
|
+
import { sidebarLang } from '../../components/layout/lang.js';
|
|
10
|
+
import type { InterfaceLanguage } from '../../../types/languages.js';
|
|
5
11
|
|
|
6
12
|
const remotes = getRemotes();
|
|
13
|
+
const interfaceLanguage = useInterfaceLanguage();
|
|
14
|
+
const breadcrumbs = getBreadcrumbs();
|
|
7
15
|
const configQuery = $derived(remotes.getShopConfig());
|
|
8
16
|
|
|
17
|
+
const lang: Record<
|
|
18
|
+
InterfaceLanguage,
|
|
19
|
+
{ title: string; description: string; submitLabel: string; saveError: string }
|
|
20
|
+
> = {
|
|
21
|
+
pl: {
|
|
22
|
+
title: 'Nowa metoda wysyłki',
|
|
23
|
+
description: 'Skonfiguruj sposób dostawy widoczny w checkout.',
|
|
24
|
+
submitLabel: 'Utwórz metodę',
|
|
25
|
+
saveError: 'Nie udało się zapisać'
|
|
26
|
+
},
|
|
27
|
+
en: {
|
|
28
|
+
title: 'New shipping method',
|
|
29
|
+
description: 'Configure a delivery method visible at checkout.',
|
|
30
|
+
submitLabel: 'Create method',
|
|
31
|
+
saveError: 'Failed to save'
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const t = $derived(lang[interfaceLanguage.current]);
|
|
35
|
+
|
|
36
|
+
$effect(() => {
|
|
37
|
+
const s = sidebarLang[interfaceLanguage.current].shop;
|
|
38
|
+
breadcrumbs.state = [
|
|
39
|
+
{ label: s.title },
|
|
40
|
+
{ label: s.shipping, href: '/admin/shop/shipping-methods' },
|
|
41
|
+
{ label: t.title }
|
|
42
|
+
];
|
|
43
|
+
});
|
|
44
|
+
|
|
9
45
|
let saving = $state(false);
|
|
10
46
|
let errorMessage = $state<string | null>(null);
|
|
11
47
|
|
|
@@ -16,30 +52,25 @@
|
|
|
16
52
|
const row = await remotes.createShippingMethodCmd(payload);
|
|
17
53
|
await goto(`/admin/shop/shipping-methods/${row.id}`);
|
|
18
54
|
} catch (err) {
|
|
19
|
-
errorMessage = err instanceof Error ? err.message :
|
|
55
|
+
errorMessage = err instanceof Error ? err.message : t.saveError;
|
|
20
56
|
} finally {
|
|
21
57
|
saving = false;
|
|
22
58
|
}
|
|
23
59
|
}
|
|
24
60
|
</script>
|
|
25
61
|
|
|
26
|
-
{
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
<div>
|
|
31
|
-
<h1 class="text-2xl font-extrabold tracking-tight">Nowa metoda wysyłki</h1>
|
|
32
|
-
<a href="/admin/shop/shipping-methods" class="text-muted-foreground text-sm hover:underline"
|
|
33
|
-
>← Wróć do listy</a
|
|
34
|
-
>
|
|
35
|
-
</div>
|
|
62
|
+
<DetailPageShell title={t.title} description={t.description}>
|
|
63
|
+
{#if !configQuery.ready}
|
|
64
|
+
<StateDisplay kind="loading" />
|
|
65
|
+
{:else if configQuery.current}
|
|
36
66
|
<ShippingMethodForm
|
|
37
67
|
languages={configQuery.current.languages}
|
|
38
68
|
vatRates={configQuery.current.vatRates}
|
|
39
69
|
paymentMethods={configQuery.current.paymentMethods}
|
|
40
70
|
{saving}
|
|
41
71
|
{errorMessage}
|
|
72
|
+
submitLabel={t.submitLabel}
|
|
42
73
|
onsubmit={handleSubmit}
|
|
43
74
|
/>
|
|
44
|
-
|
|
45
|
-
|
|
75
|
+
{/if}
|
|
76
|
+
</DetailPageShell>
|
|
@@ -3,15 +3,28 @@
|
|
|
3
3
|
import { droppable, draggable, dndState } from '@thisux/sveltednd';
|
|
4
4
|
import { getRemotes } from '../../../sveltekit/index.js';
|
|
5
5
|
import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
|
|
6
|
+
import { getBreadcrumbs } from '../../state/breadcrumbs.svelte.js';
|
|
7
|
+
import { sidebarLang } from '../../components/layout/lang.js';
|
|
6
8
|
import { resolveI18n } from '../../../shop/pricing.js';
|
|
7
9
|
import { Button } from '../../../components/ui/button/index.js';
|
|
8
10
|
import PlusIcon from '@tabler/icons-svelte/icons/plus';
|
|
9
11
|
import GripIcon from '@tabler/icons-svelte/icons/grip-vertical';
|
|
12
|
+
import { formatPlnPrice, formatCentsPrice } from '../../utils/formatters.js';
|
|
13
|
+
import PageHeader from '../../components/layout/page-header.svelte';
|
|
14
|
+
import StatusBadge from '../collection/status-badge.svelte';
|
|
15
|
+
import StateDisplay from '../collection/state-display.svelte';
|
|
16
|
+
import type { InterfaceLanguage } from '../../../types/languages.js';
|
|
10
17
|
|
|
11
18
|
const remotes = getRemotes();
|
|
12
19
|
const interfaceLanguage = useInterfaceLanguage();
|
|
20
|
+
const breadcrumbs = getBreadcrumbs();
|
|
13
21
|
const query = $derived(remotes.listShippingMethodsAdmin());
|
|
14
22
|
|
|
23
|
+
$effect(() => {
|
|
24
|
+
const s = sidebarLang[interfaceLanguage.current].shop;
|
|
25
|
+
breadcrumbs.state = [{ label: s.title }, { label: s.shipping }];
|
|
26
|
+
});
|
|
27
|
+
|
|
15
28
|
type Row = NonNullable<ReturnType<typeof remotes.listShippingMethodsAdmin>['current']>[number];
|
|
16
29
|
|
|
17
30
|
let localRows = $state<Row[]>([]);
|
|
@@ -35,16 +48,61 @@
|
|
|
35
48
|
}
|
|
36
49
|
});
|
|
37
50
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
51
|
+
const lang: Record<
|
|
52
|
+
InterfaceLanguage,
|
|
53
|
+
{
|
|
54
|
+
title: string;
|
|
55
|
+
descriptionPrefix: string;
|
|
56
|
+
columnName: string;
|
|
57
|
+
columnPrice: string;
|
|
58
|
+
columnVat: string;
|
|
59
|
+
columnFreeFrom: string;
|
|
60
|
+
columnType: string;
|
|
61
|
+
columnStatus: string;
|
|
62
|
+
addMethod: string;
|
|
63
|
+
emptyTitle: string;
|
|
64
|
+
emptyDescription: string;
|
|
65
|
+
activeYes: string;
|
|
66
|
+
activeNo: string;
|
|
67
|
+
dragLabel: (i: number, total: number) => string;
|
|
68
|
+
}
|
|
69
|
+
> = {
|
|
70
|
+
en: {
|
|
71
|
+
title: 'Shipping methods',
|
|
72
|
+
descriptionPrefix: 'Drag to reorder',
|
|
73
|
+
columnName: 'Name',
|
|
74
|
+
columnPrice: 'Price (net)',
|
|
75
|
+
columnVat: 'VAT',
|
|
76
|
+
columnFreeFrom: 'Free from',
|
|
77
|
+
columnType: 'Type',
|
|
78
|
+
columnStatus: 'Status',
|
|
79
|
+
addMethod: 'Add method',
|
|
80
|
+
emptyTitle: 'No shipping methods',
|
|
81
|
+
emptyDescription:
|
|
82
|
+
'Add your first method — courier, parcel locker, in-store pickup.',
|
|
83
|
+
activeYes: 'Active',
|
|
84
|
+
activeNo: 'Inactive',
|
|
85
|
+
dragLabel: (i, total) => `Drag to reorder, row ${i + 1} of ${total}`
|
|
86
|
+
},
|
|
87
|
+
pl: {
|
|
88
|
+
title: 'Metody wysyłki',
|
|
89
|
+
descriptionPrefix: 'Przeciągnij, aby zmienić kolejność',
|
|
90
|
+
columnName: 'Nazwa',
|
|
91
|
+
columnPrice: 'Cena (netto)',
|
|
92
|
+
columnVat: 'VAT',
|
|
93
|
+
columnFreeFrom: 'Darmowa od',
|
|
94
|
+
columnType: 'Typ',
|
|
95
|
+
columnStatus: 'Status',
|
|
96
|
+
addMethod: 'Dodaj metodę',
|
|
97
|
+
emptyTitle: 'Brak metod wysyłki',
|
|
98
|
+
emptyDescription:
|
|
99
|
+
'Dodaj pierwszą metodę — np. kurier, paczkomat, odbiór osobisty.',
|
|
100
|
+
activeYes: 'Aktywna',
|
|
101
|
+
activeNo: 'Nieaktywna',
|
|
102
|
+
dragLabel: (i, total) => `Przeciągnij, aby zmienić kolejność, wiersz ${i + 1} z ${total}`
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
const t = $derived(lang[interfaceLanguage.current]);
|
|
48
106
|
|
|
49
107
|
async function doReorder(fromIndex: number, toIndex: number) {
|
|
50
108
|
if (fromIndex === toIndex) return;
|
|
@@ -61,48 +119,36 @@
|
|
|
61
119
|
}
|
|
62
120
|
</script>
|
|
63
121
|
|
|
64
|
-
<div class="
|
|
65
|
-
<
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
</div>
|
|
78
|
-
<Button href="/admin/shop/shipping-methods/new">
|
|
79
|
-
<PlusIcon class="mr-1 size-4" />
|
|
80
|
-
Dodaj metodę
|
|
81
|
-
</Button>
|
|
82
|
-
</div>
|
|
122
|
+
<div class="p-5 pb-24 md:p-7">
|
|
123
|
+
<PageHeader
|
|
124
|
+
title={t.title}
|
|
125
|
+
count={query.ready ? localRows.length : undefined}
|
|
126
|
+
description={t.descriptionPrefix}
|
|
127
|
+
>
|
|
128
|
+
{#snippet primaryActions()}
|
|
129
|
+
<Button href="/admin/shop/shipping-methods/new">
|
|
130
|
+
<PlusIcon class="size-4" />
|
|
131
|
+
{t.addMethod}
|
|
132
|
+
</Button>
|
|
133
|
+
{/snippet}
|
|
134
|
+
</PageHeader>
|
|
83
135
|
|
|
84
|
-
<div class="px-6 pb-12">
|
|
85
136
|
{#if !query.ready}
|
|
86
|
-
<
|
|
137
|
+
<StateDisplay kind="loading" />
|
|
87
138
|
{:else if localRows.length === 0}
|
|
88
|
-
<
|
|
89
|
-
<p class="mb-2 font-semibold">Brak metod wysyłki</p>
|
|
90
|
-
<p class="text-muted-foreground">
|
|
91
|
-
Dodaj pierwszą metodę — np. kurier, paczkomat, odbiór osobisty.
|
|
92
|
-
</p>
|
|
93
|
-
</div>
|
|
139
|
+
<StateDisplay kind="empty" title={t.emptyTitle} description={t.emptyDescription} />
|
|
94
140
|
{:else}
|
|
95
|
-
<div class="
|
|
141
|
+
<div class="overflow-hidden rounded-xl border bg-card shadow-sm">
|
|
96
142
|
<div
|
|
97
|
-
class="bg-muted
|
|
143
|
+
class="text-muted-foreground bg-muted grid h-10 grid-cols-[32px_minmax(0,2fr)_minmax(0,1fr)_minmax(0,0.6fr)_minmax(0,1fr)_minmax(0,0.8fr)_minmax(0,1fr)] items-center gap-3 px-4 text-left text-[11px] font-bold tracking-[0.04em] uppercase"
|
|
98
144
|
>
|
|
99
145
|
<div></div>
|
|
100
|
-
<div>
|
|
101
|
-
<div>
|
|
102
|
-
<div>
|
|
103
|
-
<div>
|
|
104
|
-
<div>
|
|
105
|
-
<div>
|
|
146
|
+
<div>{t.columnName}</div>
|
|
147
|
+
<div>{t.columnPrice}</div>
|
|
148
|
+
<div>{t.columnVat}</div>
|
|
149
|
+
<div>{t.columnFreeFrom}</div>
|
|
150
|
+
<div>{t.columnType}</div>
|
|
151
|
+
<div>{t.columnStatus}</div>
|
|
106
152
|
</div>
|
|
107
153
|
<div>
|
|
108
154
|
{#each localRows as m, i (m.id)}
|
|
@@ -129,14 +175,14 @@
|
|
|
129
175
|
}
|
|
130
176
|
}}
|
|
131
177
|
animate:flip={{ duration: matchesReducedMotion ? 0 : 200 }}
|
|
132
|
-
class="
|
|
178
|
+
class="hover:bg-lavender-lighter/50 grid grid-cols-[32px_minmax(0,2fr)_minmax(0,1fr)_minmax(0,0.6fr)_minmax(0,1fr)_minmax(0,0.8fr)_minmax(0,1fr)] items-center gap-3 border-b px-4 py-3 text-sm transition-colors last:border-b-0"
|
|
133
179
|
>
|
|
134
180
|
<div
|
|
135
181
|
use:draggable={{ container: i.toString(), dragData: { index: i } }}
|
|
136
182
|
class="text-muted-foreground hover:text-foreground flex cursor-grab items-center justify-center"
|
|
137
183
|
role="button"
|
|
138
184
|
tabindex="0"
|
|
139
|
-
aria-label={
|
|
185
|
+
aria-label={t.dragLabel(i, localRows.length)}
|
|
140
186
|
>
|
|
141
187
|
<GripIcon class="size-4" />
|
|
142
188
|
</div>
|
|
@@ -145,27 +191,23 @@
|
|
|
145
191
|
{resolveI18n(m.name as Record<string, string>, interfaceLanguage.current, '')}
|
|
146
192
|
</a>
|
|
147
193
|
</div>
|
|
148
|
-
<div>{
|
|
194
|
+
<div>{formatPlnPrice(Number(m.price))}</div>
|
|
149
195
|
<div>{m.vatRate}%</div>
|
|
150
196
|
<div>
|
|
151
197
|
{#if cond?.freeAbove != null}
|
|
152
|
-
{
|
|
198
|
+
{formatCentsPrice(cond.freeAbove, 'PLN')}
|
|
153
199
|
{:else}
|
|
154
200
|
<span class="text-muted-foreground text-xs">—</span>
|
|
155
201
|
{/if}
|
|
156
202
|
</div>
|
|
157
203
|
<div class="text-muted-foreground font-mono text-xs">{m.carrierType}</div>
|
|
158
204
|
<div>
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
<span class="inline-flex rounded-full bg-gray-100 px-2 py-0.5 text-xs text-gray-800"
|
|
166
|
-
>Nieaktywna</span
|
|
167
|
-
>
|
|
168
|
-
{/if}
|
|
205
|
+
<StatusBadge
|
|
206
|
+
variant="boolean"
|
|
207
|
+
active={m.isActive}
|
|
208
|
+
activeLabel={t.activeYes}
|
|
209
|
+
inactiveLabel={t.activeNo}
|
|
210
|
+
/>
|
|
169
211
|
</div>
|
|
170
212
|
</div>
|
|
171
213
|
{/each}
|