@vendure/dashboard 3.4.0-minor-202506250934 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +102 -3
- package/dist/plugin/api/api-extensions.d.ts +1 -0
- package/dist/plugin/api/api-extensions.js +38 -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 +4 -3
- package/dist/plugin/constants.js +10 -277
- package/dist/plugin/dashboard.plugin.d.ts +95 -0
- package/dist/plugin/dashboard.plugin.js +168 -0
- package/dist/plugin/index.d.ts +2 -1
- package/dist/plugin/index.js +18 -1
- package/dist/plugin/package.json +3 -0
- package/dist/plugin/service/metrics.service.d.ts +15 -0
- package/dist/plugin/service/metrics.service.js +145 -0
- package/dist/plugin/types.d.ts +23 -0
- package/dist/plugin/types.js +13 -0
- package/dist/vite/constants.d.ts +5 -0
- package/dist/vite/constants.js +277 -0
- package/dist/vite/index.d.ts +1 -0
- package/dist/vite/index.js +1 -0
- package/dist/vite/types.d.ts +40 -0
- package/dist/{plugin → vite}/utils/ast-utils.d.ts +0 -5
- 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 +22 -0
- package/dist/vite/utils/compiler.js +162 -0
- package/dist/vite/utils/config-loader.d.ts +1 -0
- package/dist/vite/utils/config-loader.js +1 -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 +387 -0
- package/dist/vite/utils/tsconfig-utils.d.ts +9 -0
- package/dist/vite/utils/tsconfig-utils.js +50 -0
- package/dist/vite/utils/ui-config.d.ts +3 -0
- package/dist/vite/utils/ui-config.js +30 -0
- package/dist/{plugin → vite}/vite-plugin-config-loader.d.ts +3 -3
- package/dist/{plugin → vite}/vite-plugin-config-loader.js +18 -13
- package/dist/{plugin → vite}/vite-plugin-config.js +6 -7
- package/dist/{plugin → vite}/vite-plugin-dashboard-metadata.d.ts +1 -3
- package/dist/{plugin → vite}/vite-plugin-dashboard-metadata.js +20 -10
- package/dist/vite/vite-plugin-tailwind-source.d.ts +7 -0
- package/dist/vite/vite-plugin-tailwind-source.js +61 -0
- package/dist/vite/vite-plugin-theme.js +130 -0
- package/dist/vite/vite-plugin-ui-config.d.ts +123 -0
- package/dist/{plugin → vite}/vite-plugin-ui-config.js +3 -11
- package/dist/vite/vite-plugin-vendure-dashboard.d.ts +85 -0
- package/dist/{plugin → vite}/vite-plugin-vendure-dashboard.js +10 -7
- package/index.html +1 -1
- package/package.json +56 -31
- package/src/app/app-providers.tsx +7 -7
- package/src/app/common/delete-bulk-action.tsx +148 -0
- package/src/app/common/duplicate-bulk-action.tsx +134 -0
- package/src/app/main.tsx +9 -9
- package/src/app/routes/__root.tsx +1 -2
- package/src/app/routes/_authenticated/_administrators/administrators.graphql.ts +10 -1
- package/src/app/routes/_authenticated/_administrators/administrators.tsx +15 -8
- package/src/app/routes/_authenticated/_administrators/administrators_.$id.tsx +16 -12
- package/src/app/routes/_authenticated/_administrators/components/administrator-bulk-actions.tsx +15 -0
- package/src/app/routes/_authenticated/_administrators/components/role-permissions-display.tsx +16 -16
- package/src/app/routes/_authenticated/_assets/assets.graphql.ts +13 -2
- package/src/app/routes/_authenticated/_assets/assets.tsx +16 -4
- package/src/app/routes/_authenticated/_assets/assets_.$id.tsx +52 -38
- package/src/app/routes/_authenticated/_assets/components/asset-bulk-actions.tsx +45 -0
- package/src/app/routes/_authenticated/_channels/channels.graphql.ts +10 -1
- package/src/app/routes/_authenticated/_channels/channels.tsx +17 -10
- package/src/app/routes/_authenticated/_channels/channels_.$id.tsx +21 -17
- package/src/app/routes/_authenticated/_channels/components/channel-bulk-actions.tsx +15 -0
- package/src/app/routes/_authenticated/_collections/collections.graphql.ts +60 -3
- package/src/app/routes/_authenticated/_collections/collections.tsx +168 -124
- package/src/app/routes/_authenticated/_collections/collections_.$id.tsx +21 -17
- package/src/app/routes/_authenticated/_collections/components/collection-bulk-actions.tsx +123 -0
- package/src/app/routes/_authenticated/_collections/components/collection-contents-preview-table.tsx +8 -9
- package/src/app/routes/_authenticated/_collections/components/collection-contents-sheet.tsx +9 -5
- package/src/app/routes/_authenticated/_collections/components/collection-contents-table.tsx +10 -9
- package/src/app/routes/_authenticated/_collections/components/collection-filters-selector.tsx +12 -79
- package/src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx +430 -0
- package/src/app/routes/_authenticated/_collections/components/move-single-collection.tsx +33 -0
- package/src/app/routes/_authenticated/_countries/components/country-bulk-actions.tsx +15 -0
- package/src/app/routes/_authenticated/_countries/countries.graphql.ts +11 -2
- package/src/app/routes/_authenticated/_countries/countries.tsx +13 -6
- package/src/app/routes/_authenticated/_countries/countries_.$id.tsx +21 -17
- 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 +12 -5
- package/src/app/routes/_authenticated/_customer-groups/components/customer-group-members-table.tsx +22 -17
- package/src/app/routes/_authenticated/_customer-groups/customer-groups.graphql.ts +11 -2
- package/src/app/routes/_authenticated/_customer-groups/customer-groups.tsx +13 -6
- package/src/app/routes/_authenticated/_customer-groups/customer-groups_.$id.tsx +18 -15
- 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-bulk-actions.tsx +15 -0
- 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 +11 -7
- 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 +75 -73
- package/src/app/routes/_authenticated/_customers/components/customer-status-badge.tsx +4 -4
- package/src/app/routes/_authenticated/_customers/customers.graphql.ts +10 -2
- package/src/app/routes/_authenticated/_customers/customers.tsx +13 -6
- package/src/app/routes/_authenticated/_customers/customers_.$id.tsx +19 -15
- package/src/app/routes/_authenticated/_facets/components/edit-facet-value.tsx +9 -9
- package/src/app/routes/_authenticated/_facets/components/facet-bulk-actions.tsx +104 -0
- package/src/app/routes/_authenticated/_facets/components/facet-values-sheet.tsx +4 -4
- package/src/app/routes/_authenticated/_facets/components/facet-values-table.tsx +76 -65
- package/src/app/routes/_authenticated/_facets/facets.graphql.ts +80 -1
- package/src/app/routes/_authenticated/_facets/facets.tsx +31 -7
- package/src/app/routes/_authenticated/_facets/facets_.$facetId.values_.$id.tsx +147 -0
- package/src/app/routes/_authenticated/_facets/facets_.$id.tsx +17 -13
- package/src/app/routes/_authenticated/_global-settings/global-settings.graphql.ts +1 -1
- package/src/app/routes/_authenticated/_global-settings/global-settings.tsx +26 -18
- package/src/app/routes/_authenticated/_orders/components/add-manual-payment-dialog.tsx +191 -0
- package/src/app/routes/_authenticated/_orders/components/customer-address-selector.tsx +11 -15
- package/src/app/routes/_authenticated/_orders/components/edit-order-table.tsx +111 -80
- package/src/app/routes/_authenticated/_orders/components/fulfill-order-dialog.tsx +320 -0
- package/src/app/routes/_authenticated/_orders/components/fulfillment-details.tsx +153 -0
- package/src/app/routes/_authenticated/_orders/components/money-gross-net.tsx +11 -9
- package/src/app/routes/_authenticated/_orders/components/order-address.tsx +19 -13
- package/src/app/routes/_authenticated/_orders/components/order-history/order-history-container.tsx +67 -62
- package/src/app/routes/_authenticated/_orders/components/order-history/order-history.tsx +391 -39
- package/src/app/routes/_authenticated/_orders/components/order-history/use-order-history.ts +9 -5
- package/src/app/routes/_authenticated/_orders/components/order-line-custom-fields-form.tsx +28 -13
- package/src/app/routes/_authenticated/_orders/components/order-modification-preview-dialog.tsx +364 -0
- package/src/app/routes/_authenticated/_orders/components/order-modification-summary.tsx +222 -0
- package/src/app/routes/_authenticated/_orders/components/order-table-totals.tsx +39 -22
- package/src/app/routes/_authenticated/_orders/components/order-table.tsx +148 -87
- package/src/app/routes/_authenticated/_orders/components/order-tax-summary.tsx +37 -36
- package/src/app/routes/_authenticated/_orders/components/payment-details.tsx +274 -48
- package/src/app/routes/_authenticated/_orders/components/settle-refund-dialog.tsx +80 -0
- package/src/app/routes/_authenticated/_orders/components/shipping-method-selector.tsx +43 -44
- package/src/app/routes/_authenticated/_orders/components/state-transition-control.tsx +102 -0
- package/src/app/routes/_authenticated/_orders/components/use-transition-order-to-state.tsx +144 -0
- package/src/app/routes/_authenticated/_orders/orders.graphql.ts +219 -5
- package/src/app/routes/_authenticated/_orders/orders.tsx +23 -22
- package/src/app/routes/_authenticated/_orders/orders_.$id.tsx +190 -42
- package/src/app/routes/_authenticated/_orders/orders_.$id_.modify.tsx +550 -0
- package/src/app/routes/_authenticated/_orders/orders_.draft.$id.tsx +187 -107
- package/src/app/routes/_authenticated/_orders/utils/order-types.ts +10 -0
- package/src/app/routes/_authenticated/_orders/utils/order-utils.ts +78 -0
- package/src/app/routes/_authenticated/_payment-methods/components/payment-eligibility-checker-selector.tsx +12 -79
- package/src/app/routes/_authenticated/_payment-methods/components/payment-handler-selector.tsx +12 -79
- 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 +29 -2
- package/src/app/routes/_authenticated/_payment-methods/payment-methods.tsx +36 -14
- package/src/app/routes/_authenticated/_payment-methods/payment-methods_.$id.tsx +22 -15
- 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 +7 -6
- package/src/app/routes/_authenticated/_product-variants/product-variants.graphql.ts +64 -3
- package/src/app/routes/_authenticated/_product-variants/product-variants.tsx +39 -9
- package/src/app/routes/_authenticated/_product-variants/product-variants_.$id.tsx +33 -22
- package/src/app/routes/_authenticated/_products/components/add-product-variant-dialog.tsx +10 -10
- package/src/app/routes/_authenticated/_products/components/assign-facet-values-dialog.tsx +281 -0
- package/src/app/routes/_authenticated/_products/components/create-product-options-dialog.tsx +57 -41
- 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 +18 -14
- package/src/app/routes/_authenticated/_products/components/option-value-input.tsx +23 -17
- package/src/app/routes/_authenticated/_products/components/product-bulk-actions.tsx +123 -0
- package/src/app/routes/_authenticated/_products/components/product-option-select.tsx +28 -34
- package/src/app/routes/_authenticated/_products/components/product-variants-table.tsx +84 -53
- package/src/app/routes/_authenticated/_products/products.graphql.ts +70 -2
- package/src/app/routes/_authenticated/_products/products.tsx +36 -7
- package/src/app/routes/_authenticated/_products/products_.$id.tsx +34 -26
- 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 +14 -86
- package/src/app/routes/_authenticated/_promotions/components/promotion-bulk-actions.tsx +82 -0
- package/src/app/routes/_authenticated/_promotions/components/promotion-conditions-selector.tsx +14 -86
- package/src/app/routes/_authenticated/_promotions/promotions.graphql.ts +27 -2
- package/src/app/routes/_authenticated/_promotions/promotions.tsx +31 -7
- package/src/app/routes/_authenticated/_promotions/promotions_.$id.tsx +20 -16
- package/src/app/routes/_authenticated/_roles/components/expandable-permissions.tsx +5 -5
- package/src/app/routes/_authenticated/_roles/components/permissions-grid.tsx +21 -17
- package/src/app/routes/_authenticated/_roles/components/role-bulk-actions.tsx +15 -0
- package/src/app/routes/_authenticated/_roles/roles.graphql.ts +10 -1
- package/src/app/routes/_authenticated/_roles/roles.tsx +17 -10
- package/src/app/routes/_authenticated/_roles/roles_.$id.tsx +16 -12
- package/src/app/routes/_authenticated/_sellers/components/seller-bulk-actions.tsx +15 -0
- package/src/app/routes/_authenticated/_sellers/sellers.graphql.ts +10 -1
- package/src/app/routes/_authenticated/_sellers/sellers.tsx +13 -6
- package/src/app/routes/_authenticated/_sellers/sellers_.$id.tsx +17 -13
- 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 +12 -80
- package/src/app/routes/_authenticated/_shipping-methods/components/shipping-eligibility-checker-selector.tsx +15 -80
- package/src/app/routes/_authenticated/_shipping-methods/components/shipping-method-bulk-actions.tsx +61 -0
- 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 +29 -2
- package/src/app/routes/_authenticated/_shipping-methods/shipping-methods.tsx +25 -6
- package/src/app/routes/_authenticated/_shipping-methods/shipping-methods_.$id.tsx +25 -19
- 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 +26 -1
- package/src/app/routes/_authenticated/_stock-locations/stock-locations.tsx +25 -6
- package/src/app/routes/_authenticated/_stock-locations/stock-locations_.$id.tsx +16 -12
- package/src/app/routes/_authenticated/_system/components/payload-dialog.tsx +5 -5
- package/src/app/routes/_authenticated/_system/healthchecks.tsx +5 -5
- package/src/app/routes/_authenticated/_system/job-queue.graphql.ts +12 -1
- package/src/app/routes/_authenticated/_system/job-queue.tsx +110 -11
- package/src/app/routes/_authenticated/_system/scheduled-tasks.tsx +34 -28
- 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 +11 -2
- package/src/app/routes/_authenticated/_tax-categories/tax-categories.tsx +14 -7
- package/src/app/routes/_authenticated/_tax-categories/tax-categories_.$id.tsx +20 -16
- 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 +11 -2
- package/src/app/routes/_authenticated/_tax-rates/tax-rates.tsx +15 -8
- package/src/app/routes/_authenticated/_tax-rates/tax-rates_.$id.tsx +22 -18
- package/src/app/routes/_authenticated/_zones/components/zone-bulk-actions.tsx +15 -0
- package/src/app/routes/_authenticated/_zones/components/zone-countries-sheet.tsx +4 -4
- package/src/app/routes/_authenticated/_zones/components/zone-countries-table.tsx +12 -15
- package/src/app/routes/_authenticated/_zones/zones.graphql.ts +11 -2
- package/src/app/routes/_authenticated/_zones/zones.tsx +13 -6
- package/src/app/routes/_authenticated/_zones/zones_.$id.tsx +18 -14
- package/src/app/routes/_authenticated/index.tsx +6 -6
- package/src/app/routes/_authenticated.tsx +4 -4
- package/src/app/routes/login.tsx +2 -2
- package/src/app/styles.css +5 -2
- package/src/lib/components/data-display/boolean.tsx +1 -1
- package/src/lib/components/data-display/date-time.tsx +9 -3
- package/src/lib/components/data-display/json.tsx +1 -1
- package/src/lib/components/data-display/money.tsx +2 -3
- package/src/lib/components/data-input/affixed-input.tsx +3 -8
- package/src/lib/components/data-input/combination-mode-input.tsx +52 -0
- package/src/lib/components/data-input/configurable-operation-list-input.tsx +433 -0
- package/src/lib/components/data-input/custom-field-list-input.tsx +297 -0
- package/src/lib/components/data-input/customer-group-input.tsx +2 -2
- package/src/lib/components/data-input/datetime-input.tsx +132 -146
- package/src/lib/components/data-input/default-relation-input.tsx +599 -0
- package/src/lib/components/data-input/facet-value-input.tsx +30 -22
- package/src/lib/components/data-input/index.ts +17 -0
- package/src/lib/components/data-input/money-input.tsx +5 -12
- package/src/lib/components/data-input/product-multi-selector.tsx +426 -0
- package/src/lib/components/data-input/relation-input.tsx +164 -0
- package/src/lib/components/data-input/relation-selector.tsx +476 -0
- package/src/lib/components/data-input/{richt-text-input.tsx → rich-text-input.tsx} +15 -9
- package/src/lib/components/data-input/select-with-options.tsx +84 -0
- package/src/lib/components/data-input/struct-form-input.tsx +324 -0
- package/src/lib/components/data-table/add-filter-menu.tsx +9 -18
- package/src/lib/components/data-table/data-table-bulk-action-item.tsx +101 -0
- package/src/lib/components/data-table/data-table-bulk-actions.tsx +108 -0
- package/src/lib/components/data-table/data-table-column-header.tsx +4 -22
- package/src/lib/components/data-table/data-table-faceted-filter.tsx +8 -8
- package/src/lib/components/data-table/data-table-filter-badge.tsx +16 -8
- 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-utils.ts +34 -0
- package/src/lib/components/data-table/data-table-view-options.tsx +27 -23
- package/src/lib/components/data-table/data-table.tsx +90 -43
- package/src/lib/components/data-table/filters/data-table-boolean-filter.tsx +11 -8
- package/src/lib/components/data-table/filters/data-table-datetime-filter.tsx +14 -23
- package/src/lib/components/data-table/filters/data-table-id-filter.tsx +15 -10
- package/src/lib/components/data-table/filters/data-table-number-filter.tsx +18 -17
- package/src/lib/components/data-table/filters/data-table-string-filter.tsx +29 -12
- package/src/lib/components/data-table/human-readable-operator.tsx +3 -3
- package/src/lib/components/data-table/refresh-button.tsx +30 -15
- package/src/lib/components/data-table/use-generated-columns.tsx +322 -0
- package/src/lib/components/labeled-data.tsx +21 -0
- package/src/lib/components/layout/app-layout.tsx +8 -13
- package/src/lib/components/layout/app-sidebar.tsx +5 -5
- package/src/lib/components/layout/channel-switcher.tsx +171 -62
- package/src/lib/components/layout/content-language-selector.tsx +16 -10
- package/src/lib/components/layout/dev-mode-indicator.tsx +18 -0
- package/src/lib/components/layout/generated-breadcrumbs.tsx +1 -1
- package/src/lib/components/layout/language-dialog.tsx +7 -12
- package/src/lib/components/layout/manage-languages-dialog.tsx +405 -0
- package/src/lib/components/layout/nav-item-wrapper.tsx +107 -0
- package/src/lib/components/layout/nav-main.tsx +200 -111
- 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 +85 -50
- 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-bulk-actions.tsx +109 -0
- package/src/lib/components/shared/asset/asset-focal-point-editor.tsx +29 -19
- package/src/lib/components/shared/asset/asset-gallery.tsx +25 -20
- package/src/lib/components/shared/asset/asset-picker-dialog.tsx +63 -66
- package/src/lib/components/shared/asset/asset-preview-dialog.tsx +3 -7
- package/src/lib/components/shared/asset/asset-preview-selector.tsx +4 -6
- package/src/lib/components/shared/asset/asset-preview.tsx +7 -21
- package/src/lib/components/shared/asset/asset-properties.tsx +7 -9
- package/src/lib/components/shared/asset/focal-point-control.tsx +5 -13
- package/src/lib/components/shared/assign-to-channel-bulk-action.tsx +71 -0
- package/src/lib/components/shared/assign-to-channel-dialog.tsx +155 -0
- package/src/lib/components/shared/assigned-facet-values.tsx +1 -5
- package/src/lib/components/shared/channel-code-label.tsx +3 -4
- package/src/lib/components/shared/channel-selector.tsx +6 -6
- package/src/lib/components/shared/configurable-operation-arg-input.tsx +367 -23
- package/src/lib/components/shared/configurable-operation-input.tsx +87 -48
- package/src/lib/components/shared/configurable-operation-multi-selector.tsx +260 -0
- package/src/lib/components/shared/configurable-operation-selector.tsx +156 -0
- package/src/lib/components/shared/confirmation-dialog.tsx +2 -2
- package/src/lib/components/shared/copyable-text.tsx +3 -4
- package/src/lib/components/shared/country-selector.tsx +21 -18
- package/src/lib/components/shared/currency-selector.tsx +5 -5
- package/src/lib/components/shared/custom-fields-form.tsx +423 -50
- package/src/lib/components/shared/customer-address-form.tsx +18 -13
- package/src/lib/components/shared/customer-group-selector.tsx +6 -6
- package/src/lib/components/shared/customer-selector.tsx +24 -18
- package/src/lib/components/shared/detail-page-button.tsx +45 -1
- package/src/lib/components/shared/entity-assets.tsx +33 -34
- package/src/lib/components/shared/error-page.tsx +6 -6
- package/src/lib/components/shared/facet-value-chip.tsx +12 -5
- package/src/lib/components/shared/facet-value-selector.tsx +64 -63
- package/src/lib/components/shared/form-field-wrapper.tsx +47 -24
- package/src/lib/components/shared/history-timeline/history-entry-date.tsx +37 -0
- package/src/lib/components/shared/history-timeline/history-entry.tsx +146 -70
- 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 +7 -7
- package/src/lib/components/shared/history-timeline/history-timeline.tsx +8 -48
- 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 +6 -6
- package/src/lib/components/shared/navigation-confirmation.tsx +24 -9
- package/src/lib/components/shared/option-value-input.tsx +18 -16
- package/src/lib/components/shared/paginated-list-data-table.tsx +35 -230
- package/src/lib/components/shared/permission-guard.tsx +4 -4
- package/src/lib/components/shared/product-variant-selector.tsx +59 -34
- package/src/lib/components/shared/remove-from-channel-bulk-action.tsx +90 -0
- package/src/lib/components/shared/role-code-label.tsx +10 -6
- package/src/lib/components/shared/role-selector.tsx +4 -4
- package/src/lib/components/shared/seller-selector.tsx +21 -17
- 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 +46 -23
- package/src/lib/components/shared/vendure-image.tsx +31 -2
- package/src/lib/components/shared/zone-selector.tsx +5 -6
- 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/aspect-ratio.tsx +9 -0
- 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 +10 -3
- package/src/lib/components/ui/calendar.tsx +392 -459
- package/src/lib/components/ui/card.tsx +2 -2
- package/src/lib/components/ui/carousel.tsx +241 -0
- package/src/lib/components/ui/chart.tsx +351 -0
- package/src/lib/components/ui/checkbox.tsx +2 -2
- package/src/lib/components/ui/command.tsx +12 -6
- package/src/lib/components/ui/context-menu.tsx +252 -0
- package/src/lib/components/ui/dialog.tsx +2 -2
- package/src/lib/components/ui/drawer.tsx +133 -0
- package/src/lib/components/ui/dropdown-menu.tsx +7 -7
- package/src/lib/components/ui/form.tsx +8 -8
- package/src/lib/components/ui/hover-card.tsx +3 -3
- package/src/lib/components/ui/input-otp.tsx +77 -0
- package/src/lib/components/ui/input.tsx +1 -1
- package/src/lib/components/ui/label.tsx +2 -2
- package/src/lib/components/ui/menubar.tsx +274 -0
- package/src/lib/components/ui/navigation-menu.tsx +168 -0
- package/src/lib/components/ui/pagination.tsx +87 -108
- package/src/lib/components/ui/popover.tsx +3 -3
- package/src/lib/components/ui/progress.tsx +29 -0
- package/src/lib/components/ui/radio-group.tsx +45 -0
- package/src/lib/components/ui/resizable.tsx +54 -0
- package/src/lib/components/ui/scroll-area.tsx +2 -2
- package/src/lib/components/ui/select.tsx +151 -129
- 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/slider.tsx +63 -0
- 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/toggle-group.tsx +73 -0
- package/src/lib/components/ui/toggle.tsx +45 -0
- package/src/lib/components/ui/tooltip.tsx +3 -3
- package/src/lib/framework/alert/alert-extensions.tsx +2 -3
- package/src/lib/framework/alert/alert-item.tsx +5 -3
- package/src/lib/framework/component-registry/component-registry.tsx +33 -47
- package/src/lib/framework/component-registry/dynamic-component.tsx +3 -3
- package/src/lib/framework/dashboard-widget/base-widget.tsx +5 -13
- 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 -8
- package/src/lib/framework/dashboard-widget/metrics-widget/metrics-widget.graphql.ts +1 -1
- package/src/lib/framework/dashboard-widget/orders-summary/index.tsx +7 -8
- package/src/lib/framework/dashboard-widget/orders-summary/order-summary-widget.graphql.ts +1 -1
- package/src/lib/framework/dashboard-widget/widget-extensions.tsx +1 -1
- package/src/lib/framework/data-table/data-table-extensions.ts +35 -0
- package/src/lib/framework/defaults.ts +5 -11
- 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.ts +50 -2
- package/src/lib/framework/document-introspection/get-document-structure.spec.ts +321 -2
- package/src/lib/framework/document-introspection/get-document-structure.ts +187 -36
- package/src/lib/framework/document-introspection/hooks.ts +4 -1
- package/src/lib/framework/extension-api/define-dashboard-extension.ts +35 -49
- package/src/lib/framework/extension-api/display-component-extensions.tsx +69 -0
- package/src/lib/framework/extension-api/extension-api-types.ts +34 -98
- package/src/lib/framework/extension-api/input-component-extensions.tsx +73 -0
- package/src/lib/framework/extension-api/logic/alerts.ts +10 -0
- package/src/lib/framework/extension-api/logic/data-table.ts +60 -0
- package/src/lib/framework/extension-api/logic/detail-forms.ts +48 -0
- package/src/lib/framework/extension-api/logic/form-components.ts +13 -0
- package/src/lib/framework/extension-api/logic/index.ts +9 -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 +38 -0
- package/src/lib/framework/extension-api/logic/widgets.ts +10 -0
- package/src/lib/framework/extension-api/types/alerts.ts +54 -0
- package/src/lib/framework/extension-api/types/data-table.ts +96 -0
- package/src/lib/framework/extension-api/types/detail-forms.ts +94 -0
- package/src/lib/framework/extension-api/types/form-components.ts +43 -0
- package/src/lib/framework/extension-api/types/index.ts +9 -0
- package/src/lib/framework/extension-api/types/layout.ts +90 -0
- package/src/lib/framework/extension-api/types/login.ts +96 -0
- package/src/lib/framework/extension-api/types/navigation.ts +76 -0
- package/src/lib/framework/extension-api/types/widgets.ts +93 -0
- package/src/lib/framework/extension-api/use-dashboard-extensions.ts +2 -1
- package/src/lib/framework/extension-api/use-login-extensions.ts +26 -0
- package/src/lib/framework/form-engine/custom-form-component-extensions.ts +38 -0
- package/src/lib/framework/form-engine/custom-form-component.tsx +33 -0
- package/src/lib/framework/form-engine/form-schema-tools.spec.ts +472 -0
- package/src/lib/framework/form-engine/form-schema-tools.ts +341 -6
- package/src/lib/framework/form-engine/overridden-form-component.tsx +51 -0
- package/src/lib/framework/form-engine/use-generated-form.tsx +82 -24
- package/src/lib/framework/form-engine/utils.spec.ts +37 -0
- package/src/lib/framework/form-engine/utils.ts +99 -0
- package/src/lib/framework/layout-engine/dev-mode-button.tsx +24 -0
- package/src/lib/framework/layout-engine/layout-extensions.ts +1 -4
- package/src/lib/framework/layout-engine/location-wrapper.tsx +98 -72
- package/src/lib/framework/layout-engine/page-block-provider.tsx +6 -0
- package/src/lib/framework/layout-engine/page-layout.tsx +135 -58
- package/src/lib/framework/page/detail-page-route-loader.tsx +26 -7
- package/src/lib/framework/page/detail-page.tsx +94 -37
- package/src/lib/framework/page/list-page.tsx +18 -11
- package/src/lib/framework/page/use-detail-page.ts +47 -13
- package/src/lib/framework/page/use-extended-router.tsx +4 -5
- package/src/lib/framework/registry/global-registry.ts +4 -0
- package/src/lib/framework/registry/registry-types.ts +17 -5
- package/src/lib/graphql/api.ts +25 -3
- package/src/lib/graphql/common-operations.ts +18 -0
- package/src/lib/graphql/{fragments.tsx → fragments.ts} +1 -2
- package/src/lib/graphql/graphql-env.d.ts +27 -24
- package/src/lib/graphql/settings-store-operations.ts +17 -0
- package/src/lib/hooks/use-auth.tsx +1 -1
- package/src/lib/hooks/use-channel.ts +1 -1
- package/src/lib/hooks/use-extended-detail-query.ts +37 -0
- package/src/lib/hooks/use-extended-list-query.ts +75 -0
- package/src/lib/hooks/use-floating-bulk-actions.ts +82 -0
- package/src/lib/hooks/use-grouped-permissions.ts +3 -2
- package/src/lib/hooks/use-local-format.ts +20 -5
- package/src/lib/hooks/use-page-block.tsx +18 -0
- package/src/lib/hooks/use-page.tsx +2 -2
- package/src/lib/hooks/use-permissions.ts +3 -2
- 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 +85 -7
- package/src/lib/lib/trans.tsx +3 -3
- package/src/lib/lib/utils.ts +52 -1
- package/src/lib/providers/auth.tsx +37 -14
- package/src/lib/providers/channel-provider.tsx +17 -15
- package/src/lib/providers/server-config.tsx +13 -11
- package/src/lib/providers/theme-provider.tsx +2 -3
- package/src/lib/providers/user-settings.tsx +78 -3
- package/src/lib/virtual.d.ts +26 -2
- package/src/vite-env.d.ts +2 -0
- package/vite/tests/barrel-exports.spec.ts +30 -0
- package/vite/tests/fixtures-barrel-exports/my-plugin/index.ts +1 -0
- package/vite/tests/fixtures-barrel-exports/my-plugin/src/my.plugin.ts +8 -0
- package/vite/tests/fixtures-barrel-exports/package.json +6 -0
- package/vite/tests/fixtures-barrel-exports/vendure-config.ts +19 -0
- package/vite/tests/fixtures-npm-plugin/fake_node_modules/test-plugin/index.js +20 -0
- package/vite/tests/fixtures-npm-plugin/fake_node_modules/test-plugin/package.json +8 -0
- package/vite/tests/fixtures-npm-plugin/package.json +6 -0
- package/vite/tests/fixtures-npm-plugin/vendure-config.ts +18 -0
- package/vite/tests/fixtures-path-alias/js-aliased/index.ts +1 -0
- package/vite/tests/fixtures-path-alias/js-aliased/src/js-aliased.plugin.ts +8 -0
- package/vite/tests/fixtures-path-alias/package.json +6 -0
- package/vite/tests/fixtures-path-alias/star-aliased/index.ts +1 -0
- package/vite/tests/fixtures-path-alias/star-aliased/src/star-aliased.plugin.ts +8 -0
- package/vite/tests/fixtures-path-alias/ts-aliased/index.ts +1 -0
- package/vite/tests/fixtures-path-alias/ts-aliased/src/ts-aliased.plugin.ts +8 -0
- package/vite/tests/fixtures-path-alias/vendure-config.ts +20 -0
- package/vite/tests/npm-plugin.spec.ts +46 -0
- package/vite/tests/path-alias.spec.ts +61 -0
- package/vite/tests/tsconfig.json +21 -0
- package/vite/types.ts +44 -0
- package/vite/utils/ast-utils.spec.ts +1 -80
- package/vite/utils/ast-utils.ts +0 -86
- package/vite/utils/compiler.ts +244 -0
- package/vite/utils/config-loader.ts +0 -445
- package/vite/utils/logger.ts +43 -0
- package/vite/utils/plugin-discovery.ts +494 -0
- package/vite/utils/tsconfig-utils.ts +79 -0
- package/vite/utils/ui-config.ts +30 -42
- package/vite/vite-plugin-config-loader.ts +25 -17
- package/vite/vite-plugin-config.ts +6 -7
- package/vite/vite-plugin-dashboard-metadata.ts +27 -16
- package/vite/vite-plugin-tailwind-source.ts +81 -0
- package/vite/vite-plugin-theme.ts +69 -69
- package/vite/vite-plugin-ui-config.ts +119 -17
- package/vite/vite-plugin-vendure-dashboard.ts +60 -16
- package/dist/plugin/utils/ast-utils.js +0 -96
- package/dist/plugin/utils/ast-utils.spec.js +0 -120
- package/dist/plugin/utils/config-loader.d.ts +0 -52
- package/dist/plugin/utils/config-loader.js +0 -343
- package/dist/plugin/utils/ui-config.d.ts +0 -3
- package/dist/plugin/utils/ui-config.js +0 -34
- package/dist/plugin/vite-plugin-theme.js +0 -130
- package/dist/plugin/vite-plugin-ui-config.d.ts +0 -15
- package/dist/plugin/vite-plugin-vendure-dashboard.d.ts +0 -44
- package/src/lib/components/shared/rich-text-editor.tsx +0 -0
- package/src/lib/framework/alert/types.ts +0 -13
- package/src/lib/framework/dashboard-widget/types.ts +0 -22
- /package/dist/{plugin/utils/ast-utils.spec.d.ts → vite/types.js} +0 -0
- /package/dist/{plugin → vite}/utils/schema-generator.d.ts +0 -0
- /package/dist/{plugin → vite}/utils/schema-generator.js +0 -0
- /package/dist/{plugin → vite}/vite-plugin-admin-api-schema.d.ts +0 -0
- /package/dist/{plugin → vite}/vite-plugin-admin-api-schema.js +0 -0
- /package/dist/{plugin → vite}/vite-plugin-config.d.ts +0 -0
- /package/dist/{plugin → vite}/vite-plugin-gql-tada.d.ts +0 -0
- /package/dist/{plugin → vite}/vite-plugin-gql-tada.js +0 -0
- /package/dist/{plugin → vite}/vite-plugin-theme.d.ts +0 -0
- /package/dist/{plugin → vite}/vite-plugin-transform-index.d.ts +0 -0
- /package/dist/{plugin → vite}/vite-plugin-transform-index.js +0 -0
- /package/src/lib/components/data-table/{data-table-types.ts → types.ts} +0 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { globalRegistry } from '../../registry/global-registry.js';
|
|
2
|
+
import { DashboardAlertDefinition } from '../types/alerts.js';
|
|
3
|
+
|
|
4
|
+
export function registerAlertExtensions(alerts?: DashboardAlertDefinition[]) {
|
|
5
|
+
if (alerts) {
|
|
6
|
+
for (const alert of alerts) {
|
|
7
|
+
globalRegistry.get('dashboardAlertRegistry').set(alert.id, alert);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { parse } from 'graphql';
|
|
2
|
+
|
|
3
|
+
import { addBulkAction, addListQueryDocument } from '../../data-table/data-table-extensions.js';
|
|
4
|
+
import { addDisplayComponent } from '../display-component-extensions.js';
|
|
5
|
+
import { DashboardDataTableExtensionDefinition } from '../types/index.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @description
|
|
9
|
+
* Generates a data table display component key based on the pageId and column name.
|
|
10
|
+
* Uses the pattern: pageId_columnName
|
|
11
|
+
*/
|
|
12
|
+
export function generateDataTableDisplayComponentKey(pageId: string, column: string): string {
|
|
13
|
+
return `${pageId}_${column}`;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @description
|
|
18
|
+
* Adds a display component for a specific column in a data table.
|
|
19
|
+
*/
|
|
20
|
+
export function addDataTableDisplayComponent(
|
|
21
|
+
pageId: string,
|
|
22
|
+
column: string,
|
|
23
|
+
component: React.ComponentType<{ value: any; [key: string]: any }>,
|
|
24
|
+
) {
|
|
25
|
+
const key = generateDataTableDisplayComponentKey(pageId, column);
|
|
26
|
+
addDisplayComponent({ pageId, blockId: 'list-table', field: column, component });
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function registerDataTableExtensions(dataTables?: DashboardDataTableExtensionDefinition[]) {
|
|
30
|
+
if (dataTables) {
|
|
31
|
+
for (const dataTable of dataTables) {
|
|
32
|
+
if (dataTable.bulkActions?.length) {
|
|
33
|
+
for (const action of dataTable.bulkActions) {
|
|
34
|
+
addBulkAction(dataTable.pageId, dataTable.blockId, action);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (dataTable.extendListDocument) {
|
|
38
|
+
const document =
|
|
39
|
+
typeof dataTable.extendListDocument === 'function'
|
|
40
|
+
? dataTable.extendListDocument()
|
|
41
|
+
: dataTable.extendListDocument;
|
|
42
|
+
|
|
43
|
+
addListQueryDocument(
|
|
44
|
+
dataTable.pageId,
|
|
45
|
+
dataTable.blockId,
|
|
46
|
+
typeof document === 'string' ? parse(document) : document,
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
if (dataTable.displayComponents?.length) {
|
|
50
|
+
for (const displayComponent of dataTable.displayComponents) {
|
|
51
|
+
addDataTableDisplayComponent(
|
|
52
|
+
dataTable.pageId,
|
|
53
|
+
displayComponent.column,
|
|
54
|
+
displayComponent.component,
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { addDetailQueryDocument } from '@/vdb/framework/form-engine/custom-form-component-extensions.js';
|
|
2
|
+
import { parse } from 'graphql';
|
|
3
|
+
|
|
4
|
+
import { addDisplayComponent } from '../display-component-extensions.js';
|
|
5
|
+
import { addInputComponent } from '../input-component-extensions.js';
|
|
6
|
+
import { DashboardDetailFormExtensionDefinition } from '../types/detail-forms.js';
|
|
7
|
+
|
|
8
|
+
export function registerDetailFormExtensions(detailForms?: DashboardDetailFormExtensionDefinition[]) {
|
|
9
|
+
if (detailForms) {
|
|
10
|
+
for (const detailForm of detailForms) {
|
|
11
|
+
if (detailForm.extendDetailDocument) {
|
|
12
|
+
const document =
|
|
13
|
+
typeof detailForm.extendDetailDocument === 'function'
|
|
14
|
+
? detailForm.extendDetailDocument()
|
|
15
|
+
: detailForm.extendDetailDocument;
|
|
16
|
+
|
|
17
|
+
addDetailQueryDocument(
|
|
18
|
+
detailForm.pageId,
|
|
19
|
+
typeof document === 'string' ? parse(document) : document,
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Register input components for this detail form
|
|
24
|
+
if (detailForm.inputs) {
|
|
25
|
+
for (const inputComponent of detailForm.inputs) {
|
|
26
|
+
addInputComponent({
|
|
27
|
+
pageId: detailForm.pageId,
|
|
28
|
+
blockId: inputComponent.blockId,
|
|
29
|
+
field: inputComponent.field,
|
|
30
|
+
component: inputComponent.component,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Register display components for this detail form
|
|
36
|
+
if (detailForm.displays) {
|
|
37
|
+
for (const displayComponent of detailForm.displays) {
|
|
38
|
+
addDisplayComponent({
|
|
39
|
+
pageId: detailForm.pageId,
|
|
40
|
+
blockId: displayComponent.blockId,
|
|
41
|
+
field: displayComponent.field,
|
|
42
|
+
component: displayComponent.component,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { addCustomFormComponent } from '../../form-engine/custom-form-component-extensions.js';
|
|
2
|
+
import { DashboardCustomFormComponents } from '../types/form-components.js';
|
|
3
|
+
|
|
4
|
+
export function registerFormComponentExtensions(customFormComponents?: DashboardCustomFormComponents) {
|
|
5
|
+
if (customFormComponents) {
|
|
6
|
+
// Handle custom field components
|
|
7
|
+
if (customFormComponents.customFields) {
|
|
8
|
+
for (const component of customFormComponents.customFields) {
|
|
9
|
+
addCustomFormComponent(component);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Re-export all domain-specific logic functions
|
|
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 './login.js';
|
|
8
|
+
export * from './navigation.js';
|
|
9
|
+
export * from './widgets.js';
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import {
|
|
2
|
+
registerDashboardActionBarItem,
|
|
3
|
+
registerDashboardPageBlock,
|
|
4
|
+
} from '../../layout-engine/layout-extensions.js';
|
|
5
|
+
import { DashboardActionBarItem, DashboardPageBlockDefinition } from '../types/layout.js';
|
|
6
|
+
|
|
7
|
+
export function registerLayoutExtensions(
|
|
8
|
+
actionBarItems?: DashboardActionBarItem[],
|
|
9
|
+
pageBlocks?: DashboardPageBlockDefinition[],
|
|
10
|
+
) {
|
|
11
|
+
if (actionBarItems) {
|
|
12
|
+
for (const item of actionBarItems) {
|
|
13
|
+
registerDashboardActionBarItem(item);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (pageBlocks) {
|
|
18
|
+
for (const block of pageBlocks) {
|
|
19
|
+
registerDashboardPageBlock(block);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { globalRegistry } from '../../registry/global-registry.js';
|
|
2
|
+
import { DashboardLoginExtensions } from '../types/login.js';
|
|
3
|
+
|
|
4
|
+
export function registerLoginExtensions(loginExtensions?: DashboardLoginExtensions) {
|
|
5
|
+
if (!loginExtensions) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const registryKey = 'loginExtensions';
|
|
10
|
+
|
|
11
|
+
globalRegistry.set(registryKey, (oldValue: DashboardLoginExtensions) => {
|
|
12
|
+
return {
|
|
13
|
+
...oldValue,
|
|
14
|
+
...loginExtensions,
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { addNavMenuItem, addNavMenuSection, NavMenuItem } from '../../nav-menu/nav-menu-extensions.js';
|
|
2
|
+
import { registerRoute } from '../../page/page-api.js';
|
|
3
|
+
import { DashboardNavSectionDefinition, DashboardRouteDefinition } from '../types/navigation.js';
|
|
4
|
+
|
|
5
|
+
export function registerNavigationExtensions(
|
|
6
|
+
navSections?: DashboardNavSectionDefinition[],
|
|
7
|
+
routes?: DashboardRouteDefinition[],
|
|
8
|
+
) {
|
|
9
|
+
if (navSections) {
|
|
10
|
+
for (const section of navSections) {
|
|
11
|
+
addNavMenuSection({
|
|
12
|
+
...section,
|
|
13
|
+
placement: 'top',
|
|
14
|
+
order: section.order ?? 999,
|
|
15
|
+
items: [],
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (routes) {
|
|
21
|
+
for (const route of routes) {
|
|
22
|
+
if (route.navMenuItem) {
|
|
23
|
+
// Add the nav menu item
|
|
24
|
+
const item: NavMenuItem = {
|
|
25
|
+
url: route.navMenuItem.url ?? route.path,
|
|
26
|
+
id: route.navMenuItem.id ?? route.path,
|
|
27
|
+
title: route.navMenuItem.title ?? route.path,
|
|
28
|
+
order: route.navMenuItem.order,
|
|
29
|
+
};
|
|
30
|
+
addNavMenuItem(item, route.navMenuItem.sectionId);
|
|
31
|
+
}
|
|
32
|
+
if (route.path) {
|
|
33
|
+
// Configure a list page
|
|
34
|
+
registerRoute(route);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { registerDashboardWidget } from '../../dashboard-widget/widget-extensions.js';
|
|
2
|
+
import { DashboardWidgetDefinition } from '../types/index.js';
|
|
3
|
+
|
|
4
|
+
export function registerWidgetExtensions(widgets?: DashboardWidgetDefinition[]) {
|
|
5
|
+
if (widgets) {
|
|
6
|
+
for (const widget of widgets) {
|
|
7
|
+
registerDashboardWidget(widget);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description
|
|
3
|
+
* **Status: Developer Preview**
|
|
4
|
+
*
|
|
5
|
+
* Allows you to define custom alerts that can be displayed in the dashboard.
|
|
6
|
+
*
|
|
7
|
+
* @docsCategory extensions
|
|
8
|
+
* @since 3.3.0
|
|
9
|
+
*/
|
|
10
|
+
export interface DashboardAlertDefinition<TResponse = any> {
|
|
11
|
+
/**
|
|
12
|
+
* @description
|
|
13
|
+
* A unique identifier for the alert.
|
|
14
|
+
*/
|
|
15
|
+
id: string;
|
|
16
|
+
/**
|
|
17
|
+
* @description
|
|
18
|
+
* The title of the alert. Can be a string or a function that returns a string based on the response data.
|
|
19
|
+
*/
|
|
20
|
+
title: string | ((data: TResponse) => string);
|
|
21
|
+
/**
|
|
22
|
+
* @description
|
|
23
|
+
* The description of the alert. Can be a string or a function that returns a string based on the response data.
|
|
24
|
+
*/
|
|
25
|
+
description?: string | ((data: TResponse) => string);
|
|
26
|
+
/**
|
|
27
|
+
* @description
|
|
28
|
+
* The severity level of the alert.
|
|
29
|
+
*/
|
|
30
|
+
severity: 'info' | 'warning' | 'error';
|
|
31
|
+
/**
|
|
32
|
+
* @description
|
|
33
|
+
* A function that checks the condition and returns the response data.
|
|
34
|
+
*/
|
|
35
|
+
check: () => Promise<TResponse> | TResponse;
|
|
36
|
+
/**
|
|
37
|
+
* @description
|
|
38
|
+
* The interval in milliseconds to recheck the condition.
|
|
39
|
+
*/
|
|
40
|
+
recheckInterval?: number;
|
|
41
|
+
/**
|
|
42
|
+
* @description
|
|
43
|
+
* A function that determines whether the alert should be shown based on the response data.
|
|
44
|
+
*/
|
|
45
|
+
shouldShow?: (data: TResponse) => boolean;
|
|
46
|
+
/**
|
|
47
|
+
* @description
|
|
48
|
+
* Optional actions that can be performed when the alert is shown.
|
|
49
|
+
*/
|
|
50
|
+
actions?: Array<{
|
|
51
|
+
label: string;
|
|
52
|
+
onClick: (data: TResponse) => void;
|
|
53
|
+
}>;
|
|
54
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { Table } from '@tanstack/react-table';
|
|
2
|
+
import { DocumentNode } from 'graphql';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @description
|
|
6
|
+
* Allows you to define custom display components for specific columns in data tables.
|
|
7
|
+
* The pageId is already defined in the data table extension, so only the column name is needed.
|
|
8
|
+
*
|
|
9
|
+
* @docsCategory extensions
|
|
10
|
+
* @docsPage DataTable
|
|
11
|
+
* @since 3.4.0
|
|
12
|
+
*/
|
|
13
|
+
export interface DashboardDataTableDisplayComponent {
|
|
14
|
+
/**
|
|
15
|
+
* @description
|
|
16
|
+
* The name of the column where this display component should be used.
|
|
17
|
+
*/
|
|
18
|
+
column: string;
|
|
19
|
+
/**
|
|
20
|
+
* @description
|
|
21
|
+
* The React component that will be rendered as the display.
|
|
22
|
+
* It should accept `value` and other standard display props.
|
|
23
|
+
*/
|
|
24
|
+
component: React.ComponentType<{ value: any; [key: string]: any }>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export type BulkActionContext<Item extends { id: string } & Record<string, any>> = {
|
|
28
|
+
selection: Item[];
|
|
29
|
+
table: Table<Item>;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export type BulkActionComponent<Item extends { id: string } & Record<string, any>> = React.FunctionComponent<
|
|
33
|
+
BulkActionContext<Item>
|
|
34
|
+
>;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @description
|
|
38
|
+
* **Status: Developer Preview**
|
|
39
|
+
*
|
|
40
|
+
* A bulk action is a component that will be rendered in the bulk actions dropdown.
|
|
41
|
+
*
|
|
42
|
+
* @docsCategory components
|
|
43
|
+
* @docsPage DataTable
|
|
44
|
+
* @since 3.4.0
|
|
45
|
+
*/
|
|
46
|
+
export type BulkAction = {
|
|
47
|
+
/**
|
|
48
|
+
* @description
|
|
49
|
+
* Optional order number to control the position of this bulk action in the dropdown.
|
|
50
|
+
* A larger number will appear lower in the list.
|
|
51
|
+
*/
|
|
52
|
+
order?: number;
|
|
53
|
+
/**
|
|
54
|
+
* @description
|
|
55
|
+
* The React component that will be rendered as the bulk action item.
|
|
56
|
+
*/
|
|
57
|
+
component: BulkActionComponent<any>;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* @description
|
|
62
|
+
* This allows you to customize aspects of existing data tables in the dashboard.
|
|
63
|
+
*
|
|
64
|
+
* @docsCategory extensions
|
|
65
|
+
* @docsPage DataTable
|
|
66
|
+
* @since 3.4.0
|
|
67
|
+
*/
|
|
68
|
+
export interface DashboardDataTableExtensionDefinition {
|
|
69
|
+
/**
|
|
70
|
+
* @description
|
|
71
|
+
* The ID of the page where the data table is located, e.g. `'product-list'`, `'order-list'`.
|
|
72
|
+
*/
|
|
73
|
+
pageId: string;
|
|
74
|
+
/**
|
|
75
|
+
* @description
|
|
76
|
+
* The ID of the data table block. Defaults to `'list-table'`, which is the default blockId
|
|
77
|
+
* for the standard list pages. However, some other pages may use a different blockId,
|
|
78
|
+
* such as `'product-variants-table'` on the `'product-detail'` page.
|
|
79
|
+
*/
|
|
80
|
+
blockId?: string;
|
|
81
|
+
/**
|
|
82
|
+
* @description
|
|
83
|
+
* An array of additional bulk actions that will be available on the data table.
|
|
84
|
+
*/
|
|
85
|
+
bulkActions?: BulkAction[];
|
|
86
|
+
/**
|
|
87
|
+
* @description
|
|
88
|
+
* Allows you to extend the list document for the data table.
|
|
89
|
+
*/
|
|
90
|
+
extendListDocument?: string | DocumentNode | (() => DocumentNode | string);
|
|
91
|
+
/**
|
|
92
|
+
* @description
|
|
93
|
+
* Custom display components for specific columns in the data table.
|
|
94
|
+
*/
|
|
95
|
+
displayComponents?: DashboardDataTableDisplayComponent[];
|
|
96
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
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
|
+
* @docsPage DetailForms
|
|
14
|
+
* @since 3.4.0
|
|
15
|
+
*/
|
|
16
|
+
export interface DashboardDetailFormInputComponent {
|
|
17
|
+
/**
|
|
18
|
+
* @description
|
|
19
|
+
* The ID of the block where this input component should be used.
|
|
20
|
+
*/
|
|
21
|
+
blockId: string;
|
|
22
|
+
/**
|
|
23
|
+
* @description
|
|
24
|
+
* The name of the field where this input component should be used.
|
|
25
|
+
*/
|
|
26
|
+
field: string;
|
|
27
|
+
/**
|
|
28
|
+
* @description
|
|
29
|
+
* The React component that will be rendered as the input.
|
|
30
|
+
* It should accept `value`, `onChange`, and other standard input props.
|
|
31
|
+
*/
|
|
32
|
+
component: DataInputComponent;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @description
|
|
37
|
+
* Allows you to define custom display components for specific fields in detail forms.
|
|
38
|
+
* The pageId is already defined in the detail form extension, so only the blockId and field are needed.
|
|
39
|
+
*
|
|
40
|
+
* @docsCategory extensions
|
|
41
|
+
* @docsPage DetailForms
|
|
42
|
+
* @since 3.4.0
|
|
43
|
+
*/
|
|
44
|
+
export interface DashboardDetailFormDisplayComponent {
|
|
45
|
+
/**
|
|
46
|
+
* @description
|
|
47
|
+
* The ID of the block where this display component should be used.
|
|
48
|
+
*/
|
|
49
|
+
blockId: string;
|
|
50
|
+
/**
|
|
51
|
+
* @description
|
|
52
|
+
* The name of the field where this display component should be used.
|
|
53
|
+
*/
|
|
54
|
+
field: string;
|
|
55
|
+
/**
|
|
56
|
+
* @description
|
|
57
|
+
* The React component that will be rendered as the display.
|
|
58
|
+
* It should accept `value` and other standard display props.
|
|
59
|
+
*/
|
|
60
|
+
component: DataDisplayComponent;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* @description
|
|
65
|
+
* Allows you to extend existing detail forms (e.g. on the product detail or customer detail pages)
|
|
66
|
+
* with custom GraphQL queries, input components, and display components.
|
|
67
|
+
*
|
|
68
|
+
* @since 3.4.0
|
|
69
|
+
* @docsPage DetailForms
|
|
70
|
+
* @docsCategory extensions
|
|
71
|
+
*/
|
|
72
|
+
export interface DashboardDetailFormExtensionDefinition {
|
|
73
|
+
/**
|
|
74
|
+
* @description
|
|
75
|
+
* The ID of the page where the detail form is located, e.g. `'product-detail'`, `'order-detail'`.
|
|
76
|
+
*/
|
|
77
|
+
pageId: string;
|
|
78
|
+
/**
|
|
79
|
+
* @description
|
|
80
|
+
* Extends the GraphQL query used to fetch data for the detail page, allowing you to add additional
|
|
81
|
+
* fields that can be used by custom input or display components.
|
|
82
|
+
*/
|
|
83
|
+
extendDetailDocument?: string | DocumentNode | (() => DocumentNode | string);
|
|
84
|
+
/**
|
|
85
|
+
* @description
|
|
86
|
+
* Custom input components for specific fields in the detail form.
|
|
87
|
+
*/
|
|
88
|
+
inputs?: DashboardDetailFormInputComponent[];
|
|
89
|
+
/**
|
|
90
|
+
* @description
|
|
91
|
+
* Custom display components for specific fields in the detail form.
|
|
92
|
+
*/
|
|
93
|
+
displays?: DashboardDetailFormDisplayComponent[];
|
|
94
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
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
|
+
* @docsPage FormComponents
|
|
11
|
+
* @since 3.4.0
|
|
12
|
+
*/
|
|
13
|
+
export interface DashboardCustomFormComponent {
|
|
14
|
+
/**
|
|
15
|
+
* @description
|
|
16
|
+
* A unique identifier for the custom form component. It is a good practice to namespace
|
|
17
|
+
* these IDs to avoid naming collisions, for example `"my-plugin.markdown-editor"`.
|
|
18
|
+
*/
|
|
19
|
+
id: string;
|
|
20
|
+
/**
|
|
21
|
+
* @description
|
|
22
|
+
* The React component that will be rendered as the custom form input.
|
|
23
|
+
*/
|
|
24
|
+
component: React.FunctionComponent<CustomFormComponentInputProps>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @description
|
|
29
|
+
* Interface for registering custom field components in the dashboard.
|
|
30
|
+
* For input and display components, use the co-located approach with detailForms.
|
|
31
|
+
*
|
|
32
|
+
* @docsCategory extensions
|
|
33
|
+
* @docsPage FormComponents
|
|
34
|
+
* @since 3.4.0
|
|
35
|
+
*/
|
|
36
|
+
export interface DashboardCustomFormComponents {
|
|
37
|
+
/**
|
|
38
|
+
* @description
|
|
39
|
+
* Custom form components for custom fields. These are used when rendering
|
|
40
|
+
* custom fields in forms.
|
|
41
|
+
*/
|
|
42
|
+
customFields?: DashboardCustomFormComponent[];
|
|
43
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
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 './login.js';
|
|
8
|
+
export * from './navigation.js';
|
|
9
|
+
export * from './widgets.js';
|
|
@@ -0,0 +1,90 @@
|
|
|
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
|
+
* Allows you to define custom action bar items for any page in the dashboard.
|
|
13
|
+
*
|
|
14
|
+
* @docsCategory extensions
|
|
15
|
+
* @docsPage Layout
|
|
16
|
+
* @since 3.3.0
|
|
17
|
+
*/
|
|
18
|
+
export interface DashboardActionBarItem {
|
|
19
|
+
/**
|
|
20
|
+
* @description
|
|
21
|
+
* The ID of the page where the action bar item should be displayed.
|
|
22
|
+
*/
|
|
23
|
+
pageId: string;
|
|
24
|
+
/**
|
|
25
|
+
* @description
|
|
26
|
+
* A React component that will be rendered in the action bar.
|
|
27
|
+
*/
|
|
28
|
+
component: React.FunctionComponent<{ context: PageContextValue }>;
|
|
29
|
+
/**
|
|
30
|
+
* @description
|
|
31
|
+
* The type of action bar item to display. Defaults to `button`.
|
|
32
|
+
* The 'dropdown' type is used to display the action bar item as a dropdown menu item.
|
|
33
|
+
*
|
|
34
|
+
* When using the dropdown type, use a suitable [dropdown item](https://ui.shadcn.com/docs/components/dropdown-menu)
|
|
35
|
+
* component, such as:
|
|
36
|
+
*
|
|
37
|
+
* ```tsx
|
|
38
|
+
* import { DropdownMenuItem } from '\@vendure/dashboard';
|
|
39
|
+
*
|
|
40
|
+
* // ...
|
|
41
|
+
*
|
|
42
|
+
* {
|
|
43
|
+
* component: () => <DropdownMenuItem>My Item</DropdownMenuItem>
|
|
44
|
+
* }
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* @default 'button'
|
|
48
|
+
*/
|
|
49
|
+
type?: 'button' | 'dropdown';
|
|
50
|
+
/**
|
|
51
|
+
* @description
|
|
52
|
+
* Any permissions that are required to display this action bar item.
|
|
53
|
+
*/
|
|
54
|
+
requiresPermission?: string | string[];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export type PageBlockPosition = { blockId: string; order: 'before' | 'after' | 'replace' };
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @description
|
|
61
|
+
* The location of a page block in the dashboard. The location can be found by turning on
|
|
62
|
+
* "developer mode" in the dashboard user menu (bottom left corner) and then
|
|
63
|
+
* clicking the `< />` icon when hovering over a page block.
|
|
64
|
+
*
|
|
65
|
+
* @docsCategory extensions
|
|
66
|
+
* @docsPage Layout
|
|
67
|
+
* @since 3.3.0
|
|
68
|
+
*/
|
|
69
|
+
export type PageBlockLocation = {
|
|
70
|
+
pageId: string;
|
|
71
|
+
position: PageBlockPosition;
|
|
72
|
+
column: 'main' | 'side';
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* @description
|
|
77
|
+
* This allows you to insert a custom component into a specific location
|
|
78
|
+
* on any page in the dashboard.
|
|
79
|
+
*
|
|
80
|
+
* @docsCategory extensions
|
|
81
|
+
* @docsPage Layout
|
|
82
|
+
* @since 3.3.0
|
|
83
|
+
*/
|
|
84
|
+
export interface DashboardPageBlockDefinition {
|
|
85
|
+
id: string;
|
|
86
|
+
title?: React.ReactNode;
|
|
87
|
+
location: PageBlockLocation;
|
|
88
|
+
component: React.FunctionComponent<{ context: PageContextValue }>;
|
|
89
|
+
requiresPermission?: string | string[];
|
|
90
|
+
}
|