@wilshop/dashboard 3.5.2
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/README.md +116 -0
- package/dist/plugin/api/api-extensions.d.ts +1 -0
- package/dist/plugin/api/api-extensions.js +35 -0
- package/dist/plugin/api/metrics.resolver.d.ts +8 -0
- package/dist/plugin/api/metrics.resolver.js +40 -0
- package/dist/plugin/config/metrics-strategies.d.ts +39 -0
- package/dist/plugin/config/metrics-strategies.js +74 -0
- package/dist/plugin/constants.d.ts +8 -0
- package/dist/plugin/constants.js +31 -0
- package/dist/plugin/dashboard.plugin.d.ts +115 -0
- package/dist/plugin/dashboard.plugin.js +339 -0
- package/dist/plugin/default-page.html +193 -0
- package/dist/plugin/index.d.ts +2 -0
- package/dist/plugin/index.js +18 -0
- package/dist/plugin/package.json +3 -0
- package/dist/plugin/service/metrics.service.d.ts +15 -0
- package/dist/plugin/service/metrics.service.js +129 -0
- package/dist/plugin/types.d.ts +20 -0
- package/dist/plugin/types.js +9 -0
- package/dist/vite/constants.d.ts +5 -0
- package/dist/vite/constants.js +278 -0
- package/dist/vite/index.d.ts +1 -0
- package/dist/vite/index.js +1 -0
- package/dist/vite/types.d.ts +79 -0
- package/dist/vite/types.js +1 -0
- package/dist/vite/utils/ast-utils.d.ts +5 -0
- package/dist/vite/utils/ast-utils.js +29 -0
- package/dist/vite/utils/ast-utils.spec.d.ts +1 -0
- package/dist/vite/utils/ast-utils.spec.js +45 -0
- package/dist/vite/utils/compiler.d.ts +23 -0
- package/dist/vite/utils/compiler.js +165 -0
- package/dist/vite/utils/get-dashboard-paths.d.ts +5 -0
- package/dist/vite/utils/get-dashboard-paths.js +20 -0
- package/dist/vite/utils/logger.d.ts +3 -0
- package/dist/vite/utils/logger.js +39 -0
- package/dist/vite/utils/plugin-discovery.d.ts +27 -0
- package/dist/vite/utils/plugin-discovery.js +398 -0
- package/dist/vite/utils/schema-generator.d.ts +10 -0
- package/dist/vite/utils/schema-generator.js +35 -0
- package/dist/vite/utils/tsconfig-utils.d.ts +9 -0
- package/dist/vite/utils/tsconfig-utils.js +51 -0
- package/dist/vite/utils/ui-config.d.ts +3 -0
- package/dist/vite/utils/ui-config.js +30 -0
- package/dist/vite/vite-plugin-admin-api-schema.d.ts +24 -0
- package/dist/vite/vite-plugin-admin-api-schema.js +82 -0
- package/dist/vite/vite-plugin-config-loader.d.ts +16 -0
- package/dist/vite/vite-plugin-config-loader.js +70 -0
- package/dist/vite/vite-plugin-config.d.ts +4 -0
- package/dist/vite/vite-plugin-config.js +60 -0
- package/dist/vite/vite-plugin-dashboard-metadata.d.ts +7 -0
- package/dist/vite/vite-plugin-dashboard-metadata.js +61 -0
- package/dist/vite/vite-plugin-gql-tada.d.ts +6 -0
- package/dist/vite/vite-plugin-gql-tada.js +51 -0
- package/dist/vite/vite-plugin-hmr.d.ts +8 -0
- package/dist/vite/vite-plugin-hmr.js +34 -0
- package/dist/vite/vite-plugin-lingui-babel.d.ts +27 -0
- package/dist/vite/vite-plugin-lingui-babel.js +86 -0
- package/dist/vite/vite-plugin-tailwind-source.d.ts +7 -0
- package/dist/vite/vite-plugin-tailwind-source.js +48 -0
- package/dist/vite/vite-plugin-theme.d.ts +55 -0
- package/dist/vite/vite-plugin-theme.js +130 -0
- package/dist/vite/vite-plugin-transform-index.d.ts +11 -0
- package/dist/vite/vite-plugin-transform-index.js +40 -0
- package/dist/vite/vite-plugin-translations.d.ts +31 -0
- package/dist/vite/vite-plugin-translations.js +177 -0
- package/dist/vite/vite-plugin-ui-config.d.ts +150 -0
- package/dist/vite/vite-plugin-ui-config.js +36 -0
- package/dist/vite/vite-plugin-vendure-dashboard.d.ts +142 -0
- package/dist/vite/vite-plugin-vendure-dashboard.js +170 -0
- package/index.html +14 -0
- package/lingui.config.js +37 -0
- package/package.json +178 -0
- package/src/app/app-providers.tsx +31 -0
- package/src/app/common/delete-bulk-action.tsx +149 -0
- package/src/app/common/duplicate-bulk-action.tsx +147 -0
- package/src/app/common/duplicate-entity-dialog.tsx +117 -0
- package/src/app/common/map-faceted-filter-fields.ts +21 -0
- package/src/app/common/set-document-direction.ts +7 -0
- package/src/app/common/use-page-title.test.ts +263 -0
- package/src/app/common/use-page-title.ts +86 -0
- package/src/app/main.tsx +134 -0
- package/src/app/routeTree.gen.ts +1284 -0
- package/src/app/routes/__root.tsx +23 -0
- package/src/app/routes/_authenticated/_administrators/administrators.graphql.ts +88 -0
- package/src/app/routes/_authenticated/_administrators/administrators.tsx +104 -0
- package/src/app/routes/_authenticated/_administrators/administrators_.$id.tsx +160 -0
- package/src/app/routes/_authenticated/_administrators/components/administrator-bulk-actions.tsx +15 -0
- package/src/app/routes/_authenticated/_administrators/components/role-permissions-display.tsx +133 -0
- package/src/app/routes/_authenticated/_assets/assets.graphql.ts +76 -0
- package/src/app/routes/_authenticated/_assets/assets.tsx +48 -0
- package/src/app/routes/_authenticated/_assets/assets_.$id.tsx +181 -0
- package/src/app/routes/_authenticated/_assets/components/asset-bulk-actions.tsx +47 -0
- package/src/app/routes/_authenticated/_assets/components/asset-tag-filter.tsx +206 -0
- package/src/app/routes/_authenticated/_assets/components/asset-tags-editor.tsx +226 -0
- package/src/app/routes/_authenticated/_assets/components/manage-tags-dialog.tsx +212 -0
- package/src/app/routes/_authenticated/_channels/channels.graphql.ts +102 -0
- package/src/app/routes/_authenticated/_channels/channels.tsx +81 -0
- package/src/app/routes/_authenticated/_channels/channels_.$id.tsx +251 -0
- package/src/app/routes/_authenticated/_channels/components/channel-bulk-actions.tsx +15 -0
- package/src/app/routes/_authenticated/_collections/collections.graphql.ts +193 -0
- package/src/app/routes/_authenticated/_collections/collections.tsx +337 -0
- package/src/app/routes/_authenticated/_collections/collections_.$id.tsx +236 -0
- package/src/app/routes/_authenticated/_collections/components/collection-bulk-actions.tsx +130 -0
- package/src/app/routes/_authenticated/_collections/components/collection-contents-preview-table.tsx +153 -0
- package/src/app/routes/_authenticated/_collections/components/collection-contents-sheet.tsx +50 -0
- package/src/app/routes/_authenticated/_collections/components/collection-contents-table.tsx +83 -0
- package/src/app/routes/_authenticated/_collections/components/collection-filters-selector.tsx +24 -0
- package/src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx +433 -0
- package/src/app/routes/_authenticated/_countries/components/country-bulk-actions.tsx +15 -0
- package/src/app/routes/_authenticated/_countries/countries.graphql.ts +82 -0
- package/src/app/routes/_authenticated/_countries/countries.tsx +72 -0
- package/src/app/routes/_authenticated/_countries/countries_.$id.tsx +123 -0
- package/src/app/routes/_authenticated/_customer-groups/components/customer-group-bulk-actions.tsx +15 -0
- package/src/app/routes/_authenticated/_customer-groups/components/customer-group-members-sheet.tsx +51 -0
- package/src/app/routes/_authenticated/_customer-groups/components/customer-group-members-table.tsx +134 -0
- package/src/app/routes/_authenticated/_customer-groups/customer-groups.graphql.ts +80 -0
- package/src/app/routes/_authenticated/_customer-groups/customer-groups.tsx +72 -0
- package/src/app/routes/_authenticated/_customer-groups/customer-groups_.$id.tsx +121 -0
- package/src/app/routes/_authenticated/_customers/components/customer-address-card.tsx +155 -0
- package/src/app/routes/_authenticated/_customers/components/customer-address-form.tsx +347 -0
- package/src/app/routes/_authenticated/_customers/components/customer-bulk-actions.tsx +15 -0
- package/src/app/routes/_authenticated/_customers/components/customer-group-controls.tsx +4 -0
- package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history-container.tsx +78 -0
- package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history-types.ts +5 -0
- package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history-utils.tsx +124 -0
- package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history.tsx +113 -0
- package/src/app/routes/_authenticated/_customers/components/customer-history/default-customer-history-components.tsx +176 -0
- package/src/app/routes/_authenticated/_customers/components/customer-history/index.ts +4 -0
- package/src/app/routes/_authenticated/_customers/components/customer-history/use-customer-history.ts +169 -0
- package/src/app/routes/_authenticated/_customers/components/customer-order-table.tsx +90 -0
- package/src/app/routes/_authenticated/_customers/components/customer-status-badge.tsx +33 -0
- package/src/app/routes/_authenticated/_customers/customers.graphql.ts +218 -0
- package/src/app/routes/_authenticated/_customers/customers.tsx +104 -0
- package/src/app/routes/_authenticated/_customers/customers_.$id.tsx +280 -0
- package/src/app/routes/_authenticated/_facets/components/facet-bulk-actions.tsx +99 -0
- package/src/app/routes/_authenticated/_facets/components/facet-value-bulk-actions.tsx +16 -0
- package/src/app/routes/_authenticated/_facets/components/facet-values-sheet.tsx +49 -0
- package/src/app/routes/_authenticated/_facets/components/facet-values-table.tsx +139 -0
- package/src/app/routes/_authenticated/_facets/facets.graphql.ts +182 -0
- package/src/app/routes/_authenticated/_facets/facets.tsx +121 -0
- package/src/app/routes/_authenticated/_facets/facets_.$facetId.values_.$id.tsx +158 -0
- package/src/app/routes/_authenticated/_facets/facets_.$id.tsx +152 -0
- package/src/app/routes/_authenticated/_global-settings/global-settings.graphql.ts +28 -0
- package/src/app/routes/_authenticated/_global-settings/global-settings.tsx +161 -0
- package/src/app/routes/_authenticated/_orders/components/add-manual-payment-dialog.tsx +189 -0
- package/src/app/routes/_authenticated/_orders/components/add-surcharge-form.tsx +139 -0
- package/src/app/routes/_authenticated/_orders/components/customer-address-selector.tsx +100 -0
- package/src/app/routes/_authenticated/_orders/components/edit-order-table.tsx +287 -0
- package/src/app/routes/_authenticated/_orders/components/fulfill-order-dialog.tsx +320 -0
- package/src/app/routes/_authenticated/_orders/components/fulfillment-details.tsx +159 -0
- package/src/app/routes/_authenticated/_orders/components/money-gross-net.tsx +20 -0
- package/src/app/routes/_authenticated/_orders/components/order-address.tsx +65 -0
- package/src/app/routes/_authenticated/_orders/components/order-detail-shared.tsx +307 -0
- package/src/app/routes/_authenticated/_orders/components/order-history/default-order-history-components.tsx +98 -0
- package/src/app/routes/_authenticated/_orders/components/order-history/index.ts +3 -0
- package/src/app/routes/_authenticated/_orders/components/order-history/order-history-container.tsx +80 -0
- package/src/app/routes/_authenticated/_orders/components/order-history/order-history-types.ts +5 -0
- package/src/app/routes/_authenticated/_orders/components/order-history/order-history-utils.tsx +173 -0
- package/src/app/routes/_authenticated/_orders/components/order-history/order-history.tsx +104 -0
- package/src/app/routes/_authenticated/_orders/components/order-history/use-order-history.ts +175 -0
- package/src/app/routes/_authenticated/_orders/components/order-line-custom-fields-form.tsx +53 -0
- package/src/app/routes/_authenticated/_orders/components/order-modification-preview-dialog.tsx +365 -0
- package/src/app/routes/_authenticated/_orders/components/order-modification-summary.tsx +261 -0
- package/src/app/routes/_authenticated/_orders/components/order-table-totals.tsx +100 -0
- package/src/app/routes/_authenticated/_orders/components/order-table.tsx +194 -0
- package/src/app/routes/_authenticated/_orders/components/order-tax-summary.tsx +40 -0
- package/src/app/routes/_authenticated/_orders/components/payment-details.tsx +293 -0
- package/src/app/routes/_authenticated/_orders/components/seller-orders-card.tsx +63 -0
- package/src/app/routes/_authenticated/_orders/components/settle-refund-dialog.tsx +80 -0
- package/src/app/routes/_authenticated/_orders/components/shipping-method-selector.tsx +64 -0
- package/src/app/routes/_authenticated/_orders/components/state-transition-control.tsx +99 -0
- package/src/app/routes/_authenticated/_orders/components/use-transition-order-to-state.tsx +151 -0
- package/src/app/routes/_authenticated/_orders/orders.graphql.ts +775 -0
- package/src/app/routes/_authenticated/_orders/orders.tsx +120 -0
- package/src/app/routes/_authenticated/_orders/orders_.$aggregateOrderId_.seller-orders.$sellerOrderId.tsx +50 -0
- package/src/app/routes/_authenticated/_orders/orders_.$id.tsx +30 -0
- package/src/app/routes/_authenticated/_orders/orders_.$id_.modify.tsx +298 -0
- package/src/app/routes/_authenticated/_orders/orders_.draft.$id.tsx +495 -0
- package/src/app/routes/_authenticated/_orders/utils/order-detail-loaders.tsx +134 -0
- package/src/app/routes/_authenticated/_orders/utils/order-types.ts +10 -0
- package/src/app/routes/_authenticated/_orders/utils/order-utils.ts +159 -0
- package/src/app/routes/_authenticated/_orders/utils/use-modify-order.ts +335 -0
- package/src/app/routes/_authenticated/_payment-methods/components/payment-eligibility-checker-selector.tsx +37 -0
- package/src/app/routes/_authenticated/_payment-methods/components/payment-handler-selector.tsx +33 -0
- package/src/app/routes/_authenticated/_payment-methods/components/payment-method-bulk-actions.tsx +58 -0
- package/src/app/routes/_authenticated/_payment-methods/payment-methods.graphql.ts +110 -0
- package/src/app/routes/_authenticated/_payment-methods/payment-methods.tsx +88 -0
- package/src/app/routes/_authenticated/_payment-methods/payment-methods_.$id.tsx +197 -0
- package/src/app/routes/_authenticated/_product-variants/components/add-currency-dropdown.tsx +49 -0
- package/src/app/routes/_authenticated/_product-variants/components/add-stock-location-dropdown.tsx +56 -0
- package/src/app/routes/_authenticated/_product-variants/components/product-variant-bulk-actions.tsx +110 -0
- package/src/app/routes/_authenticated/_product-variants/components/variant-price-detail.tsx +88 -0
- package/src/app/routes/_authenticated/_product-variants/product-variants.graphql.ts +207 -0
- package/src/app/routes/_authenticated/_product-variants/product-variants.tsx +98 -0
- package/src/app/routes/_authenticated/_product-variants/product-variants_.$id.tsx +471 -0
- package/src/app/routes/_authenticated/_products/components/add-option-group-dialog.tsx +127 -0
- package/src/app/routes/_authenticated/_products/components/add-product-variant-dialog.tsx +372 -0
- package/src/app/routes/_authenticated/_products/components/assign-facet-values-dialog.tsx +282 -0
- package/src/app/routes/_authenticated/_products/components/create-product-options-dialog.tsx +416 -0
- package/src/app/routes/_authenticated/_products/components/create-product-variants-dialog.tsx +190 -0
- package/src/app/routes/_authenticated/_products/components/create-product-variants.tsx +370 -0
- package/src/app/routes/_authenticated/_products/components/option-groups-editor.tsx +180 -0
- package/src/app/routes/_authenticated/_products/components/option-value-input.tsx +72 -0
- package/src/app/routes/_authenticated/_products/components/product-bulk-actions.tsx +117 -0
- package/src/app/routes/_authenticated/_products/components/product-option-group-badge.tsx +19 -0
- package/src/app/routes/_authenticated/_products/components/product-option-select.tsx +111 -0
- package/src/app/routes/_authenticated/_products/components/product-options-table.tsx +114 -0
- package/src/app/routes/_authenticated/_products/components/product-variants-table.tsx +120 -0
- package/src/app/routes/_authenticated/_products/product-option-groups.graphql.ts +103 -0
- package/src/app/routes/_authenticated/_products/products.graphql.ts +352 -0
- package/src/app/routes/_authenticated/_products/products.tsx +121 -0
- package/src/app/routes/_authenticated/_products/products_.$id.tsx +258 -0
- package/src/app/routes/_authenticated/_products/products_.$id_.variants.tsx +405 -0
- package/src/app/routes/_authenticated/_products/products_.$productId.option-groups.$id.tsx +177 -0
- package/src/app/routes/_authenticated/_products/products_.$productId.option-groups.$productOptionGroupId.options_.$id.tsx +204 -0
- package/src/app/routes/_authenticated/_profile/profile.graphql.ts +23 -0
- package/src/app/routes/_authenticated/_profile/profile.tsx +119 -0
- package/src/app/routes/_authenticated/_promotions/components/promotion-actions-selector.tsx +35 -0
- package/src/app/routes/_authenticated/_promotions/components/promotion-bulk-actions.tsx +72 -0
- package/src/app/routes/_authenticated/_promotions/components/promotion-conditions-selector.tsx +35 -0
- package/src/app/routes/_authenticated/_promotions/promotions.graphql.ts +121 -0
- package/src/app/routes/_authenticated/_promotions/promotions.tsx +94 -0
- package/src/app/routes/_authenticated/_promotions/promotions_.$id.tsx +245 -0
- package/src/app/routes/_authenticated/_roles/components/expandable-permissions.tsx +54 -0
- package/src/app/routes/_authenticated/_roles/components/permissions-table-grid.tsx +251 -0
- package/src/app/routes/_authenticated/_roles/components/role-bulk-actions.tsx +15 -0
- package/src/app/routes/_authenticated/_roles/roles.graphql.ts +76 -0
- package/src/app/routes/_authenticated/_roles/roles.tsx +99 -0
- package/src/app/routes/_authenticated/_roles/roles_.$id.tsx +146 -0
- package/src/app/routes/_authenticated/_sellers/components/seller-bulk-actions.tsx +15 -0
- package/src/app/routes/_authenticated/_sellers/sellers.graphql.ts +70 -0
- package/src/app/routes/_authenticated/_sellers/sellers.tsx +56 -0
- package/src/app/routes/_authenticated/_sellers/sellers_.$id.tsx +112 -0
- package/src/app/routes/_authenticated/_shipping-methods/components/fulfillment-handler-selector.tsx +56 -0
- package/src/app/routes/_authenticated/_shipping-methods/components/metadata-badges.tsx +15 -0
- package/src/app/routes/_authenticated/_shipping-methods/components/price-display.tsx +21 -0
- package/src/app/routes/_authenticated/_shipping-methods/components/shipping-calculator-selector.tsx +33 -0
- package/src/app/routes/_authenticated/_shipping-methods/components/shipping-eligibility-checker-selector.tsx +36 -0
- package/src/app/routes/_authenticated/_shipping-methods/components/shipping-method-bulk-actions.tsx +61 -0
- package/src/app/routes/_authenticated/_shipping-methods/components/shipping-method-test-result-wrapper.tsx +87 -0
- package/src/app/routes/_authenticated/_shipping-methods/components/test-address-form.tsx +256 -0
- package/src/app/routes/_authenticated/_shipping-methods/components/test-order-builder.tsx +244 -0
- package/src/app/routes/_authenticated/_shipping-methods/components/test-shipping-methods-result.tsx +97 -0
- package/src/app/routes/_authenticated/_shipping-methods/components/test-shipping-methods-sheet.tsx +41 -0
- package/src/app/routes/_authenticated/_shipping-methods/components/test-shipping-methods.tsx +74 -0
- package/src/app/routes/_authenticated/_shipping-methods/components/test-single-method-result.tsx +90 -0
- package/src/app/routes/_authenticated/_shipping-methods/components/test-single-shipping-method-sheet.tsx +56 -0
- package/src/app/routes/_authenticated/_shipping-methods/components/test-single-shipping-method.tsx +82 -0
- package/src/app/routes/_authenticated/_shipping-methods/components/use-shipping-method-test-state.ts +67 -0
- package/src/app/routes/_authenticated/_shipping-methods/shipping-methods.graphql.ts +137 -0
- package/src/app/routes/_authenticated/_shipping-methods/shipping-methods.tsx +76 -0
- package/src/app/routes/_authenticated/_shipping-methods/shipping-methods_.$id.tsx +197 -0
- package/src/app/routes/_authenticated/_stock-locations/components/stock-location-bulk-actions.tsx +58 -0
- package/src/app/routes/_authenticated/_stock-locations/stock-locations.graphql.ts +87 -0
- package/src/app/routes/_authenticated/_stock-locations/stock-locations.tsx +65 -0
- package/src/app/routes/_authenticated/_stock-locations/stock-locations_.$id.tsx +126 -0
- package/src/app/routes/_authenticated/_system/components/payload-dialog.tsx +41 -0
- package/src/app/routes/_authenticated/_system/healthchecks.tsx +99 -0
- package/src/app/routes/_authenticated/_system/job-queue.graphql.ts +54 -0
- package/src/app/routes/_authenticated/_system/job-queue.tsx +265 -0
- package/src/app/routes/_authenticated/_system/scheduled-tasks.tsx +249 -0
- package/src/app/routes/_authenticated/_tax-categories/components/tax-category-bulk-actions.tsx +15 -0
- package/src/app/routes/_authenticated/_tax-categories/tax-categories.graphql.ts +72 -0
- package/src/app/routes/_authenticated/_tax-categories/tax-categories.tsx +69 -0
- package/src/app/routes/_authenticated/_tax-categories/tax-categories_.$id.tsx +127 -0
- package/src/app/routes/_authenticated/_tax-rates/components/tax-rate-bulk-actions.tsx +15 -0
- package/src/app/routes/_authenticated/_tax-rates/tax-rates.graphql.ts +84 -0
- package/src/app/routes/_authenticated/_tax-rates/tax-rates.tsx +119 -0
- package/src/app/routes/_authenticated/_tax-rates/tax-rates_.$id.tsx +149 -0
- package/src/app/routes/_authenticated/_zones/components/zone-bulk-actions.tsx +63 -0
- package/src/app/routes/_authenticated/_zones/components/zone-countries-add.tsx +0 -0
- package/src/app/routes/_authenticated/_zones/components/zone-countries-sheet.tsx +34 -0
- package/src/app/routes/_authenticated/_zones/components/zone-countries-table.tsx +94 -0
- package/src/app/routes/_authenticated/_zones/zones.graphql.ts +105 -0
- package/src/app/routes/_authenticated/_zones/zones.tsx +64 -0
- package/src/app/routes/_authenticated/_zones/zones_.$id.tsx +110 -0
- package/src/app/routes/_authenticated/index.tsx +233 -0
- package/src/app/routes/_authenticated.tsx +35 -0
- package/src/app/routes/login.tsx +49 -0
- package/src/app/styles.css +100 -0
- package/src/app/tailwindcss-animate.css +275 -0
- package/src/i18n/common-strings.ts +111 -0
- package/src/i18n/locales/ar.po +4972 -0
- package/src/i18n/locales/bg.po +3436 -0
- package/src/i18n/locales/cs.po +4972 -0
- package/src/i18n/locales/de.po +4972 -0
- package/src/i18n/locales/en.po +4972 -0
- package/src/i18n/locales/es.po +4972 -0
- package/src/i18n/locales/fa.po +4972 -0
- package/src/i18n/locales/fr.po +4972 -0
- package/src/i18n/locales/he.po +4972 -0
- package/src/i18n/locales/hr.po +4972 -0
- package/src/i18n/locales/it.po +4972 -0
- package/src/i18n/locales/ja.po +4972 -0
- package/src/i18n/locales/ko.po +4628 -0
- package/src/i18n/locales/nb.po +4972 -0
- package/src/i18n/locales/ne.po +4972 -0
- package/src/i18n/locales/nl.po +4628 -0
- package/src/i18n/locales/pl.po +4972 -0
- package/src/i18n/locales/pt_BR.po +4972 -0
- package/src/i18n/locales/pt_PT.po +4972 -0
- package/src/i18n/locales/ru.po +4972 -0
- package/src/i18n/locales/sv.po +4972 -0
- package/src/i18n/locales/tr.po +4972 -0
- package/src/i18n/locales/uk.po +4972 -0
- package/src/i18n/locales/zh_Hans.po +4972 -0
- package/src/i18n/locales/zh_Hant.po +4972 -0
- package/src/lib/components/data-display/boolean.tsx +23 -0
- package/src/lib/components/data-display/date-time.tsx +19 -0
- package/src/lib/components/data-display/json.tsx +20 -0
- package/src/lib/components/data-display/money.tsx +14 -0
- package/src/lib/components/data-input/affixed-input.stories.tsx +93 -0
- package/src/lib/components/data-input/affixed-input.tsx +79 -0
- package/src/lib/components/data-input/boolean-input.stories.tsx +102 -0
- package/src/lib/components/data-input/boolean-input.tsx +16 -0
- package/src/lib/components/data-input/checkbox-input.stories.tsx +61 -0
- package/src/lib/components/data-input/checkbox-input.tsx +15 -0
- package/src/lib/components/data-input/combination-mode-input.tsx +61 -0
- package/src/lib/components/data-input/configurable-operation-list-input.tsx +58 -0
- package/src/lib/components/data-input/custom-field-list-input.tsx +294 -0
- package/src/lib/components/data-input/customer-group-input.tsx +61 -0
- package/src/lib/components/data-input/datetime-input.stories.tsx +62 -0
- package/src/lib/components/data-input/datetime-input.tsx +192 -0
- package/src/lib/components/data-input/default-relation-input.tsx +626 -0
- package/src/lib/components/data-input/facet-value-input.tsx +78 -0
- package/src/lib/components/data-input/index.ts +23 -0
- package/src/lib/components/data-input/money-input.stories.tsx +88 -0
- package/src/lib/components/data-input/money-input.tsx +122 -0
- package/src/lib/components/data-input/number-input.stories.tsx +103 -0
- package/src/lib/components/data-input/number-input.tsx +85 -0
- package/src/lib/components/data-input/password-form-input.stories.tsx +65 -0
- package/src/lib/components/data-input/password-form-input.tsx +23 -0
- package/src/lib/components/data-input/product-multi-selector-input.tsx +416 -0
- package/src/lib/components/data-input/relation-input.tsx +165 -0
- package/src/lib/components/data-input/relation-selector.tsx +476 -0
- package/src/lib/components/data-input/rich-text-input.stories.tsx +92 -0
- package/src/lib/components/data-input/rich-text-input.tsx +16 -0
- package/src/lib/components/data-input/select-with-options.tsx +96 -0
- package/src/lib/components/data-input/slug-input.stories.tsx +232 -0
- package/src/lib/components/data-input/slug-input.tsx +289 -0
- package/src/lib/components/data-input/string-list-input.tsx +268 -0
- package/src/lib/components/data-input/struct-form-input.tsx +320 -0
- package/src/lib/components/data-input/text-input.stories.tsx +52 -0
- package/src/lib/components/data-input/text-input.tsx +16 -0
- package/src/lib/components/data-input/textarea-input.stories.tsx +55 -0
- package/src/lib/components/data-input/textarea-input.tsx +23 -0
- package/src/lib/components/data-table/add-filter-menu.tsx +64 -0
- package/src/lib/components/data-table/column-header-wrapper.tsx +106 -0
- package/src/lib/components/data-table/data-table-bulk-action-item.tsx +141 -0
- package/src/lib/components/data-table/data-table-bulk-actions.tsx +99 -0
- package/src/lib/components/data-table/data-table-column-header.tsx +50 -0
- package/src/lib/components/data-table/data-table-context.tsx +106 -0
- package/src/lib/components/data-table/data-table-faceted-filter.tsx +195 -0
- package/src/lib/components/data-table/data-table-filter-badge-editable.tsx +35 -0
- package/src/lib/components/data-table/data-table-filter-badge.tsx +101 -0
- package/src/lib/components/data-table/data-table-filter-dialog.tsx +92 -0
- package/src/lib/components/data-table/data-table-pagination.tsx +103 -0
- package/src/lib/components/data-table/data-table-utils.ts +291 -0
- package/src/lib/components/data-table/data-table-view-options.tsx +130 -0
- package/src/lib/components/data-table/data-table.stories.tsx +249 -0
- package/src/lib/components/data-table/data-table.tsx +508 -0
- package/src/lib/components/data-table/filters/data-table-boolean-filter.tsx +60 -0
- package/src/lib/components/data-table/filters/data-table-datetime-filter.tsx +159 -0
- package/src/lib/components/data-table/filters/data-table-id-filter.tsx +63 -0
- package/src/lib/components/data-table/filters/data-table-number-filter.tsx +123 -0
- package/src/lib/components/data-table/filters/data-table-string-filter.tsx +79 -0
- package/src/lib/components/data-table/global-views-bar.tsx +97 -0
- package/src/lib/components/data-table/global-views-sheet.tsx +11 -0
- package/src/lib/components/data-table/human-readable-operator.tsx +65 -0
- package/src/lib/components/data-table/manage-global-views-button.tsx +26 -0
- package/src/lib/components/data-table/my-views-button.tsx +47 -0
- package/src/lib/components/data-table/refresh-button.tsx +49 -0
- package/src/lib/components/data-table/save-view-button.tsx +45 -0
- package/src/lib/components/data-table/save-view-dialog.tsx +134 -0
- package/src/lib/components/data-table/types.ts +40 -0
- package/src/lib/components/data-table/use-all-bulk-actions.ts +19 -0
- package/src/lib/components/data-table/use-generated-columns.tsx +411 -0
- package/src/lib/components/data-table/user-views-sheet.tsx +11 -0
- package/src/lib/components/data-table/views-sheet.tsx +305 -0
- package/src/lib/components/date-range-picker.tsx +186 -0
- package/src/lib/components/labeled-data.tsx +21 -0
- package/src/lib/components/layout/app-layout.tsx +35 -0
- package/src/lib/components/layout/app-sidebar.tsx +37 -0
- package/src/lib/components/layout/channel-switcher.tsx +229 -0
- package/src/lib/components/layout/content-language-selector.tsx +46 -0
- package/src/lib/components/layout/dev-mode-indicator.tsx +18 -0
- package/src/lib/components/layout/generated-breadcrumbs.tsx +136 -0
- package/src/lib/components/layout/language-dialog.tsx +133 -0
- package/src/lib/components/layout/manage-languages-dialog.tsx +386 -0
- package/src/lib/components/layout/nav-item-wrapper.tsx +107 -0
- package/src/lib/components/layout/nav-main.tsx +331 -0
- package/src/lib/components/layout/nav-projects.tsx +81 -0
- package/src/lib/components/layout/nav-user.tsx +180 -0
- package/src/lib/components/login/login-form.tsx +124 -0
- package/src/lib/components/shared/alerts.tsx +52 -0
- package/src/lib/components/shared/animated-number.tsx +49 -0
- package/src/lib/components/shared/asset/asset-bulk-actions.tsx +109 -0
- package/src/lib/components/shared/asset/asset-focal-point-editor.tsx +103 -0
- package/src/lib/components/shared/asset/asset-gallery.stories.tsx +76 -0
- package/src/lib/components/shared/asset/asset-gallery.tsx +623 -0
- package/src/lib/components/shared/asset/asset-picker-dialog.stories.tsx +58 -0
- package/src/lib/components/shared/asset/asset-picker-dialog.tsx +109 -0
- package/src/lib/components/shared/asset/asset-preview-dialog.tsx +38 -0
- package/src/lib/components/shared/asset/asset-preview-selector.tsx +32 -0
- package/src/lib/components/shared/asset/asset-preview.tsx +114 -0
- package/src/lib/components/shared/asset/asset-properties.tsx +44 -0
- package/src/lib/components/shared/assign-to-channel-bulk-action.tsx +71 -0
- package/src/lib/components/shared/assign-to-channel-dialog.tsx +156 -0
- package/src/lib/components/shared/assigned-channels.tsx +108 -0
- package/src/lib/components/shared/assigned-facet-values.tsx +61 -0
- package/src/lib/components/shared/channel-chip.tsx +43 -0
- package/src/lib/components/shared/channel-code-label.tsx +6 -0
- package/src/lib/components/shared/channel-selector.tsx +51 -0
- package/src/lib/components/shared/configurable-operation-arg-input.tsx +29 -0
- package/src/lib/components/shared/configurable-operation-input.tsx +167 -0
- package/src/lib/components/shared/configurable-operation-multi-selector.tsx +263 -0
- package/src/lib/components/shared/configurable-operation-selector.tsx +156 -0
- package/src/lib/components/shared/confirmation-dialog.tsx +58 -0
- package/src/lib/components/shared/copyable-text.tsx +30 -0
- package/src/lib/components/shared/country-selector.tsx +108 -0
- package/src/lib/components/shared/currency-selector.tsx +33 -0
- package/src/lib/components/shared/custom-fields-form.tsx +296 -0
- package/src/lib/components/shared/customer-address-form.tsx +338 -0
- package/src/lib/components/shared/customer-group-chip.tsx +30 -0
- package/src/lib/components/shared/customer-group-selector.tsx +65 -0
- package/src/lib/components/shared/customer-selector.tsx +112 -0
- package/src/lib/components/shared/detail-page-button.stories.tsx +52 -0
- package/src/lib/components/shared/detail-page-button.tsx +59 -0
- package/src/lib/components/shared/entity-assets.tsx +411 -0
- package/src/lib/components/shared/error-page.tsx +31 -0
- package/src/lib/components/shared/facet-value-chip.tsx +59 -0
- package/src/lib/components/shared/facet-value-selector.stories.tsx +48 -0
- package/src/lib/components/shared/facet-value-selector.tsx +458 -0
- package/src/lib/components/shared/form-field-wrapper.tsx +111 -0
- package/src/lib/components/shared/history-timeline/history-entry-date.tsx +37 -0
- package/src/lib/components/shared/history-timeline/history-note-checkbox.tsx +28 -0
- package/src/lib/components/shared/history-timeline/history-note-editor.tsx +60 -0
- package/src/lib/components/shared/history-timeline/history-note-entry.tsx +65 -0
- package/src/lib/components/shared/history-timeline/history-note-input.tsx +39 -0
- package/src/lib/components/shared/history-timeline/history-timeline-with-grouping.tsx +141 -0
- package/src/lib/components/shared/history-timeline/history-timeline.tsx +16 -0
- package/src/lib/components/shared/history-timeline/use-history-note-editor.ts +26 -0
- package/src/lib/components/shared/icon-mark.tsx +18 -0
- package/src/lib/components/shared/language-selector.tsx +56 -0
- package/src/lib/components/shared/logo-mark.tsx +24 -0
- package/src/lib/components/shared/multi-select.tsx +159 -0
- package/src/lib/components/shared/navigation-confirmation.tsx +64 -0
- package/src/lib/components/shared/option-value-input.tsx +97 -0
- package/src/lib/components/shared/paginated-list-data-table.stories.tsx +212 -0
- package/src/lib/components/shared/paginated-list-data-table.tsx +523 -0
- package/src/lib/components/shared/permission-guard.stories.tsx +46 -0
- package/src/lib/components/shared/permission-guard.tsx +51 -0
- package/src/lib/components/shared/product-variant-selector.tsx +136 -0
- package/src/lib/components/shared/remove-from-channel-bulk-action.tsx +93 -0
- package/src/lib/components/shared/rich-text-editor/image-dialog.tsx +223 -0
- package/src/lib/components/shared/rich-text-editor/link-dialog.tsx +151 -0
- package/src/lib/components/shared/rich-text-editor/responsive-toolbar.tsx +443 -0
- package/src/lib/components/shared/rich-text-editor/rich-text-editor.tsx +339 -0
- package/src/lib/components/shared/rich-text-editor/table-delete-menu.tsx +104 -0
- package/src/lib/components/shared/rich-text-editor/table-edit-icons.tsx +225 -0
- package/src/lib/components/shared/role-code-label.tsx +12 -0
- package/src/lib/components/shared/role-selector.tsx +56 -0
- package/src/lib/components/shared/seller-selector.tsx +111 -0
- package/src/lib/components/shared/stock-level-label.tsx +22 -0
- package/src/lib/components/shared/table-cell/order-table-cell-components.tsx +80 -0
- package/src/lib/components/shared/tax-category-selector.tsx +65 -0
- package/src/lib/components/shared/translatable-form-field.tsx +149 -0
- package/src/lib/components/shared/vendure-image.stories.tsx +167 -0
- package/src/lib/components/shared/vendure-image.tsx +307 -0
- package/src/lib/components/shared/zone-selector.tsx +65 -0
- package/src/lib/components/ui/accordion.stories.tsx +33 -0
- package/src/lib/components/ui/accordion.tsx +59 -0
- package/src/lib/components/ui/alert-dialog.stories.tsx +48 -0
- package/src/lib/components/ui/alert-dialog.tsx +128 -0
- package/src/lib/components/ui/alert.stories.tsx +35 -0
- package/src/lib/components/ui/alert.tsx +60 -0
- package/src/lib/components/ui/aspect-ratio.stories.tsx +28 -0
- package/src/lib/components/ui/aspect-ratio.tsx +9 -0
- package/src/lib/components/ui/badge.stories.tsx +28 -0
- package/src/lib/components/ui/badge.tsx +38 -0
- package/src/lib/components/ui/breadcrumb.stories.tsx +41 -0
- package/src/lib/components/ui/breadcrumb.tsx +102 -0
- package/src/lib/components/ui/button.stories.tsx +38 -0
- package/src/lib/components/ui/button.tsx +58 -0
- package/src/lib/components/ui/calendar.stories.tsx +22 -0
- package/src/lib/components/ui/calendar.tsx +447 -0
- package/src/lib/components/ui/card.stories.tsx +28 -0
- package/src/lib/components/ui/card.tsx +47 -0
- package/src/lib/components/ui/carousel.stories.tsx +34 -0
- package/src/lib/components/ui/carousel.tsx +241 -0
- package/src/lib/components/ui/chart.tsx +351 -0
- package/src/lib/components/ui/checkbox.stories.tsx +31 -0
- package/src/lib/components/ui/checkbox.tsx +27 -0
- package/src/lib/components/ui/collapsible.stories.tsx +39 -0
- package/src/lib/components/ui/collapsible.tsx +33 -0
- package/src/lib/components/ui/command.stories.tsx +44 -0
- package/src/lib/components/ui/command.tsx +139 -0
- package/src/lib/components/ui/context-menu.stories.tsx +38 -0
- package/src/lib/components/ui/context-menu.tsx +252 -0
- package/src/lib/components/ui/dialog.stories.tsx +52 -0
- package/src/lib/components/ui/dialog.tsx +116 -0
- package/src/lib/components/ui/drawer.stories.tsx +50 -0
- package/src/lib/components/ui/drawer.tsx +133 -0
- package/src/lib/components/ui/dropdown-menu.stories.tsx +41 -0
- package/src/lib/components/ui/dropdown-menu.tsx +223 -0
- package/src/lib/components/ui/form.tsx +141 -0
- package/src/lib/components/ui/grid-layout.tsx +376 -0
- package/src/lib/components/ui/hover-card.stories.tsx +38 -0
- package/src/lib/components/ui/hover-card.tsx +36 -0
- package/src/lib/components/ui/input-group.tsx +149 -0
- package/src/lib/components/ui/input-otp.stories.tsx +30 -0
- package/src/lib/components/ui/input-otp.tsx +77 -0
- package/src/lib/components/ui/input.stories.tsx +38 -0
- package/src/lib/components/ui/input.tsx +19 -0
- package/src/lib/components/ui/label.stories.tsx +24 -0
- package/src/lib/components/ui/label.tsx +21 -0
- package/src/lib/components/ui/menubar.stories.tsx +53 -0
- package/src/lib/components/ui/menubar.tsx +274 -0
- package/src/lib/components/ui/navigation-menu.stories.tsx +54 -0
- package/src/lib/components/ui/navigation-menu.tsx +168 -0
- package/src/lib/components/ui/pagination.stories.tsx +51 -0
- package/src/lib/components/ui/pagination.tsx +106 -0
- package/src/lib/components/ui/password-input.stories.tsx +32 -0
- package/src/lib/components/ui/password-input.tsx +29 -0
- package/src/lib/components/ui/popover.stories.tsx +33 -0
- package/src/lib/components/ui/popover.tsx +40 -0
- package/src/lib/components/ui/progress.stories.tsx +27 -0
- package/src/lib/components/ui/progress.tsx +29 -0
- package/src/lib/components/ui/radio-group.stories.tsx +34 -0
- package/src/lib/components/ui/radio-group.tsx +45 -0
- package/src/lib/components/ui/resizable.stories.tsx +32 -0
- package/src/lib/components/ui/resizable.tsx +54 -0
- package/src/lib/components/ui/scroll-area.stories.tsx +31 -0
- package/src/lib/components/ui/scroll-area.tsx +50 -0
- package/src/lib/components/ui/select.stories.tsx +36 -0
- package/src/lib/components/ui/select.tsx +183 -0
- package/src/lib/components/ui/separator.stories.tsx +35 -0
- package/src/lib/components/ui/separator.tsx +26 -0
- package/src/lib/components/ui/sheet.stories.tsx +50 -0
- package/src/lib/components/ui/sheet.tsx +118 -0
- package/src/lib/components/ui/sidebar-context.ts +16 -0
- package/src/lib/components/ui/sidebar.tsx +686 -0
- package/src/lib/components/ui/skeleton.stories.tsx +26 -0
- package/src/lib/components/ui/skeleton.tsx +13 -0
- package/src/lib/components/ui/slider.stories.tsx +37 -0
- package/src/lib/components/ui/slider.tsx +63 -0
- package/src/lib/components/ui/sonner.tsx +27 -0
- package/src/lib/components/ui/switch.stories.tsx +31 -0
- package/src/lib/components/ui/switch.tsx +26 -0
- package/src/lib/components/ui/table.stories.tsx +52 -0
- package/src/lib/components/ui/table.tsx +82 -0
- package/src/lib/components/ui/tabs.stories.tsx +29 -0
- package/src/lib/components/ui/tabs.tsx +48 -0
- package/src/lib/components/ui/textarea.stories.tsx +32 -0
- package/src/lib/components/ui/textarea.tsx +18 -0
- package/src/lib/components/ui/toggle-group.stories.tsx +31 -0
- package/src/lib/components/ui/toggle-group.tsx +73 -0
- package/src/lib/components/ui/toggle.stories.tsx +39 -0
- package/src/lib/components/ui/toggle.tsx +45 -0
- package/src/lib/components/ui/tooltip.stories.tsx +30 -0
- package/src/lib/components/ui/tooltip.tsx +51 -0
- package/src/lib/constants.ts +336 -0
- package/src/lib/framework/alert/alert-extensions.tsx +19 -0
- package/src/lib/framework/alert/alert-item.tsx +44 -0
- package/src/lib/framework/alert/alerts-indicator.tsx +22 -0
- package/src/lib/framework/alert/search-index-buffer-alert/search-index-buffer-alert.ts +41 -0
- package/src/lib/framework/component-registry/component-registry.tsx +18 -0
- package/src/lib/framework/component-registry/display-component.tsx +28 -0
- package/src/lib/framework/dashboard-widget/base-widget.tsx +101 -0
- package/src/lib/framework/dashboard-widget/latest-orders-widget/index.tsx +152 -0
- package/src/lib/framework/dashboard-widget/latest-orders-widget/latest-orders-widget.graphql.ts +35 -0
- package/src/lib/framework/dashboard-widget/metrics-widget/chart.tsx +40 -0
- package/src/lib/framework/dashboard-widget/metrics-widget/index.tsx +96 -0
- package/src/lib/framework/dashboard-widget/metrics-widget/metrics-widget.graphql.ts +20 -0
- package/src/lib/framework/dashboard-widget/orders-summary/index.tsx +113 -0
- package/src/lib/framework/dashboard-widget/orders-summary/order-summary-widget.graphql.ts +14 -0
- package/src/lib/framework/dashboard-widget/widget-extensions.tsx +19 -0
- package/src/lib/framework/dashboard-widget/widget-filters-context.tsx +36 -0
- package/src/lib/framework/data-table/data-table-extensions.ts +35 -0
- package/src/lib/framework/defaults.ts +270 -0
- package/src/lib/framework/document-extension/extend-detail-form-query.ts +50 -0
- package/src/lib/framework/document-extension/extend-document.spec.ts +884 -0
- package/src/lib/framework/document-extension/extend-document.ts +159 -0
- package/src/lib/framework/document-introspection/add-custom-fields.spec.ts +1458 -0
- package/src/lib/framework/document-introspection/add-custom-fields.ts +452 -0
- package/src/lib/framework/document-introspection/get-document-structure.spec.ts +581 -0
- package/src/lib/framework/document-introspection/get-document-structure.ts +669 -0
- package/src/lib/framework/document-introspection/hooks.ts +13 -0
- package/src/lib/framework/document-introspection/include-only-selected-list-fields.spec.ts +1840 -0
- package/src/lib/framework/document-introspection/include-only-selected-list-fields.ts +940 -0
- package/src/lib/framework/document-introspection/testing-utils.ts +161 -0
- package/src/lib/framework/extension-api/define-dashboard-extension.ts +99 -0
- package/src/lib/framework/extension-api/display-component-extensions.tsx +58 -0
- package/src/lib/framework/extension-api/extension-api-types.ts +92 -0
- package/src/lib/framework/extension-api/input-component-extensions.tsx +96 -0
- package/src/lib/framework/extension-api/logic/alerts.ts +11 -0
- package/src/lib/framework/extension-api/logic/data-table.ts +37 -0
- package/src/lib/framework/extension-api/logic/detail-forms.ts +35 -0
- package/src/lib/framework/extension-api/logic/form-components.ts +14 -0
- package/src/lib/framework/extension-api/logic/history-entries.ts +24 -0
- package/src/lib/framework/extension-api/logic/index.ts +10 -0
- package/src/lib/framework/extension-api/logic/layout.ts +22 -0
- package/src/lib/framework/extension-api/logic/login.ts +17 -0
- package/src/lib/framework/extension-api/logic/navigation.ts +41 -0
- package/src/lib/framework/extension-api/logic/widgets.ts +10 -0
- package/src/lib/framework/extension-api/types/alerts.ts +59 -0
- package/src/lib/framework/extension-api/types/data-table.ts +159 -0
- package/src/lib/framework/extension-api/types/detail-forms.ts +58 -0
- package/src/lib/framework/extension-api/types/form-components.ts +41 -0
- package/src/lib/framework/extension-api/types/history-entries.ts +120 -0
- package/src/lib/framework/extension-api/types/index.ts +10 -0
- package/src/lib/framework/extension-api/types/layout.ts +141 -0
- package/src/lib/framework/extension-api/types/login.ts +76 -0
- package/src/lib/framework/extension-api/types/navigation.ts +105 -0
- package/src/lib/framework/extension-api/types/widgets.ts +101 -0
- package/src/lib/framework/extension-api/use-dashboard-extensions.ts +27 -0
- package/src/lib/framework/extension-api/use-login-extensions.ts +26 -0
- package/src/lib/framework/form-engine/custom-form-component-extensions.ts +15 -0
- package/src/lib/framework/form-engine/custom-form-component.tsx +16 -0
- package/src/lib/framework/form-engine/default-input-for-type.tsx +35 -0
- package/src/lib/framework/form-engine/form-control-adapter.tsx +193 -0
- package/src/lib/framework/form-engine/form-engine-types.ts +169 -0
- package/src/lib/framework/form-engine/form-schema-tools.spec.ts +610 -0
- package/src/lib/framework/form-engine/form-schema-tools.ts +417 -0
- package/src/lib/framework/form-engine/overridden-form-component.tsx +51 -0
- package/src/lib/framework/form-engine/use-generated-form.tsx +226 -0
- package/src/lib/framework/form-engine/utils.spec.ts +37 -0
- package/src/lib/framework/form-engine/utils.ts +356 -0
- package/src/lib/framework/form-engine/value-transformers.ts +150 -0
- package/src/lib/framework/history-entry/history-entry-extensions.ts +11 -0
- package/src/lib/framework/history-entry/history-entry.tsx +129 -0
- package/src/lib/framework/layout-engine/custom-form-page.stories.tsx +344 -0
- package/src/lib/framework/layout-engine/dev-mode-button.tsx +24 -0
- package/src/lib/framework/layout-engine/layout-extensions.ts +27 -0
- package/src/lib/framework/layout-engine/location-wrapper.tsx +122 -0
- package/src/lib/framework/layout-engine/page-block-provider.tsx +6 -0
- package/src/lib/framework/layout-engine/page-layout.spec.tsx +138 -0
- package/src/lib/framework/layout-engine/page-layout.tsx +700 -0
- package/src/lib/framework/layout-engine/page-provider.tsx +10 -0
- package/src/lib/framework/layout-engine/page.stories.tsx +275 -0
- package/src/lib/framework/nav-menu/nav-menu-extensions.ts +112 -0
- package/src/lib/framework/page/detail-page-route-loader.tsx +67 -0
- package/src/lib/framework/page/detail-page.stories.tsx +151 -0
- package/src/lib/framework/page/detail-page.tsx +255 -0
- package/src/lib/framework/page/list-page.stories.tsx +217 -0
- package/src/lib/framework/page/list-page.tsx +613 -0
- package/src/lib/framework/page/page-api.ts +9 -0
- package/src/lib/framework/page/page-types.ts +51 -0
- package/src/lib/framework/page/use-detail-page.ts +341 -0
- package/src/lib/framework/page/use-extended-router.tsx +139 -0
- package/src/lib/framework/registry/global-registry.ts +50 -0
- package/src/lib/framework/registry/registry-types.ts +32 -0
- package/src/lib/graphql/api.ts +123 -0
- package/src/lib/graphql/common-operations.ts +37 -0
- package/src/lib/graphql/fragments.ts +71 -0
- package/src/lib/graphql/graphql-env.d.ts +523 -0
- package/src/lib/graphql/graphql.ts +15 -0
- package/src/lib/graphql/settings-store-operations.ts +17 -0
- package/src/lib/hooks/use-alerts.ts +84 -0
- package/src/lib/hooks/use-auth.tsx +21 -0
- package/src/lib/hooks/use-channel.ts +27 -0
- package/src/lib/hooks/use-custom-field-config.ts +27 -0
- package/src/lib/hooks/use-display-locale.ts +40 -0
- package/src/lib/hooks/use-drag-and-drop.ts +86 -0
- package/src/lib/hooks/use-dynamic-translations.ts +46 -0
- package/src/lib/hooks/use-extended-detail-query.ts +37 -0
- package/src/lib/hooks/use-extended-list-query.ts +80 -0
- package/src/lib/hooks/use-floating-bulk-actions.ts +83 -0
- package/src/lib/hooks/use-grouped-permissions.ts +55 -0
- package/src/lib/hooks/use-local-format.ts +186 -0
- package/src/lib/hooks/use-mobile.ts +19 -0
- package/src/lib/hooks/use-page-block.tsx +27 -0
- package/src/lib/hooks/use-page.tsx +10 -0
- package/src/lib/hooks/use-permissions.ts +40 -0
- package/src/lib/hooks/use-saved-views.ts +238 -0
- package/src/lib/hooks/use-server-config.ts +4 -0
- package/src/lib/hooks/use-sorted-languages.ts +41 -0
- package/src/lib/hooks/use-theme.ts +10 -0
- package/src/lib/hooks/use-ui-language-loader.ts +30 -0
- package/src/lib/hooks/use-user-settings.tsx +12 -0
- package/src/lib/index.ts +293 -0
- package/src/lib/lib/load-i18n-messages.ts +20 -0
- package/src/lib/lib/trans.tsx +20 -0
- package/src/lib/lib/utils.ts +111 -0
- package/src/lib/providers/alerts-provider.tsx +60 -0
- package/src/lib/providers/auth.tsx +232 -0
- package/src/lib/providers/channel-provider.tsx +245 -0
- package/src/lib/providers/i18n-provider.tsx +21 -0
- package/src/lib/providers/server-config.tsx +289 -0
- package/src/lib/providers/theme-provider.tsx +56 -0
- package/src/lib/providers/user-settings.tsx +244 -0
- package/src/lib/types/saved-views.ts +42 -0
- package/src/lib/utils/config-utils.ts +19 -0
- package/src/lib/utils/global-languages.ts +268 -0
- package/src/lib/utils/saved-views-utils.ts +40 -0
- package/src/lib/virtual.d.ts +39 -0
- package/src/vite-env.d.ts +2 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { graphql, VariablesOf } from 'gql.tada';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
|
|
4
|
+
import { getOperationVariablesFields } from '../document-introspection/get-document-structure.js';
|
|
5
|
+
|
|
6
|
+
import { removeEmptyIdFields } from './utils.js';
|
|
7
|
+
|
|
8
|
+
const createProductDocument = graphql(`
|
|
9
|
+
mutation CreateProduct($input: CreateProductInput!) {
|
|
10
|
+
createProduct(input: $input) {
|
|
11
|
+
id
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
`);
|
|
15
|
+
|
|
16
|
+
type CreateProductInput = VariablesOf<typeof createProductDocument>;
|
|
17
|
+
|
|
18
|
+
describe('removeEmptyIdFields', () => {
|
|
19
|
+
it('should remove empty translation id field', () => {
|
|
20
|
+
const values: CreateProductInput = {
|
|
21
|
+
input: { translations: [{ id: '', languageCode: 'en' }] },
|
|
22
|
+
};
|
|
23
|
+
const fields = getOperationVariablesFields(createProductDocument);
|
|
24
|
+
const result = removeEmptyIdFields(values, fields);
|
|
25
|
+
|
|
26
|
+
expect(result).toEqual({ input: { translations: [{ languageCode: 'en' }] } });
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('should remove empty featuredAsset id field', () => {
|
|
30
|
+
const values: CreateProductInput = {
|
|
31
|
+
input: { featuredAssetId: '', translations: [] },
|
|
32
|
+
};
|
|
33
|
+
const fields = getOperationVariablesFields(createProductDocument);
|
|
34
|
+
const result = removeEmptyIdFields(values, fields);
|
|
35
|
+
expect(result).toEqual({ input: { translations: [] } });
|
|
36
|
+
});
|
|
37
|
+
});
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AllCustomFieldConfigs,
|
|
3
|
+
BooleanCustomFieldConfig,
|
|
4
|
+
BooleanStructField,
|
|
5
|
+
ConfigurableArgDef,
|
|
6
|
+
ConfigurableFieldDef,
|
|
7
|
+
DateTimeCustomFieldConfig,
|
|
8
|
+
DateTimeStructField,
|
|
9
|
+
FloatCustomFieldConfig,
|
|
10
|
+
FloatStructField,
|
|
11
|
+
IntCustomFieldConfig,
|
|
12
|
+
IntStructField,
|
|
13
|
+
LocaleStringCustomFieldConfig,
|
|
14
|
+
LocaleTextCustomFieldConfig,
|
|
15
|
+
RelationCustomFieldConfig,
|
|
16
|
+
StringCustomFieldConfig,
|
|
17
|
+
StringStructField,
|
|
18
|
+
StructCustomFieldConfig,
|
|
19
|
+
StructField,
|
|
20
|
+
TextCustomFieldConfig,
|
|
21
|
+
} from '@/vdb/framework/form-engine/form-engine-types.js';
|
|
22
|
+
import { FormEvent } from 'react';
|
|
23
|
+
import { UseFormReturn } from 'react-hook-form';
|
|
24
|
+
|
|
25
|
+
import { FieldInfo } from '../document-introspection/get-document-structure.js';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Transforms relation fields in an entity, extracting IDs from relation objects.
|
|
29
|
+
* This is primarily used for custom fields of type "ID".
|
|
30
|
+
*
|
|
31
|
+
* @param fields - Array of field information
|
|
32
|
+
* @param entity - The entity to transform
|
|
33
|
+
* @returns A new entity with transformed relation fields
|
|
34
|
+
*/
|
|
35
|
+
export function transformRelationFields<E extends Record<string, any>>(fields: FieldInfo[], entity: E): E {
|
|
36
|
+
// Create a shallow copy to avoid mutating the original entity
|
|
37
|
+
const processedEntity = { ...entity, customFields: { ...(entity.customFields ?? {}) } };
|
|
38
|
+
|
|
39
|
+
// Skip processing if there are no custom fields
|
|
40
|
+
if (!entity.customFields || !processedEntity.customFields) {
|
|
41
|
+
return processedEntity;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Find the customFields field info
|
|
45
|
+
const customFieldsInfo = fields.find(field => field.name === 'customFields' && field.typeInfo);
|
|
46
|
+
if (!customFieldsInfo?.typeInfo) {
|
|
47
|
+
return processedEntity;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Process only ID type custom fields
|
|
51
|
+
const idTypeCustomFields = customFieldsInfo.typeInfo.filter(field => field.type === 'ID');
|
|
52
|
+
|
|
53
|
+
for (const customField of idTypeCustomFields) {
|
|
54
|
+
const relationField = customField.name;
|
|
55
|
+
|
|
56
|
+
if (customField.list) {
|
|
57
|
+
// For list fields, the accessor is the field name without the "Ids" suffix
|
|
58
|
+
const propertyAccessorKey = customField.name.replace(/Ids$/, '');
|
|
59
|
+
const relationValue = entity.customFields[propertyAccessorKey];
|
|
60
|
+
|
|
61
|
+
if (relationValue) {
|
|
62
|
+
const relationIdValue = relationValue.map((v: { id: string }) => v.id);
|
|
63
|
+
if (relationIdValue && relationIdValue.length > 0) {
|
|
64
|
+
processedEntity.customFields[relationField] = relationIdValue;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
} else {
|
|
68
|
+
// For single fields, the accessor is the field name without the "Id" suffix
|
|
69
|
+
const propertyAccessorKey = customField.name.replace(/Id$/, '');
|
|
70
|
+
const relationValue = entity.customFields[propertyAccessorKey];
|
|
71
|
+
processedEntity.customFields[relationField] = relationValue?.id;
|
|
72
|
+
delete processedEntity.customFields[propertyAccessorKey];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return processedEntity;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* @description
|
|
80
|
+
* Due to the schema types, sometimes "create" mutations will have a default empty "id"
|
|
81
|
+
* field which can cause issues if we actually send them with a "create" mutation to the server.
|
|
82
|
+
* This function deletes any empty ID fields on the entity or its nested objects.
|
|
83
|
+
*/
|
|
84
|
+
export function removeEmptyIdFields<T extends Record<string, any>>(values: T, fields: FieldInfo[]): T {
|
|
85
|
+
if (!values) {
|
|
86
|
+
return values;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Create a deep copy to avoid mutating the original values
|
|
90
|
+
const result = structuredClone(values);
|
|
91
|
+
|
|
92
|
+
function recursiveRemove(obj: any, fieldDefs: FieldInfo[]) {
|
|
93
|
+
if (Array.isArray(obj)) {
|
|
94
|
+
for (const item of obj) {
|
|
95
|
+
recursiveRemove(item, fieldDefs);
|
|
96
|
+
}
|
|
97
|
+
} else if (typeof obj === 'object' && obj !== null) {
|
|
98
|
+
for (const field of fieldDefs) {
|
|
99
|
+
// Remove empty string ID fields at this level
|
|
100
|
+
if (field.type === 'ID' && typeof obj[field.name] === 'string' && obj[field.name] === '') {
|
|
101
|
+
delete obj[field.name];
|
|
102
|
+
}
|
|
103
|
+
// If the field is an object or array, recurse into it
|
|
104
|
+
if (Array.isArray(obj[field.name])) {
|
|
105
|
+
if (field.typeInfo) {
|
|
106
|
+
for (const item of obj[field.name]) {
|
|
107
|
+
recursiveRemove(item, field.typeInfo);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
} else if (
|
|
111
|
+
typeof obj[field.name] === 'object' &&
|
|
112
|
+
obj[field.name] !== null &&
|
|
113
|
+
field.typeInfo
|
|
114
|
+
) {
|
|
115
|
+
recursiveRemove(obj[field.name], field.typeInfo);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
recursiveRemove(result, fields);
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// =============================================================================
|
|
126
|
+
// TYPE GUARDS FOR CONFIGURABLE FIELD DEFINITIONS
|
|
127
|
+
// =============================================================================
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Determines if a field definition is a custom field config (vs configurable operation arg)
|
|
131
|
+
*/
|
|
132
|
+
export function isCustomFieldConfig(input: ConfigurableFieldDef): input is AllCustomFieldConfigs {
|
|
133
|
+
return input.hasOwnProperty('readonly');
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Determines if a field definition is a configurable operation argument
|
|
138
|
+
*/
|
|
139
|
+
export function isConfigurableArgDef(input: ConfigurableFieldDef): input is ConfigurableArgDef {
|
|
140
|
+
return !input.hasOwnProperty('readonly');
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// =============================================================================
|
|
144
|
+
// TYPE GUARDS FOR SPECIFIC CUSTOM FIELD TYPES
|
|
145
|
+
// =============================================================================
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* String custom field with optional pattern and options
|
|
149
|
+
*/
|
|
150
|
+
export function isStringCustomFieldConfig(input: ConfigurableFieldDef): input is StringCustomFieldConfig {
|
|
151
|
+
return input.type === 'string' && isCustomFieldConfig(input);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* String custom field that has options (select dropdown)
|
|
156
|
+
*/
|
|
157
|
+
export function isStringFieldWithOptions(input: ConfigurableFieldDef): input is StringCustomFieldConfig {
|
|
158
|
+
const isCustomFieldWithOptions =
|
|
159
|
+
input.type === 'string' &&
|
|
160
|
+
isCustomFieldConfig(input) &&
|
|
161
|
+
input.hasOwnProperty('options') &&
|
|
162
|
+
Array.isArray((input as any).options);
|
|
163
|
+
if (isCustomFieldWithOptions) {
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
const isConfigArgWithOptions =
|
|
167
|
+
input.type === 'string' && isConfigurableArgDef(input) && Array.isArray(input.ui?.options);
|
|
168
|
+
if (isConfigArgWithOptions) {
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Locale string custom field
|
|
176
|
+
*/
|
|
177
|
+
export function isLocaleStringCustomFieldConfig(
|
|
178
|
+
input: ConfigurableFieldDef,
|
|
179
|
+
): input is LocaleStringCustomFieldConfig {
|
|
180
|
+
return input.type === 'localeString' && isCustomFieldConfig(input);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Text custom field (textarea)
|
|
185
|
+
*/
|
|
186
|
+
export function isTextCustomFieldConfig(input: ConfigurableFieldDef): input is TextCustomFieldConfig {
|
|
187
|
+
return input.type === 'text' && isCustomFieldConfig(input);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Locale text custom field (localized textarea)
|
|
192
|
+
*/
|
|
193
|
+
export function isLocaleTextCustomFieldConfig(
|
|
194
|
+
input: ConfigurableFieldDef,
|
|
195
|
+
): input is LocaleTextCustomFieldConfig {
|
|
196
|
+
return input.type === 'localeText' && isCustomFieldConfig(input);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Boolean custom field
|
|
201
|
+
*/
|
|
202
|
+
export function isBooleanCustomFieldConfig(input: ConfigurableFieldDef): input is BooleanCustomFieldConfig {
|
|
203
|
+
return input.type === 'boolean' && isCustomFieldConfig(input);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Integer custom field with optional min/max/step
|
|
208
|
+
*/
|
|
209
|
+
export function isIntCustomFieldConfig(input: ConfigurableFieldDef): input is IntCustomFieldConfig {
|
|
210
|
+
return input.type === 'int' && isCustomFieldConfig(input);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Float custom field with optional min/max/step
|
|
215
|
+
*/
|
|
216
|
+
export function isFloatCustomFieldConfig(input: ConfigurableFieldDef): input is FloatCustomFieldConfig {
|
|
217
|
+
return input.type === 'float' && isCustomFieldConfig(input);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* DateTime custom field with optional min/max/step
|
|
222
|
+
*/
|
|
223
|
+
export function isDateTimeCustomFieldConfig(input: ConfigurableFieldDef): input is DateTimeCustomFieldConfig {
|
|
224
|
+
return input.type === 'datetime' && isCustomFieldConfig(input);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Relation custom field (references another entity)
|
|
229
|
+
*/
|
|
230
|
+
export function isRelationCustomFieldConfig(input: ConfigurableFieldDef): input is RelationCustomFieldConfig {
|
|
231
|
+
return input.type === 'relation' && isCustomFieldConfig(input);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Struct custom field (nested object with sub-fields)
|
|
236
|
+
*/
|
|
237
|
+
export function isStructCustomFieldConfig(input: ConfigurableFieldDef): input is StructCustomFieldConfig {
|
|
238
|
+
return input.type === 'struct' && isCustomFieldConfig(input);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Legacy alias for backward compatibility
|
|
242
|
+
export const isStructFieldConfig = isStructCustomFieldConfig;
|
|
243
|
+
|
|
244
|
+
// =============================================================================
|
|
245
|
+
// TYPE GUARDS FOR STRUCT FIELD TYPES (fields within struct custom fields)
|
|
246
|
+
// =============================================================================
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* String field within a struct custom field
|
|
250
|
+
*/
|
|
251
|
+
export function isStringStructField(input: StructField): input is StringStructField {
|
|
252
|
+
return input.type === 'string';
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* String struct field that has options (select dropdown)
|
|
257
|
+
*/
|
|
258
|
+
export function isStringStructFieldWithOptions(
|
|
259
|
+
input: StructField,
|
|
260
|
+
): input is StringStructField & { options: any[] } {
|
|
261
|
+
return (
|
|
262
|
+
input.type === 'string' && input.hasOwnProperty('options') && Array.isArray((input as any).options)
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Integer field within a struct custom field
|
|
268
|
+
*/
|
|
269
|
+
export function isIntStructField(input: StructField): input is IntStructField {
|
|
270
|
+
return input.type === 'int';
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Float field within a struct custom field
|
|
275
|
+
*/
|
|
276
|
+
export function isFloatStructField(input: StructField): input is FloatStructField {
|
|
277
|
+
return input.type === 'float';
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Boolean field within a struct custom field
|
|
282
|
+
*/
|
|
283
|
+
export function isBooleanStructField(input: StructField): input is BooleanStructField {
|
|
284
|
+
return input.type === 'boolean';
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* DateTime field within a struct custom field
|
|
289
|
+
*/
|
|
290
|
+
export function isDateTimeStructField(input: StructField): input is DateTimeStructField {
|
|
291
|
+
return input.type === 'datetime';
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// =============================================================================
|
|
295
|
+
// UTILITY TYPE GUARDS
|
|
296
|
+
// =============================================================================
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Determines if a field is a list/array field
|
|
300
|
+
*/
|
|
301
|
+
export function isListField(input?: ConfigurableFieldDef): boolean {
|
|
302
|
+
return input && isCustomFieldConfig(input) ? Boolean(input.list) : false;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Determines if a field is readonly
|
|
307
|
+
*/
|
|
308
|
+
export function isReadonlyField(input?: ConfigurableFieldDef): boolean {
|
|
309
|
+
return input && isCustomFieldConfig(input) ? Boolean(input.readonly) : false;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Determines if a field requires special permissions
|
|
314
|
+
*/
|
|
315
|
+
export function hasPermissionRequirement(input: ConfigurableFieldDef): boolean {
|
|
316
|
+
return isCustomFieldConfig(input) && Boolean(input.requiresPermission);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Determines if a field is nullable
|
|
321
|
+
*/
|
|
322
|
+
export function isNullableField(input: ConfigurableFieldDef): boolean {
|
|
323
|
+
return isCustomFieldConfig(input) && Boolean(input.nullable);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Handles nested form submission to prevent event bubbling in nested forms.
|
|
328
|
+
* This is useful when you have a form inside a dialog that's within another form.
|
|
329
|
+
*
|
|
330
|
+
* @param form - The react-hook-form instance
|
|
331
|
+
* @param onSubmit - The submit handler function
|
|
332
|
+
* @returns An event handler that prevents propagation and handles the form submission
|
|
333
|
+
*
|
|
334
|
+
* @example
|
|
335
|
+
* ```tsx
|
|
336
|
+
* const form = useForm<FormSchema>({ resolver: zodResolver(formSchema) });
|
|
337
|
+
*
|
|
338
|
+
* return (
|
|
339
|
+
* <form onSubmit={handleNestedFormSubmit(form, (data) => {
|
|
340
|
+
* // Handle form submission
|
|
341
|
+
* })}>
|
|
342
|
+
* ...
|
|
343
|
+
* </form>
|
|
344
|
+
* );
|
|
345
|
+
* ```
|
|
346
|
+
*/
|
|
347
|
+
export function handleNestedFormSubmit<TFieldValues extends Record<string, any>>(
|
|
348
|
+
form: UseFormReturn<TFieldValues>,
|
|
349
|
+
onSubmit: (data: TFieldValues) => void | Promise<void>,
|
|
350
|
+
) {
|
|
351
|
+
return (e: FormEvent<HTMLFormElement>) => {
|
|
352
|
+
e.preventDefault();
|
|
353
|
+
e.stopPropagation();
|
|
354
|
+
void form.handleSubmit(onSubmit)(e);
|
|
355
|
+
};
|
|
356
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { ConfigurableFieldDef } from '@/vdb/framework/form-engine/form-engine-types.js';
|
|
2
|
+
|
|
3
|
+
export type ValueMode = 'native' | 'json-string';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Interface for transforming values between native JavaScript types and JSON strings
|
|
7
|
+
*/
|
|
8
|
+
export interface ValueTransformer {
|
|
9
|
+
parse: (value: string, fieldDef: ConfigurableFieldDef) => any;
|
|
10
|
+
serialize: (value: any, fieldDef: ConfigurableFieldDef) => string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Native value transformer - passes values through unchanged
|
|
15
|
+
*/
|
|
16
|
+
export const nativeValueTransformer: ValueTransformer = {
|
|
17
|
+
parse: (value: string, fieldDef: ConfigurableFieldDef) => {
|
|
18
|
+
// For native mode, values are already in their correct JavaScript type
|
|
19
|
+
return value;
|
|
20
|
+
},
|
|
21
|
+
serialize: (value: any, fieldDef: ConfigurableFieldDef) => {
|
|
22
|
+
// For native mode, values are already in their correct JavaScript type
|
|
23
|
+
return value;
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* JSON string value transformer - converts between JSON strings and native values
|
|
29
|
+
*/
|
|
30
|
+
export const jsonStringValueTransformer: ValueTransformer = {
|
|
31
|
+
parse: (value: string, fieldDef: ConfigurableFieldDef) => {
|
|
32
|
+
if (value === undefined) {
|
|
33
|
+
return getDefaultValue(fieldDef);
|
|
34
|
+
}
|
|
35
|
+
// This case arises often when the administrator is actively editing
|
|
36
|
+
// values and clears out the input. At that point, we don't want to suddenly
|
|
37
|
+
// switch to the default value otherwise it results in poor UX, e.g. pressing
|
|
38
|
+
// backspace to delete a number would result in `0` suddenly appearing as the value.
|
|
39
|
+
if (value === '') {
|
|
40
|
+
return value;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
try {
|
|
44
|
+
// For JSON string mode, parse the string to get the native value
|
|
45
|
+
const parsed = JSON.parse(value);
|
|
46
|
+
|
|
47
|
+
// Handle special cases for different field types
|
|
48
|
+
switch (fieldDef.type) {
|
|
49
|
+
case 'boolean':
|
|
50
|
+
return parsed === true || parsed === 'true';
|
|
51
|
+
case 'int':
|
|
52
|
+
case 'float':
|
|
53
|
+
return typeof parsed === 'number' ? parsed : parseFloat(parsed) || 0;
|
|
54
|
+
case 'datetime':
|
|
55
|
+
return parsed;
|
|
56
|
+
default:
|
|
57
|
+
return parsed;
|
|
58
|
+
}
|
|
59
|
+
} catch (error) {
|
|
60
|
+
// If parsing fails, try to handle as a plain string for certain types
|
|
61
|
+
switch (fieldDef.type) {
|
|
62
|
+
case 'boolean':
|
|
63
|
+
return value === 'true';
|
|
64
|
+
case 'int':
|
|
65
|
+
case 'float':
|
|
66
|
+
return parseFloat(value) || 0;
|
|
67
|
+
default:
|
|
68
|
+
return value;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
serialize: (value: any, fieldDef: ConfigurableFieldDef) => {
|
|
73
|
+
if (value === null || value === undefined) {
|
|
74
|
+
return '';
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Handle special cases for different field types
|
|
78
|
+
switch (fieldDef.type) {
|
|
79
|
+
case 'boolean':
|
|
80
|
+
return (value === true || value === 'true').toString();
|
|
81
|
+
case 'int':
|
|
82
|
+
case 'float':
|
|
83
|
+
return typeof value === 'number' ? value.toString() : (parseFloat(value) || 0).toString();
|
|
84
|
+
case 'string':
|
|
85
|
+
return typeof value === 'string' ? value : JSON.stringify(value);
|
|
86
|
+
default:
|
|
87
|
+
// For complex values (arrays, objects), serialize as JSON
|
|
88
|
+
return typeof value === 'string' ? value : JSON.stringify(value);
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Get the appropriate value transformer based on the value mode
|
|
95
|
+
*/
|
|
96
|
+
export function getValueTransformer(valueMode: ValueMode): ValueTransformer {
|
|
97
|
+
switch (valueMode) {
|
|
98
|
+
case 'native':
|
|
99
|
+
return nativeValueTransformer;
|
|
100
|
+
case 'json-string':
|
|
101
|
+
return jsonStringValueTransformer;
|
|
102
|
+
default:
|
|
103
|
+
return nativeValueTransformer;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Get default value for a field type
|
|
109
|
+
*/
|
|
110
|
+
function getDefaultValue(fieldDef: ConfigurableFieldDef): any {
|
|
111
|
+
if (fieldDef.list) {
|
|
112
|
+
return [];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
switch (fieldDef.type) {
|
|
116
|
+
case 'string':
|
|
117
|
+
case 'ID':
|
|
118
|
+
case 'localeString':
|
|
119
|
+
case 'localeText':
|
|
120
|
+
return '';
|
|
121
|
+
case 'int':
|
|
122
|
+
case 'float':
|
|
123
|
+
return 0;
|
|
124
|
+
case 'boolean':
|
|
125
|
+
return false;
|
|
126
|
+
case 'datetime':
|
|
127
|
+
return '';
|
|
128
|
+
case 'relation':
|
|
129
|
+
return fieldDef.list ? [] : null;
|
|
130
|
+
case 'struct':
|
|
131
|
+
return fieldDef.list ? [] : {};
|
|
132
|
+
default:
|
|
133
|
+
return '';
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Utility to transform a value using the appropriate transformer
|
|
139
|
+
*/
|
|
140
|
+
export function transformValue(
|
|
141
|
+
value: any,
|
|
142
|
+
fieldDef: ConfigurableFieldDef,
|
|
143
|
+
valueMode: ValueMode,
|
|
144
|
+
direction: 'parse' | 'serialize',
|
|
145
|
+
): any {
|
|
146
|
+
const transformer = getValueTransformer(valueMode);
|
|
147
|
+
return direction === 'parse'
|
|
148
|
+
? transformer.parse(value, fieldDef)
|
|
149
|
+
: transformer.serialize(value, fieldDef);
|
|
150
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DashboardHistoryEntryComponent } from '@/vdb/framework/extension-api/types/index.js';
|
|
2
|
+
|
|
3
|
+
import { globalRegistry } from '../registry/global-registry.js';
|
|
4
|
+
|
|
5
|
+
globalRegistry.register('historyEntries', new Map<string, DashboardHistoryEntryComponent['component']>());
|
|
6
|
+
|
|
7
|
+
export function getCustomHistoryEntryForType(
|
|
8
|
+
type: string,
|
|
9
|
+
): DashboardHistoryEntryComponent['component'] | undefined {
|
|
10
|
+
return globalRegistry.get('historyEntries').get(type);
|
|
11
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { HistoryEntryItem } from '@/vdb/framework/extension-api/types/index.js';
|
|
2
|
+
import { cn } from '@/vdb/lib/utils.js';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { HistoryEntryDate } from '../../components/shared/history-timeline/history-entry-date.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @description
|
|
8
|
+
* The props for the {@link HistoryEntry} component.
|
|
9
|
+
*
|
|
10
|
+
* @docsCategory extensions-api
|
|
11
|
+
* @docsPage HistoryEntries
|
|
12
|
+
* @since 3.4.3
|
|
13
|
+
*/
|
|
14
|
+
export interface HistoryEntryProps {
|
|
15
|
+
/**
|
|
16
|
+
* @description
|
|
17
|
+
* The entry itself, which will get passed down to your custom component
|
|
18
|
+
*/
|
|
19
|
+
entry: HistoryEntryItem;
|
|
20
|
+
/**
|
|
21
|
+
* @description
|
|
22
|
+
* The title of the entry
|
|
23
|
+
*/
|
|
24
|
+
title: string | React.ReactNode;
|
|
25
|
+
/**
|
|
26
|
+
* @description
|
|
27
|
+
* An icon which is used to represent the entry. Note that this will only
|
|
28
|
+
* display if `isPrimary` is `true`.
|
|
29
|
+
*/
|
|
30
|
+
timelineIcon?: React.ReactNode;
|
|
31
|
+
/**
|
|
32
|
+
* @description
|
|
33
|
+
* Optional tailwind classes to apply to the icon. For instance
|
|
34
|
+
*
|
|
35
|
+
* ```ts
|
|
36
|
+
* const success = 'bg-success text-success-foreground';
|
|
37
|
+
* const destructive = 'bg-destructive text-destructive-foreground';
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
timelineIconClassName?: string;
|
|
41
|
+
/**
|
|
42
|
+
* @description
|
|
43
|
+
* The name to display of "who did the action". For instance:
|
|
44
|
+
*
|
|
45
|
+
* ```ts
|
|
46
|
+
* const getActorName = (entry: HistoryEntryItem) => {
|
|
47
|
+
* if (entry.administrator) {
|
|
48
|
+
* return `${entry.administrator.firstName} ${entry.administrator.lastName}`;
|
|
49
|
+
* } else if (entity?.customer) {
|
|
50
|
+
* return `${entity.customer.firstName} ${entity.customer.lastName}`;
|
|
51
|
+
* }
|
|
52
|
+
* return '';
|
|
53
|
+
* };
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
actorName?: string;
|
|
57
|
+
children: React.ReactNode;
|
|
58
|
+
/**
|
|
59
|
+
* @description
|
|
60
|
+
* When set to `true`, the timeline entry will feature the specified icon and will not
|
|
61
|
+
* be collapsible.
|
|
62
|
+
*/
|
|
63
|
+
isPrimary?: boolean;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* @description
|
|
68
|
+
* A component which is used to display a history entry in the order/customer history timeline.
|
|
69
|
+
*
|
|
70
|
+
* @docsCategory extensions-api
|
|
71
|
+
* @docsPage HistoryEntries
|
|
72
|
+
* @since 3.4.3
|
|
73
|
+
*/
|
|
74
|
+
export function HistoryEntry({
|
|
75
|
+
entry,
|
|
76
|
+
timelineIcon,
|
|
77
|
+
timelineIconClassName,
|
|
78
|
+
actorName,
|
|
79
|
+
title,
|
|
80
|
+
children,
|
|
81
|
+
isPrimary = true,
|
|
82
|
+
}: Readonly<HistoryEntryProps>) {
|
|
83
|
+
return (
|
|
84
|
+
<div key={entry.id} className="relative group">
|
|
85
|
+
<div
|
|
86
|
+
className={`flex gap-3 p-3 rounded-lg hover:bg-muted/30 transition-colors ${!isPrimary ? 'opacity-90' : ''}`}
|
|
87
|
+
>
|
|
88
|
+
<div className={cn(`relative z-10 flex-shrink-0`, isPrimary ? 'ml-0' : 'ml-2 mt-1')}>
|
|
89
|
+
<div
|
|
90
|
+
className={`rounded-full flex items-center justify-center ${isPrimary ? 'h-6 w-6' : 'h-2 w-2 border'} ${timelineIconClassName ?? ''} ${isPrimary ? 'shadow-sm' : 'shadow-none'}`}
|
|
91
|
+
>
|
|
92
|
+
<div className={isPrimary ? 'text-current scale-80' : 'text-current scale-0'}>
|
|
93
|
+
{timelineIcon ?? ''}
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
<div className="flex-1 min-w-0">
|
|
99
|
+
<div className="flex items-start justify-between">
|
|
100
|
+
<div className="flex-1 min-w-0">
|
|
101
|
+
<h4
|
|
102
|
+
className={`text-sm ${isPrimary ? 'font-medium text-foreground' : 'font-normal text-muted-foreground'}`}
|
|
103
|
+
>
|
|
104
|
+
{title}
|
|
105
|
+
</h4>
|
|
106
|
+
<div className="mt-1">{children}</div>
|
|
107
|
+
</div>
|
|
108
|
+
|
|
109
|
+
<div className="flex items-center gap-2 ml-4 flex-shrink-0">
|
|
110
|
+
<div className="text-right">
|
|
111
|
+
<HistoryEntryDate
|
|
112
|
+
date={entry.createdAt}
|
|
113
|
+
className={`text-xs cursor-help ${isPrimary ? 'text-muted-foreground' : 'text-muted-foreground/70'}`}
|
|
114
|
+
/>
|
|
115
|
+
{actorName && (
|
|
116
|
+
<div
|
|
117
|
+
className={`text-xs ${isPrimary ? 'text-muted-foreground' : 'text-muted-foreground/70'}`}
|
|
118
|
+
>
|
|
119
|
+
{actorName}
|
|
120
|
+
</div>
|
|
121
|
+
)}
|
|
122
|
+
</div>
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
);
|
|
129
|
+
}
|