@endora-commerce/admin-kit 0.0.0-stage → 0.100.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/LICENSE +21 -0
- package/README.md +212 -2
- package/dist/components/FileDropzone.d.ts +13 -0
- package/dist/components/FileDropzone.d.ts.map +1 -0
- package/dist/components/FileDropzone.js +39 -0
- package/dist/components/FileDropzone.js.map +1 -0
- package/dist/components/PaginationFooter.d.ts +25 -0
- package/dist/components/PaginationFooter.d.ts.map +1 -0
- package/dist/components/PaginationFooter.js +33 -0
- package/dist/components/PaginationFooter.js.map +1 -0
- package/dist/components/ResponsiveTable.d.ts +26 -0
- package/dist/components/ResponsiveTable.d.ts.map +1 -0
- package/dist/components/ResponsiveTable.js +34 -0
- package/dist/components/ResponsiveTable.js.map +1 -0
- package/dist/components/RowActionMenu.d.ts +40 -0
- package/dist/components/RowActionMenu.d.ts.map +1 -0
- package/dist/components/RowActionMenu.js +15 -0
- package/dist/components/RowActionMenu.js.map +1 -0
- package/dist/components/StickyFormActions.d.ts +10 -0
- package/dist/components/StickyFormActions.d.ts.map +1 -0
- package/dist/components/StickyFormActions.js +10 -0
- package/dist/components/StickyFormActions.js.map +1 -0
- package/dist/components/TouchReorderButtons.d.ts +13 -0
- package/dist/components/TouchReorderButtons.d.ts.map +1 -0
- package/dist/components/TouchReorderButtons.js +12 -0
- package/dist/components/TouchReorderButtons.js.map +1 -0
- package/dist/components/admin-user-picker/AdminUserPicker.d.ts +14 -0
- package/dist/components/admin-user-picker/AdminUserPicker.d.ts.map +1 -0
- package/dist/components/admin-user-picker/AdminUserPicker.js +68 -0
- package/dist/components/admin-user-picker/AdminUserPicker.js.map +1 -0
- package/dist/components/asset-picker/AssetFieldPicker.d.ts +32 -0
- package/dist/components/asset-picker/AssetFieldPicker.d.ts.map +1 -0
- package/dist/components/asset-picker/AssetFieldPicker.js +42 -0
- package/dist/components/asset-picker/AssetFieldPicker.js.map +1 -0
- package/dist/components/asset-picker/AssetPicker.d.ts +31 -0
- package/dist/components/asset-picker/AssetPicker.d.ts.map +1 -0
- package/dist/components/asset-picker/AssetPicker.js +68 -0
- package/dist/components/asset-picker/AssetPicker.js.map +1 -0
- package/dist/components/asset-picker/AssetUploader.d.ts +15 -0
- package/dist/components/asset-picker/AssetUploader.d.ts.map +1 -0
- package/dist/components/asset-picker/AssetUploader.js +61 -0
- package/dist/components/asset-picker/AssetUploader.js.map +1 -0
- package/dist/components/asset-picker/assets-api.d.ts +49 -0
- package/dist/components/asset-picker/assets-api.d.ts.map +1 -0
- package/dist/components/asset-picker/assets-api.js +67 -0
- package/dist/components/asset-picker/assets-api.js.map +1 -0
- package/dist/components/category-picker/CategorySelect.d.ts +14 -0
- package/dist/components/category-picker/CategorySelect.d.ts.map +1 -0
- package/dist/components/category-picker/CategorySelect.js +41 -0
- package/dist/components/category-picker/CategorySelect.js.map +1 -0
- package/dist/components/category-tree-picker/CategoryTreeNodeRow.d.ts +18 -0
- package/dist/components/category-tree-picker/CategoryTreeNodeRow.d.ts.map +1 -0
- package/dist/components/category-tree-picker/CategoryTreeNodeRow.js +19 -0
- package/dist/components/category-tree-picker/CategoryTreeNodeRow.js.map +1 -0
- package/dist/components/category-tree-picker/CategoryTreePicker.d.ts +23 -0
- package/dist/components/category-tree-picker/CategoryTreePicker.d.ts.map +1 -0
- package/dist/components/category-tree-picker/CategoryTreePicker.js +82 -0
- package/dist/components/category-tree-picker/CategoryTreePicker.js.map +1 -0
- package/dist/components/category-tree-picker/category-tree-utils.d.ts +35 -0
- package/dist/components/category-tree-picker/category-tree-utils.d.ts.map +1 -0
- package/dist/components/category-tree-picker/category-tree-utils.js +140 -0
- package/dist/components/category-tree-picker/category-tree-utils.js.map +1 -0
- package/dist/components/category-tree-picker/index.d.ts +4 -0
- package/dist/components/category-tree-picker/index.d.ts.map +1 -0
- package/dist/components/category-tree-picker/index.js +2 -0
- package/dist/components/category-tree-picker/index.js.map +1 -0
- package/dist/components/charts/echart.d.ts +17 -0
- package/dist/components/charts/echart.d.ts.map +1 -0
- package/dist/components/charts/echart.js +61 -0
- package/dist/components/charts/echart.js.map +1 -0
- package/dist/components/cms-picker/CmsBlockPicker.d.ts +14 -0
- package/dist/components/cms-picker/CmsBlockPicker.d.ts.map +1 -0
- package/dist/components/cms-picker/CmsBlockPicker.js +40 -0
- package/dist/components/cms-picker/CmsBlockPicker.js.map +1 -0
- package/dist/components/cms-picker/CmsPagePicker.d.ts +15 -0
- package/dist/components/cms-picker/CmsPagePicker.d.ts.map +1 -0
- package/dist/components/cms-picker/CmsPagePicker.js +80 -0
- package/dist/components/cms-picker/CmsPagePicker.js.map +1 -0
- package/dist/components/content-language-tabs/ContentLanguageTabs.d.ts +30 -0
- package/dist/components/content-language-tabs/ContentLanguageTabs.d.ts.map +1 -0
- package/dist/components/content-language-tabs/ContentLanguageTabs.js +14 -0
- package/dist/components/content-language-tabs/ContentLanguageTabs.js.map +1 -0
- package/dist/components/country-select/CountrySelect.d.ts +29 -0
- package/dist/components/country-select/CountrySelect.d.ts.map +1 -0
- package/dist/components/country-select/CountrySelect.js +40 -0
- package/dist/components/country-select/CountrySelect.js.map +1 -0
- package/dist/components/country-select/index.d.ts +3 -0
- package/dist/components/country-select/index.d.ts.map +1 -0
- package/dist/components/country-select/index.js +3 -0
- package/dist/components/country-select/index.js.map +1 -0
- package/dist/components/country-select/useCountriesQuery.d.ts +12 -0
- package/dist/components/country-select/useCountriesQuery.d.ts.map +1 -0
- package/dist/components/country-select/useCountriesQuery.js +69 -0
- package/dist/components/country-select/useCountriesQuery.js.map +1 -0
- package/dist/components/custom-field-values/CustomFieldValuesPanel.d.ts +48 -0
- package/dist/components/custom-field-values/CustomFieldValuesPanel.d.ts.map +1 -0
- package/dist/components/custom-field-values/CustomFieldValuesPanel.js +122 -0
- package/dist/components/custom-field-values/CustomFieldValuesPanel.js.map +1 -0
- package/dist/components/customer-group-picker/CustomerGroupPicker.d.ts +14 -0
- package/dist/components/customer-group-picker/CustomerGroupPicker.d.ts.map +1 -0
- package/dist/components/customer-group-picker/CustomerGroupPicker.js +36 -0
- package/dist/components/customer-group-picker/CustomerGroupPicker.js.map +1 -0
- package/dist/components/customer-picker/CustomerPicker.d.ts +18 -0
- package/dist/components/customer-picker/CustomerPicker.d.ts.map +1 -0
- package/dist/components/customer-picker/CustomerPicker.js +85 -0
- package/dist/components/customer-picker/CustomerPicker.js.map +1 -0
- package/dist/components/dictionary-picker/CountryPicker.d.ts +26 -0
- package/dist/components/dictionary-picker/CountryPicker.d.ts.map +1 -0
- package/dist/components/dictionary-picker/CountryPicker.js +29 -0
- package/dist/components/dictionary-picker/CountryPicker.js.map +1 -0
- package/dist/components/dictionary-picker/CurrencyPicker.d.ts +17 -0
- package/dist/components/dictionary-picker/CurrencyPicker.d.ts.map +1 -0
- package/dist/components/dictionary-picker/CurrencyPicker.js +29 -0
- package/dist/components/dictionary-picker/CurrencyPicker.js.map +1 -0
- package/dist/components/dictionary-picker/dictionary-api.d.ts +21 -0
- package/dist/components/dictionary-picker/dictionary-api.d.ts.map +1 -0
- package/dist/components/dictionary-picker/dictionary-api.js +26 -0
- package/dist/components/dictionary-picker/dictionary-api.js.map +1 -0
- package/dist/components/dictionary-picker/index.d.ts +4 -0
- package/dist/components/dictionary-picker/index.d.ts.map +1 -0
- package/dist/components/dictionary-picker/index.js +4 -0
- package/dist/components/dictionary-picker/index.js.map +1 -0
- package/dist/components/fulfilment-strategy-picker/FulfilmentStrategyPicker.d.ts +49 -0
- package/dist/components/fulfilment-strategy-picker/FulfilmentStrategyPicker.d.ts.map +1 -0
- package/dist/components/fulfilment-strategy-picker/FulfilmentStrategyPicker.js +43 -0
- package/dist/components/fulfilment-strategy-picker/FulfilmentStrategyPicker.js.map +1 -0
- package/dist/components/hooks/useFocusTrap.d.ts +6 -0
- package/dist/components/hooks/useFocusTrap.d.ts.map +1 -0
- package/dist/components/hooks/useFocusTrap.js +41 -0
- package/dist/components/hooks/useFocusTrap.js.map +1 -0
- package/dist/components/hooks/useViewportTier.d.ts +7 -0
- package/dist/components/hooks/useViewportTier.d.ts.map +1 -0
- package/dist/components/hooks/useViewportTier.js +23 -0
- package/dist/components/hooks/useViewportTier.js.map +1 -0
- package/dist/components/index.d.ts +101 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +63 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/organization-picker/OrganizationPicker.d.ts +28 -0
- package/dist/components/organization-picker/OrganizationPicker.d.ts.map +1 -0
- package/dist/components/organization-picker/OrganizationPicker.js +35 -0
- package/dist/components/organization-picker/OrganizationPicker.js.map +1 -0
- package/dist/components/organization-picker/OrganizationPickerMulti.d.ts +32 -0
- package/dist/components/organization-picker/OrganizationPickerMulti.d.ts.map +1 -0
- package/dist/components/organization-picker/OrganizationPickerMulti.js +55 -0
- package/dist/components/organization-picker/OrganizationPickerMulti.js.map +1 -0
- package/dist/components/organization-picker/OrganizationStatusBadge.d.ts +7 -0
- package/dist/components/organization-picker/OrganizationStatusBadge.d.ts.map +1 -0
- package/dist/components/organization-picker/OrganizationStatusBadge.js +33 -0
- package/dist/components/organization-picker/OrganizationStatusBadge.js.map +1 -0
- package/dist/components/organization-picker/useOrganizationsQuery.d.ts +33 -0
- package/dist/components/organization-picker/useOrganizationsQuery.d.ts.map +1 -0
- package/dist/components/organization-picker/useOrganizationsQuery.js +92 -0
- package/dist/components/organization-picker/useOrganizationsQuery.js.map +1 -0
- package/dist/components/payment-method-availability/MethodAvailabilityCell.d.ts +38 -0
- package/dist/components/payment-method-availability/MethodAvailabilityCell.d.ts.map +1 -0
- package/dist/components/payment-method-availability/MethodAvailabilityCell.js +50 -0
- package/dist/components/payment-method-availability/MethodAvailabilityCell.js.map +1 -0
- package/dist/components/product-picker/ProductPicker.d.ts +22 -0
- package/dist/components/product-picker/ProductPicker.d.ts.map +1 -0
- package/dist/components/product-picker/ProductPicker.js +143 -0
- package/dist/components/product-picker/ProductPicker.js.map +1 -0
- package/dist/components/reorder/ReorderAnnouncer.d.ts +29 -0
- package/dist/components/reorder/ReorderAnnouncer.d.ts.map +1 -0
- package/dist/components/reorder/ReorderAnnouncer.js +6 -0
- package/dist/components/reorder/ReorderAnnouncer.js.map +1 -0
- package/dist/components/reorder/useReorderList.d.ts +121 -0
- package/dist/components/reorder/useReorderList.d.ts.map +1 -0
- package/dist/components/reorder/useReorderList.js +241 -0
- package/dist/components/reorder/useReorderList.js.map +1 -0
- package/dist/components/rule-builder/RuleBuilder.d.ts +105 -0
- package/dist/components/rule-builder/RuleBuilder.d.ts.map +1 -0
- package/dist/components/rule-builder/RuleBuilder.js +138 -0
- package/dist/components/rule-builder/RuleBuilder.js.map +1 -0
- package/dist/components/sales-channel-picker/SalesChannelPicker.d.ts +15 -0
- package/dist/components/sales-channel-picker/SalesChannelPicker.d.ts.map +1 -0
- package/dist/components/sales-channel-picker/SalesChannelPicker.js +79 -0
- package/dist/components/sales-channel-picker/SalesChannelPicker.js.map +1 -0
- package/dist/components/scope-notice/ScopeNotice.d.ts +33 -0
- package/dist/components/scope-notice/ScopeNotice.d.ts.map +1 -0
- package/dist/components/scope-notice/ScopeNotice.js +11 -0
- package/dist/components/scope-notice/ScopeNotice.js.map +1 -0
- package/dist/components/scope-picker/ScopePicker.d.ts +28 -0
- package/dist/components/scope-picker/ScopePicker.d.ts.map +1 -0
- package/dist/components/scope-picker/ScopePicker.js +114 -0
- package/dist/components/scope-picker/ScopePicker.js.map +1 -0
- package/dist/components/scope-picker/sales-channels-api.d.ts +19 -0
- package/dist/components/scope-picker/sales-channels-api.d.ts.map +1 -0
- package/dist/components/scope-picker/sales-channels-api.js +30 -0
- package/dist/components/scope-picker/sales-channels-api.js.map +1 -0
- package/dist/components/status-transition-graph/StatusTransitionGraph.d.ts +26 -0
- package/dist/components/status-transition-graph/StatusTransitionGraph.d.ts.map +1 -0
- package/dist/components/status-transition-graph/StatusTransitionGraph.js +241 -0
- package/dist/components/status-transition-graph/StatusTransitionGraph.js.map +1 -0
- package/dist/components/status-transition-graph/index.d.ts +3 -0
- package/dist/components/status-transition-graph/index.d.ts.map +1 -0
- package/dist/components/status-transition-graph/index.js +2 -0
- package/dist/components/status-transition-graph/index.js.map +1 -0
- package/dist/contributions/index.d.ts +44 -0
- package/dist/contributions/index.d.ts.map +1 -0
- package/dist/contributions/index.js +42 -0
- package/dist/contributions/index.js.map +1 -0
- package/dist/contributions/zone-component.d.ts +70 -0
- package/dist/contributions/zone-component.d.ts.map +1 -0
- package/dist/contributions/zone-component.js +26 -0
- package/dist/contributions/zone-component.js.map +1 -0
- package/dist/field-protection/FieldProtectionPricePanel.d.ts +26 -0
- package/dist/field-protection/FieldProtectionPricePanel.d.ts.map +1 -0
- package/dist/field-protection/FieldProtectionPricePanel.js +14 -0
- package/dist/field-protection/FieldProtectionPricePanel.js.map +1 -0
- package/dist/field-protection/FieldProtectionSummary.d.ts +18 -0
- package/dist/field-protection/FieldProtectionSummary.d.ts.map +1 -0
- package/dist/field-protection/FieldProtectionSummary.js +18 -0
- package/dist/field-protection/FieldProtectionSummary.js.map +1 -0
- package/dist/field-protection/FieldProtectionToggle.d.ts +36 -0
- package/dist/field-protection/FieldProtectionToggle.d.ts.map +1 -0
- package/dist/field-protection/FieldProtectionToggle.js +30 -0
- package/dist/field-protection/FieldProtectionToggle.js.map +1 -0
- package/dist/field-protection/describe-path.d.ts +27 -0
- package/dist/field-protection/describe-path.d.ts.map +1 -0
- package/dist/field-protection/describe-path.js +28 -0
- package/dist/field-protection/describe-path.js.map +1 -0
- package/dist/field-protection/index.d.ts +46 -0
- package/dist/field-protection/index.d.ts.map +1 -0
- package/dist/field-protection/index.js +41 -0
- package/dist/field-protection/index.js.map +1 -0
- package/dist/field-protection/types.d.ts +93 -0
- package/dist/field-protection/types.d.ts.map +1 -0
- package/dist/field-protection/types.js +2 -0
- package/dist/field-protection/types.js.map +1 -0
- package/dist/field-protection/use-field-protection.d.ts +27 -0
- package/dist/field-protection/use-field-protection.d.ts.map +1 -0
- package/dist/field-protection/use-field-protection.js +149 -0
- package/dist/field-protection/use-field-protection.js.map +1 -0
- package/dist/i18n/TranslationProvider.d.ts +27 -0
- package/dist/i18n/TranslationProvider.d.ts.map +1 -0
- package/dist/i18n/TranslationProvider.js +130 -0
- package/dist/i18n/TranslationProvider.js.map +1 -0
- package/dist/i18n/app-language-context.d.ts +8 -0
- package/dist/i18n/app-language-context.d.ts.map +1 -0
- package/dist/i18n/app-language-context.js +13 -0
- package/dist/i18n/app-language-context.js.map +1 -0
- package/dist/i18n/index.d.ts +29 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +25 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/interpolate.d.ts +2 -0
- package/dist/i18n/interpolate.d.ts.map +1 -0
- package/dist/i18n/interpolate.js +10 -0
- package/dist/i18n/interpolate.js.map +1 -0
- package/dist/i18n/language-storage.d.ts +16 -0
- package/dist/i18n/language-storage.d.ts.map +1 -0
- package/dist/i18n/language-storage.js +26 -0
- package/dist/i18n/language-storage.js.map +1 -0
- package/dist/i18n/resolver.d.ts +19 -0
- package/dist/i18n/resolver.d.ts.map +1 -0
- package/dist/i18n/resolver.js +23 -0
- package/dist/i18n/resolver.js.map +1 -0
- package/dist/i18n/types.d.ts +12 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +7 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/i18n/useTranslation.d.ts +2 -0
- package/dist/i18n/useTranslation.d.ts.map +1 -0
- package/dist/i18n/useTranslation.js +16 -0
- package/dist/i18n/useTranslation.js.map +1 -0
- package/dist/lib/admin-actions/icon-map.d.ts +3 -0
- package/dist/lib/admin-actions/icon-map.d.ts.map +1 -0
- package/dist/lib/admin-actions/icon-map.js +115 -0
- package/dist/lib/admin-actions/icon-map.js.map +1 -0
- package/dist/lib/api-client.d.ts +55 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +89 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/asset-url.d.ts +32 -0
- package/dist/lib/asset-url.d.ts.map +1 -0
- package/dist/lib/asset-url.js +42 -0
- package/dist/lib/asset-url.js.map +1 -0
- package/dist/lib/auth.d.ts +92 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +133 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/format.d.ts +2 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +9 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/index.d.ts +46 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +41 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/invoice-email-outcome.d.ts +53 -0
- package/dist/lib/invoice-email-outcome.d.ts.map +1 -0
- package/dist/lib/invoice-email-outcome.js +43 -0
- package/dist/lib/invoice-email-outcome.js.map +1 -0
- package/dist/lib/module-presence/ModulePresenceProvider.d.ts +49 -0
- package/dist/lib/module-presence/ModulePresenceProvider.d.ts.map +1 -0
- package/dist/lib/module-presence/ModulePresenceProvider.js +73 -0
- package/dist/lib/module-presence/ModulePresenceProvider.js.map +1 -0
- package/dist/lib/module-presence/api.d.ts +15 -0
- package/dist/lib/module-presence/api.d.ts.map +1 -0
- package/dist/lib/module-presence/api.js +25 -0
- package/dist/lib/module-presence/api.js.map +1 -0
- package/dist/lib/module-presence/index.d.ts +3 -0
- package/dist/lib/module-presence/index.d.ts.map +1 -0
- package/dist/lib/module-presence/index.js +3 -0
- package/dist/lib/module-presence/index.js.map +1 -0
- package/dist/lib/money.d.ts +22 -0
- package/dist/lib/money.d.ts.map +1 -0
- package/dist/lib/money.js +51 -0
- package/dist/lib/money.js.map +1 -0
- package/dist/lib/page-size-options.d.ts +15 -0
- package/dist/lib/page-size-options.d.ts.map +1 -0
- package/dist/lib/page-size-options.js +14 -0
- package/dist/lib/page-size-options.js.map +1 -0
- package/dist/lib/status-color.d.ts +32 -0
- package/dist/lib/status-color.d.ts.map +1 -0
- package/dist/lib/status-color.js +24 -0
- package/dist/lib/status-color.js.map +1 -0
- package/dist/lib/surface-visibility.d.ts +70 -0
- package/dist/lib/surface-visibility.d.ts.map +1 -0
- package/dist/lib/surface-visibility.js +37 -0
- package/dist/lib/surface-visibility.js.map +1 -0
- package/dist/lib/text-normalization.d.ts +56 -0
- package/dist/lib/text-normalization.d.ts.map +1 -0
- package/dist/lib/text-normalization.js +59 -0
- package/dist/lib/text-normalization.js.map +1 -0
- package/dist/lib/use-page-size-preference.d.ts +29 -0
- package/dist/lib/use-page-size-preference.d.ts.map +1 -0
- package/dist/lib/use-page-size-preference.js +61 -0
- package/dist/lib/use-page-size-preference.js.map +1 -0
- package/dist/lib/use-unsaved-changes-prompt.d.ts +23 -0
- package/dist/lib/use-unsaved-changes-prompt.d.ts.map +1 -0
- package/dist/lib/use-unsaved-changes-prompt.js +75 -0
- package/dist/lib/use-unsaved-changes-prompt.js.map +1 -0
- package/dist/lib/utils.d.ts +9 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +12 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/uuid.d.ts +8 -0
- package/dist/lib/uuid.d.ts.map +1 -0
- package/dist/lib/uuid.js +18 -0
- package/dist/lib/uuid.js.map +1 -0
- package/dist/ui/alert.d.ts +12 -0
- package/dist/ui/alert.d.ts.map +1 -0
- package/dist/ui/alert.js +22 -0
- package/dist/ui/alert.js.map +1 -0
- package/dist/ui/badge.d.ts +10 -0
- package/dist/ui/badge.d.ts.map +1 -0
- package/dist/ui/badge.js +21 -0
- package/dist/ui/badge.js.map +1 -0
- package/dist/ui/button.d.ts +12 -0
- package/dist/ui/button.d.ts.map +1 -0
- package/dist/ui/button.js +31 -0
- package/dist/ui/button.js.map +1 -0
- package/dist/ui/card.d.ts +8 -0
- package/dist/ui/card.d.ts.map +1 -0
- package/dist/ui/card.js +16 -0
- package/dist/ui/card.js.map +1 -0
- package/dist/ui/checkbox.d.ts +8 -0
- package/dist/ui/checkbox.d.ts.map +1 -0
- package/dist/ui/checkbox.js +11 -0
- package/dist/ui/checkbox.js.map +1 -0
- package/dist/ui/color-picker.d.ts +23 -0
- package/dist/ui/color-picker.d.ts.map +1 -0
- package/dist/ui/color-picker.js +76 -0
- package/dist/ui/color-picker.js.map +1 -0
- package/dist/ui/combobox.d.ts +68 -0
- package/dist/ui/combobox.d.ts.map +1 -0
- package/dist/ui/combobox.js +182 -0
- package/dist/ui/combobox.js.map +1 -0
- package/dist/ui/dropdown-menu.d.ts +26 -0
- package/dist/ui/dropdown-menu.d.ts.map +1 -0
- package/dist/ui/dropdown-menu.js +38 -0
- package/dist/ui/dropdown-menu.js.map +1 -0
- package/dist/ui/index.d.ts +47 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +38 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/input.d.ts +3 -0
- package/dist/ui/input.d.ts.map +1 -0
- package/dist/ui/input.js +8 -0
- package/dist/ui/input.js.map +1 -0
- package/dist/ui/label.d.ts +4 -0
- package/dist/ui/label.d.ts.map +1 -0
- package/dist/ui/label.js +9 -0
- package/dist/ui/label.js.map +1 -0
- package/dist/ui/multi-select.d.ts +32 -0
- package/dist/ui/multi-select.d.ts.map +1 -0
- package/dist/ui/multi-select.js +63 -0
- package/dist/ui/multi-select.js.map +1 -0
- package/dist/ui/page-header.d.ts +21 -0
- package/dist/ui/page-header.d.ts.map +1 -0
- package/dist/ui/page-header.js +9 -0
- package/dist/ui/page-header.js.map +1 -0
- package/dist/ui/route-tabs.d.ts +58 -0
- package/dist/ui/route-tabs.d.ts.map +1 -0
- package/dist/ui/route-tabs.js +34 -0
- package/dist/ui/route-tabs.js.map +1 -0
- package/dist/ui/save-button-group.d.ts +27 -0
- package/dist/ui/save-button-group.d.ts.map +1 -0
- package/dist/ui/save-button-group.js +44 -0
- package/dist/ui/save-button-group.js.map +1 -0
- package/dist/ui/section.d.ts +20 -0
- package/dist/ui/section.d.ts.map +1 -0
- package/dist/ui/section.js +7 -0
- package/dist/ui/section.js.map +1 -0
- package/dist/ui/select.d.ts +10 -0
- package/dist/ui/select.d.ts.map +1 -0
- package/dist/ui/select.js +15 -0
- package/dist/ui/select.js.map +1 -0
- package/dist/ui/separator.d.ts +3 -0
- package/dist/ui/separator.d.ts.map +1 -0
- package/dist/ui/separator.js +7 -0
- package/dist/ui/separator.js.map +1 -0
- package/dist/ui/table.d.ts +10 -0
- package/dist/ui/table.d.ts.map +1 -0
- package/dist/ui/table.js +20 -0
- package/dist/ui/table.js.map +1 -0
- package/dist/ui/textarea.d.ts +3 -0
- package/dist/ui/textarea.d.ts.map +1 -0
- package/dist/ui/textarea.js +8 -0
- package/dist/ui/textarea.js.map +1 -0
- package/dist/zones/AdminContributionsProvider.d.ts +72 -0
- package/dist/zones/AdminContributionsProvider.d.ts.map +1 -0
- package/dist/zones/AdminContributionsProvider.js +63 -0
- package/dist/zones/AdminContributionsProvider.js.map +1 -0
- package/dist/zones/AdminZone.d.ts +30 -0
- package/dist/zones/AdminZone.d.ts.map +1 -0
- package/dist/zones/AdminZone.js +59 -0
- package/dist/zones/AdminZone.js.map +1 -0
- package/dist/zones/RouteTabsZone.d.ts +62 -0
- package/dist/zones/RouteTabsZone.d.ts.map +1 -0
- package/dist/zones/RouteTabsZone.js +25 -0
- package/dist/zones/RouteTabsZone.js.map +1 -0
- package/dist/zones/ZoneErrorBoundary.d.ts +36 -0
- package/dist/zones/ZoneErrorBoundary.d.ts.map +1 -0
- package/dist/zones/ZoneErrorBoundary.js +44 -0
- package/dist/zones/ZoneErrorBoundary.js.map +1 -0
- package/dist/zones/index.d.ts +31 -0
- package/dist/zones/index.d.ts.map +1 -0
- package/dist/zones/index.js +27 -0
- package/dist/zones/index.js.map +1 -0
- package/dist/zones/use-admin-zone.d.ts +32 -0
- package/dist/zones/use-admin-zone.d.ts.map +1 -0
- package/dist/zones/use-admin-zone.js +96 -0
- package/dist/zones/use-admin-zone.js.map +1 -0
- package/package.json +94 -3
- package/tailwind.css +14 -0
- package/theme.css +2056 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CategoryTreeNodeRow.js","sourceRoot":"","sources":["../../../src/components/category-tree-picker/CategoryTreeNodeRow.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAkB,MAAM,OAAO,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAyB,MAAM,0BAA0B,CAAC;AAgB1F,MAAM,UAAU,mBAAmB,CAAC,KAA+B;IACjE,MAAM,KAAK,GAAG,uBAAuB,CACnC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EACxB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EACxB,KAAK,CAAC,MAAM,CACb,CAAC;IACF,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;IACrE,MAAM,WAAW,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAEnD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACxB,WAAW,CAAC,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;QACpD,CAAC;IACH,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAEnC,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,8CAA8C,EAC9C,aAAa,IAAI,cAAc,CAChC,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,aAEvD,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CACnB,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,IAAI,EACT,SAAS,EAAC,sBAAsB,EAChC,QAAQ,EAAE,KAAK,CAAC,QAAQ,mBACT,KAAK,CAAC,QAAQ,gBACjB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EACpE,OAAO,EAAE,KAAK,CAAC,cAAc,YAE5B,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAC,WAAW,IAAC,IAAI,EAAE,EAAE,GAAI,CAAC,CAAC,CAAC,KAAC,YAAY,IAAC,IAAI,EAAE,EAAE,GAAI,GACjE,CACV,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,+BAA+B,wBAAe,CAC/D,EACD,KAAC,QAAQ,IACP,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ,kBACV,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,gBACzC,KAAK,EACjB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,GAAS,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,GAC5C,EACF,eACE,SAAS,EAAE,EAAE,CAAC,kBAAkB,EAAE,aAAa,IAAI,6BAA6B,CAAC,EACjF,KAAK,EAAE,KAAK,YAEX,KAAK,GACD,IACH,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import { type CategoryTreePickerCategory } from './category-tree-utils.js';
|
|
3
|
+
export interface CategoryTreePickerProps {
|
|
4
|
+
categories: CategoryTreePickerCategory[];
|
|
5
|
+
selectedIds: string[];
|
|
6
|
+
onChange: (ids: string[]) => void;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
loading?: boolean;
|
|
9
|
+
error?: string | null;
|
|
10
|
+
className?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* **Its copy is `core`'s, not `catalog`'s** (R-1, 2026-08-31). The component
|
|
14
|
+
* called `useTranslation('catalog')` from Phase 1b, which `admin-kit-surface.md`
|
|
15
|
+
* R6 rules is module knowledge for the same reason an admin API client is: the
|
|
16
|
+
* bundle behind a namespace is shipped by a module package the kit does not and
|
|
17
|
+
* may not depend on, resolved at runtime by string, and a renamed key renders
|
|
18
|
+
* `core.<key>` at the operator rather than failing to compile. All seven
|
|
19
|
+
* `categoryTreePicker.*` keys moved into `core` under the same spelling; none
|
|
20
|
+
* duplicates a concept `core` already carries, so none is reused.
|
|
21
|
+
*/
|
|
22
|
+
export declare function CategoryTreePicker(props: CategoryTreePickerProps): ReactNode;
|
|
23
|
+
//# sourceMappingURL=CategoryTreePicker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CategoryTreePicker.d.ts","sourceRoot":"","sources":["../../../src/components/category-tree-picker/CategoryTreePicker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAMlF,OAAO,EAQL,KAAK,0BAA0B,EAChC,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,0BAA0B,EAAE,CAAC;IACzC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,SAAS,CAgI5E"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
3
|
+
import { Alert, AlertDescription } from '../../ui/alert.js';
|
|
4
|
+
import { Input } from '../../ui/input.js';
|
|
5
|
+
import { useTranslation } from '../../i18n/useTranslation.js';
|
|
6
|
+
import { useTranslationContext } from '../../i18n/TranslationProvider.js';
|
|
7
|
+
import { CategoryTreeNodeRow } from './CategoryTreeNodeRow.js';
|
|
8
|
+
import { adminLanguageToLocale, ancestorIdsForSelected, buildCategoryTree, computeParentIndeterminateIds, expandedIdsForFilteredTree, filterCategoryTree, visibleFlattenedTree, } from './category-tree-utils.js';
|
|
9
|
+
/**
|
|
10
|
+
* **Its copy is `core`'s, not `catalog`'s** (R-1, 2026-08-31). The component
|
|
11
|
+
* called `useTranslation('catalog')` from Phase 1b, which `admin-kit-surface.md`
|
|
12
|
+
* R6 rules is module knowledge for the same reason an admin API client is: the
|
|
13
|
+
* bundle behind a namespace is shipped by a module package the kit does not and
|
|
14
|
+
* may not depend on, resolved at runtime by string, and a renamed key renders
|
|
15
|
+
* `core.<key>` at the operator rather than failing to compile. All seven
|
|
16
|
+
* `categoryTreePicker.*` keys moved into `core` under the same spelling; none
|
|
17
|
+
* duplicates a concept `core` already carries, so none is reused.
|
|
18
|
+
*/
|
|
19
|
+
export function CategoryTreePicker(props) {
|
|
20
|
+
const t = useTranslation('core');
|
|
21
|
+
const { language } = useTranslationContext();
|
|
22
|
+
const locale = adminLanguageToLocale(language);
|
|
23
|
+
const [expandedIds, setExpandedIds] = useState(() => new Set());
|
|
24
|
+
const [filterQuery, setFilterQuery] = useState('');
|
|
25
|
+
const tree = useMemo(() => buildCategoryTree(props.categories), [props.categories]);
|
|
26
|
+
const filterActive = filterQuery.trim().length > 0;
|
|
27
|
+
const filteredTree = useMemo(() => (filterActive ? filterCategoryTree(tree, filterQuery, locale) : tree), [tree, filterQuery, filterActive, locale]);
|
|
28
|
+
const effectiveExpanded = useMemo(() => {
|
|
29
|
+
if (filterActive)
|
|
30
|
+
return expandedIdsForFilteredTree(filteredTree);
|
|
31
|
+
return expandedIds;
|
|
32
|
+
}, [filterActive, filteredTree, expandedIds]);
|
|
33
|
+
const visibleRows = useMemo(() => visibleFlattenedTree(filteredTree, effectiveExpanded, filterActive), [filteredTree, effectiveExpanded, filterActive]);
|
|
34
|
+
const selectedSet = useMemo(() => new Set(props.selectedIds), [props.selectedIds]);
|
|
35
|
+
const indeterminateIds = useMemo(() => computeParentIndeterminateIds(tree, selectedSet), [tree, selectedSet]);
|
|
36
|
+
// Keep branches expanded up to each selected category so deep picks are visible.
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
const ancestors = ancestorIdsForSelected(props.categories, selectedSet);
|
|
39
|
+
if (ancestors.size === 0)
|
|
40
|
+
return;
|
|
41
|
+
setExpandedIds((prev) => {
|
|
42
|
+
const next = new Set(prev);
|
|
43
|
+
let changed = false;
|
|
44
|
+
for (const id of ancestors) {
|
|
45
|
+
if (!next.has(id)) {
|
|
46
|
+
next.add(id);
|
|
47
|
+
changed = true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return changed ? next : prev;
|
|
51
|
+
});
|
|
52
|
+
}, [props.categories, selectedSet]);
|
|
53
|
+
const toggleExpand = useCallback((id) => {
|
|
54
|
+
setExpandedIds((prev) => {
|
|
55
|
+
const next = new Set(prev);
|
|
56
|
+
if (next.has(id))
|
|
57
|
+
next.delete(id);
|
|
58
|
+
else
|
|
59
|
+
next.add(id);
|
|
60
|
+
return next;
|
|
61
|
+
});
|
|
62
|
+
}, []);
|
|
63
|
+
const toggleSelect = useCallback((id) => {
|
|
64
|
+
if (props.disabled)
|
|
65
|
+
return;
|
|
66
|
+
if (selectedSet.has(id)) {
|
|
67
|
+
props.onChange(props.selectedIds.filter((x) => x !== id));
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
props.onChange([...props.selectedIds, id]);
|
|
71
|
+
}
|
|
72
|
+
}, [props, selectedSet]);
|
|
73
|
+
const wrapperClass = props.className ? `space-y-2 ${props.className}` : 'space-y-2';
|
|
74
|
+
if (props.loading) {
|
|
75
|
+
return _jsx("p", { className: "text-sm text-muted-foreground", children: t('categoryTreePicker.loading') });
|
|
76
|
+
}
|
|
77
|
+
if (props.error) {
|
|
78
|
+
return (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: props.error }) }));
|
|
79
|
+
}
|
|
80
|
+
return (_jsxs("div", { className: wrapperClass, children: [_jsx(Input, { type: "search", value: filterQuery, disabled: props.disabled, placeholder: t('categoryTreePicker.filter.placeholder'), "aria-label": t('categoryTreePicker.filter.placeholder'), onChange: (e) => setFilterQuery(e.target.value) }), _jsx("div", { id: "category-tree-picker-list", role: "tree", "aria-label": t('categoryTreePicker.aria.treeLabel'), className: "max-h-64 overflow-y-auto rounded-md border border-input p-1", children: props.categories.length === 0 ? (_jsx("p", { className: "px-2 py-3 text-sm text-muted-foreground", children: t('categoryTreePicker.empty.noCategories') })) : visibleRows.length === 0 ? (_jsx("p", { className: "px-2 py-3 text-sm text-muted-foreground", children: t('categoryTreePicker.empty.noMatches') })) : (visibleRows.map(({ node, expanded, hasChildren }) => (_jsx(CategoryTreeNodeRow, { node: node, locale: locale, checked: selectedSet.has(node.category.id), indeterminate: indeterminateIds.has(node.category.id), disabled: props.disabled ?? false, hasChildren: hasChildren, expanded: expanded, expandLabel: t('categoryTreePicker.expand'), collapseLabel: t('categoryTreePicker.collapse'), onToggleExpand: () => toggleExpand(node.category.id), onToggleSelect: () => toggleSelect(node.category.id) }, node.category.id)))) })] }));
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=CategoryTreePicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CategoryTreePicker.js","sourceRoot":"","sources":["../../../src/components/category-tree-picker/CategoryTreePicker.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface CategoryTreePickerCategory {
|
|
2
|
+
id: string;
|
|
3
|
+
parentCategoryId: string | null;
|
|
4
|
+
name: Record<string, string>;
|
|
5
|
+
slug: string;
|
|
6
|
+
sortOrder: number;
|
|
7
|
+
}
|
|
8
|
+
export interface CategoryTreeNode {
|
|
9
|
+
category: CategoryTreePickerCategory;
|
|
10
|
+
depth: number;
|
|
11
|
+
children: CategoryTreeNode[];
|
|
12
|
+
}
|
|
13
|
+
export declare function adminLanguageToLocale(language: string): string;
|
|
14
|
+
export declare function pickCategoryDisplayName(name: Record<string, string>, slug: string, locale: string): string;
|
|
15
|
+
export declare function buildCategoryTree(rows: CategoryTreePickerCategory[]): CategoryTreeNode[];
|
|
16
|
+
export declare function flattenCategoryTree(nodes: CategoryTreeNode[]): CategoryTreeNode[];
|
|
17
|
+
/** Returns visible nodes when filter is active (matched nodes + ancestors). */
|
|
18
|
+
export declare function filterCategoryTree(nodes: CategoryTreeNode[], query: string, locale: string): CategoryTreeNode[];
|
|
19
|
+
/** Node ids that must render expanded while a filter is active. */
|
|
20
|
+
export declare function expandedIdsForFilteredTree(nodes: CategoryTreeNode[]): Set<string>;
|
|
21
|
+
/** True when this node or any descendant is in `selected`. */
|
|
22
|
+
export declare function subtreeHasSelection(node: CategoryTreeNode, selected: ReadonlySet<string>): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Parent nodes that should show indeterminate checkbox: some descendant is
|
|
25
|
+
* selected but the parent itself is not.
|
|
26
|
+
*/
|
|
27
|
+
export declare function computeParentIndeterminateIds(nodes: CategoryTreeNode[], selected: ReadonlySet<string>): Set<string>;
|
|
28
|
+
/** Ancestor category ids to expand so deep selections stay visible. */
|
|
29
|
+
export declare function ancestorIdsForSelected(categories: CategoryTreePickerCategory[], selected: ReadonlySet<string>): Set<string>;
|
|
30
|
+
export declare function visibleFlattenedTree(nodes: CategoryTreeNode[], expandedIds: Set<string>, filterActive: boolean): Array<{
|
|
31
|
+
node: CategoryTreeNode;
|
|
32
|
+
expanded: boolean;
|
|
33
|
+
hasChildren: boolean;
|
|
34
|
+
}>;
|
|
35
|
+
//# sourceMappingURL=category-tree-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"category-tree-utils.d.ts","sourceRoot":"","sources":["../../../src/components/category-tree-picker/category-tree-utils.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,0BAA0B,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAOD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,MAAM,CAQR;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,0BAA0B,EAAE,GAAG,gBAAgB,EAAE,CAoBxF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAOjF;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,gBAAgB,EAAE,EACzB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,gBAAgB,EAAE,CAqBpB;AAED,mEAAmE;AACnE,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAYjF;AAED,8DAA8D;AAC9D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAGlG;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,gBAAgB,EAAE,EACzB,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,GAC5B,GAAG,CAAC,MAAM,CAAC,CAiBb;AAED,uEAAuE;AACvE,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,0BAA0B,EAAE,EACxC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,GAC5B,GAAG,CAAC,MAAM,CAAC,CAWb;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,gBAAgB,EAAE,EACzB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EACxB,YAAY,EAAE,OAAO,GACpB,KAAK,CAAC;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAAC,CAgB5E"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { normalize } from '../../lib/text-normalization.js';
|
|
2
|
+
const LOCALE_BY_ADMIN_LANGUAGE = {
|
|
3
|
+
en: 'en-US',
|
|
4
|
+
pl: 'pl-PL',
|
|
5
|
+
};
|
|
6
|
+
export function adminLanguageToLocale(language) {
|
|
7
|
+
return LOCALE_BY_ADMIN_LANGUAGE[language] ?? 'en-US';
|
|
8
|
+
}
|
|
9
|
+
export function pickCategoryDisplayName(name, slug, locale) {
|
|
10
|
+
const direct = name[locale]?.trim();
|
|
11
|
+
if (direct)
|
|
12
|
+
return direct;
|
|
13
|
+
const en = name['en-US']?.trim();
|
|
14
|
+
if (en)
|
|
15
|
+
return en;
|
|
16
|
+
const first = Object.values(name).find((v) => v?.trim());
|
|
17
|
+
if (first?.trim())
|
|
18
|
+
return first.trim();
|
|
19
|
+
return slug;
|
|
20
|
+
}
|
|
21
|
+
export function buildCategoryTree(rows) {
|
|
22
|
+
const byParent = new Map();
|
|
23
|
+
for (const row of rows) {
|
|
24
|
+
const key = row.parentCategoryId;
|
|
25
|
+
const arr = byParent.get(key) ?? [];
|
|
26
|
+
arr.push(row);
|
|
27
|
+
byParent.set(key, arr);
|
|
28
|
+
}
|
|
29
|
+
function build(parentId, depth) {
|
|
30
|
+
return (byParent.get(parentId) ?? [])
|
|
31
|
+
.sort((a, b) => a.sortOrder - b.sortOrder || a.slug.localeCompare(b.slug))
|
|
32
|
+
.map((category) => ({
|
|
33
|
+
category,
|
|
34
|
+
depth,
|
|
35
|
+
children: build(category.id, depth + 1),
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
return build(null, 0);
|
|
39
|
+
}
|
|
40
|
+
export function flattenCategoryTree(nodes) {
|
|
41
|
+
const out = [];
|
|
42
|
+
for (const node of nodes) {
|
|
43
|
+
out.push(node);
|
|
44
|
+
out.push(...flattenCategoryTree(node.children));
|
|
45
|
+
}
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
/** Returns visible nodes when filter is active (matched nodes + ancestors). */
|
|
49
|
+
export function filterCategoryTree(nodes, query, locale) {
|
|
50
|
+
const q = normalize(query);
|
|
51
|
+
if (!q)
|
|
52
|
+
return nodes;
|
|
53
|
+
function filterList(list) {
|
|
54
|
+
const out = [];
|
|
55
|
+
for (const node of list) {
|
|
56
|
+
const label = pickCategoryDisplayName(node.category.name, node.category.slug, locale);
|
|
57
|
+
const selfMatch = normalize(label).includes(q);
|
|
58
|
+
const filteredChildren = filterList(node.children);
|
|
59
|
+
if (selfMatch || filteredChildren.length > 0) {
|
|
60
|
+
out.push({
|
|
61
|
+
...node,
|
|
62
|
+
children: filteredChildren,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return out;
|
|
67
|
+
}
|
|
68
|
+
return filterList(nodes);
|
|
69
|
+
}
|
|
70
|
+
/** Node ids that must render expanded while a filter is active. */
|
|
71
|
+
export function expandedIdsForFilteredTree(nodes) {
|
|
72
|
+
const ids = new Set();
|
|
73
|
+
function walk(list) {
|
|
74
|
+
for (const node of list) {
|
|
75
|
+
if (node.children.length > 0) {
|
|
76
|
+
ids.add(node.category.id);
|
|
77
|
+
walk(node.children);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
walk(nodes);
|
|
82
|
+
return ids;
|
|
83
|
+
}
|
|
84
|
+
/** True when this node or any descendant is in `selected`. */
|
|
85
|
+
export function subtreeHasSelection(node, selected) {
|
|
86
|
+
if (selected.has(node.category.id))
|
|
87
|
+
return true;
|
|
88
|
+
return node.children.some((child) => subtreeHasSelection(child, selected));
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Parent nodes that should show indeterminate checkbox: some descendant is
|
|
92
|
+
* selected but the parent itself is not.
|
|
93
|
+
*/
|
|
94
|
+
export function computeParentIndeterminateIds(nodes, selected) {
|
|
95
|
+
const indeterminate = new Set();
|
|
96
|
+
function walk(node) {
|
|
97
|
+
let anyBelow = false;
|
|
98
|
+
for (const child of node.children) {
|
|
99
|
+
if (walk(child))
|
|
100
|
+
anyBelow = true;
|
|
101
|
+
}
|
|
102
|
+
const self = selected.has(node.category.id);
|
|
103
|
+
if (anyBelow && !self && node.children.length > 0) {
|
|
104
|
+
indeterminate.add(node.category.id);
|
|
105
|
+
}
|
|
106
|
+
return self || anyBelow;
|
|
107
|
+
}
|
|
108
|
+
for (const root of nodes)
|
|
109
|
+
walk(root);
|
|
110
|
+
return indeterminate;
|
|
111
|
+
}
|
|
112
|
+
/** Ancestor category ids to expand so deep selections stay visible. */
|
|
113
|
+
export function ancestorIdsForSelected(categories, selected) {
|
|
114
|
+
const parentById = new Map(categories.map((c) => [c.id, c.parentCategoryId]));
|
|
115
|
+
const ancestors = new Set();
|
|
116
|
+
for (const id of selected) {
|
|
117
|
+
let parentId = parentById.get(id) ?? null;
|
|
118
|
+
while (parentId) {
|
|
119
|
+
ancestors.add(parentId);
|
|
120
|
+
parentId = parentById.get(parentId) ?? null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return ancestors;
|
|
124
|
+
}
|
|
125
|
+
export function visibleFlattenedTree(nodes, expandedIds, filterActive) {
|
|
126
|
+
const rows = [];
|
|
127
|
+
function walk(list) {
|
|
128
|
+
for (const node of list) {
|
|
129
|
+
const hasChildren = node.children.length > 0;
|
|
130
|
+
const expanded = filterActive || expandedIds.has(node.category.id);
|
|
131
|
+
rows.push({ node, expanded, hasChildren });
|
|
132
|
+
if (hasChildren && expanded) {
|
|
133
|
+
walk(node.children);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
walk(nodes);
|
|
138
|
+
return rows;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=category-tree-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"category-tree-utils.js","sourceRoot":"","sources":["../../../src/components/category-tree-picker/category-tree-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/category-tree-picker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACvE,YAAY,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/category-tree-picker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type CSSProperties } from 'react';
|
|
2
|
+
import type { ECElementEvent, EChartsOption, EChartsType } from 'echarts';
|
|
3
|
+
export type EChartEventHandler = (params: ECElementEvent) => void;
|
|
4
|
+
export interface EChartProps {
|
|
5
|
+
/** Full ECharts option object. Replacing it re-renders the chart. */
|
|
6
|
+
option: EChartsOption;
|
|
7
|
+
/** When true (default) the option fully replaces the previous one. */
|
|
8
|
+
notMerge?: boolean;
|
|
9
|
+
/** Map of ECharts event name → handler, e.g. `{ click: fn }`. Memoize it. */
|
|
10
|
+
onEvents?: Record<string, EChartEventHandler>;
|
|
11
|
+
/** Called once with the live instance after init (for dispatchAction, etc.). */
|
|
12
|
+
onReady?: (chart: EChartsType) => void;
|
|
13
|
+
className?: string;
|
|
14
|
+
style?: CSSProperties;
|
|
15
|
+
}
|
|
16
|
+
export declare function EChart({ option, notMerge, onEvents, onReady, className, style, }: EChartProps): React.ReactNode;
|
|
17
|
+
//# sourceMappingURL=echart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"echart.d.ts","sourceRoot":"","sources":["../../../src/components/charts/echart.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE1E,MAAM,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;AAElE,MAAM,WAAW,WAAW;IAC1B,qEAAqE;IACrE,MAAM,EAAE,aAAa,CAAC;IACtB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC9C,gFAAgF;IAChF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,wBAAgB,MAAM,CAAC,EACrB,MAAM,EACN,QAAe,EACf,QAAQ,EACR,OAAO,EACP,SAAS,EACT,KAAK,GACN,EAAE,WAAW,GAAG,KAAK,CAAC,SAAS,CA+C/B"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// Thin, reusable React wrapper around Apache ECharts.
|
|
3
|
+
//
|
|
4
|
+
// Owns the lifecycle the way React can't: it creates the chart instance once,
|
|
5
|
+
// keeps it sized to its container via a ResizeObserver, pushes new `option`
|
|
6
|
+
// objects on change, and disposes on unmount. Event handlers are (re)bound
|
|
7
|
+
// whenever `onEvents` changes — memoize that map in the caller to avoid churn.
|
|
8
|
+
//
|
|
9
|
+
// Intended as the shared charting primitive for the admin panel (status-graph
|
|
10
|
+
// editor today, analytics module later), so it stays chart-type agnostic: the
|
|
11
|
+
// caller supplies a full `EChartsOption`.
|
|
12
|
+
//
|
|
13
|
+
// <EChart option={option} className="h-96 w-full" onEvents={events} />
|
|
14
|
+
import { useEffect, useRef } from 'react';
|
|
15
|
+
import * as echarts from 'echarts';
|
|
16
|
+
export function EChart({ option, notMerge = true, onEvents, onReady, className, style, }) {
|
|
17
|
+
const containerRef = useRef(null);
|
|
18
|
+
const chartRef = useRef(null);
|
|
19
|
+
const onReadyRef = useRef(onReady);
|
|
20
|
+
onReadyRef.current = onReady;
|
|
21
|
+
// Create the instance once and keep it sized to the container.
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
const el = containerRef.current;
|
|
24
|
+
if (!el)
|
|
25
|
+
return;
|
|
26
|
+
const chart = echarts.init(el);
|
|
27
|
+
chartRef.current = chart;
|
|
28
|
+
onReadyRef.current?.(chart);
|
|
29
|
+
const observer = new ResizeObserver(() => chart.resize());
|
|
30
|
+
observer.observe(el);
|
|
31
|
+
// When the chart mounts inside a flex/grid child, its final width may only
|
|
32
|
+
// be known after the first layout pass — resize on the next frame so the
|
|
33
|
+
// canvas fills the full container width instead of an initial narrow guess.
|
|
34
|
+
const raf = requestAnimationFrame(() => chart.resize());
|
|
35
|
+
return () => {
|
|
36
|
+
cancelAnimationFrame(raf);
|
|
37
|
+
observer.disconnect();
|
|
38
|
+
chart.dispose();
|
|
39
|
+
chartRef.current = null;
|
|
40
|
+
};
|
|
41
|
+
}, []);
|
|
42
|
+
// Push option updates.
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
chartRef.current?.setOption(option, notMerge);
|
|
45
|
+
}, [option, notMerge]);
|
|
46
|
+
// (Re)bind event handlers.
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
const chart = chartRef.current;
|
|
49
|
+
if (!chart || !onEvents)
|
|
50
|
+
return;
|
|
51
|
+
const entries = Object.entries(onEvents);
|
|
52
|
+
for (const [event, handler] of entries)
|
|
53
|
+
chart.on(event, handler);
|
|
54
|
+
return () => {
|
|
55
|
+
for (const [event, handler] of entries)
|
|
56
|
+
chart.off(event, handler);
|
|
57
|
+
};
|
|
58
|
+
}, [onEvents]);
|
|
59
|
+
return _jsx("div", { ref: containerRef, className: className, style: style });
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=echart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"echart.js","sourceRoot":"","sources":["../../../src/components/charts/echart.tsx"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,EAAE;AACF,8EAA8E;AAC9E,4EAA4E;AAC5E,2EAA2E;AAC3E,+EAA+E;AAC/E,EAAE;AACF,8EAA8E;AAC9E,8EAA8E;AAC9E,0CAA0C;AAC1C,EAAE;AACF,yEAAyE;AAEzE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAsB,MAAM,OAAO,CAAC;AAC9D,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAkBnC,MAAM,UAAU,MAAM,CAAC,EACrB,MAAM,EACN,QAAQ,GAAG,IAAI,EACf,QAAQ,EACR,OAAO,EACP,SAAS,EACT,KAAK,GACO;IACZ,MAAM,YAAY,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IAE7B,+DAA+D;IAC/D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC;QAChC,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/B,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;QACzB,UAAU,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QAE5B,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1D,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAErB,2EAA2E;QAC3E,yEAAyE;QACzE,4EAA4E;QAC5E,MAAM,GAAG,GAAG,qBAAqB,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAExD,OAAO,GAAG,EAAE;YACV,oBAAoB,CAAC,GAAG,CAAC,CAAC;YAC1B,QAAQ,CAAC,UAAU,EAAE,CAAC;YACtB,KAAK,CAAC,OAAO,EAAE,CAAC;YAChB,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1B,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,uBAAuB;IACvB,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChD,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEvB,2BAA2B;IAC3B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ;YAAE,OAAO;QAChC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzC,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,OAAO;YAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAgB,CAAC,CAAC;QAC1E,OAAO,GAAG,EAAE;YACV,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,OAAO;gBAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,OAAgB,CAAC,CAAC;QAC7E,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,OAAO,cAAK,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,GAAI,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface CmsBlockPickerProps {
|
|
3
|
+
value: string | null;
|
|
4
|
+
onChange: (blockId: string | null) => void;
|
|
5
|
+
placeholder?: string;
|
|
6
|
+
emptyMessage?: string;
|
|
7
|
+
clearable?: boolean;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
ariaLabel?: string;
|
|
10
|
+
id?: string;
|
|
11
|
+
className?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function CmsBlockPicker(props: CmsBlockPickerProps): ReactNode;
|
|
14
|
+
//# sourceMappingURL=CmsBlockPicker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CmsBlockPicker.d.ts","sourceRoot":"","sources":["../../../src/components/cms-picker/CmsBlockPicker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AA4BrE,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,SAAS,CAgDpE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
3
|
+
// `apiClient` comes through the kit's published `lib` **barrel** rather than
|
|
4
|
+
// through `../../lib/api-client.js` — see the note in
|
|
5
|
+
// `../sales-channel-picker/SalesChannelPicker.tsx`: the barrel is the only
|
|
6
|
+
// spelling `vi.mock` can name from outside the package.
|
|
7
|
+
import { ApiError, apiClient } from '../../lib/index.js';
|
|
8
|
+
import { Combobox } from '../../ui/combobox.js';
|
|
9
|
+
export function CmsBlockPicker(props) {
|
|
10
|
+
const [blocks, setBlocks] = useState([]);
|
|
11
|
+
const [loading, setLoading] = useState(true);
|
|
12
|
+
const [error, setError] = useState(null);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
let alive = true;
|
|
15
|
+
setLoading(true);
|
|
16
|
+
apiClient
|
|
17
|
+
.get('/api/v1/admin/cms/blocks')
|
|
18
|
+
.then((res) => {
|
|
19
|
+
if (!alive)
|
|
20
|
+
return;
|
|
21
|
+
setBlocks(res.data);
|
|
22
|
+
})
|
|
23
|
+
.catch((err) => {
|
|
24
|
+
if (!alive)
|
|
25
|
+
return;
|
|
26
|
+
setError(err instanceof ApiError ? err.envelope.error.message : 'Failed to load blocks.');
|
|
27
|
+
})
|
|
28
|
+
.finally(() => {
|
|
29
|
+
if (alive)
|
|
30
|
+
setLoading(false);
|
|
31
|
+
});
|
|
32
|
+
return () => {
|
|
33
|
+
alive = false;
|
|
34
|
+
};
|
|
35
|
+
}, []);
|
|
36
|
+
const options = useMemo(() => blocks.map((b) => ({ value: b.id, label: b.name, description: b.code })), [blocks]);
|
|
37
|
+
const emptyMessage = props.emptyMessage ?? error ?? 'No CMS blocks.';
|
|
38
|
+
return (_jsx(Combobox, { options: options, value: props.value, onChange: props.onChange, loading: loading, clearable: props.clearable ?? true, disabled: props.disabled ?? false, placeholder: props.placeholder ?? 'Select a CMS block…', emptyMessage: emptyMessage, ariaLabel: props.ariaLabel ?? 'Select CMS block', id: props.id ?? '', className: props.className ?? '' }));
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=CmsBlockPicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CmsBlockPicker.js","sourceRoot":"","sources":["../../../src/components/cms-picker/CmsBlockPicker.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAErE,6EAA6E;AAC7E,sDAAsD;AACtD,2EAA2E;AAC3E,wDAAwD;AACxD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAuB,MAAM,sBAAsB,CAAC;AAiCrE,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAoB,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,SAAS;aACN,GAAG,CAAuB,0BAA0B,CAAC;aACrD,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YACZ,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACtB,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,QAAQ,CAAC,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;QAC5F,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,IAAI,KAAK;gBAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QACL,OAAO,GAAS,EAAE;YAChB,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAC9E,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,KAAK,IAAI,gBAAgB,CAAC;IAErE,OAAO,CACL,KAAC,QAAQ,IACP,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI,EAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK,EACjC,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,qBAAqB,EACvD,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,kBAAkB,EAChD,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,EAClB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE,GAChC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface CmsPagePickerProps {
|
|
3
|
+
value: string | null;
|
|
4
|
+
onChange: (pageId: string | null) => void;
|
|
5
|
+
salesChannelId?: string;
|
|
6
|
+
placeholder?: string;
|
|
7
|
+
emptyMessage?: string;
|
|
8
|
+
clearable?: boolean;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
ariaLabel?: string;
|
|
11
|
+
id?: string;
|
|
12
|
+
className?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function CmsPagePicker(props: CmsPagePickerProps): ReactNode;
|
|
15
|
+
//# sourceMappingURL=CmsPagePicker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CmsPagePicker.d.ts","sourceRoot":"","sources":["../../../src/components/cms-picker/CmsPagePicker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAyC1F,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,SAAS,CAkFlE"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
3
|
+
// `apiClient` comes through the kit's published `lib` **barrel** rather than
|
|
4
|
+
// through `../../lib/api-client.js` — see the note in
|
|
5
|
+
// `../sales-channel-picker/SalesChannelPicker.tsx`: the barrel is the only
|
|
6
|
+
// spelling `vi.mock` can name from outside the package.
|
|
7
|
+
import { ApiError, apiClient } from '../../lib/index.js';
|
|
8
|
+
import { Combobox } from '../../ui/combobox.js';
|
|
9
|
+
function listCmsPages(query) {
|
|
10
|
+
const params = new URLSearchParams();
|
|
11
|
+
if (query.q)
|
|
12
|
+
params.set('q', query.q);
|
|
13
|
+
if (query.salesChannelId)
|
|
14
|
+
params.set('salesChannelId', query.salesChannelId);
|
|
15
|
+
params.set('limit', String(query.limit));
|
|
16
|
+
return apiClient.get(`/api/v1/admin/cms/pages?${params.toString()}`);
|
|
17
|
+
}
|
|
18
|
+
const SEARCH_DEBOUNCE_MS = 250;
|
|
19
|
+
const DEFAULT_LIMIT = 20;
|
|
20
|
+
export function CmsPagePicker(props) {
|
|
21
|
+
const [cache, setCache] = useState(() => new Map());
|
|
22
|
+
const [options, setOptions] = useState([]);
|
|
23
|
+
const [searching, setSearching] = useState(false);
|
|
24
|
+
const [error, setError] = useState(null);
|
|
25
|
+
const timerRef = useRef(null);
|
|
26
|
+
const seqRef = useRef(0);
|
|
27
|
+
useEffect(() => () => {
|
|
28
|
+
if (timerRef.current !== null)
|
|
29
|
+
clearTimeout(timerRef.current);
|
|
30
|
+
}, []);
|
|
31
|
+
const runSearch = useCallback(async (query, seq) => {
|
|
32
|
+
setSearching(true);
|
|
33
|
+
setError(null);
|
|
34
|
+
try {
|
|
35
|
+
const trimmed = query.trim();
|
|
36
|
+
const res = await listCmsPages({
|
|
37
|
+
limit: DEFAULT_LIMIT,
|
|
38
|
+
...(trimmed.length > 0 ? { q: trimmed } : {}),
|
|
39
|
+
...(props.salesChannelId ? { salesChannelId: props.salesChannelId } : {}),
|
|
40
|
+
});
|
|
41
|
+
if (seq !== seqRef.current)
|
|
42
|
+
return;
|
|
43
|
+
setCache((prev) => {
|
|
44
|
+
const next = new Map(prev);
|
|
45
|
+
for (const p of res.data)
|
|
46
|
+
next.set(p.id, p);
|
|
47
|
+
return next;
|
|
48
|
+
});
|
|
49
|
+
setOptions(res.data.map((p) => ({
|
|
50
|
+
value: p.id,
|
|
51
|
+
label: p.name,
|
|
52
|
+
description: `/${p.slug}${p.status === 'published' ? '' : ` · ${p.status}`}`,
|
|
53
|
+
})));
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
if (seq !== seqRef.current)
|
|
57
|
+
return;
|
|
58
|
+
setError(err instanceof ApiError ? err.envelope.error.message : 'Search failed.');
|
|
59
|
+
setOptions([]);
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
if (seq === seqRef.current)
|
|
63
|
+
setSearching(false);
|
|
64
|
+
}
|
|
65
|
+
}, [props.salesChannelId]);
|
|
66
|
+
const handleSearchChange = useCallback((query) => {
|
|
67
|
+
if (timerRef.current !== null)
|
|
68
|
+
clearTimeout(timerRef.current);
|
|
69
|
+
const seq = ++seqRef.current;
|
|
70
|
+
timerRef.current = setTimeout(() => void runSearch(query, seq), SEARCH_DEBOUNCE_MS);
|
|
71
|
+
}, [runSearch]);
|
|
72
|
+
const selectedLabel = useMemo(() => {
|
|
73
|
+
if (!props.value)
|
|
74
|
+
return '';
|
|
75
|
+
return cache.get(props.value)?.name ?? '';
|
|
76
|
+
}, [props.value, cache]);
|
|
77
|
+
const emptyMessage = props.emptyMessage ?? error ?? (searching ? 'Searching…' : 'No matching pages.');
|
|
78
|
+
return (_jsx(Combobox, { options: options, value: props.value, onChange: props.onChange, onSearchChange: handleSearchChange, manualFilter: true, loading: searching, clearable: props.clearable ?? true, disabled: props.disabled ?? false, placeholder: props.placeholder ?? 'Search CMS pages…', emptyMessage: emptyMessage, ariaLabel: props.ariaLabel ?? 'Select CMS page', id: props.id ?? '', className: props.className ?? '', selectedLabel: selectedLabel }));
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=CmsPagePicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CmsPagePicker.js","sourceRoot":"","sources":["../../../src/components/cms-picker/CmsPagePicker.tsx"],"names":[],"mappings":"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"}
|