@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,28 +1,26 @@
|
|
|
1
|
+
import { getOperationVariablesFields } from '@/framework/document-introspection/get-document-structure.js';
|
|
2
|
+
import {
|
|
3
|
+
createFormSchemaFromFields,
|
|
4
|
+
getDefaultValuesFromFields,
|
|
5
|
+
} from '@/framework/form-engine/form-schema-tools.js';
|
|
6
|
+
import { useChannel } from '@/hooks/use-channel.js';
|
|
7
|
+
import { useServerConfig } from '@/hooks/use-server-config.js';
|
|
1
8
|
import type { TypedDocumentNode } from '@graphql-typed-document-node/core';
|
|
2
9
|
import { zodResolver } from '@hookform/resolvers/zod';
|
|
3
10
|
import { VariablesOf } from 'gql.tada';
|
|
4
11
|
import { FormEvent } from 'react';
|
|
5
12
|
import { useForm } from 'react-hook-form';
|
|
6
|
-
import { useChannel } from '../../hooks/use-channel.js';
|
|
7
|
-
import { useServerConfig } from '../../hooks/use-server-config.js';
|
|
8
|
-
import { getOperationVariablesFields } from '../document-introspection/get-document-structure.js';
|
|
9
|
-
import { createFormSchemaFromFields, getDefaultValuesFromFields } from './form-schema-tools.js';
|
|
10
|
-
import { transformRelationFields } from './utils.js';
|
|
11
13
|
|
|
12
14
|
export interface GeneratedFormOptions<
|
|
13
15
|
T extends TypedDocumentNode<any, any>,
|
|
14
|
-
VarName extends keyof VariablesOf<T> | undefined = 'input',
|
|
16
|
+
VarName extends (keyof VariablesOf<T>) | undefined = 'input',
|
|
15
17
|
E extends Record<string, any> = Record<string, any>,
|
|
16
18
|
> {
|
|
17
19
|
document?: T;
|
|
18
20
|
varName?: VarName;
|
|
19
21
|
entity: E | null | undefined;
|
|
20
|
-
setValues: (
|
|
21
|
-
|
|
22
|
-
) => VarName extends keyof VariablesOf<T> ? VariablesOf<T>[VarName] : VariablesOf<T>;
|
|
23
|
-
onSubmit?: (
|
|
24
|
-
values: VarName extends keyof VariablesOf<T> ? VariablesOf<T>[VarName] : VariablesOf<T>,
|
|
25
|
-
) => void;
|
|
22
|
+
setValues: (entity: NonNullable<E>) => VarName extends keyof VariablesOf<T> ? VariablesOf<T>[VarName] : VariablesOf<T>;
|
|
23
|
+
onSubmit?: (values: VarName extends keyof VariablesOf<T> ? VariablesOf<T>[VarName] : VariablesOf<T>) => void;
|
|
26
24
|
}
|
|
27
25
|
|
|
28
26
|
/**
|
|
@@ -43,7 +41,7 @@ export function useGeneratedForm<
|
|
|
43
41
|
const updateFields = document ? getOperationVariablesFields(document, varName) : [];
|
|
44
42
|
const schema = createFormSchemaFromFields(updateFields);
|
|
45
43
|
const defaultValues = getDefaultValuesFromFields(updateFields, activeChannel?.defaultLanguageCode);
|
|
46
|
-
const processedEntity = ensureTranslationsForAllLanguages(entity, availableLanguages
|
|
44
|
+
const processedEntity = ensureTranslationsForAllLanguages(entity, availableLanguages);
|
|
47
45
|
|
|
48
46
|
const form = useForm({
|
|
49
47
|
resolver: async (values, context, options) => {
|
|
@@ -55,9 +53,7 @@ export function useGeneratedForm<
|
|
|
55
53
|
},
|
|
56
54
|
mode: 'onChange',
|
|
57
55
|
defaultValues,
|
|
58
|
-
values: processedEntity
|
|
59
|
-
? transformRelationFields(updateFields, setValues(processedEntity))
|
|
60
|
-
: defaultValues,
|
|
56
|
+
values: processedEntity ? setValues(processedEntity) : defaultValues,
|
|
61
57
|
});
|
|
62
58
|
let submitHandler = (event: FormEvent) => {
|
|
63
59
|
event.preventDefault();
|
|
@@ -73,13 +69,11 @@ export function useGeneratedForm<
|
|
|
73
69
|
|
|
74
70
|
/**
|
|
75
71
|
* Ensures that an entity with translations has entries for all available languages.
|
|
76
|
-
* If a language is missing, it creates an empty translation based on the structure of existing translations
|
|
77
|
-
* and the expected form structure from defaultValues.
|
|
72
|
+
* If a language is missing, it creates an empty translation based on the structure of existing translations.
|
|
78
73
|
*/
|
|
79
74
|
function ensureTranslationsForAllLanguages<E extends Record<string, any>>(
|
|
80
75
|
entity: E | null | undefined,
|
|
81
76
|
availableLanguages: string[] = [],
|
|
82
|
-
expectedStructure?: Record<string, any>,
|
|
83
77
|
): E | null | undefined {
|
|
84
78
|
if (
|
|
85
79
|
!entity ||
|
|
@@ -97,56 +91,23 @@ function ensureTranslationsForAllLanguages<E extends Record<string, any>>(
|
|
|
97
91
|
// Get existing language codes
|
|
98
92
|
const existingLanguageCodes = new Set(translations.map((t: any) => t.languageCode));
|
|
99
93
|
|
|
100
|
-
// Get the expected translation structure from defaultValues or existing translations
|
|
101
|
-
const existingTemplate = translations[0] || {};
|
|
102
|
-
const expectedTranslationStructure = expectedStructure?.translations?.[0] || {};
|
|
103
|
-
|
|
104
|
-
// Merge the structures to ensure we have all expected fields
|
|
105
|
-
const templateStructure = {
|
|
106
|
-
...expectedTranslationStructure,
|
|
107
|
-
...existingTemplate,
|
|
108
|
-
};
|
|
109
|
-
|
|
110
94
|
// Add missing language translations
|
|
111
95
|
for (const langCode of availableLanguages) {
|
|
112
96
|
if (!existingLanguageCodes.has(langCode)) {
|
|
97
|
+
// Find a translation to use as template for field structure
|
|
98
|
+
const template = translations[0] || {};
|
|
113
99
|
const emptyTranslation: Record<string, any> = {
|
|
114
100
|
languageCode: langCode,
|
|
115
101
|
};
|
|
116
102
|
|
|
117
|
-
// Add empty fields based on
|
|
118
|
-
Object.keys(
|
|
103
|
+
// Add empty fields based on template (excluding languageCode)
|
|
104
|
+
Object.keys(template).forEach(key => {
|
|
119
105
|
if (key !== 'languageCode') {
|
|
120
|
-
|
|
121
|
-
// For nested objects like customFields, create an empty object
|
|
122
|
-
emptyTranslation[key] = Array.isArray(templateStructure[key]) ? [] : {};
|
|
123
|
-
} else {
|
|
124
|
-
// For primitive values, use empty string as default
|
|
125
|
-
emptyTranslation[key] = '';
|
|
126
|
-
}
|
|
106
|
+
emptyTranslation[key] = '';
|
|
127
107
|
}
|
|
128
108
|
});
|
|
129
109
|
|
|
130
110
|
translations.push(emptyTranslation);
|
|
131
|
-
} else {
|
|
132
|
-
// For existing translations, ensure they have all expected fields
|
|
133
|
-
const existingTranslation = translations.find((t: any) => t.languageCode === langCode);
|
|
134
|
-
if (existingTranslation) {
|
|
135
|
-
Object.keys(expectedTranslationStructure).forEach(key => {
|
|
136
|
-
if (key !== 'languageCode' && !(key in existingTranslation)) {
|
|
137
|
-
if (
|
|
138
|
-
typeof expectedTranslationStructure[key] === 'object' &&
|
|
139
|
-
expectedTranslationStructure[key] !== null
|
|
140
|
-
) {
|
|
141
|
-
existingTranslation[key] = Array.isArray(expectedTranslationStructure[key])
|
|
142
|
-
? []
|
|
143
|
-
: {};
|
|
144
|
-
} else {
|
|
145
|
-
existingTranslation[key] = '';
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
111
|
}
|
|
151
112
|
}
|
|
152
113
|
|
|
@@ -1,128 +1,95 @@
|
|
|
1
|
-
import { CopyableText } from '@/
|
|
2
|
-
import { Button } from '@/
|
|
3
|
-
import { Popover, PopoverContent, PopoverTrigger } from '@/
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { CodeXmlIcon } from 'lucide-react';
|
|
9
|
-
import
|
|
1
|
+
import { CopyableText } from '@/components/shared/copyable-text.js';
|
|
2
|
+
import { Button } from '@/components/ui/button.js';
|
|
3
|
+
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover.js';
|
|
4
|
+
import { usePage } from '@/hooks/use-page.js';
|
|
5
|
+
import { useUserSettings } from '@/hooks/use-user-settings.js';
|
|
6
|
+
import { cn } from '@/lib/utils.js';
|
|
7
|
+
import { Trans } from '@/lib/trans.js';
|
|
8
|
+
import { CodeXmlIcon, InfoIcon } from 'lucide-react';
|
|
9
|
+
import { createContext, useContext, useState } from 'react';
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
const LocationWrapperContext = createContext<{
|
|
12
|
+
parentId: string | null;
|
|
13
|
+
hoveredId: string | null;
|
|
14
|
+
setHoveredId: ((id: string | null) => void) | null;
|
|
15
|
+
}>({
|
|
16
|
+
parentId: null,
|
|
17
|
+
hoveredId: null,
|
|
18
|
+
setHoveredId: null,
|
|
19
|
+
});
|
|
14
20
|
|
|
15
|
-
|
|
16
|
-
globalHoveredId = id;
|
|
17
|
-
hoverListeners.forEach(listener => listener(id));
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
export interface LocationWrapperProps {
|
|
21
|
-
children: React.ReactNode;
|
|
22
|
-
identifier?: string;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export function LocationWrapper({ children, identifier }: Readonly<LocationWrapperProps>) {
|
|
21
|
+
export function LocationWrapper({ children, blockId }: { children: React.ReactNode; blockId?: string }) {
|
|
26
22
|
const page = usePage();
|
|
27
|
-
const pageBlock = usePageBlock({ optional: true });
|
|
28
23
|
const { settings } = useUserSettings();
|
|
29
24
|
const [isPopoverOpen, setIsPopoverOpen] = useState(false);
|
|
30
|
-
const blockId = pageBlock?.blockId ?? null;
|
|
31
25
|
const isPageWrapper = !blockId;
|
|
32
26
|
|
|
33
|
-
const [
|
|
34
|
-
const
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
// Subscribe to global hover changes
|
|
38
|
-
useEffect(() => {
|
|
39
|
-
const listener = (newHoveredId: string | null) => {
|
|
40
|
-
setHoveredId(newHoveredId);
|
|
41
|
-
};
|
|
42
|
-
hoverListeners.add(listener);
|
|
43
|
-
return () => {
|
|
44
|
-
hoverListeners.delete(listener);
|
|
45
|
-
};
|
|
46
|
-
}, []);
|
|
27
|
+
const [hoveredIdTopLevel, setHoveredIdTopLevel] = useState<string | null>(null);
|
|
28
|
+
const { hoveredId, setHoveredId, parentId } = useContext(LocationWrapperContext);
|
|
29
|
+
const id = `${page.pageId}-${blockId ?? 'page'}`;
|
|
30
|
+
const isHovered = hoveredId === id || hoveredIdTopLevel === id;
|
|
47
31
|
|
|
48
32
|
const setHoverId = (id: string | null) => {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
// Set this element as hovered
|
|
54
|
-
setHoverId(id);
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
const handleMouseLeave = () => {
|
|
58
|
-
// If we're at the top level (page wrapper), go to null
|
|
59
|
-
// If we're at block level, go to page level
|
|
60
|
-
// If we're at identifier level, go to block level
|
|
61
|
-
if (isPageWrapper) {
|
|
62
|
-
setHoverId(null);
|
|
63
|
-
} else if (blockId && !identifier) {
|
|
64
|
-
// Block level - go to page level
|
|
65
|
-
setHoverId(`${page.pageId}-page-`);
|
|
66
|
-
} else if (identifier) {
|
|
67
|
-
// Identifier level - go to block level
|
|
68
|
-
setHoverId(`${page.pageId}-${blockId}-`);
|
|
33
|
+
if (setHoveredId) {
|
|
34
|
+
setHoveredId(id);
|
|
35
|
+
} else {
|
|
36
|
+
setHoveredIdTopLevel(id);
|
|
69
37
|
}
|
|
70
38
|
};
|
|
71
39
|
|
|
72
40
|
if (settings.devMode) {
|
|
73
41
|
const pageId = page.pageId;
|
|
74
42
|
return (
|
|
75
|
-
<
|
|
76
|
-
|
|
77
|
-
`ring-2 transition-all delay-50 relative`,
|
|
78
|
-
isHovered || isPopoverOpen ? 'ring-dev-mode' : 'ring-transparent',
|
|
79
|
-
isPageWrapper ? 'ring-inset' : '',
|
|
80
|
-
identifier ? 'rounded-md' : 'rounded-xl',
|
|
81
|
-
)}
|
|
82
|
-
onMouseEnter={handleMouseEnter}
|
|
83
|
-
onMouseLeave={handleMouseLeave}
|
|
43
|
+
<LocationWrapperContext.Provider
|
|
44
|
+
value={{ hoveredId: hoveredIdTopLevel, setHoveredId: setHoveredIdTopLevel, parentId: id }}
|
|
84
45
|
>
|
|
85
46
|
<div
|
|
86
|
-
className={
|
|
47
|
+
className={cn(
|
|
48
|
+
`ring-2 rounded-xl transition-all delay-50 relative`,
|
|
49
|
+
isHovered || isPopoverOpen ? 'ring-dev-mode' : 'ring-transparent',
|
|
50
|
+
isPageWrapper ? 'ring-inset' : '',
|
|
51
|
+
)}
|
|
52
|
+
onMouseEnter={() => setHoverId(id)}
|
|
53
|
+
onMouseLeave={() => setHoverId(parentId)}
|
|
87
54
|
>
|
|
88
|
-
<
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
</
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
55
|
+
<div
|
|
56
|
+
className={`absolute top-0.5 right-0.5 transition-all delay-50 z-10 ${isHovered || isPopoverOpen ? 'visible' : 'invisible'}`}
|
|
57
|
+
>
|
|
58
|
+
<Popover open={isPopoverOpen} onOpenChange={setIsPopoverOpen}>
|
|
59
|
+
<PopoverTrigger asChild>
|
|
60
|
+
<Button variant="ghost" size="icon" className="rounded-lg">
|
|
61
|
+
<CodeXmlIcon className="text-dev-mode w-5 h-5" />
|
|
62
|
+
</Button>
|
|
63
|
+
</PopoverTrigger>
|
|
64
|
+
<PopoverContent className="w-60">
|
|
65
|
+
<div className="space-y-2">
|
|
66
|
+
<div className="flex items-center gap-2">
|
|
67
|
+
<InfoIcon className="h-4 w-4 text-dev-mode" />
|
|
68
|
+
<span className="font-medium">
|
|
69
|
+
<Trans>Location Details</Trans>
|
|
70
|
+
</span>
|
|
71
|
+
</div>
|
|
72
|
+
<div className="space-y-1.5">
|
|
73
|
+
{pageId && (
|
|
74
|
+
<div>
|
|
75
|
+
<div className="text-xs text-muted-foreground">pageId</div>
|
|
76
|
+
<CopyableText text={pageId} />
|
|
77
|
+
</div>
|
|
78
|
+
)}
|
|
79
|
+
{blockId && (
|
|
80
|
+
<div>
|
|
81
|
+
<div className="text-xs text-muted-foreground">blockId</div>
|
|
82
|
+
<CopyableText text={blockId} />
|
|
83
|
+
</div>
|
|
84
|
+
)}
|
|
85
|
+
</div>
|
|
119
86
|
</div>
|
|
120
|
-
</
|
|
121
|
-
</
|
|
122
|
-
</
|
|
87
|
+
</PopoverContent>
|
|
88
|
+
</Popover>
|
|
89
|
+
</div>
|
|
90
|
+
{children}
|
|
123
91
|
</div>
|
|
124
|
-
|
|
125
|
-
</div>
|
|
92
|
+
</LocationWrapperContext.Provider>
|
|
126
93
|
);
|
|
127
94
|
}
|
|
128
95
|
return children;
|
|
@@ -1,21 +1,20 @@
|
|
|
1
|
-
import { CustomFieldsForm } from '@/
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
1
|
+
import { CustomFieldsForm } from '@/components/shared/custom-fields-form.js';
|
|
2
|
+
import { PermissionGuard } from '@/components/shared/permission-guard.js';
|
|
3
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card.js';
|
|
4
|
+
import { Form } from '@/components/ui/form.js';
|
|
5
|
+
import { useCustomFieldConfig } from '@/hooks/use-custom-field-config.js';
|
|
6
|
+
import { usePage } from '@/hooks/use-page.js';
|
|
7
|
+
import { cn } from '@/lib/utils.js';
|
|
8
|
+
import { NavigationConfirmation } from '@/components/shared/navigation-confirmation.js';
|
|
9
9
|
import { useMediaQuery } from '@uidotdev/usehooks';
|
|
10
10
|
import React, { ComponentProps } from 'react';
|
|
11
11
|
import { Control, UseFormReturn } from 'react-hook-form';
|
|
12
12
|
|
|
13
|
-
import { DashboardActionBarItem } from '../extension-api/types
|
|
13
|
+
import { DashboardActionBarItem } from '../extension-api/extension-api-types.js';
|
|
14
14
|
|
|
15
|
-
import { PageBlockContext } from '@/vdb/framework/layout-engine/page-block-provider.js';
|
|
16
|
-
import { PageContext, PageContextValue } from '@/vdb/framework/layout-engine/page-provider.js';
|
|
17
15
|
import { getDashboardActionBarItems, getDashboardPageBlocks } from './layout-extensions.js';
|
|
18
16
|
import { LocationWrapper } from './location-wrapper.js';
|
|
17
|
+
import { PageContext, PageContextValue } from '@/framework/layout-engine/page-provider.js';
|
|
19
18
|
|
|
20
19
|
export interface PageProps extends ComponentProps<'div'> {
|
|
21
20
|
pageId?: string;
|
|
@@ -42,11 +41,13 @@ export interface PageProps extends ComponentProps<'div'> {
|
|
|
42
41
|
* @docsWeight 0
|
|
43
42
|
* @since 3.3.0
|
|
44
43
|
*/
|
|
45
|
-
export function Page({ children, pageId, entity, form, submitHandler, ...props }:
|
|
44
|
+
export function Page({ children, pageId, entity, form, submitHandler, ...props }: PageProps) {
|
|
46
45
|
const childArray = React.Children.toArray(children);
|
|
47
46
|
|
|
48
47
|
const pageTitle = childArray.find(child => React.isValidElement(child) && child.type === PageTitle);
|
|
49
|
-
const pageActionBar = childArray.find(
|
|
48
|
+
const pageActionBar = childArray.find(
|
|
49
|
+
child => isOfType(child, PageActionBar),
|
|
50
|
+
);
|
|
50
51
|
|
|
51
52
|
const pageContent = childArray.filter(
|
|
52
53
|
child => !isOfType(child, PageTitle) && !isOfType(child, PageActionBar),
|
|
@@ -72,13 +73,7 @@ export function Page({ children, pageId, entity, form, submitHandler, ...props }
|
|
|
72
73
|
);
|
|
73
74
|
}
|
|
74
75
|
|
|
75
|
-
function PageContent({
|
|
76
|
-
pageHeader,
|
|
77
|
-
pageContent,
|
|
78
|
-
form,
|
|
79
|
-
submitHandler,
|
|
80
|
-
...props
|
|
81
|
-
}: {
|
|
76
|
+
function PageContent({ pageHeader, pageContent, form, submitHandler, ...props }: {
|
|
82
77
|
pageHeader: React.ReactNode;
|
|
83
78
|
pageContent: React.ReactNode;
|
|
84
79
|
form?: UseFormReturn<any>;
|
|
@@ -99,14 +94,9 @@ function PageContent({
|
|
|
99
94
|
);
|
|
100
95
|
}
|
|
101
96
|
|
|
102
|
-
export function PageContentWithOptionalForm({
|
|
103
|
-
form,
|
|
104
|
-
pageHeader,
|
|
105
|
-
pageContent,
|
|
106
|
-
submitHandler,
|
|
107
|
-
}: {
|
|
97
|
+
export function PageContentWithOptionalForm({ form, pageHeader, pageContent, submitHandler }: {
|
|
108
98
|
form?: UseFormReturn<any>;
|
|
109
|
-
pageHeader: React.ReactNode
|
|
99
|
+
pageHeader: React.ReactNode
|
|
110
100
|
pageContent: React.ReactNode;
|
|
111
101
|
submitHandler?: any;
|
|
112
102
|
}) {
|
|
@@ -164,7 +154,7 @@ function isPageBlock(child: unknown): child is React.ReactElement<PageBlockProps
|
|
|
164
154
|
* @docsWeight 0
|
|
165
155
|
* @since 3.3.0
|
|
166
156
|
*/
|
|
167
|
-
export function PageLayout({ children, className }:
|
|
157
|
+
export function PageLayout({ children, className }: PageLayoutProps) {
|
|
168
158
|
const page = usePage();
|
|
169
159
|
const isDesktop = useMediaQuery('only screen and (min-width : 769px)');
|
|
170
160
|
// Separate blocks into categories
|
|
@@ -194,7 +184,6 @@ export function PageLayout({ children, className }: Readonly<PageLayoutProps>) {
|
|
|
194
184
|
if (extensionBlock) {
|
|
195
185
|
const ExtensionBlock = (
|
|
196
186
|
<PageBlock
|
|
197
|
-
key={childBlock.key}
|
|
198
187
|
column={extensionBlock.location.column}
|
|
199
188
|
blockId={extensionBlock.id}
|
|
200
189
|
title={extensionBlock.title}
|
|
@@ -238,7 +227,7 @@ export function PageLayout({ children, className }: Readonly<PageLayoutProps>) {
|
|
|
238
227
|
);
|
|
239
228
|
}
|
|
240
229
|
|
|
241
|
-
export function DetailFormGrid({ children }:
|
|
230
|
+
export function DetailFormGrid({ children }: { children: React.ReactNode }) {
|
|
242
231
|
return <div className="md:grid md:grid-cols-2 gap-4 items-start mb-4">{children}</div>;
|
|
243
232
|
}
|
|
244
233
|
|
|
@@ -252,7 +241,7 @@ export function DetailFormGrid({ children }: Readonly<{ children: React.ReactNod
|
|
|
252
241
|
* @docsPage PageTitle
|
|
253
242
|
* @since 3.3.0
|
|
254
243
|
*/
|
|
255
|
-
export function PageTitle({ children }:
|
|
244
|
+
export function PageTitle({ children }: { children: React.ReactNode }) {
|
|
256
245
|
return <h1 className="text-2xl font-semibold">{children}</h1>;
|
|
257
246
|
}
|
|
258
247
|
|
|
@@ -269,11 +258,15 @@ export function PageTitle({ children }: Readonly<{ children: React.ReactNode }>)
|
|
|
269
258
|
* @docsWeight 0
|
|
270
259
|
* @since 3.3.0
|
|
271
260
|
*/
|
|
272
|
-
export function PageActionBar({ children }:
|
|
261
|
+
export function PageActionBar({ children }: { children: React.ReactNode }) {
|
|
273
262
|
let childArray = React.Children.toArray(children);
|
|
274
263
|
|
|
275
|
-
const leftContent = childArray.filter(
|
|
276
|
-
|
|
264
|
+
const leftContent = childArray.filter(
|
|
265
|
+
child => isOfType(child, PageActionBarLeft),
|
|
266
|
+
);
|
|
267
|
+
const rightContent = childArray.filter(
|
|
268
|
+
child => isOfType(child, PageActionBarRight),
|
|
269
|
+
);
|
|
277
270
|
|
|
278
271
|
return (
|
|
279
272
|
<div className={cn('flex gap-2', leftContent.length > 0 ? 'justify-between' : 'justify-end')}>
|
|
@@ -291,7 +284,7 @@ export function PageActionBar({ children }: Readonly<{ children: React.ReactNode
|
|
|
291
284
|
* @docsPage PageActionBar
|
|
292
285
|
* @since 3.3.0
|
|
293
286
|
*/
|
|
294
|
-
export function PageActionBarLeft({ children }:
|
|
287
|
+
export function PageActionBarLeft({ children }: { children: React.ReactNode }) {
|
|
295
288
|
return <div className="flex justify-start gap-2">{children}</div>;
|
|
296
289
|
}
|
|
297
290
|
|
|
@@ -303,7 +296,7 @@ export function PageActionBarLeft({ children }: Readonly<{ children: React.React
|
|
|
303
296
|
* @docsPage PageActionBar
|
|
304
297
|
* @since 3.3.0
|
|
305
298
|
*/
|
|
306
|
-
export function PageActionBarRight({ children }:
|
|
299
|
+
export function PageActionBarRight({ children }: { children: React.ReactNode }) {
|
|
307
300
|
const page = usePage();
|
|
308
301
|
const actionBarItems = page.pageId ? getDashboardActionBarItems(page.pageId) : [];
|
|
309
302
|
return (
|
|
@@ -355,28 +348,19 @@ export type PageBlockProps = {
|
|
|
355
348
|
* @docsWeight 0
|
|
356
349
|
* @since 3.3.0
|
|
357
350
|
*/
|
|
358
|
-
export function PageBlock({
|
|
359
|
-
children,
|
|
360
|
-
title,
|
|
361
|
-
description,
|
|
362
|
-
className,
|
|
363
|
-
blockId,
|
|
364
|
-
column,
|
|
365
|
-
}: Readonly<PageBlockProps>) {
|
|
351
|
+
export function PageBlock({ children, title, description, className, blockId }: PageBlockProps) {
|
|
366
352
|
return (
|
|
367
|
-
<
|
|
368
|
-
<
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
<
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
</LocationWrapper>
|
|
379
|
-
</PageBlockContext.Provider>
|
|
353
|
+
<LocationWrapper blockId={blockId}>
|
|
354
|
+
<Card className={cn('w-full', className)}>
|
|
355
|
+
{title || description ? (
|
|
356
|
+
<CardHeader>
|
|
357
|
+
{title && <CardTitle>{title}</CardTitle>}
|
|
358
|
+
{description && <CardDescription>{description}</CardDescription>}
|
|
359
|
+
</CardHeader>
|
|
360
|
+
) : null}
|
|
361
|
+
<CardContent className={cn(!title ? 'pt-6' : '')}>{children}</CardContent>
|
|
362
|
+
</Card>
|
|
363
|
+
</LocationWrapper>
|
|
380
364
|
);
|
|
381
365
|
}
|
|
382
366
|
|
|
@@ -392,16 +376,14 @@ export function PageBlock({
|
|
|
392
376
|
* @since 3.3.0
|
|
393
377
|
*/
|
|
394
378
|
export function FullWidthPageBlock({
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
}: Pick<PageBlockProps, 'children' | 'className' | 'blockId'>) {
|
|
379
|
+
children,
|
|
380
|
+
className,
|
|
381
|
+
blockId,
|
|
382
|
+
}: Pick<PageBlockProps, 'children' | 'className' | 'blockId'>) {
|
|
399
383
|
return (
|
|
400
|
-
<
|
|
401
|
-
<
|
|
402
|
-
|
|
403
|
-
</LocationWrapper>
|
|
404
|
-
</PageBlockContext.Provider>
|
|
384
|
+
<LocationWrapper blockId={blockId}>
|
|
385
|
+
<div className={cn('w-full', className)}>{children}</div>
|
|
386
|
+
</LocationWrapper>
|
|
405
387
|
);
|
|
406
388
|
}
|
|
407
389
|
|
|
@@ -416,10 +398,10 @@ export function FullWidthPageBlock({
|
|
|
416
398
|
* @since 3.3.0
|
|
417
399
|
*/
|
|
418
400
|
export function CustomFieldsPageBlock({
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
}: {
|
|
401
|
+
column,
|
|
402
|
+
entityType,
|
|
403
|
+
control,
|
|
404
|
+
}: {
|
|
423
405
|
column: 'main' | 'side';
|
|
424
406
|
entityType: string;
|
|
425
407
|
control: Control<any, any>;
|
|
@@ -1,55 +1,36 @@
|
|
|
1
|
-
import { NEW_ENTITY_PATH } from '@/
|
|
1
|
+
import { NEW_ENTITY_PATH } from '@/constants.js';
|
|
2
2
|
|
|
3
|
-
import { PageBreadcrumb } from '@/
|
|
4
|
-
import { extendDetailFormQuery } from '@/vdb/framework/document-extension/extend-detail-form-query.js';
|
|
3
|
+
import { PageBreadcrumb } from '@/components/layout/generated-breadcrumbs.js';
|
|
5
4
|
import { TypedDocumentNode } from '@graphql-typed-document-node/core';
|
|
6
|
-
import { FileBaseRouteOptions
|
|
7
|
-
import { addCustomFields } from '../document-introspection/add-custom-fields.js';
|
|
5
|
+
import { FileBaseRouteOptions } from '@tanstack/react-router';
|
|
8
6
|
import { getQueryName, getQueryTypeFieldInfo } from '../document-introspection/get-document-structure.js';
|
|
9
7
|
import { DetailEntity } from './page-types.js';
|
|
10
8
|
import { getDetailQueryOptions } from './use-detail-page.js';
|
|
11
|
-
|
|
9
|
+
import { addCustomFields } from '../document-introspection/add-custom-fields.js';
|
|
12
10
|
export interface DetailPageRouteLoaderConfig<T extends TypedDocumentNode<any, any>> {
|
|
13
|
-
/**
|
|
14
|
-
* @description
|
|
15
|
-
* The pageId is used to ensure any detail form extensions (such as extensions to
|
|
16
|
-
* the detail query document) get correctly applied at the route loader level.
|
|
17
|
-
*/
|
|
18
|
-
pageId?: string;
|
|
19
11
|
queryDocument: T;
|
|
20
|
-
breadcrumb: (
|
|
21
|
-
isNew: boolean,
|
|
22
|
-
entity: DetailEntity<T>,
|
|
23
|
-
location: ParsedLocation,
|
|
24
|
-
) => Array<PageBreadcrumb | undefined>;
|
|
12
|
+
breadcrumb: (isNew: boolean, entity: DetailEntity<T>) => Array<PageBreadcrumb | undefined>;
|
|
25
13
|
}
|
|
26
14
|
|
|
27
15
|
export function detailPageRouteLoader<T extends TypedDocumentNode<any, any>>({
|
|
28
|
-
pageId,
|
|
29
16
|
queryDocument,
|
|
30
17
|
breadcrumb,
|
|
31
18
|
}: DetailPageRouteLoaderConfig<T>) {
|
|
32
19
|
const loader: FileBaseRouteOptions<any, any>['loader'] = async ({
|
|
33
20
|
context,
|
|
34
21
|
params,
|
|
35
|
-
location,
|
|
36
22
|
}: {
|
|
37
23
|
context: any;
|
|
38
24
|
params: any;
|
|
39
|
-
location: ParsedLocation;
|
|
40
25
|
}) => {
|
|
41
26
|
if (!params.id) {
|
|
42
27
|
throw new Error('ID param is required');
|
|
43
28
|
}
|
|
44
29
|
const isNew = params.id === NEW_ENTITY_PATH;
|
|
45
|
-
const { extendedQuery: extendedQueryDocument } = extendDetailFormQuery(
|
|
46
|
-
addCustomFields(queryDocument),
|
|
47
|
-
pageId,
|
|
48
|
-
);
|
|
49
30
|
const result = isNew
|
|
50
31
|
? null
|
|
51
32
|
: await context.queryClient.ensureQueryData(
|
|
52
|
-
getDetailQueryOptions(
|
|
33
|
+
getDetailQueryOptions(addCustomFields(queryDocument), { id: params.id }),
|
|
53
34
|
{ id: params.id },
|
|
54
35
|
);
|
|
55
36
|
|
|
@@ -60,7 +41,7 @@ export function detailPageRouteLoader<T extends TypedDocumentNode<any, any>>({
|
|
|
60
41
|
throw new Error(`${entityName} with the ID ${params.id} was not found`);
|
|
61
42
|
}
|
|
62
43
|
return {
|
|
63
|
-
breadcrumb: breadcrumb(isNew, result?.[entityField]
|
|
44
|
+
breadcrumb: breadcrumb(isNew, result?.[entityField]),
|
|
64
45
|
};
|
|
65
46
|
};
|
|
66
47
|
return loader;
|