@vendure/dashboard 3.3.6-master-202507050232 → 3.4.0-minor-202506250934
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 +4 -41
- package/dist/plugin/utils/config-loader.d.ts +1 -70
- package/dist/plugin/utils/config-loader.js +9 -33
- package/dist/plugin/vite-plugin-config-loader.js +1 -6
- package/dist/plugin/vite-plugin-config.js +7 -6
- package/dist/plugin/vite-plugin-dashboard-metadata.d.ts +3 -1
- package/dist/plugin/vite-plugin-dashboard-metadata.js +8 -1
- package/dist/plugin/vite-plugin-vendure-dashboard.d.ts +0 -41
- package/dist/plugin/vite-plugin-vendure-dashboard.js +2 -5
- package/package.json +131 -131
- package/src/app/app-providers.tsx +6 -6
- package/src/app/main.tsx +9 -9
- package/src/app/routes/__root.tsx +2 -1
- package/src/app/routes/_authenticated/_administrators/administrators.graphql.ts +1 -10
- package/src/app/routes/_authenticated/_administrators/administrators.tsx +8 -15
- package/src/app/routes/_authenticated/_administrators/administrators_.$id.tsx +12 -16
- package/src/app/routes/_authenticated/_administrators/components/role-permissions-display.tsx +16 -16
- package/src/app/routes/_authenticated/_assets/assets.graphql.ts +2 -13
- package/src/app/routes/_authenticated/_assets/assets.tsx +4 -16
- package/src/app/routes/_authenticated/_assets/assets_.$id.tsx +38 -52
- package/src/app/routes/_authenticated/_channels/channels.graphql.ts +1 -10
- package/src/app/routes/_authenticated/_channels/channels.tsx +10 -17
- package/src/app/routes/_authenticated/_channels/channels_.$id.tsx +17 -21
- package/src/app/routes/_authenticated/_collections/collections.graphql.ts +3 -60
- package/src/app/routes/_authenticated/_collections/collections.tsx +124 -168
- package/src/app/routes/_authenticated/_collections/collections_.$id.tsx +16 -20
- package/src/app/routes/_authenticated/_collections/components/collection-contents-preview-table.tsx +8 -7
- package/src/app/routes/_authenticated/_collections/components/collection-contents-sheet.tsx +5 -9
- package/src/app/routes/_authenticated/_collections/components/collection-contents-table.tsx +9 -10
- package/src/app/routes/_authenticated/_collections/components/collection-filters-selector.tsx +7 -7
- package/src/app/routes/_authenticated/_countries/countries.graphql.ts +2 -11
- package/src/app/routes/_authenticated/_countries/countries.tsx +6 -13
- package/src/app/routes/_authenticated/_countries/countries_.$id.tsx +17 -21
- package/src/app/routes/_authenticated/_customer-groups/components/customer-group-members-sheet.tsx +5 -12
- package/src/app/routes/_authenticated/_customer-groups/components/customer-group-members-table.tsx +17 -22
- package/src/app/routes/_authenticated/_customer-groups/customer-groups.graphql.ts +2 -11
- package/src/app/routes/_authenticated/_customer-groups/customer-groups.tsx +6 -13
- package/src/app/routes/_authenticated/_customer-groups/customer-groups_.$id.tsx +15 -18
- package/src/app/routes/_authenticated/_customers/components/customer-address-card.tsx +19 -19
- package/src/app/routes/_authenticated/_customers/components/customer-address-form.tsx +10 -10
- package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history-container.tsx +5 -5
- package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history.tsx +7 -11
- package/src/app/routes/_authenticated/_customers/components/customer-history/use-customer-history.ts +4 -4
- package/src/app/routes/_authenticated/_customers/components/customer-order-table.tsx +73 -75
- package/src/app/routes/_authenticated/_customers/components/customer-status-badge.tsx +4 -4
- package/src/app/routes/_authenticated/_customers/customers.graphql.ts +2 -10
- package/src/app/routes/_authenticated/_customers/customers.tsx +6 -13
- package/src/app/routes/_authenticated/_customers/customers_.$id.tsx +15 -19
- package/src/app/routes/_authenticated/_facets/components/edit-facet-value.tsx +9 -9
- package/src/app/routes/_authenticated/_facets/components/facet-values-sheet.tsx +4 -4
- package/src/app/routes/_authenticated/_facets/components/facet-values-table.tsx +11 -15
- package/src/app/routes/_authenticated/_facets/facets.graphql.ts +1 -31
- package/src/app/routes/_authenticated/_facets/facets.tsx +7 -31
- package/src/app/routes/_authenticated/_facets/facets_.$id.tsx +13 -17
- package/src/app/routes/_authenticated/_global-settings/global-settings.graphql.ts +1 -1
- package/src/app/routes/_authenticated/_global-settings/global-settings.tsx +13 -13
- package/src/app/routes/_authenticated/_orders/components/customer-address-selector.tsx +14 -11
- package/src/app/routes/_authenticated/_orders/components/edit-order-table.tsx +55 -93
- package/src/app/routes/_authenticated/_orders/components/money-gross-net.tsx +9 -11
- package/src/app/routes/_authenticated/_orders/components/order-address.tsx +6 -5
- package/src/app/routes/_authenticated/_orders/components/order-history/order-history-container.tsx +62 -67
- package/src/app/routes/_authenticated/_orders/components/order-history/order-history.tsx +6 -11
- package/src/app/routes/_authenticated/_orders/components/order-history/use-order-history.ts +5 -9
- package/src/app/routes/_authenticated/_orders/components/order-line-custom-fields-form.tsx +7 -11
- package/src/app/routes/_authenticated/_orders/components/order-table-totals.tsx +22 -39
- package/src/app/routes/_authenticated/_orders/components/order-table.tsx +4 -4
- package/src/app/routes/_authenticated/_orders/components/order-tax-summary.tsx +36 -37
- package/src/app/routes/_authenticated/_orders/components/payment-details.tsx +33 -18
- package/src/app/routes/_authenticated/_orders/components/shipping-method-selector.tsx +44 -43
- package/src/app/routes/_authenticated/_orders/orders.graphql.ts +3 -101
- package/src/app/routes/_authenticated/_orders/orders.tsx +20 -21
- package/src/app/routes/_authenticated/_orders/orders_.$id.tsx +16 -72
- package/src/app/routes/_authenticated/_orders/orders_.draft.$id.tsx +90 -188
- package/src/app/routes/_authenticated/_payment-methods/components/payment-eligibility-checker-selector.tsx +7 -10
- package/src/app/routes/_authenticated/_payment-methods/components/payment-handler-selector.tsx +11 -11
- package/src/app/routes/_authenticated/_payment-methods/payment-methods.graphql.ts +2 -29
- package/src/app/routes/_authenticated/_payment-methods/payment-methods.tsx +14 -36
- package/src/app/routes/_authenticated/_payment-methods/payment-methods_.$id.tsx +15 -22
- package/src/app/routes/_authenticated/_product-variants/components/variant-price-detail.tsx +6 -7
- package/src/app/routes/_authenticated/_product-variants/product-variants.graphql.ts +3 -64
- package/src/app/routes/_authenticated/_product-variants/product-variants.tsx +9 -39
- package/src/app/routes/_authenticated/_product-variants/product-variants_.$id.tsx +22 -33
- package/src/app/routes/_authenticated/_products/components/add-product-variant-dialog.tsx +10 -10
- package/src/app/routes/_authenticated/_products/components/create-product-options-dialog.tsx +41 -57
- package/src/app/routes/_authenticated/_products/components/create-product-variants-dialog.tsx +11 -11
- package/src/app/routes/_authenticated/_products/components/create-product-variants.tsx +14 -18
- package/src/app/routes/_authenticated/_products/components/option-value-input.tsx +15 -21
- package/src/app/routes/_authenticated/_products/components/product-option-select.tsx +34 -28
- package/src/app/routes/_authenticated/_products/components/product-variants-table.tsx +53 -84
- package/src/app/routes/_authenticated/_products/products.graphql.ts +2 -70
- package/src/app/routes/_authenticated/_products/products.tsx +7 -36
- package/src/app/routes/_authenticated/_products/products_.$id.tsx +24 -33
- package/src/app/routes/_authenticated/_profile/profile.graphql.ts +1 -1
- package/src/app/routes/_authenticated/_profile/profile.tsx +8 -8
- package/src/app/routes/_authenticated/_promotions/components/promotion-actions-selector.tsx +11 -14
- package/src/app/routes/_authenticated/_promotions/components/promotion-conditions-selector.tsx +11 -14
- package/src/app/routes/_authenticated/_promotions/promotions.graphql.ts +2 -27
- package/src/app/routes/_authenticated/_promotions/promotions.tsx +7 -31
- package/src/app/routes/_authenticated/_promotions/promotions_.$id.tsx +16 -20
- package/src/app/routes/_authenticated/_roles/components/expandable-permissions.tsx +5 -5
- package/src/app/routes/_authenticated/_roles/components/permissions-grid.tsx +17 -21
- package/src/app/routes/_authenticated/_roles/roles.graphql.ts +1 -10
- package/src/app/routes/_authenticated/_roles/roles.tsx +10 -17
- package/src/app/routes/_authenticated/_roles/roles_.$id.tsx +12 -16
- package/src/app/routes/_authenticated/_sellers/sellers.graphql.ts +1 -10
- package/src/app/routes/_authenticated/_sellers/sellers.tsx +6 -13
- package/src/app/routes/_authenticated/_sellers/sellers_.$id.tsx +13 -17
- package/src/app/routes/_authenticated/_shipping-methods/components/fulfillment-handler-selector.tsx +6 -6
- package/src/app/routes/_authenticated/_shipping-methods/components/shipping-calculator-selector.tsx +21 -23
- package/src/app/routes/_authenticated/_shipping-methods/components/shipping-eligibility-checker-selector.tsx +21 -25
- package/src/app/routes/_authenticated/_shipping-methods/components/test-shipping-method-dialog.tsx +3 -3
- package/src/app/routes/_authenticated/_shipping-methods/shipping-methods.graphql.ts +2 -29
- package/src/app/routes/_authenticated/_shipping-methods/shipping-methods.tsx +6 -25
- package/src/app/routes/_authenticated/_shipping-methods/shipping-methods_.$id.tsx +13 -17
- package/src/app/routes/_authenticated/_stock-locations/stock-locations.graphql.ts +1 -26
- package/src/app/routes/_authenticated/_stock-locations/stock-locations.tsx +6 -25
- package/src/app/routes/_authenticated/_stock-locations/stock-locations_.$id.tsx +12 -16
- package/src/app/routes/_authenticated/_system/components/payload-dialog.tsx +4 -4
- package/src/app/routes/_authenticated/_system/healthchecks.tsx +4 -4
- package/src/app/routes/_authenticated/_system/job-queue.graphql.ts +1 -1
- package/src/app/routes/_authenticated/_system/job-queue.tsx +6 -10
- package/src/app/routes/_authenticated/_system/scheduled-tasks.tsx +28 -34
- package/src/app/routes/_authenticated/_tax-categories/tax-categories.graphql.ts +2 -11
- package/src/app/routes/_authenticated/_tax-categories/tax-categories.tsx +7 -14
- package/src/app/routes/_authenticated/_tax-categories/tax-categories_.$id.tsx +16 -20
- package/src/app/routes/_authenticated/_tax-rates/tax-rates.graphql.ts +2 -11
- package/src/app/routes/_authenticated/_tax-rates/tax-rates.tsx +8 -15
- package/src/app/routes/_authenticated/_tax-rates/tax-rates_.$id.tsx +18 -22
- package/src/app/routes/_authenticated/_zones/components/zone-countries-sheet.tsx +4 -4
- package/src/app/routes/_authenticated/_zones/components/zone-countries-table.tsx +8 -12
- package/src/app/routes/_authenticated/_zones/zones.graphql.ts +2 -11
- package/src/app/routes/_authenticated/_zones/zones.tsx +6 -13
- package/src/app/routes/_authenticated/_zones/zones_.$id.tsx +14 -18
- package/src/app/routes/_authenticated/index.tsx +4 -4
- package/src/app/routes/_authenticated.tsx +3 -3
- package/src/app/routes/login.tsx +2 -2
- package/src/app/styles.css +1 -4
- package/src/lib/components/data-display/boolean.tsx +1 -1
- package/src/lib/components/data-display/date-time.tsx +2 -2
- package/src/lib/components/data-display/json.tsx +1 -1
- package/src/lib/components/data-display/money.tsx +3 -2
- package/src/lib/components/data-input/affixed-input.tsx +8 -3
- package/src/lib/components/data-input/customer-group-input.tsx +2 -2
- package/src/lib/components/data-input/datetime-input.tsx +146 -129
- package/src/lib/components/data-input/facet-value-input.tsx +22 -30
- package/src/lib/components/data-input/money-input.tsx +12 -5
- package/src/lib/components/data-input/{rich-text-input.tsx → richt-text-input.tsx} +1 -1
- package/src/lib/components/data-table/add-filter-menu.tsx +18 -9
- package/src/lib/components/data-table/data-table-column-header.tsx +22 -4
- package/src/lib/components/data-table/data-table-faceted-filter.tsx +8 -8
- package/src/lib/components/data-table/data-table-filter-badge.tsx +8 -16
- package/src/lib/components/data-table/data-table-filter-dialog.tsx +8 -8
- package/src/lib/components/data-table/data-table-pagination.tsx +4 -4
- package/src/lib/components/data-table/data-table-view-options.tsx +21 -25
- package/src/lib/components/data-table/data-table.tsx +41 -85
- package/src/lib/components/data-table/filters/data-table-boolean-filter.tsx +8 -11
- package/src/lib/components/data-table/filters/data-table-datetime-filter.tsx +23 -14
- package/src/lib/components/data-table/filters/data-table-id-filter.tsx +10 -15
- package/src/lib/components/data-table/filters/data-table-number-filter.tsx +17 -18
- package/src/lib/components/data-table/filters/data-table-string-filter.tsx +12 -29
- package/src/lib/components/data-table/human-readable-operator.tsx +3 -3
- package/src/lib/components/data-table/refresh-button.tsx +15 -30
- package/src/lib/components/layout/app-layout.tsx +8 -8
- package/src/lib/components/layout/app-sidebar.tsx +5 -5
- package/src/lib/components/layout/channel-switcher.tsx +8 -8
- package/src/lib/components/layout/content-language-selector.tsx +10 -16
- package/src/lib/components/layout/generated-breadcrumbs.tsx +1 -1
- package/src/lib/components/layout/language-dialog.tsx +11 -5
- package/src/lib/components/layout/nav-main.tsx +4 -4
- package/src/lib/components/layout/nav-projects.tsx +2 -2
- package/src/lib/components/layout/nav-user.tsx +7 -7
- package/src/lib/components/layout/prerelease-popup.tsx +1 -1
- package/src/lib/components/login/login-form.tsx +5 -5
- package/src/lib/components/shared/alerts.tsx +3 -3
- package/src/lib/components/shared/animated-number.tsx +2 -2
- package/src/lib/components/shared/asset/asset-focal-point-editor.tsx +19 -29
- package/src/lib/components/shared/asset/asset-gallery.tsx +18 -23
- package/src/lib/components/shared/asset/asset-picker-dialog.tsx +66 -63
- package/src/lib/components/shared/asset/asset-preview-dialog.tsx +7 -3
- package/src/lib/components/shared/asset/asset-preview-selector.tsx +6 -4
- package/src/lib/components/shared/asset/asset-preview.tsx +15 -7
- package/src/lib/components/shared/asset/asset-properties.tsx +9 -7
- package/src/lib/components/shared/asset/focal-point-control.tsx +13 -5
- package/src/lib/components/shared/assigned-facet-values.tsx +5 -1
- package/src/lib/components/shared/channel-code-label.tsx +4 -3
- package/src/lib/components/shared/channel-selector.tsx +6 -6
- package/src/lib/components/shared/configurable-operation-arg-input.tsx +2 -2
- package/src/lib/components/shared/configurable-operation-input.tsx +16 -15
- package/src/lib/components/shared/confirmation-dialog.tsx +2 -2
- package/src/lib/components/shared/copyable-text.tsx +4 -3
- package/src/lib/components/shared/country-selector.tsx +18 -21
- package/src/lib/components/shared/currency-selector.tsx +5 -5
- package/src/lib/components/shared/custom-fields-form.tsx +51 -253
- package/src/lib/components/shared/customer-address-form.tsx +13 -18
- package/src/lib/components/shared/customer-group-selector.tsx +6 -6
- package/src/lib/components/shared/customer-selector.tsx +18 -24
- package/src/lib/components/shared/detail-page-button.tsx +1 -3
- package/src/lib/components/shared/entity-assets.tsx +34 -33
- package/src/lib/components/shared/error-page.tsx +6 -6
- package/src/lib/components/shared/facet-value-chip.tsx +5 -12
- package/src/lib/components/shared/facet-value-selector.tsx +63 -64
- package/src/lib/components/shared/form-field-wrapper.tsx +24 -47
- package/src/lib/components/shared/history-timeline/history-entry.tsx +6 -12
- package/src/lib/components/shared/history-timeline/history-note-checkbox.tsx +3 -3
- package/src/lib/components/shared/history-timeline/history-note-editor.tsx +4 -4
- package/src/lib/components/shared/history-timeline/history-note-input.tsx +3 -3
- package/src/lib/components/shared/history-timeline/history-timeline.tsx +8 -15
- package/src/lib/components/shared/language-selector.tsx +5 -5
- package/src/lib/components/shared/logo-mark.tsx +2 -2
- package/src/lib/components/shared/multi-select.tsx +5 -5
- package/src/lib/components/shared/navigation-confirmation.tsx +9 -24
- package/src/lib/components/shared/option-value-input.tsx +15 -17
- package/src/lib/components/shared/paginated-list-data-table.tsx +24 -100
- package/src/lib/components/shared/permission-guard.tsx +4 -4
- package/src/lib/components/shared/product-variant-selector.tsx +31 -32
- package/src/lib/components/shared/role-code-label.tsx +6 -10
- package/src/lib/components/shared/role-selector.tsx +4 -4
- package/src/lib/components/shared/seller-selector.tsx +17 -21
- package/src/lib/components/shared/stock-level-label.tsx +5 -5
- package/src/lib/components/shared/tax-category-selector.tsx +5 -5
- package/src/lib/components/shared/translatable-form-field.tsx +21 -30
- package/src/lib/components/shared/vendure-image.tsx +2 -31
- package/src/lib/components/shared/zone-selector.tsx +6 -5
- package/src/lib/components/ui/accordion.tsx +3 -3
- package/src/lib/components/ui/alert-dialog.tsx +10 -10
- package/src/lib/components/ui/alert.tsx +3 -3
- package/src/lib/components/ui/badge.tsx +2 -2
- package/src/lib/components/ui/breadcrumb.tsx +4 -4
- package/src/lib/components/ui/button.tsx +3 -10
- package/src/lib/components/ui/calendar.tsx +459 -392
- package/src/lib/components/ui/card.tsx +2 -2
- package/src/lib/components/ui/checkbox.tsx +2 -2
- package/src/lib/components/ui/command.tsx +6 -12
- package/src/lib/components/ui/dialog.tsx +2 -2
- package/src/lib/components/ui/dropdown-menu.tsx +7 -7
- package/src/lib/components/ui/form.tsx +4 -4
- package/src/lib/components/ui/hover-card.tsx +3 -3
- package/src/lib/components/ui/input.tsx +1 -1
- package/src/lib/components/ui/label.tsx +2 -2
- package/src/lib/components/ui/pagination.tsx +108 -87
- package/src/lib/components/ui/popover.tsx +3 -3
- package/src/lib/components/ui/scroll-area.tsx +2 -2
- package/src/lib/components/ui/select.tsx +129 -151
- package/src/lib/components/ui/separator.tsx +2 -2
- package/src/lib/components/ui/sheet.tsx +5 -5
- package/src/lib/components/ui/sidebar.tsx +10 -10
- package/src/lib/components/ui/skeleton.tsx +1 -1
- package/src/lib/components/ui/switch.tsx +2 -2
- package/src/lib/components/ui/table.tsx +2 -2
- package/src/lib/components/ui/tabs.tsx +3 -3
- package/src/lib/components/ui/textarea.tsx +1 -1
- package/src/lib/components/ui/tooltip.tsx +3 -3
- package/src/lib/framework/alert/alert-extensions.tsx +3 -2
- package/src/lib/framework/alert/alert-item.tsx +3 -5
- package/src/lib/framework/alert/types.ts +13 -0
- package/src/lib/framework/component-registry/component-registry.tsx +47 -33
- package/src/lib/framework/dashboard-widget/base-widget.tsx +13 -5
- package/src/lib/framework/dashboard-widget/latest-orders-widget/index.tsx +8 -8
- package/src/lib/framework/dashboard-widget/latest-orders-widget/latest-orders-widget.graphql.ts +1 -1
- package/src/lib/framework/dashboard-widget/metrics-widget/index.tsx +7 -6
- package/src/lib/framework/dashboard-widget/metrics-widget/metrics-widget.graphql.ts +1 -1
- package/src/lib/framework/dashboard-widget/orders-summary/index.tsx +6 -7
- package/src/lib/framework/dashboard-widget/orders-summary/order-summary-widget.graphql.ts +1 -1
- package/src/lib/framework/dashboard-widget/types.ts +22 -0
- package/src/lib/framework/dashboard-widget/widget-extensions.tsx +1 -1
- package/src/lib/framework/defaults.ts +1 -1
- package/src/lib/framework/document-introspection/add-custom-fields.ts +2 -50
- package/src/lib/framework/document-introspection/get-document-structure.ts +10 -43
- package/src/lib/framework/document-introspection/hooks.ts +1 -4
- package/src/lib/framework/extension-api/define-dashboard-extension.ts +49 -31
- package/src/lib/framework/extension-api/extension-api-types.ts +98 -25
- package/src/lib/framework/extension-api/use-dashboard-extensions.ts +1 -2
- package/src/lib/framework/form-engine/form-schema-tools.ts +1 -1
- package/src/lib/framework/form-engine/use-generated-form.tsx +18 -57
- package/src/lib/framework/layout-engine/location-wrapper.tsx +72 -105
- package/src/lib/framework/layout-engine/page-layout.tsx +52 -70
- package/src/lib/framework/page/detail-page-route-loader.tsx +7 -26
- package/src/lib/framework/page/detail-page.tsx +37 -94
- package/src/lib/framework/page/list-page.tsx +11 -9
- package/src/lib/framework/page/use-detail-page.ts +7 -38
- package/src/lib/framework/page/use-extended-router.tsx +5 -4
- package/src/lib/framework/registry/registry-types.ts +5 -15
- package/src/lib/graphql/{fragments.ts → fragments.tsx} +2 -1
- package/src/lib/graphql/graphql-env.d.ts +13 -16
- package/src/lib/hooks/use-auth.tsx +1 -1
- package/src/lib/hooks/use-channel.ts +1 -1
- package/src/lib/hooks/use-grouped-permissions.ts +2 -3
- package/src/lib/hooks/use-page.tsx +2 -2
- package/src/lib/hooks/use-permissions.ts +2 -3
- package/src/lib/hooks/use-server-config.ts +1 -1
- package/src/lib/hooks/use-theme.ts +1 -1
- package/src/lib/hooks/use-user-settings.tsx +1 -1
- package/src/lib/index.ts +6 -65
- package/src/lib/lib/trans.tsx +3 -3
- package/src/lib/lib/utils.ts +0 -49
- package/src/lib/providers/auth.tsx +14 -37
- package/src/lib/providers/channel-provider.tsx +4 -4
- package/src/lib/providers/server-config.tsx +11 -13
- package/src/lib/providers/theme-provider.tsx +3 -2
- package/vite/utils/config-loader.ts +10 -120
- package/vite/vite-plugin-config-loader.ts +1 -6
- package/vite/vite-plugin-config.ts +7 -6
- package/vite/vite-plugin-dashboard-metadata.ts +9 -1
- package/vite/vite-plugin-vendure-dashboard.ts +4 -48
- package/dist/plugin/tests/barrel-exports/my-plugin/index.d.ts +0 -1
- package/dist/plugin/tests/barrel-exports/my-plugin/index.js +0 -17
- package/dist/plugin/tests/barrel-exports/my-plugin/src/my.plugin.d.ts +0 -2
- package/dist/plugin/tests/barrel-exports/my-plugin/src/my.plugin.js +0 -20
- package/dist/plugin/tests/barrel-exports/vendure-config.d.ts +0 -2
- package/dist/plugin/tests/barrel-exports/vendure-config.js +0 -19
- package/dist/plugin/tests/barrel-exports.spec.d.ts +0 -1
- package/dist/plugin/tests/barrel-exports.spec.js +0 -14
- package/dist/plugin/vite-plugin-tailwind-source.d.ts +0 -7
- package/dist/plugin/vite-plugin-tailwind-source.js +0 -49
- package/src/app/common/delete-bulk-action.tsx +0 -148
- package/src/app/common/duplicate-bulk-action.tsx +0 -134
- package/src/app/routes/_authenticated/_administrators/components/administrator-bulk-actions.tsx +0 -15
- package/src/app/routes/_authenticated/_assets/components/asset-bulk-actions.tsx +0 -45
- package/src/app/routes/_authenticated/_channels/components/channel-bulk-actions.tsx +0 -15
- package/src/app/routes/_authenticated/_collections/components/collection-bulk-actions.tsx +0 -123
- package/src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx +0 -430
- package/src/app/routes/_authenticated/_collections/components/move-single-collection.tsx +0 -33
- package/src/app/routes/_authenticated/_countries/components/country-bulk-actions.tsx +0 -15
- package/src/app/routes/_authenticated/_customer-groups/components/customer-group-bulk-actions.tsx +0 -15
- package/src/app/routes/_authenticated/_customers/components/customer-bulk-actions.tsx +0 -15
- package/src/app/routes/_authenticated/_facets/components/facet-bulk-actions.tsx +0 -104
- package/src/app/routes/_authenticated/_orders/components/add-manual-payment-dialog.tsx +0 -191
- package/src/app/routes/_authenticated/_orders/components/fulfill-order-dialog.tsx +0 -320
- package/src/app/routes/_authenticated/_orders/components/fulfillment-details.tsx +0 -173
- package/src/app/routes/_authenticated/_orders/utils/order-types.ts +0 -7
- package/src/app/routes/_authenticated/_orders/utils/order-utils.ts +0 -77
- package/src/app/routes/_authenticated/_payment-methods/components/payment-method-bulk-actions.tsx +0 -58
- package/src/app/routes/_authenticated/_product-variants/components/product-variant-bulk-actions.tsx +0 -110
- package/src/app/routes/_authenticated/_products/components/assign-facet-values-dialog.tsx +0 -281
- package/src/app/routes/_authenticated/_products/components/product-bulk-actions.tsx +0 -123
- package/src/app/routes/_authenticated/_promotions/components/promotion-bulk-actions.tsx +0 -82
- package/src/app/routes/_authenticated/_roles/components/role-bulk-actions.tsx +0 -15
- package/src/app/routes/_authenticated/_sellers/components/seller-bulk-actions.tsx +0 -15
- package/src/app/routes/_authenticated/_shipping-methods/components/shipping-method-bulk-actions.tsx +0 -61
- package/src/app/routes/_authenticated/_stock-locations/components/stock-location-bulk-actions.tsx +0 -58
- package/src/app/routes/_authenticated/_tax-categories/components/tax-category-bulk-actions.tsx +0 -15
- package/src/app/routes/_authenticated/_tax-rates/components/tax-rate-bulk-actions.tsx +0 -15
- package/src/app/routes/_authenticated/_zones/components/zone-bulk-actions.tsx +0 -15
- package/src/lib/components/data-input/index.ts +0 -11
- package/src/lib/components/data-input/relation-input.tsx +0 -153
- package/src/lib/components/data-input/relation-selector.tsx +0 -468
- package/src/lib/components/data-table/data-table-bulk-action-item.tsx +0 -101
- package/src/lib/components/data-table/data-table-bulk-actions.tsx +0 -95
- package/src/lib/components/labeled-data.tsx +0 -21
- package/src/lib/components/shared/asset/asset-bulk-actions.tsx +0 -94
- package/src/lib/components/shared/assign-to-channel-bulk-action.tsx +0 -71
- package/src/lib/components/shared/assign-to-channel-dialog.tsx +0 -155
- package/src/lib/components/shared/remove-from-channel-bulk-action.tsx +0 -90
- package/src/lib/framework/data-table/data-table-extensions.ts +0 -35
- package/src/lib/framework/document-extension/extend-detail-form-query.ts +0 -50
- package/src/lib/framework/document-extension/extend-document.spec.ts +0 -884
- package/src/lib/framework/document-extension/extend-document.ts +0 -159
- package/src/lib/framework/extension-api/display-component-extensions.tsx +0 -69
- package/src/lib/framework/extension-api/input-component-extensions.tsx +0 -69
- package/src/lib/framework/extension-api/logic/alerts.ts +0 -10
- package/src/lib/framework/extension-api/logic/data-table.ts +0 -60
- package/src/lib/framework/extension-api/logic/detail-forms.ts +0 -48
- package/src/lib/framework/extension-api/logic/form-components.ts +0 -13
- package/src/lib/framework/extension-api/logic/index.ts +0 -8
- package/src/lib/framework/extension-api/logic/layout.ts +0 -22
- package/src/lib/framework/extension-api/logic/navigation.ts +0 -37
- package/src/lib/framework/extension-api/logic/widgets.ts +0 -10
- package/src/lib/framework/extension-api/types/alerts.ts +0 -54
- package/src/lib/framework/extension-api/types/data-table.ts +0 -87
- package/src/lib/framework/extension-api/types/detail-forms.ts +0 -81
- package/src/lib/framework/extension-api/types/form-components.ts +0 -32
- package/src/lib/framework/extension-api/types/index.ts +0 -8
- package/src/lib/framework/extension-api/types/layout.ts +0 -78
- package/src/lib/framework/extension-api/types/navigation.ts +0 -19
- package/src/lib/framework/extension-api/types/widgets.ts +0 -97
- package/src/lib/framework/form-engine/custom-form-component-extensions.ts +0 -38
- package/src/lib/framework/form-engine/custom-form-component.tsx +0 -33
- package/src/lib/framework/form-engine/overridden-form-component.tsx +0 -51
- package/src/lib/framework/form-engine/utils.ts +0 -58
- package/src/lib/framework/layout-engine/page-block-provider.tsx +0 -6
- package/src/lib/graphql/common-operations.ts +0 -18
- package/src/lib/hooks/use-extended-detail-query.ts +0 -37
- package/src/lib/hooks/use-extended-list-query.ts +0 -73
- package/src/lib/hooks/use-page-block.tsx +0 -18
- package/vite/tests/barrel-exports/my-plugin/index.ts +0 -1
- package/vite/tests/barrel-exports/my-plugin/src/my.plugin.ts +0 -8
- package/vite/tests/barrel-exports/package.json +0 -6
- package/vite/tests/barrel-exports/vendure-config.ts +0 -19
- package/vite/tests/barrel-exports.spec.ts +0 -21
- package/vite/vite-plugin-tailwind-source.ts +0 -65
- /package/src/lib/components/data-table/{types.ts → data-table-types.ts} +0 -0
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
DataDisplayComponent,
|
|
3
|
-
DataInputComponent,
|
|
4
|
-
} from '@/vdb/framework/component-registry/component-registry.js';
|
|
5
|
-
import { DocumentNode } from 'graphql';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* @description
|
|
9
|
-
* Allows you to define custom input components for specific fields in detail forms.
|
|
10
|
-
* The pageId is already defined in the detail form extension, so only the blockId and field are needed.
|
|
11
|
-
*
|
|
12
|
-
* @docsCategory extensions
|
|
13
|
-
* @since 3.4.0
|
|
14
|
-
*/
|
|
15
|
-
export interface DashboardDetailFormInputComponent {
|
|
16
|
-
/**
|
|
17
|
-
* @description
|
|
18
|
-
* The ID of the block where this input component should be used.
|
|
19
|
-
*/
|
|
20
|
-
blockId: string;
|
|
21
|
-
/**
|
|
22
|
-
* @description
|
|
23
|
-
* The name of the field where this input component should be used.
|
|
24
|
-
*/
|
|
25
|
-
field: string;
|
|
26
|
-
/**
|
|
27
|
-
* @description
|
|
28
|
-
* The React component that will be rendered as the input.
|
|
29
|
-
* It should accept `value`, `onChange`, and other standard input props.
|
|
30
|
-
*/
|
|
31
|
-
component: DataInputComponent;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* @description
|
|
36
|
-
* Allows you to define custom display components for specific fields in detail forms.
|
|
37
|
-
* The pageId is already defined in the detail form extension, so only the blockId and field are needed.
|
|
38
|
-
*
|
|
39
|
-
* @docsCategory extensions
|
|
40
|
-
* @since 3.4.0
|
|
41
|
-
*/
|
|
42
|
-
export interface DashboardDetailFormDisplayComponent {
|
|
43
|
-
/**
|
|
44
|
-
* @description
|
|
45
|
-
* The ID of the block where this display component should be used.
|
|
46
|
-
*/
|
|
47
|
-
blockId: string;
|
|
48
|
-
/**
|
|
49
|
-
* @description
|
|
50
|
-
* The name of the field where this display component should be used.
|
|
51
|
-
*/
|
|
52
|
-
field: string;
|
|
53
|
-
/**
|
|
54
|
-
* @description
|
|
55
|
-
* The React component that will be rendered as the display.
|
|
56
|
-
* It should accept `value` and other standard display props.
|
|
57
|
-
*/
|
|
58
|
-
component: DataDisplayComponent;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export interface DashboardDetailFormExtensionDefinition {
|
|
62
|
-
/**
|
|
63
|
-
* @description
|
|
64
|
-
* The ID of the page where the detail form is located, e.g. `'product-detail'`, `'order-detail'`.
|
|
65
|
-
*/
|
|
66
|
-
pageId: string;
|
|
67
|
-
/**
|
|
68
|
-
* @description
|
|
69
|
-
*/
|
|
70
|
-
extendDetailDocument?: string | DocumentNode | (() => DocumentNode | string);
|
|
71
|
-
/**
|
|
72
|
-
* @description
|
|
73
|
-
* Custom input components for specific fields in the detail form.
|
|
74
|
-
*/
|
|
75
|
-
inputs?: DashboardDetailFormInputComponent[];
|
|
76
|
-
/**
|
|
77
|
-
* @description
|
|
78
|
-
* Custom display components for specific fields in the detail form.
|
|
79
|
-
*/
|
|
80
|
-
displays?: DashboardDetailFormDisplayComponent[];
|
|
81
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import type React from 'react';
|
|
2
|
-
|
|
3
|
-
import { CustomFormComponentInputProps } from '../../form-engine/custom-form-component.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* @description
|
|
7
|
-
* Allows you to define custom form components for custom fields in the dashboard.
|
|
8
|
-
*
|
|
9
|
-
* @docsCategory extensions
|
|
10
|
-
* @since 3.4.0
|
|
11
|
-
*/
|
|
12
|
-
export interface DashboardCustomFormComponent {
|
|
13
|
-
id: string;
|
|
14
|
-
component: React.FunctionComponent<CustomFormComponentInputProps>;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* @description
|
|
19
|
-
* Interface for registering custom field components in the dashboard.
|
|
20
|
-
* For input and display components, use the co-located approach with detailForms.
|
|
21
|
-
*
|
|
22
|
-
* @docsCategory extensions
|
|
23
|
-
* @since 3.4.0
|
|
24
|
-
*/
|
|
25
|
-
export interface DashboardCustomFormComponents {
|
|
26
|
-
/**
|
|
27
|
-
* @description
|
|
28
|
-
* Custom form components for custom fields. These are used when rendering
|
|
29
|
-
* custom fields in forms.
|
|
30
|
-
*/
|
|
31
|
-
customFields?: DashboardCustomFormComponent[];
|
|
32
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
// Re-export all domain-specific types
|
|
2
|
-
export * from './alerts.js';
|
|
3
|
-
export * from './data-table.js';
|
|
4
|
-
export * from './detail-forms.js';
|
|
5
|
-
export * from './form-components.js';
|
|
6
|
-
export * from './layout.js';
|
|
7
|
-
export * from './navigation.js';
|
|
8
|
-
export * from './widgets.js';
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import type React from 'react';
|
|
2
|
-
|
|
3
|
-
import { PageContextValue } from '../../layout-engine/page-provider.js';
|
|
4
|
-
|
|
5
|
-
export interface ActionBarButtonState {
|
|
6
|
-
disabled: boolean;
|
|
7
|
-
visible: boolean;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* @description
|
|
12
|
-
* **Status: Developer Preview**
|
|
13
|
-
*
|
|
14
|
-
* Allows you to define custom action bar items for any page in the dashboard.
|
|
15
|
-
*
|
|
16
|
-
* @docsCategory extensions
|
|
17
|
-
* @since 3.3.0
|
|
18
|
-
*/
|
|
19
|
-
export interface DashboardActionBarItem {
|
|
20
|
-
/**
|
|
21
|
-
* @description
|
|
22
|
-
* The ID of the page where the action bar item should be displayed.
|
|
23
|
-
*/
|
|
24
|
-
pageId: string;
|
|
25
|
-
/**
|
|
26
|
-
* @description
|
|
27
|
-
* A React component that will be rendered in the action bar.
|
|
28
|
-
*/
|
|
29
|
-
component: React.FunctionComponent<{ context: PageContextValue }>;
|
|
30
|
-
/**
|
|
31
|
-
* @description
|
|
32
|
-
* Any permissions that are required to display this action bar item.
|
|
33
|
-
*/
|
|
34
|
-
requiresPermission?: string | string[];
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export interface DashboardActionBarDropdownMenuItem {
|
|
38
|
-
locationId: string;
|
|
39
|
-
component: React.FunctionComponent<{ context: PageContextValue }>;
|
|
40
|
-
requiresPermission?: string | string[];
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export type PageBlockPosition = { blockId: string; order: 'before' | 'after' | 'replace' };
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* @description
|
|
47
|
-
* **Status: Developer Preview**
|
|
48
|
-
*
|
|
49
|
-
* The location of a page block in the dashboard. The location can be found by turning on
|
|
50
|
-
* "developer mode" in the dashboard user menu (bottom left corner) and then
|
|
51
|
-
* clicking the `< />` icon when hovering over a page block.
|
|
52
|
-
*
|
|
53
|
-
* @docsCategory extensions
|
|
54
|
-
* @since 3.3.0
|
|
55
|
-
*/
|
|
56
|
-
export type PageBlockLocation = {
|
|
57
|
-
pageId: string;
|
|
58
|
-
position: PageBlockPosition;
|
|
59
|
-
column: 'main' | 'side';
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* @description
|
|
64
|
-
* **Status: Developer Preview**
|
|
65
|
-
*
|
|
66
|
-
* This allows you to insert a custom component into a specific location
|
|
67
|
-
* on any page in the dashboard.
|
|
68
|
-
*
|
|
69
|
-
* @docsCategory extensions
|
|
70
|
-
* @since 3.3.0
|
|
71
|
-
*/
|
|
72
|
-
export interface DashboardPageBlockDefinition {
|
|
73
|
-
id: string;
|
|
74
|
-
title?: React.ReactNode;
|
|
75
|
-
location: PageBlockLocation;
|
|
76
|
-
component: React.FunctionComponent<{ context: PageContextValue }>;
|
|
77
|
-
requiresPermission?: string | string[];
|
|
78
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { AnyRoute, RouteOptions } from '@tanstack/react-router';
|
|
2
|
-
import { LucideIcon } from 'lucide-react';
|
|
3
|
-
import type React from 'react';
|
|
4
|
-
|
|
5
|
-
import { NavMenuItem } from '../../nav-menu/nav-menu-extensions.js';
|
|
6
|
-
|
|
7
|
-
export interface DashboardRouteDefinition {
|
|
8
|
-
component: (route: AnyRoute) => React.ReactNode;
|
|
9
|
-
path: string;
|
|
10
|
-
navMenuItem?: Partial<NavMenuItem> & { sectionId: string };
|
|
11
|
-
loader?: RouteOptions['loader'];
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface DashboardNavSectionDefinition {
|
|
15
|
-
id: string;
|
|
16
|
-
title: string;
|
|
17
|
-
icon?: LucideIcon;
|
|
18
|
-
order?: number;
|
|
19
|
-
}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import React, { PropsWithChildren } from 'react';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @description
|
|
5
|
-
* **Status: Developer Preview**
|
|
6
|
-
*
|
|
7
|
-
* Base props interface for dashboard widgets.
|
|
8
|
-
*
|
|
9
|
-
* @docsCategory extensions
|
|
10
|
-
* @since 3.3.0
|
|
11
|
-
*/
|
|
12
|
-
export type DashboardBaseWidgetProps = PropsWithChildren<{
|
|
13
|
-
id: string;
|
|
14
|
-
title?: string;
|
|
15
|
-
description?: string;
|
|
16
|
-
config?: Record<string, unknown>;
|
|
17
|
-
actions?: React.ReactNode;
|
|
18
|
-
}>;
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* @description
|
|
22
|
-
* **Status: Developer Preview**
|
|
23
|
-
*
|
|
24
|
-
* Represents an instance of a dashboard widget with its layout and configuration.
|
|
25
|
-
*
|
|
26
|
-
* @docsCategory extensions
|
|
27
|
-
* @since 3.3.0
|
|
28
|
-
*/
|
|
29
|
-
export type DashboardWidgetInstance = {
|
|
30
|
-
/**
|
|
31
|
-
* @description
|
|
32
|
-
* A unique identifier for the widget instance.
|
|
33
|
-
*/
|
|
34
|
-
id: string;
|
|
35
|
-
/**
|
|
36
|
-
* @description
|
|
37
|
-
* The ID of the widget definition this instance is based on.
|
|
38
|
-
*/
|
|
39
|
-
widgetId: string;
|
|
40
|
-
/**
|
|
41
|
-
* @description
|
|
42
|
-
* The layout configuration for the widget.
|
|
43
|
-
*/
|
|
44
|
-
layout: {
|
|
45
|
-
x: number;
|
|
46
|
-
y: number;
|
|
47
|
-
w: number;
|
|
48
|
-
h: number;
|
|
49
|
-
};
|
|
50
|
-
/**
|
|
51
|
-
* @description
|
|
52
|
-
* Optional configuration data for the widget.
|
|
53
|
-
*/
|
|
54
|
-
config?: Record<string, unknown>;
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* @description
|
|
59
|
-
* **Status: Developer Preview**
|
|
60
|
-
*
|
|
61
|
-
* Defines a dashboard widget that can be added to the dashboard.
|
|
62
|
-
*
|
|
63
|
-
* @docsCategory extensions
|
|
64
|
-
* @since 3.3.0
|
|
65
|
-
*/
|
|
66
|
-
export type DashboardWidgetDefinition = {
|
|
67
|
-
/**
|
|
68
|
-
* @description
|
|
69
|
-
* A unique identifier for the widget.
|
|
70
|
-
*/
|
|
71
|
-
id: string;
|
|
72
|
-
/**
|
|
73
|
-
* @description
|
|
74
|
-
* The display name of the widget.
|
|
75
|
-
*/
|
|
76
|
-
name: string;
|
|
77
|
-
/**
|
|
78
|
-
* @description
|
|
79
|
-
* The React component that renders the widget.
|
|
80
|
-
*/
|
|
81
|
-
component: React.ComponentType<DashboardBaseWidgetProps>;
|
|
82
|
-
/**
|
|
83
|
-
* @description
|
|
84
|
-
* The default size and position of the widget.
|
|
85
|
-
*/
|
|
86
|
-
defaultSize: { w: number; h: number; x?: number; y?: number };
|
|
87
|
-
/**
|
|
88
|
-
* @description
|
|
89
|
-
* The minimum size constraints for the widget.
|
|
90
|
-
*/
|
|
91
|
-
minSize?: { w: number; h: number };
|
|
92
|
-
/**
|
|
93
|
-
* @description
|
|
94
|
-
* The maximum size constraints for the widget.
|
|
95
|
-
*/
|
|
96
|
-
maxSize?: { w: number; h: number };
|
|
97
|
-
};
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { DocumentNode } from 'graphql';
|
|
2
|
-
|
|
3
|
-
import { DashboardCustomFormComponent } from '../extension-api/extension-api-types.js';
|
|
4
|
-
import { globalRegistry } from '../registry/global-registry.js';
|
|
5
|
-
|
|
6
|
-
import { CustomFormComponentInputProps } from './custom-form-component.js';
|
|
7
|
-
|
|
8
|
-
globalRegistry.register(
|
|
9
|
-
'customFormComponents',
|
|
10
|
-
new Map<string, React.FunctionComponent<CustomFormComponentInputProps>>(),
|
|
11
|
-
);
|
|
12
|
-
|
|
13
|
-
globalRegistry.register('detailQueryDocumentRegistry', new Map<string, DocumentNode[]>());
|
|
14
|
-
|
|
15
|
-
export function getCustomFormComponent(
|
|
16
|
-
id: string,
|
|
17
|
-
): React.FunctionComponent<CustomFormComponentInputProps> | undefined {
|
|
18
|
-
return globalRegistry.get('customFormComponents').get(id);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function addCustomFormComponent({ id, component }: DashboardCustomFormComponent) {
|
|
22
|
-
const customFormComponents = globalRegistry.get('customFormComponents');
|
|
23
|
-
if (customFormComponents.has(id)) {
|
|
24
|
-
// eslint-disable-next-line no-console
|
|
25
|
-
console.warn(`Custom form component with id "${id}" is already registered and will be overwritten.`);
|
|
26
|
-
}
|
|
27
|
-
customFormComponents.set(id, component);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export function getDetailQueryDocuments(pageId: string): DocumentNode[] {
|
|
31
|
-
return globalRegistry.get('detailQueryDocumentRegistry').get(pageId) || [];
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function addDetailQueryDocument(pageId: string, document: DocumentNode) {
|
|
35
|
-
const listQueryDocumentRegistry = globalRegistry.get('detailQueryDocumentRegistry');
|
|
36
|
-
const existingDocuments = listQueryDocumentRegistry.get(pageId) || [];
|
|
37
|
-
listQueryDocumentRegistry.set(pageId, [...existingDocuments, document]);
|
|
38
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { CustomFieldConfig } from '@vendure/common/lib/generated-types';
|
|
2
|
-
import {
|
|
3
|
-
ControllerFieldState,
|
|
4
|
-
ControllerRenderProps,
|
|
5
|
-
FieldPath,
|
|
6
|
-
FieldValues,
|
|
7
|
-
UseFormStateReturn,
|
|
8
|
-
} from 'react-hook-form';
|
|
9
|
-
import { getCustomFormComponent } from './custom-form-component-extensions.js';
|
|
10
|
-
|
|
11
|
-
export interface CustomFormComponentProps {
|
|
12
|
-
fieldProps: CustomFormComponentInputProps;
|
|
13
|
-
fieldDef: Pick<CustomFieldConfig, 'ui' | 'type' | 'name'>;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface CustomFormComponentInputProps<
|
|
17
|
-
TFieldValues extends FieldValues = FieldValues,
|
|
18
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
19
|
-
> {
|
|
20
|
-
field: ControllerRenderProps<TFieldValues, TName>;
|
|
21
|
-
fieldState: ControllerFieldState;
|
|
22
|
-
formState: UseFormStateReturn<TFieldValues>;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export function CustomFormComponent({ fieldDef, fieldProps }: CustomFormComponentProps) {
|
|
26
|
-
const Component = getCustomFormComponent(fieldDef.ui?.component);
|
|
27
|
-
|
|
28
|
-
if (!Component) {
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return <Component {...fieldProps} />;
|
|
33
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
DataDisplayComponent,
|
|
3
|
-
DataInputComponent,
|
|
4
|
-
useComponentRegistry,
|
|
5
|
-
} from '@/vdb/framework/component-registry/component-registry.js';
|
|
6
|
-
import { generateInputComponentKey } from '@/vdb/framework/extension-api/input-component-extensions.js';
|
|
7
|
-
import { usePageBlock } from '@/vdb/hooks/use-page-block.js';
|
|
8
|
-
import { usePage } from '@/vdb/hooks/use-page.js';
|
|
9
|
-
import { ControllerRenderProps, FieldPath, FieldValues } from 'react-hook-form';
|
|
10
|
-
|
|
11
|
-
export interface OverriddenFormComponent<
|
|
12
|
-
TFieldValues extends FieldValues = any,
|
|
13
|
-
TName extends FieldPath<TFieldValues> = any,
|
|
14
|
-
> {
|
|
15
|
-
fieldName: string;
|
|
16
|
-
field: ControllerRenderProps<TFieldValues, TName>;
|
|
17
|
-
children?: React.ReactNode;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* @description
|
|
22
|
-
* Based on the pageId and blockId of where this is placed, it will check whether any custom components
|
|
23
|
-
* are registered and render them if so. Otherwise, it will render the children, which act as the
|
|
24
|
-
* default if this location has not been overridden.
|
|
25
|
-
*
|
|
26
|
-
* ```tsx
|
|
27
|
-
* <OverriddenFormComponent fieldName="myField" field={field}>
|
|
28
|
-
* <Input {...field} />
|
|
29
|
-
* </OverriddenFormComponent>
|
|
30
|
-
* ```
|
|
31
|
-
*/
|
|
32
|
-
export function OverriddenFormComponent({ fieldName, field, children }: Readonly<OverriddenFormComponent>) {
|
|
33
|
-
const page = usePage();
|
|
34
|
-
const pageBlock = usePageBlock({ optional: true });
|
|
35
|
-
const componentRegistry = useComponentRegistry();
|
|
36
|
-
let DisplayComponent: DataDisplayComponent | undefined;
|
|
37
|
-
let InputComponent: DataInputComponent | undefined;
|
|
38
|
-
if (page.pageId && pageBlock?.blockId) {
|
|
39
|
-
const customInputComponentKey = generateInputComponentKey(page.pageId, pageBlock.blockId, fieldName);
|
|
40
|
-
DisplayComponent = componentRegistry.getDisplayComponent(customInputComponentKey);
|
|
41
|
-
InputComponent = componentRegistry.getInputComponent(customInputComponentKey);
|
|
42
|
-
}
|
|
43
|
-
if (DisplayComponent) {
|
|
44
|
-
return <DisplayComponent {...field} />;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
if (InputComponent) {
|
|
48
|
-
return <InputComponent {...field} />;
|
|
49
|
-
}
|
|
50
|
-
return children ?? null;
|
|
51
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { FieldInfo } from '../document-introspection/get-document-structure.js';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Transforms relation fields in an entity, extracting IDs from relation objects.
|
|
5
|
-
* This is primarily used for custom fields of type "ID".
|
|
6
|
-
*
|
|
7
|
-
* @param fields - Array of field information
|
|
8
|
-
* @param entity - The entity to transform
|
|
9
|
-
* @returns A new entity with transformed relation fields
|
|
10
|
-
*/
|
|
11
|
-
export function transformRelationFields<E extends Record<string, any>>(fields: FieldInfo[], entity: E): E {
|
|
12
|
-
// Create a shallow copy to avoid mutating the original entity
|
|
13
|
-
const processedEntity = { ...entity };
|
|
14
|
-
|
|
15
|
-
// Skip processing if there are no custom fields
|
|
16
|
-
if (!entity.customFields || !processedEntity.customFields) {
|
|
17
|
-
return processedEntity;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// Find the customFields field info
|
|
21
|
-
const customFieldsInfo = fields.find(field => field.name === 'customFields' && field.typeInfo);
|
|
22
|
-
if (!customFieldsInfo?.typeInfo) {
|
|
23
|
-
return processedEntity;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// Process only ID type custom fields
|
|
27
|
-
const idTypeCustomFields = customFieldsInfo.typeInfo.filter(field => field.type === 'ID');
|
|
28
|
-
|
|
29
|
-
for (const customField of idTypeCustomFields) {
|
|
30
|
-
const relationField = customField.name;
|
|
31
|
-
|
|
32
|
-
if (customField.list) {
|
|
33
|
-
// For list fields, the accessor is the field name without the "Ids" suffix
|
|
34
|
-
const propertyAccessorKey = customField.name.replace(/Ids$/, '');
|
|
35
|
-
const relationValue = entity.customFields[propertyAccessorKey];
|
|
36
|
-
|
|
37
|
-
if (relationValue) {
|
|
38
|
-
const relationIdValue = relationValue.map((v: { id: string }) => v.id);
|
|
39
|
-
if (relationIdValue && relationIdValue.length > 0) {
|
|
40
|
-
processedEntity.customFields[relationField] = relationIdValue;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
} else {
|
|
44
|
-
// For single fields, the accessor is the field name without the "Id" suffix
|
|
45
|
-
const propertyAccessorKey = customField.name.replace(/Id$/, '');
|
|
46
|
-
const relationValue = entity.customFields[propertyAccessorKey];
|
|
47
|
-
|
|
48
|
-
if (relationValue) {
|
|
49
|
-
const relationIdValue = relationValue.id;
|
|
50
|
-
if (relationIdValue) {
|
|
51
|
-
processedEntity.customFields[relationField] = relationIdValue;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return processedEntity;
|
|
58
|
-
}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { PageBlockProps } from '@/vdb/framework/layout-engine/page-layout.js';
|
|
2
|
-
import { createContext } from 'react';
|
|
3
|
-
|
|
4
|
-
export type PageBlockContextValue = Pick<PageBlockProps, 'blockId' | 'column' | 'title' | 'description'>;
|
|
5
|
-
|
|
6
|
-
export const PageBlockContext = createContext<PageBlockContextValue | undefined>(undefined);
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { graphql } from './graphql.js';
|
|
2
|
-
|
|
3
|
-
export const duplicateEntityDocument = graphql(`
|
|
4
|
-
mutation DuplicateEntity($input: DuplicateEntityInput!) {
|
|
5
|
-
duplicateEntity(input: $input) {
|
|
6
|
-
... on DuplicateEntitySuccess {
|
|
7
|
-
newEntityId
|
|
8
|
-
}
|
|
9
|
-
... on ErrorResult {
|
|
10
|
-
errorCode
|
|
11
|
-
message
|
|
12
|
-
}
|
|
13
|
-
... on DuplicateEntityError {
|
|
14
|
-
duplicationError
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
`);
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { extendDetailFormQuery } from '@/vdb/framework/document-extension/extend-detail-form-query.js';
|
|
2
|
-
import { useLingui } from '@/vdb/lib/trans.js';
|
|
3
|
-
import { DocumentNode } from 'graphql';
|
|
4
|
-
import { useEffect, useMemo, useRef } from 'react';
|
|
5
|
-
import { toast } from 'sonner';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* @description
|
|
9
|
-
* Extends a detail page query document with any registered extensions provided by
|
|
10
|
-
* the `extendDetailDocument` function for the given page.
|
|
11
|
-
*/
|
|
12
|
-
export function useExtendedDetailQuery<T extends DocumentNode>(detailQuery: T, pageId?: string) {
|
|
13
|
-
const hasShownError = useRef(false);
|
|
14
|
-
const { i18n } = useLingui();
|
|
15
|
-
|
|
16
|
-
const extendedDetailQuery = useMemo(() => {
|
|
17
|
-
if (!pageId || !detailQuery) {
|
|
18
|
-
return detailQuery;
|
|
19
|
-
}
|
|
20
|
-
const result = extendDetailFormQuery(detailQuery, pageId);
|
|
21
|
-
if (result.errorMessage && !hasShownError.current) {
|
|
22
|
-
// Show a user-friendly toast notification
|
|
23
|
-
toast.error(i18n.t('Query extension error'), {
|
|
24
|
-
description:
|
|
25
|
-
result.errorMessage + '. ' + i18n.t('The page will continue with the default query.'),
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
return result.extendedQuery;
|
|
29
|
-
}, [detailQuery, pageId]);
|
|
30
|
-
|
|
31
|
-
// Reset error flag when dependencies change
|
|
32
|
-
useEffect(() => {
|
|
33
|
-
hasShownError.current = false;
|
|
34
|
-
}, [detailQuery, pageId]);
|
|
35
|
-
|
|
36
|
-
return extendedDetailQuery;
|
|
37
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { getListQueryDocuments } from '@/vdb/framework/data-table/data-table-extensions.js';
|
|
2
|
-
import { extendDocument } from '@/vdb/framework/document-extension/extend-document.js';
|
|
3
|
-
import { useLingui } from '@/vdb/lib/trans.js';
|
|
4
|
-
import { DocumentNode } from 'graphql';
|
|
5
|
-
import { useEffect, useMemo, useRef } from 'react';
|
|
6
|
-
import { toast } from 'sonner';
|
|
7
|
-
|
|
8
|
-
import { usePageBlock } from './use-page-block.js';
|
|
9
|
-
import { usePage } from './use-page.js';
|
|
10
|
-
|
|
11
|
-
export function useExtendedListQuery<T extends DocumentNode>(listQuery: T) {
|
|
12
|
-
const { pageId } = usePage();
|
|
13
|
-
const { blockId } = usePageBlock();
|
|
14
|
-
const { i18n } = useLingui();
|
|
15
|
-
const listQueryExtensions = pageId && blockId ? getListQueryDocuments(pageId, blockId) : [];
|
|
16
|
-
const hasShownError = useRef(false);
|
|
17
|
-
|
|
18
|
-
const extendedListQuery = useMemo(() => {
|
|
19
|
-
let result: T = listQuery;
|
|
20
|
-
let error: Error | null = null;
|
|
21
|
-
|
|
22
|
-
try {
|
|
23
|
-
result = listQueryExtensions.reduce(
|
|
24
|
-
(acc, extension) => extendDocument(acc, extension),
|
|
25
|
-
listQuery,
|
|
26
|
-
) as T;
|
|
27
|
-
} catch (err) {
|
|
28
|
-
error = err instanceof Error ? err : new Error(String(err));
|
|
29
|
-
// Continue with the original query instead of the extended one
|
|
30
|
-
result = listQuery;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// Store error for useEffect to handle
|
|
34
|
-
if (error && !hasShownError.current) {
|
|
35
|
-
hasShownError.current = true;
|
|
36
|
-
|
|
37
|
-
// Provide a helpful error message based on the error type
|
|
38
|
-
let errorMessage = i18n.t('Failed to extend query document');
|
|
39
|
-
if (error.message.includes('Extension query must have at least one top-level field')) {
|
|
40
|
-
errorMessage = i18n.t('Query extension is invalid: must have at least one top-level field');
|
|
41
|
-
} else if (error.message.includes('The query extension must extend the')) {
|
|
42
|
-
errorMessage = i18n.t('Query extension mismatch: ') + error.message;
|
|
43
|
-
} else if (error.message.includes('Syntax Error')) {
|
|
44
|
-
errorMessage = i18n.t('Query extension contains invalid GraphQL syntax');
|
|
45
|
-
} else {
|
|
46
|
-
errorMessage = i18n.t('Query extension error: ') + error.message;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Log the error and continue with the original query
|
|
50
|
-
// eslint-disable-next-line no-console
|
|
51
|
-
console.warn(`${errorMessage}. Continuing with original query.`, {
|
|
52
|
-
pageId,
|
|
53
|
-
blockId,
|
|
54
|
-
extensionsCount: listQueryExtensions.length,
|
|
55
|
-
error: error.message,
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
// Show a user-friendly toast notification
|
|
59
|
-
toast.error(i18n.t('Query extension error'), {
|
|
60
|
-
description: errorMessage + '. ' + i18n.t('The page will continue with the default query.'),
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
return result;
|
|
65
|
-
}, [listQuery, listQueryExtensions, pageId, blockId]);
|
|
66
|
-
|
|
67
|
-
// Reset error flag when dependencies change
|
|
68
|
-
useEffect(() => {
|
|
69
|
-
hasShownError.current = false;
|
|
70
|
-
}, [listQuery, listQueryExtensions, pageId, blockId]);
|
|
71
|
-
|
|
72
|
-
return extendedListQuery;
|
|
73
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { PageBlockContext } from '@/vdb/framework/layout-engine/page-block-provider.js';
|
|
2
|
-
import { useContext } from 'react';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* @description
|
|
6
|
-
* Returns the current PageBlock context, which means there must be
|
|
7
|
-
* a PageBlock ancestor component higher in the tree.
|
|
8
|
-
*
|
|
9
|
-
* If `optional` is set to true, the hook will not throw if no PageBlock
|
|
10
|
-
* exists higher in the tree, but will just return undefined.
|
|
11
|
-
*/
|
|
12
|
-
export function usePageBlock({ optional }: { optional?: boolean } = {}) {
|
|
13
|
-
const pageBlock = useContext(PageBlockContext);
|
|
14
|
-
if (!pageBlock && !optional) {
|
|
15
|
-
throw new Error('PageBlockProvider not found');
|
|
16
|
-
}
|
|
17
|
-
return pageBlock;
|
|
18
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './src/my.plugin';
|