@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,30 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* A tab strip over content language codes: the caller passes the codes and the
|
|
4
|
+
* active one in, and gets the chosen one back.
|
|
5
|
+
*
|
|
6
|
+
* **Published by feature 091, P8.** The component sat under `cms`' admin
|
|
7
|
+
* directory and was rendered by `blog`'s two editors as well as by `cms`' own
|
|
8
|
+
* three — four `cross-module-imports` keys over a strip that holds nothing of
|
|
9
|
+
* `cms`: `admin-component-contribution.md` Z1 question 1 (value in, value back)
|
|
10
|
+
* settles that the **consumer** decides it appears, which is a published
|
|
11
|
+
* component and not a zone contribution.
|
|
12
|
+
*
|
|
13
|
+
* **Its copy is `core`'s, not `cms`'** (R-1, `admin-kit-surface.md` R6). A
|
|
14
|
+
* translation namespace is module knowledge: the bundle behind one ships in a
|
|
15
|
+
* module package the kit does not and may not depend on, it is resolved at
|
|
16
|
+
* runtime by string, and a key the namespace does not carry renders
|
|
17
|
+
* `core.<key>` at the operator rather than failing to compile. Both of this
|
|
18
|
+
* component's keys had no other reader anywhere in the tree, so they moved to
|
|
19
|
+
* `core` under `contentLanguageTabs.*` rather than being copied.
|
|
20
|
+
*/
|
|
21
|
+
export interface ContentLanguageTabsProps {
|
|
22
|
+
/** The content language codes to offer, in the order they should read. */
|
|
23
|
+
languages: string[];
|
|
24
|
+
/** The code currently selected, or `null` while nothing is. */
|
|
25
|
+
activeLanguage: string | null;
|
|
26
|
+
/** The caller commits the chosen code. */
|
|
27
|
+
onChange: (language: string) => void;
|
|
28
|
+
}
|
|
29
|
+
export declare function ContentLanguageTabs({ languages, activeLanguage, onChange, }: ContentLanguageTabsProps): ReactNode;
|
|
30
|
+
//# sourceMappingURL=ContentLanguageTabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContentLanguageTabs.d.ts","sourceRoot":"","sources":["../../../src/components/content-language-tabs/ContentLanguageTabs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,wBAAwB;IACvC,0EAA0E;IAC1E,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,+DAA+D;IAC/D,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,0CAA0C;IAC1C,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,wBAAgB,mBAAmB,CAAC,EAClC,SAAS,EACT,cAAc,EACd,QAAQ,GACT,EAAE,wBAAwB,GAAG,SAAS,CA+BtC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Button } from '../../ui/button.js';
|
|
3
|
+
import { useTranslation } from '../../i18n/useTranslation.js';
|
|
4
|
+
export function ContentLanguageTabs({ languages, activeLanguage, onChange, }) {
|
|
5
|
+
const t = useTranslation('core');
|
|
6
|
+
if (languages.length === 0) {
|
|
7
|
+
return _jsx("p", { className: "text-sm text-muted-foreground", children: t('contentLanguageTabs.empty') });
|
|
8
|
+
}
|
|
9
|
+
return (_jsx("div", { className: "flex flex-wrap gap-2", role: "tablist", "aria-label": t('contentLanguageTabs.ariaLabel'), children: languages.map((language) => {
|
|
10
|
+
const active = language === activeLanguage;
|
|
11
|
+
return (_jsx(Button, { type: "button", variant: active ? 'default' : 'outline', size: "sm", onClick: () => onChange(language), role: "tab", "aria-selected": active, children: language }, language));
|
|
12
|
+
}) }));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=ContentLanguageTabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContentLanguageTabs.js","sourceRoot":"","sources":["../../../src/components/content-language-tabs/ContentLanguageTabs.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AA8B9D,MAAM,UAAU,mBAAmB,CAAC,EAClC,SAAS,EACT,cAAc,EACd,QAAQ,GACiB;IACzB,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAEjC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,YAAG,SAAS,EAAC,+BAA+B,YAAE,CAAC,CAAC,2BAA2B,CAAC,GAAK,CAAC;IAC3F,CAAC;IAED,OAAO,CACL,cACE,SAAS,EAAC,sBAAsB,EAChC,IAAI,EAAC,SAAS,gBACF,CAAC,CAAC,+BAA+B,CAAC,YAE7C,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC1B,MAAM,MAAM,GAAG,QAAQ,KAAK,cAAc,CAAC;YAC3C,OAAO,CACL,KAAC,MAAM,IAEL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EACvC,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACjC,IAAI,EAAC,KAAK,mBACK,MAAM,YAEpB,QAAQ,IARJ,QAAQ,CASN,CACV,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface CountrySelectProps {
|
|
3
|
+
/** Selected ISO 3166-1 alpha-2 country code (e.g. "PL"), or null when empty. */
|
|
4
|
+
value: string | null;
|
|
5
|
+
/** Fires with the new alpha-2 code, or null when cleared. */
|
|
6
|
+
onChange: (code: string | null) => void;
|
|
7
|
+
id?: string;
|
|
8
|
+
ariaLabel?: string;
|
|
9
|
+
className?: string;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
/** Hide the clear button (e.g. when the field is required). Defaults to false. */
|
|
12
|
+
clearable?: boolean;
|
|
13
|
+
placeholder?: string;
|
|
14
|
+
emptyMessage?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* CountrySelect — a searchable country dropdown for any Admin UI form.
|
|
18
|
+
*
|
|
19
|
+
* Wraps the design-system <Combobox /> over the dictionary's active country
|
|
20
|
+
* list (locale-resolved labels, served by the public dictionary facade and
|
|
21
|
+
* shared across instances via {@link useCountriesQuery}). The committed value
|
|
22
|
+
* is the ISO 3166-1 alpha-2 code, matching what address payloads expect.
|
|
23
|
+
*
|
|
24
|
+
* Drop it in wherever a country needs picking instead of a free-text field:
|
|
25
|
+
*
|
|
26
|
+
* <CountrySelect value={code} onChange={setCode} ariaLabel="country" />
|
|
27
|
+
*/
|
|
28
|
+
export declare function CountrySelect(props: CountrySelectProps): ReactNode;
|
|
29
|
+
//# sourceMappingURL=CountrySelect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CountrySelect.d.ts","sourceRoot":"","sources":["../../../src/components/country-select/CountrySelect.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAMhD,MAAM,WAAW,kBAAkB;IACjC,gFAAgF;IAChF,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,6DAA6D;IAC7D,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACxC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kFAAkF;IAClF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,SAAS,CA4ClE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo } from 'react';
|
|
3
|
+
import { Combobox } from '../../ui/combobox.js';
|
|
4
|
+
import { useTranslation } from '../../i18n/useTranslation.js';
|
|
5
|
+
import { useAppLanguage } from '../../i18n/app-language-context.js';
|
|
6
|
+
import { useCountriesQuery } from './useCountriesQuery.js';
|
|
7
|
+
/**
|
|
8
|
+
* CountrySelect — a searchable country dropdown for any Admin UI form.
|
|
9
|
+
*
|
|
10
|
+
* Wraps the design-system <Combobox /> over the dictionary's active country
|
|
11
|
+
* list (locale-resolved labels, served by the public dictionary facade and
|
|
12
|
+
* shared across instances via {@link useCountriesQuery}). The committed value
|
|
13
|
+
* is the ISO 3166-1 alpha-2 code, matching what address payloads expect.
|
|
14
|
+
*
|
|
15
|
+
* Drop it in wherever a country needs picking instead of a free-text field:
|
|
16
|
+
*
|
|
17
|
+
* <CountrySelect value={code} onChange={setCode} ariaLabel="country" />
|
|
18
|
+
*/
|
|
19
|
+
export function CountrySelect(props) {
|
|
20
|
+
const t = useTranslation('core');
|
|
21
|
+
const { language } = useAppLanguage();
|
|
22
|
+
const { countries, loading, error } = useCountriesQuery(language);
|
|
23
|
+
const options = useMemo(() => countries.map((c) => ({
|
|
24
|
+
value: c.code,
|
|
25
|
+
label: `${c.label} (${c.code})`,
|
|
26
|
+
})), [countries]);
|
|
27
|
+
// Keep the selected code visible even before the list resolves, or if the
|
|
28
|
+
// stored code is no longer an active country (archived dictionary entry).
|
|
29
|
+
const selected = props.value
|
|
30
|
+
? (countries.find((c) => c.code === props.value)?.label ?? props.value)
|
|
31
|
+
: '';
|
|
32
|
+
const emptyMessage = props.emptyMessage ??
|
|
33
|
+
(loading
|
|
34
|
+
? t('countrySelect.loading')
|
|
35
|
+
: error
|
|
36
|
+
? t('countrySelect.error')
|
|
37
|
+
: t('countrySelect.empty'));
|
|
38
|
+
return (_jsx(Combobox, { ...(props.id ? { id: props.id } : {}), ...(props.ariaLabel ? { ariaLabel: props.ariaLabel } : {}), ...(props.className ? { className: props.className } : {}), options: options, value: props.value && props.value !== '' ? props.value : null, selectedLabel: props.value ? `${selected}${selected === props.value ? '' : ` (${props.value})`}` : '', onChange: (next) => props.onChange(next), disabled: props.disabled ?? false, loading: loading, clearable: props.clearable ?? false, placeholder: props.placeholder ?? t('countrySelect.placeholder'), emptyMessage: emptyMessage }));
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=CountrySelect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CountrySelect.js","sourceRoot":"","sources":["../../../src/components/country-select/CountrySelect.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/country-select/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/country-select/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA2B,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAgC,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ResolvedCountry } from '@endora-commerce/contracts';
|
|
2
|
+
export interface UseCountriesQueryResult {
|
|
3
|
+
countries: ResolvedCountry[];
|
|
4
|
+
loading: boolean;
|
|
5
|
+
error: boolean;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Returns the active dictionary countries (locale-resolved labels, sorted by
|
|
9
|
+
* the dictionary `sortOrder`). Shared/memoised across instances per locale.
|
|
10
|
+
*/
|
|
11
|
+
export declare function useCountriesQuery(locale: string): UseCountriesQueryResult;
|
|
12
|
+
//# sourceMappingURL=useCountriesQuery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCountriesQuery.d.ts","sourceRoot":"","sources":["../../../src/components/country-select/useCountriesQuery.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAA8B,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAuB9F,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,uBAAuB,CA4BzE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// Shared loader for the dictionary country list.
|
|
2
|
+
//
|
|
3
|
+
// The active country set is small (~250 rows) and effectively static for
|
|
4
|
+
// the lifetime of a session, so we fetch it once per locale and memoise the
|
|
5
|
+
// in-flight promise at module scope. Multiple <CountrySelect /> instances on
|
|
6
|
+
// the same screen (e.g. delivery + billing address) therefore share a single
|
|
7
|
+
// network request instead of each firing their own.
|
|
8
|
+
//
|
|
9
|
+
// Reads the PUBLIC dictionary facade (`GET /api/v1/dictionary`), which is not
|
|
10
|
+
// gated behind the `dictionary.write` admin permission — so any admin who can
|
|
11
|
+
// reach a form (orders, customers, organizations…) can populate the dropdown
|
|
12
|
+
// regardless of their dictionary access.
|
|
13
|
+
import { useEffect, useState } from 'react';
|
|
14
|
+
import { apiClient } from '../../lib/api-client.js';
|
|
15
|
+
const cache = new Map();
|
|
16
|
+
function load(locale) {
|
|
17
|
+
const cached = cache.get(locale);
|
|
18
|
+
if (cached)
|
|
19
|
+
return cached;
|
|
20
|
+
const params = new URLSearchParams();
|
|
21
|
+
if (locale)
|
|
22
|
+
params.set('locale', locale);
|
|
23
|
+
const query = params.toString();
|
|
24
|
+
const promise = apiClient
|
|
25
|
+
.get(`/api/v1/dictionary${query ? `?${query}` : ''}`)
|
|
26
|
+
.then((res) => res.data.countries)
|
|
27
|
+
.catch((err) => {
|
|
28
|
+
// Don't poison the cache on a transient failure — let the next mount retry.
|
|
29
|
+
cache.delete(locale);
|
|
30
|
+
throw err;
|
|
31
|
+
});
|
|
32
|
+
cache.set(locale, promise);
|
|
33
|
+
return promise;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Returns the active dictionary countries (locale-resolved labels, sorted by
|
|
37
|
+
* the dictionary `sortOrder`). Shared/memoised across instances per locale.
|
|
38
|
+
*/
|
|
39
|
+
export function useCountriesQuery(locale) {
|
|
40
|
+
const [countries, setCountries] = useState([]);
|
|
41
|
+
const [loading, setLoading] = useState(true);
|
|
42
|
+
const [error, setError] = useState(false);
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
let alive = true;
|
|
45
|
+
setLoading(true);
|
|
46
|
+
setError(false);
|
|
47
|
+
void load(locale)
|
|
48
|
+
.then((rows) => {
|
|
49
|
+
if (!alive)
|
|
50
|
+
return;
|
|
51
|
+
setCountries(rows);
|
|
52
|
+
})
|
|
53
|
+
.catch(() => {
|
|
54
|
+
if (!alive)
|
|
55
|
+
return;
|
|
56
|
+
setError(true);
|
|
57
|
+
setCountries([]);
|
|
58
|
+
})
|
|
59
|
+
.finally(() => {
|
|
60
|
+
if (alive)
|
|
61
|
+
setLoading(false);
|
|
62
|
+
});
|
|
63
|
+
return () => {
|
|
64
|
+
alive = false;
|
|
65
|
+
};
|
|
66
|
+
}, [locale]);
|
|
67
|
+
return { countries, loading, error };
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=useCountriesQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCountriesQuery.js","sourceRoot":"","sources":["../../../src/components/country-select/useCountriesQuery.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,EAAE;AACF,yEAAyE;AACzE,4EAA4E;AAC5E,6EAA6E;AAC7E,6EAA6E;AAC7E,oDAAoD;AACpD,EAAE;AACF,8EAA8E;AAC9E,8EAA8E;AAC9E,6EAA6E;AAC7E,yCAAyC;AAEzC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsC,CAAC;AAE5D,SAAS,IAAI,CAAC,MAAc;IAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,IAAI,MAAM;QAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,SAAS;SACtB,GAAG,CAA6B,qBAAqB,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;SAChF,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;SACjC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QACtB,4EAA4E;QAC5E,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrB,MAAM,GAAG,CAAC;IACZ,CAAC,CAAC,CAAC;IACL,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAQD;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAoB,EAAE,CAAC,CAAC;IAClE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE1C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,KAAK,IAAI,CAAC,MAAM,CAAC;aACd,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACb,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,YAAY,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,YAAY,CAAC,EAAE,CAAC,CAAC;QACnB,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,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { SupportedEntityType } from '@endora-commerce/contracts';
|
|
3
|
+
export interface CustomFieldValuesPanelProps {
|
|
4
|
+
entityType: SupportedEntityType;
|
|
5
|
+
/** Current stored values for the host record. */
|
|
6
|
+
values: Record<string, unknown>;
|
|
7
|
+
/** Persist the edited bag. Host owns the write (its own endpoint). */
|
|
8
|
+
save: (values: Record<string, unknown>) => Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Reusable admin panel that renders custom-field value inputs for one host
|
|
12
|
+
* record (feature 055). Fetches the entity type's definitions and maps each
|
|
13
|
+
* `valueType` to a design-system input; the host page supplies `save`.
|
|
14
|
+
*
|
|
15
|
+
* **It is a published component, not a zone contribution** (feature 091, P4e;
|
|
16
|
+
* `admin-component-contribution.md` §9.1). Its props are
|
|
17
|
+
* `(entityType, values, save)` — data in, edited data back — so each of its four
|
|
18
|
+
* call sites hands it the **host's own** stored bag and the host's own writer:
|
|
19
|
+
* `customFieldValues` is a column on the host's row and the host owns the
|
|
20
|
+
* endpoint that writes it, `quote_requests`' optimistic-concurrency header
|
|
21
|
+
* included. Principle XIV working as designed is what puts it there. So the
|
|
22
|
+
* reach was never *"the owner mounts its screen fragment in the consumer's
|
|
23
|
+
* screen"* — nothing here is the owner's code.
|
|
24
|
+
*
|
|
25
|
+
* **The request is built here**, on P2's terms: one `GET` for the definitions,
|
|
26
|
+
* off the published `apiClient` and the owner's contract types, which both sides
|
|
27
|
+
* already compile. No admin API client of another module's crosses the seam, and
|
|
28
|
+
* the two strings come out of `core`, so R6 (as R-1 reads it) is satisfied by
|
|
29
|
+
* construction rather than by exception.
|
|
30
|
+
*
|
|
31
|
+
* **A failed definitions load is not an empty entity type.** The
|
|
32
|
+
* `defs.length === 0` return below used to sit **above** the error `Alert`, so
|
|
33
|
+
* the panel rendered nothing either way and an operator could not tell a broken
|
|
34
|
+
* request from "no custom fields are defined for this entity type". The empty
|
|
35
|
+
* return is now conditional on the load having actually answered.
|
|
36
|
+
*
|
|
37
|
+
* The old ordering was argued to be accidentally right for one case — a 503
|
|
38
|
+
* from a switched-off `custom_fields` — and that case does not exist.
|
|
39
|
+
* `custom_fields` declares `activation.nonDeactivatable`, which since issue #258
|
|
40
|
+
* makes it a **required** module: `requiredModulesFrom` puts it in the
|
|
41
|
+
* composition's required set, `composeModules` refuses a composition that would
|
|
42
|
+
* reach its boot phase without it, and D-69 refuses every disable and every
|
|
43
|
+
* uninstall. A platform that cannot serve this endpoint does not boot, so
|
|
44
|
+
* `MODULE_DISABLED` is unreachable here and there is no branch to preserve for
|
|
45
|
+
* it.
|
|
46
|
+
*/
|
|
47
|
+
export declare function CustomFieldValuesPanel({ entityType, values, save, }: CustomFieldValuesPanelProps): ReactNode;
|
|
48
|
+
//# sourceMappingURL=CustomFieldValuesPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CustomFieldValuesPanel.d.ts","sourceRoot":"","sources":["../../../src/components/custom-field-values/CustomFieldValuesPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACzE,OAAO,KAAK,EAA4B,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAahG,MAAM,WAAW,2BAA2B;IAC1C,UAAU,EAAE,mBAAmB,CAAC;IAChC,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,sEAAsE;IACtE,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,UAAU,EACV,MAAM,EACN,IAAI,GACL,EAAE,2BAA2B,GAAG,SAAS,CA8EzC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, 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 { Alert, AlertDescription } from '../../ui/alert.js';
|
|
9
|
+
import { Button } from '../../ui/button.js';
|
|
10
|
+
import { Card, CardContent, CardHeader, CardTitle } from '../../ui/card.js';
|
|
11
|
+
import { Label } from '../../ui/label.js';
|
|
12
|
+
import { Select } from '../../ui/select.js';
|
|
13
|
+
import { useTranslation } from '../../i18n/useTranslation.js';
|
|
14
|
+
/**
|
|
15
|
+
* Reusable admin panel that renders custom-field value inputs for one host
|
|
16
|
+
* record (feature 055). Fetches the entity type's definitions and maps each
|
|
17
|
+
* `valueType` to a design-system input; the host page supplies `save`.
|
|
18
|
+
*
|
|
19
|
+
* **It is a published component, not a zone contribution** (feature 091, P4e;
|
|
20
|
+
* `admin-component-contribution.md` §9.1). Its props are
|
|
21
|
+
* `(entityType, values, save)` — data in, edited data back — so each of its four
|
|
22
|
+
* call sites hands it the **host's own** stored bag and the host's own writer:
|
|
23
|
+
* `customFieldValues` is a column on the host's row and the host owns the
|
|
24
|
+
* endpoint that writes it, `quote_requests`' optimistic-concurrency header
|
|
25
|
+
* included. Principle XIV working as designed is what puts it there. So the
|
|
26
|
+
* reach was never *"the owner mounts its screen fragment in the consumer's
|
|
27
|
+
* screen"* — nothing here is the owner's code.
|
|
28
|
+
*
|
|
29
|
+
* **The request is built here**, on P2's terms: one `GET` for the definitions,
|
|
30
|
+
* off the published `apiClient` and the owner's contract types, which both sides
|
|
31
|
+
* already compile. No admin API client of another module's crosses the seam, and
|
|
32
|
+
* the two strings come out of `core`, so R6 (as R-1 reads it) is satisfied by
|
|
33
|
+
* construction rather than by exception.
|
|
34
|
+
*
|
|
35
|
+
* **A failed definitions load is not an empty entity type.** The
|
|
36
|
+
* `defs.length === 0` return below used to sit **above** the error `Alert`, so
|
|
37
|
+
* the panel rendered nothing either way and an operator could not tell a broken
|
|
38
|
+
* request from "no custom fields are defined for this entity type". The empty
|
|
39
|
+
* return is now conditional on the load having actually answered.
|
|
40
|
+
*
|
|
41
|
+
* The old ordering was argued to be accidentally right for one case — a 503
|
|
42
|
+
* from a switched-off `custom_fields` — and that case does not exist.
|
|
43
|
+
* `custom_fields` declares `activation.nonDeactivatable`, which since issue #258
|
|
44
|
+
* makes it a **required** module: `requiredModulesFrom` puts it in the
|
|
45
|
+
* composition's required set, `composeModules` refuses a composition that would
|
|
46
|
+
* reach its boot phase without it, and D-69 refuses every disable and every
|
|
47
|
+
* uninstall. A platform that cannot serve this endpoint does not boot, so
|
|
48
|
+
* `MODULE_DISABLED` is unreachable here and there is no branch to preserve for
|
|
49
|
+
* it.
|
|
50
|
+
*/
|
|
51
|
+
export function CustomFieldValuesPanel({ entityType, values, save, }) {
|
|
52
|
+
const t = useTranslation('core');
|
|
53
|
+
const [defs, setDefs] = useState([]);
|
|
54
|
+
const [draft, setDraft] = useState(values);
|
|
55
|
+
const [error, setError] = useState(null);
|
|
56
|
+
const [saving, setSaving] = useState(false);
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
let live = true;
|
|
59
|
+
void (async () => {
|
|
60
|
+
try {
|
|
61
|
+
const res = await apiClient.get(`/api/v1/admin/custom-fields/definitions?entityType=${entityType}`);
|
|
62
|
+
if (live) {
|
|
63
|
+
setDefs(res.data);
|
|
64
|
+
// A previous entity type's failure must not outlive the read that
|
|
65
|
+
// succeeded — it is now the thing that decides the empty branch below.
|
|
66
|
+
setError(null);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
if (live)
|
|
71
|
+
setError(err instanceof ApiError ? err.envelope.error.message : 'Failed to load.');
|
|
72
|
+
}
|
|
73
|
+
})();
|
|
74
|
+
return () => {
|
|
75
|
+
live = false;
|
|
76
|
+
};
|
|
77
|
+
}, [entityType]);
|
|
78
|
+
const set = useCallback((key, value) => {
|
|
79
|
+
setDraft((prev) => ({ ...prev, [key]: value }));
|
|
80
|
+
}, []);
|
|
81
|
+
const onSave = useCallback(async () => {
|
|
82
|
+
setError(null);
|
|
83
|
+
setSaving(true);
|
|
84
|
+
try {
|
|
85
|
+
await save(draft);
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
setError(err instanceof ApiError ? err.envelope.error.message : 'Save failed.');
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
setSaving(false);
|
|
92
|
+
}
|
|
93
|
+
}, [draft, save]);
|
|
94
|
+
// Nothing defined for this entity type — but only once the load has answered.
|
|
95
|
+
// With `error` set, the same empty `defs` means the load failed, and the panel
|
|
96
|
+
// owes the operator the message rather than an absence.
|
|
97
|
+
if (defs.length === 0 && error === null)
|
|
98
|
+
return null;
|
|
99
|
+
return (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: t('customFields.title') }) }), _jsxs(CardContent, { className: "space-y-3", children: [error && (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) })), defs.map((d) => (_jsxs("div", { className: "space-y-1", children: [_jsxs(Label, { htmlFor: `cf-${d.key}`, children: [d.label['en'] ?? d.labelDefault, d.required && _jsx("span", { className: "text-destructive", children: " *" })] }), renderInput(d, draft[d.key], (v) => set(d.key, v))] }, d.id))), defs.length > 0 && (_jsx(Button, { size: "sm", disabled: saving, onClick: () => void onSave(), children: t('customFields.save') }))] })] }));
|
|
100
|
+
}
|
|
101
|
+
const inputClass = 'h-9 rounded-md border border-input bg-background px-3 text-sm';
|
|
102
|
+
function renderInput(def, value, onChange) {
|
|
103
|
+
switch (def.valueType) {
|
|
104
|
+
case 'boolean':
|
|
105
|
+
return (_jsx("input", { id: `cf-${def.key}`, type: "checkbox", checked: value === true, onChange: (e) => onChange(e.target.checked) }));
|
|
106
|
+
case 'number':
|
|
107
|
+
return (_jsx("input", { id: `cf-${def.key}`, type: "number", className: inputClass, value: value === undefined || value === null ? '' : String(value), onChange: (e) => onChange(e.target.value === '' ? undefined : Number(e.target.value)) }));
|
|
108
|
+
case 'date':
|
|
109
|
+
return (_jsx("input", { id: `cf-${def.key}`, type: "date", className: inputClass, value: typeof value === 'string' ? value : '', onChange: (e) => onChange(e.target.value || undefined) }));
|
|
110
|
+
case 'select':
|
|
111
|
+
return (_jsxs(Select, { id: `cf-${def.key}`, value: typeof value === 'string' ? value : '', onChange: (e) => onChange(e.target.value || undefined), children: [_jsx("option", { value: "", children: "\u2014" }), def.options.map((o) => (_jsx("option", { value: o.value, children: o.label['en'] ?? o.labelDefault }, o.id ?? o.value)))] }));
|
|
112
|
+
case 'multiselect': {
|
|
113
|
+
const selected = Array.isArray(value) ? value : [];
|
|
114
|
+
return (_jsx("div", { className: "flex flex-wrap gap-2", children: def.options.map((o) => (_jsxs("label", { className: "flex items-center gap-1 text-sm", children: [_jsx("input", { type: "checkbox", checked: selected.includes(o.value), onChange: (e) => onChange(e.target.checked
|
|
115
|
+
? [...selected, o.value]
|
|
116
|
+
: selected.filter((v) => v !== o.value)) }), o.label['en'] ?? o.labelDefault] }, o.id ?? o.value))) }));
|
|
117
|
+
}
|
|
118
|
+
default:
|
|
119
|
+
return (_jsx("input", { id: `cf-${def.key}`, className: inputClass, value: typeof value === 'string' ? value : '', onChange: (e) => onChange(e.target.value) }));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=CustomFieldValuesPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CustomFieldValuesPanel.js","sourceRoot":"","sources":["../../../src/components/custom-field-values/CustomFieldValuesPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface CustomerGroupPickerProps {
|
|
3
|
+
value: string | null;
|
|
4
|
+
onChange: (customerGroupId: 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 CustomerGroupPicker(props: CustomerGroupPickerProps): ReactNode;
|
|
14
|
+
//# sourceMappingURL=CustomerGroupPicker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CustomerGroupPicker.d.ts","sourceRoot":"","sources":["../../../src/components/customer-group-picker/CustomerGroupPicker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAkBrE,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACnD,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,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,SAAS,CAgD9E"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
3
|
+
import { ApiError, apiClient } from '../../lib/api-client.js';
|
|
4
|
+
import { Combobox } from '../../ui/combobox.js';
|
|
5
|
+
export function CustomerGroupPicker(props) {
|
|
6
|
+
const [groups, setGroups] = useState([]);
|
|
7
|
+
const [loading, setLoading] = useState(true);
|
|
8
|
+
const [error, setError] = useState(null);
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
let alive = true;
|
|
11
|
+
setLoading(true);
|
|
12
|
+
apiClient
|
|
13
|
+
.get('/api/v1/admin/customer-groups')
|
|
14
|
+
.then((res) => {
|
|
15
|
+
if (!alive)
|
|
16
|
+
return;
|
|
17
|
+
setGroups(res.data);
|
|
18
|
+
})
|
|
19
|
+
.catch((err) => {
|
|
20
|
+
if (!alive)
|
|
21
|
+
return;
|
|
22
|
+
setError(err instanceof ApiError ? err.envelope.error.message : 'Failed to load groups.');
|
|
23
|
+
})
|
|
24
|
+
.finally(() => {
|
|
25
|
+
if (alive)
|
|
26
|
+
setLoading(false);
|
|
27
|
+
});
|
|
28
|
+
return () => {
|
|
29
|
+
alive = false;
|
|
30
|
+
};
|
|
31
|
+
}, []);
|
|
32
|
+
const options = useMemo(() => groups.map((g) => ({ value: g.id, label: g.name, description: g.code })), [groups]);
|
|
33
|
+
const emptyMessage = props.emptyMessage ?? error ?? 'No customer groups.';
|
|
34
|
+
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 customer group…', emptyMessage: emptyMessage, ariaLabel: props.ariaLabel ?? 'Select customer group', id: props.id ?? '', className: props.className ?? '' }));
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=CustomerGroupPicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CustomerGroupPicker.js","sourceRoot":"","sources":["../../../src/components/customer-group-picker/CustomerGroupPicker.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAuB,MAAM,sBAAsB,CAAC;AA4BrE,MAAM,UAAU,mBAAmB,CAAC,KAA+B;IACjE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAyB,EAAE,CAAC,CAAC;IACjE,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,CAAmC,+BAA+B,CAAC;aACtE,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,qBAAqB,CAAC;IAE1E,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,0BAA0B,EAC5D,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,uBAAuB,EACrD,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,EAClB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE,GAChC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface CustomerPickerProps {
|
|
3
|
+
value: string | null;
|
|
4
|
+
onChange: (customerAccountId: string | null) => void;
|
|
5
|
+
status?: 'active' | 'blocked' | 'deleted';
|
|
6
|
+
/** When set, only accounts belonging to this organization are searched
|
|
7
|
+
* (feature 062 — distributor-binding service-account picker). */
|
|
8
|
+
organizationId?: string;
|
|
9
|
+
placeholder?: string;
|
|
10
|
+
emptyMessage?: string;
|
|
11
|
+
clearable?: boolean;
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
ariaLabel?: string;
|
|
14
|
+
id?: string;
|
|
15
|
+
className?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function CustomerPicker(props: CustomerPickerProps): ReactNode;
|
|
18
|
+
//# sourceMappingURL=CustomerPicker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CustomerPicker.d.ts","sourceRoot":"","sources":["../../../src/components/customer-picker/CustomerPicker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAwC1F,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACrD,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1C;sEACkE;IAClE,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,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,SAAS,CAsFpE"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
3
|
+
import { ApiError, apiClient } from '../../lib/api-client.js';
|
|
4
|
+
import { Combobox } from '../../ui/combobox.js';
|
|
5
|
+
function customerLabel(c) {
|
|
6
|
+
const name = `${c.firstName} ${c.lastName}`.trim();
|
|
7
|
+
return name.length > 0 ? name : c.email;
|
|
8
|
+
}
|
|
9
|
+
function customerDescription(c) {
|
|
10
|
+
const name = `${c.firstName} ${c.lastName}`.trim();
|
|
11
|
+
// When the label already shows the name, lead the description with the email.
|
|
12
|
+
return name.length > 0
|
|
13
|
+
? c.organizationName
|
|
14
|
+
? `${c.email} · ${c.organizationName}`
|
|
15
|
+
: c.email
|
|
16
|
+
: (c.organizationName ?? '');
|
|
17
|
+
}
|
|
18
|
+
const SEARCH_DEBOUNCE_MS = 250;
|
|
19
|
+
const DEFAULT_PAGE_SIZE = 20;
|
|
20
|
+
export function CustomerPicker(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 params = new URLSearchParams();
|
|
36
|
+
params.set('pageSize', String(DEFAULT_PAGE_SIZE));
|
|
37
|
+
if (props.status)
|
|
38
|
+
params.set('status', props.status);
|
|
39
|
+
if (props.organizationId)
|
|
40
|
+
params.set('organizationId', props.organizationId);
|
|
41
|
+
const trimmed = query.trim();
|
|
42
|
+
if (trimmed.length > 0)
|
|
43
|
+
params.set('q', trimmed);
|
|
44
|
+
const res = await apiClient.get(`/api/v1/admin/customers?${params.toString()}`);
|
|
45
|
+
if (seq !== seqRef.current)
|
|
46
|
+
return;
|
|
47
|
+
setCache((prev) => {
|
|
48
|
+
const next = new Map(prev);
|
|
49
|
+
for (const c of res.data)
|
|
50
|
+
next.set(c.id, c);
|
|
51
|
+
return next;
|
|
52
|
+
});
|
|
53
|
+
setOptions(res.data.map((c) => ({
|
|
54
|
+
value: c.id,
|
|
55
|
+
label: customerLabel(c),
|
|
56
|
+
description: customerDescription(c),
|
|
57
|
+
})));
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
if (seq !== seqRef.current)
|
|
61
|
+
return;
|
|
62
|
+
setError(err instanceof ApiError ? err.envelope.error.message : 'Search failed.');
|
|
63
|
+
setOptions([]);
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
if (seq === seqRef.current)
|
|
67
|
+
setSearching(false);
|
|
68
|
+
}
|
|
69
|
+
}, [props.status, props.organizationId]);
|
|
70
|
+
const handleSearchChange = useCallback((query) => {
|
|
71
|
+
if (timerRef.current !== null)
|
|
72
|
+
clearTimeout(timerRef.current);
|
|
73
|
+
const seq = ++seqRef.current;
|
|
74
|
+
timerRef.current = setTimeout(() => void runSearch(query, seq), SEARCH_DEBOUNCE_MS);
|
|
75
|
+
}, [runSearch]);
|
|
76
|
+
const selectedLabel = useMemo(() => {
|
|
77
|
+
if (!props.value)
|
|
78
|
+
return '';
|
|
79
|
+
const c = cache.get(props.value);
|
|
80
|
+
return c ? customerLabel(c) : '';
|
|
81
|
+
}, [props.value, cache]);
|
|
82
|
+
const emptyMessage = props.emptyMessage ?? error ?? (searching ? 'Searching…' : 'No matching customers.');
|
|
83
|
+
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 customers by name or email…', emptyMessage: emptyMessage, ariaLabel: props.ariaLabel ?? 'Select customer', id: props.id ?? '', className: props.className ?? '', selectedLabel: selectedLabel }));
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=CustomerPicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CustomerPicker.js","sourceRoot":"","sources":["../../../src/components/customer-picker/CustomerPicker.tsx"],"names":[],"mappings":"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"}
|