@vendure/dashboard 3.2.0 → 3.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +42 -0
- package/README.md +12 -12
- package/dist/plugin/vite-plugin-admin-api-schema.js +2 -2
- package/dist/plugin/vite-plugin-dashboard-metadata.js +4 -4
- package/dist/plugin/vite-plugin-theme.d.ts +55 -0
- package/dist/plugin/vite-plugin-theme.js +130 -0
- package/dist/plugin/vite-plugin-ui-config.js +2 -2
- package/dist/plugin/vite-plugin-vendure-dashboard.d.ts +2 -1
- package/dist/plugin/vite-plugin-vendure-dashboard.js +2 -0
- package/index.html +15 -15
- package/lingui.config.js +12 -12
- package/package.json +15 -5
- package/src/app/app-providers.tsx +30 -30
- package/src/app/main.tsx +97 -97
- package/src/app/routes/__root.tsx +24 -24
- package/src/app/routes/_authenticated/_administrators/administrators.graphql.ts +79 -79
- package/src/app/routes/_authenticated/_administrators/administrators.tsx +86 -86
- package/src/app/routes/_authenticated/_administrators/administrators_.$id.tsx +155 -155
- package/src/app/routes/_authenticated/_administrators/components/role-permissions-display.tsx +133 -133
- package/src/app/routes/_authenticated/_assets/assets.tsx +19 -19
- package/src/app/routes/_authenticated/_channels/channels.graphql.ts +93 -93
- package/src/app/routes/_authenticated/_channels/channels.tsx +60 -60
- package/src/app/routes/_authenticated/_channels/channels_.$id.tsx +248 -248
- package/src/app/routes/_authenticated/_collections/collections.graphql.ts +133 -133
- package/src/app/routes/_authenticated/_collections/collections.tsx +195 -195
- package/src/app/routes/_authenticated/_collections/collections_.$id.tsx +224 -224
- package/src/app/routes/_authenticated/_collections/components/collection-contents-preview-table.tsx +127 -127
- package/src/app/routes/_authenticated/_collections/components/collection-contents-sheet.tsx +46 -46
- package/src/app/routes/_authenticated/_collections/components/collection-contents-table.tsx +82 -82
- package/src/app/routes/_authenticated/_collections/components/collection-filters-selector.tsx +91 -91
- package/src/app/routes/_authenticated/_countries/countries.graphql.ts +69 -69
- package/src/app/routes/_authenticated/_countries/countries.tsx +67 -67
- package/src/app/routes/_authenticated/_countries/countries_.$id.tsx +122 -122
- package/src/app/routes/_authenticated/_customer-groups/components/customer-group-members-sheet.tsx +44 -44
- package/src/app/routes/_authenticated/_customer-groups/components/customer-group-members-table.tsx +129 -129
- package/src/app/routes/_authenticated/_customer-groups/customer-groups.graphql.ts +71 -71
- package/src/app/routes/_authenticated/_customer-groups/customer-groups.tsx +68 -68
- package/src/app/routes/_authenticated/_customer-groups/customer-groups_.$id.tsx +111 -111
- package/src/app/routes/_authenticated/_customers/components/customer-address-card.tsx +155 -155
- package/src/app/routes/_authenticated/_customers/components/customer-address-form.tsx +344 -344
- package/src/app/routes/_authenticated/_customers/components/customer-group-controls.tsx +4 -4
- package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history-container.tsx +78 -78
- package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history.tsx +77 -77
- package/src/app/routes/_authenticated/_customers/components/customer-history/index.ts +3 -3
- package/src/app/routes/_authenticated/_customers/components/customer-history/use-customer-history.ts +169 -169
- package/src/app/routes/_authenticated/_customers/components/customer-order-table.tsx +88 -88
- package/src/app/routes/_authenticated/_customers/components/customer-status-badge.tsx +33 -33
- package/src/app/routes/_authenticated/_customers/customers.graphql.ts +204 -204
- package/src/app/routes/_authenticated/_customers/customers.tsx +82 -82
- package/src/app/routes/_authenticated/_customers/customers_.$id.tsx +274 -274
- package/src/app/routes/_authenticated/_facets/components/edit-facet-value.tsx +129 -129
- package/src/app/routes/_authenticated/_facets/components/facet-values-sheet.tsx +46 -46
- package/src/app/routes/_authenticated/_facets/components/facet-values-table.tsx +97 -97
- package/src/app/routes/_authenticated/_facets/facets.graphql.ts +104 -104
- package/src/app/routes/_authenticated/_facets/facets.tsx +97 -97
- package/src/app/routes/_authenticated/_facets/facets_.$id.tsx +139 -139
- package/src/app/routes/_authenticated/_global-settings/global-settings.graphql.ts +28 -28
- package/src/app/routes/_authenticated/_global-settings/global-settings.tsx +161 -161
- package/src/app/routes/_authenticated/_orders/components/order-address.tsx +58 -58
- package/src/app/routes/_authenticated/_orders/components/order-history/index.ts +3 -3
- package/src/app/routes/_authenticated/_orders/components/order-history/order-history-container.tsx +72 -72
- package/src/app/routes/_authenticated/_orders/components/order-history/order-history.tsx +96 -96
- package/src/app/routes/_authenticated/_orders/components/order-history/use-order-history.ts +171 -171
- package/src/app/routes/_authenticated/_orders/components/order-table.tsx +169 -169
- package/src/app/routes/_authenticated/_orders/components/order-tax-summary.tsx +38 -38
- package/src/app/routes/_authenticated/_orders/components/payment-details.tsx +61 -61
- package/src/app/routes/_authenticated/_orders/orders.graphql.ts +325 -325
- package/src/app/routes/_authenticated/_orders/orders.tsx +120 -120
- package/src/app/routes/_authenticated/_orders/orders_.$id.tsx +133 -133
- package/src/app/routes/_authenticated/_payment-methods/components/payment-eligibility-checker-selector.tsx +104 -104
- package/src/app/routes/_authenticated/_payment-methods/components/payment-handler-selector.tsx +100 -100
- package/src/app/routes/_authenticated/_payment-methods/payment-methods.graphql.ts +83 -83
- package/src/app/routes/_authenticated/_payment-methods/payment-methods.tsx +64 -64
- package/src/app/routes/_authenticated/_payment-methods/payment-methods_.$id.tsx +183 -183
- package/src/app/routes/_authenticated/_product-variants/components/variant-price-detail.tsx +87 -87
- package/src/app/routes/_authenticated/_product-variants/product-variants.graphql.ts +123 -123
- package/src/app/routes/_authenticated/_product-variants/product-variants.tsx +78 -78
- package/src/app/routes/_authenticated/_product-variants/product-variants_.$id.tsx +331 -331
- package/src/app/routes/_authenticated/_products/components/create-product-variants-dialog.tsx +228 -228
- package/src/app/routes/_authenticated/_products/components/create-product-variants.tsx +462 -462
- package/src/app/routes/_authenticated/_products/components/option-value-input.tsx +95 -95
- package/src/app/routes/_authenticated/_products/components/product-variants-table.tsx +87 -87
- package/src/app/routes/_authenticated/_products/products.graphql.ts +116 -116
- package/src/app/routes/_authenticated/_products/products.tsx +48 -48
- package/src/app/routes/_authenticated/_products/products_.$id.tsx +196 -196
- package/src/app/routes/_authenticated/_profile/profile.graphql.ts +23 -23
- package/src/app/routes/_authenticated/_profile/profile.tsx +122 -122
- package/src/app/routes/_authenticated/_promotions/components/promotion-actions-selector.tsx +107 -107
- package/src/app/routes/_authenticated/_promotions/components/promotion-conditions-selector.tsx +107 -107
- package/src/app/routes/_authenticated/_promotions/promotions.graphql.ts +96 -96
- package/src/app/routes/_authenticated/_promotions/promotions.tsx +61 -61
- package/src/app/routes/_authenticated/_promotions/promotions_.$id.tsx +235 -235
- package/src/app/routes/_authenticated/_roles/components/expandable-permissions.tsx +54 -54
- package/src/app/routes/_authenticated/_roles/components/permissions-grid.tsx +116 -116
- package/src/app/routes/_authenticated/_roles/roles.graphql.ts +67 -67
- package/src/app/routes/_authenticated/_roles/roles.tsx +96 -96
- package/src/app/routes/_authenticated/_roles/roles_.$id.tsx +142 -142
- package/src/app/routes/_authenticated/_sellers/sellers.graphql.ts +61 -61
- package/src/app/routes/_authenticated/_sellers/sellers.tsx +51 -51
- package/src/app/routes/_authenticated/_sellers/sellers_.$id.tsx +111 -111
- package/src/app/routes/_authenticated/_shipping-methods/components/fulfillment-handler-selector.tsx +56 -56
- package/src/app/routes/_authenticated/_shipping-methods/components/shipping-calculator-selector.tsx +101 -101
- package/src/app/routes/_authenticated/_shipping-methods/components/shipping-eligibility-checker-selector.tsx +101 -101
- package/src/app/routes/_authenticated/_shipping-methods/components/test-shipping-method-dialog.tsx +32 -32
- package/src/app/routes/_authenticated/_shipping-methods/shipping-methods.graphql.ts +83 -83
- package/src/app/routes/_authenticated/_shipping-methods/shipping-methods.tsx +55 -55
- package/src/app/routes/_authenticated/_shipping-methods/shipping-methods_.$id.tsx +171 -171
- package/src/app/routes/_authenticated/_stock-locations/stock-locations.graphql.ts +62 -62
- package/src/app/routes/_authenticated/_stock-locations/stock-locations.tsx +48 -48
- package/src/app/routes/_authenticated/_stock-locations/stock-locations_.$id.tsx +115 -115
- package/src/app/routes/_authenticated/_system/components/payload-dialog.tsx +34 -34
- package/src/app/routes/_authenticated/_system/healthchecks.tsx +93 -93
- package/src/app/routes/_authenticated/_system/job-queue.graphql.ts +43 -43
- package/src/app/routes/_authenticated/_system/job-queue.tsx +161 -161
- package/src/app/routes/_authenticated/_tax-categories/tax-categories.graphql.ts +63 -63
- package/src/app/routes/_authenticated/_tax-categories/tax-categories.tsx +65 -65
- package/src/app/routes/_authenticated/_tax-categories/tax-categories_.$id.tsx +115 -115
- package/src/app/routes/_authenticated/_tax-rates/tax-rates.graphql.ts +75 -75
- package/src/app/routes/_authenticated/_tax-rates/tax-rates.tsx +108 -108
- package/src/app/routes/_authenticated/_tax-rates/tax-rates_.$id.tsx +148 -148
- package/src/app/routes/_authenticated/_zones/components/zone-countries-sheet.tsx +31 -31
- package/src/app/routes/_authenticated/_zones/components/zone-countries-table.tsx +79 -79
- package/src/app/routes/_authenticated/_zones/zones.graphql.ts +96 -96
- package/src/app/routes/_authenticated/_zones/zones.tsx +57 -57
- package/src/app/routes/_authenticated/_zones/zones_.$id.tsx +103 -103
- package/src/app/routes/_authenticated/index.tsx +194 -194
- package/src/app/routes/_authenticated.tsx +25 -25
- package/src/app/routes/login.tsx +48 -48
- package/src/app/styles.css +82 -82
- package/src/app/tailwindcss-animate.css +275 -275
- package/src/i18n/locales/de.po +1579 -1579
- package/src/i18n/locales/en.po +1579 -1579
- package/src/lib/components/data-display/boolean.tsx +23 -23
- package/src/lib/components/data-display/date-time.tsx +13 -13
- package/src/lib/components/data-display/json.tsx +5 -5
- package/src/lib/components/data-display/money.tsx +15 -15
- package/src/lib/components/data-input/affixed-input.tsx +49 -49
- package/src/lib/components/data-input/customer-group-input.tsx +72 -72
- package/src/lib/components/data-input/datetime-input.tsx +149 -149
- package/src/lib/components/data-input/facet-value-input.tsx +68 -68
- package/src/lib/components/data-input/money-input.tsx +112 -112
- package/src/lib/components/data-input/richt-text-input.tsx +99 -99
- package/src/lib/components/data-table/data-table-column-header.tsx +73 -73
- package/src/lib/components/data-table/data-table-faceted-filter.tsx +172 -172
- package/src/lib/components/data-table/data-table-filter-dialog.tsx +73 -73
- package/src/lib/components/data-table/data-table-pagination.tsx +87 -87
- package/src/lib/components/data-table/data-table-view-options.tsx +53 -53
- package/src/lib/components/data-table/data-table.tsx +218 -218
- package/src/lib/components/layout/app-layout.tsx +42 -42
- package/src/lib/components/layout/app-sidebar.tsx +34 -34
- package/src/lib/components/layout/channel-switcher.tsx +87 -87
- package/src/lib/components/layout/content-language-selector.tsx +41 -41
- package/src/lib/components/layout/generated-breadcrumbs.tsx +82 -82
- package/src/lib/components/layout/language-dialog.tsx +104 -104
- package/src/lib/components/layout/nav-main.tsx +178 -178
- package/src/lib/components/layout/nav-projects.tsx +81 -81
- package/src/lib/components/layout/nav-user.tsx +176 -176
- package/src/lib/components/layout/prerelease-popup.tsx +38 -38
- package/src/lib/components/login/login-form.tsx +173 -173
- package/src/lib/components/shared/alerts.tsx +20 -20
- package/src/lib/components/shared/animated-number.tsx +49 -49
- package/src/lib/components/shared/asset-gallery.tsx +433 -433
- package/src/lib/components/shared/asset-picker-dialog.tsx +71 -71
- package/src/lib/components/shared/asset-preview-dialog.tsx +48 -48
- package/src/lib/components/shared/asset-preview.tsx +345 -345
- package/src/lib/components/shared/assigned-facet-values.tsx +68 -68
- package/src/lib/components/shared/channel-code-label.tsx +7 -7
- package/src/lib/components/shared/channel-selector.tsx +51 -51
- package/src/lib/components/shared/configurable-operation-arg-input.tsx +51 -51
- package/src/lib/components/shared/configurable-operation-input.tsx +133 -133
- package/src/lib/components/shared/confirmation-dialog.tsx +58 -58
- package/src/lib/components/shared/copyable-text.tsx +31 -31
- package/src/lib/components/shared/country-selector.tsx +105 -105
- package/src/lib/components/shared/currency-selector.tsx +33 -33
- package/src/lib/components/shared/custom-fields-form.tsx +86 -86
- package/src/lib/components/shared/customer-address-form.tsx +330 -330
- package/src/lib/components/shared/customer-group-chip.tsx +30 -30
- package/src/lib/components/shared/customer-group-selector.tsx +62 -62
- package/src/lib/components/shared/customer-selector.tsx +107 -107
- package/src/lib/components/shared/detail-page-button.tsx +22 -22
- package/src/lib/components/shared/entity-assets.tsx +340 -340
- package/src/lib/components/shared/error-page.tsx +31 -31
- package/src/lib/components/shared/facet-value-chip.tsx +44 -44
- package/src/lib/components/shared/facet-value-selector.tsx +306 -306
- package/src/lib/components/shared/focal-point-control.tsx +64 -64
- package/src/lib/components/shared/form-field-wrapper.tsx +37 -37
- package/src/lib/components/shared/history-timeline/history-entry.tsx +112 -112
- package/src/lib/components/shared/history-timeline/history-note-checkbox.tsx +28 -28
- package/src/lib/components/shared/history-timeline/history-note-editor.tsx +60 -60
- package/src/lib/components/shared/history-timeline/history-note-input.tsx +39 -39
- package/src/lib/components/shared/history-timeline/history-timeline.tsx +56 -56
- package/src/lib/components/shared/icon-mark.tsx +18 -18
- package/src/lib/components/shared/language-selector.tsx +48 -48
- package/src/lib/components/shared/logo-mark.tsx +24 -24
- package/src/lib/components/shared/multi-select.tsx +159 -159
- package/src/lib/components/shared/option-value-input.tsx +94 -94
- package/src/lib/components/shared/paginated-list-data-table.tsx +520 -520
- package/src/lib/components/shared/permission-guard.tsx +20 -20
- package/src/lib/components/shared/role-code-label.tsx +8 -8
- package/src/lib/components/shared/role-selector.tsx +56 -56
- package/src/lib/components/shared/seller-selector.tsx +107 -107
- package/src/lib/components/shared/tax-category-selector.tsx +65 -65
- package/src/lib/components/shared/translatable-form-field.tsx +74 -74
- package/src/lib/components/shared/vendure-image.tsx +159 -159
- package/src/lib/components/shared/zone-selector.tsx +66 -66
- package/src/lib/components/ui/accordion.tsx +59 -59
- package/src/lib/components/ui/alert-dialog.tsx +128 -128
- package/src/lib/components/ui/alert.tsx +60 -60
- package/src/lib/components/ui/avatar.tsx +38 -38
- package/src/lib/components/ui/badge.tsx +38 -38
- package/src/lib/components/ui/breadcrumb.tsx +102 -102
- package/src/lib/components/ui/button.tsx +51 -51
- package/src/lib/components/ui/calendar.tsx +69 -69
- package/src/lib/components/ui/card.tsx +47 -47
- package/src/lib/components/ui/checkbox.tsx +27 -27
- package/src/lib/components/ui/collapsible.tsx +33 -33
- package/src/lib/components/ui/command.tsx +133 -133
- package/src/lib/components/ui/dialog.tsx +116 -116
- package/src/lib/components/ui/dropdown-menu.tsx +220 -220
- package/src/lib/components/ui/form.tsx +141 -141
- package/src/lib/components/ui/hover-card.tsx +36 -36
- package/src/lib/components/ui/input.tsx +19 -19
- package/src/lib/components/ui/label.tsx +21 -21
- package/src/lib/components/ui/pagination.tsx +127 -127
- package/src/lib/components/ui/popover.tsx +40 -40
- package/src/lib/components/ui/scroll-area.tsx +50 -50
- package/src/lib/components/ui/select.tsx +161 -161
- package/src/lib/components/ui/separator.tsx +26 -26
- package/src/lib/components/ui/sheet.tsx +118 -118
- package/src/lib/components/ui/sidebar.tsx +696 -696
- package/src/lib/components/ui/skeleton.tsx +13 -13
- package/src/lib/components/ui/sonner.tsx +27 -27
- package/src/lib/components/ui/switch.tsx +26 -26
- package/src/lib/components/ui/table.tsx +82 -82
- package/src/lib/components/ui/tabs.tsx +48 -48
- package/src/lib/components/ui/textarea.tsx +18 -18
- package/src/lib/components/ui/tooltip.tsx +51 -51
- package/src/lib/constants.ts +326 -326
- package/src/lib/framework/component-registry/component-registry.tsx +70 -70
- package/src/lib/framework/component-registry/dynamic-component.tsx +58 -58
- package/src/lib/framework/dashboard-widget/base-widget.tsx +97 -97
- package/src/lib/framework/dashboard-widget/latest-orders-widget/index.tsx +96 -96
- package/src/lib/framework/dashboard-widget/latest-orders-widget/latest-orders-widget.graphql.ts +35 -35
- package/src/lib/framework/dashboard-widget/metrics-widget/chart.tsx +24 -24
- package/src/lib/framework/dashboard-widget/metrics-widget/index.tsx +82 -82
- package/src/lib/framework/dashboard-widget/metrics-widget/metrics-widget.graphql.ts +14 -14
- package/src/lib/framework/dashboard-widget/orders-summary/index.tsx +167 -167
- package/src/lib/framework/dashboard-widget/orders-summary/order-summary-widget.graphql.ts +14 -14
- package/src/lib/framework/dashboard-widget/types.ts +22 -22
- package/src/lib/framework/dashboard-widget/widget-extensions.tsx +19 -19
- package/src/lib/framework/defaults.ts +219 -219
- package/src/lib/framework/document-introspection/add-custom-fields.spec.ts +242 -242
- package/src/lib/framework/document-introspection/add-custom-fields.ts +246 -246
- package/src/lib/framework/document-introspection/get-document-structure.spec.ts +310 -310
- package/src/lib/framework/document-introspection/get-document-structure.ts +460 -460
- package/src/lib/framework/document-introspection/hooks.ts +10 -10
- package/src/lib/framework/extension-api/define-dashboard-extension.ts +66 -66
- package/src/lib/framework/extension-api/extension-api-types.ts +58 -58
- package/src/lib/framework/extension-api/use-dashboard-extensions.ts +26 -26
- package/src/lib/framework/form-engine/form-schema-tools.ts +98 -98
- package/src/lib/framework/form-engine/use-generated-form.tsx +116 -116
- package/src/lib/framework/layout-engine/layout-extensions.ts +30 -30
- package/src/lib/framework/layout-engine/location-wrapper.tsx +96 -96
- package/src/lib/framework/layout-engine/page-layout.tsx +272 -272
- package/src/lib/framework/nav-menu/nav-menu-extensions.ts +66 -66
- package/src/lib/framework/page/detail-page-route-loader.tsx +48 -48
- package/src/lib/framework/page/detail-page.tsx +131 -131
- package/src/lib/framework/page/list-page.tsx +166 -166
- package/src/lib/framework/page/page-api.ts +9 -9
- package/src/lib/framework/page/page-types.ts +51 -51
- package/src/lib/framework/page/use-detail-page.ts +217 -217
- package/src/lib/framework/page/use-extended-router.tsx +69 -69
- package/src/lib/framework/registry/global-registry.ts +46 -46
- package/src/lib/framework/registry/registry-types.ts +15 -15
- package/src/lib/graphql/api.ts +61 -61
- package/src/lib/graphql/fragments.tsx +54 -54
- package/src/lib/graphql/graphql-env.d.ts +499 -499
- package/src/lib/graphql/graphql.ts +15 -15
- package/src/lib/hooks/use-auth.tsx +11 -11
- package/src/lib/hooks/use-channel.ts +12 -12
- package/src/lib/hooks/use-custom-field-config.ts +10 -10
- package/src/lib/hooks/use-grouped-permissions.ts +54 -54
- package/src/lib/hooks/use-local-format.ts +119 -119
- package/src/lib/hooks/use-mobile.ts +19 -19
- package/src/lib/hooks/use-page.tsx +10 -10
- package/src/lib/hooks/use-permissions.ts +22 -22
- package/src/lib/hooks/use-server-config.ts +4 -4
- package/src/lib/hooks/use-theme.ts +10 -10
- package/src/lib/hooks/use-user-settings.tsx +12 -12
- package/src/lib/index.ts +149 -149
- package/src/lib/lib/trans.tsx +16 -16
- package/src/lib/lib/utils.ts +60 -60
- package/src/lib/providers/auth.tsx +152 -152
- package/src/lib/providers/channel-provider.tsx +121 -121
- package/src/lib/providers/i18n-provider.tsx +28 -28
- package/src/lib/providers/server-config.tsx +279 -279
- package/src/lib/providers/theme-provider.tsx +54 -54
- package/src/lib/providers/user-settings.tsx +89 -89
- package/src/lib/virtual.d.ts +12 -12
- package/vite/config-loader.ts +181 -181
- package/vite/constants.ts +280 -280
- package/vite/index.ts +1 -1
- package/vite/schema-generator.ts +40 -40
- package/vite/ui-config.ts +60 -60
- package/vite/vite-plugin-admin-api-schema.ts +141 -141
- package/vite/vite-plugin-config-loader.ts +64 -64
- package/vite/vite-plugin-config.ts +42 -42
- package/vite/vite-plugin-dashboard-metadata.ts +58 -58
- package/vite/vite-plugin-gql-tada.ts +62 -62
- package/vite/vite-plugin-theme.ts +195 -195
- package/vite/vite-plugin-ui-config.ts +60 -60
- package/vite/vite-plugin-vendure-dashboard.ts +118 -118
- package/dist/plugin/.vendure-dashboard-temp/dev-config.js +0 -227
- package/dist/plugin/.vendure-dashboard-temp/dev-config.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/api/api-extensions.js +0 -33
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/api/api-extensions.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/api/mv.resolver.js +0 -69
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/api/mv.resolver.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/config/mv-order-process.js +0 -110
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/config/mv-order-process.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/config/mv-order-seller-strategy.js +0 -134
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/config/mv-order-seller-strategy.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/config/mv-payment-handler.js +0 -86
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/config/mv-payment-handler.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/config/mv-shipping-eligibility-checker.js +0 -49
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/config/mv-shipping-eligibility-checker.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/config/mv-shipping-line-assignment-strategy.js +0 -57
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/config/mv-shipping-line-assignment-strategy.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/constants.js +0 -20
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/constants.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/multivendor.plugin.js +0 -151
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/multivendor.plugin.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/payment/mv-connect-sdk.js +0 -47
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/payment/mv-connect-sdk.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/service/mv.service.js +0 -222
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/service/mv.service.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/types.js +0 -4
- package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/types.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/package.json +0 -3
- package/dist/plugin/.vendure-dashboard-temp/schema.graphql +0 -6378
- package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/api/api-extensions.js +0 -103
- package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/api/api-extensions.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/api/product-entity.resolver.js +0 -105
- package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/api/product-entity.resolver.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/api/product-review-admin.resolver.js +0 -183
- package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/api/product-review-admin.resolver.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/api/product-review-entity.resolver.js +0 -113
- package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/api/product-review-entity.resolver.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/api/product-review-shop.resolver.js +0 -112
- package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/api/product-review-shop.resolver.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/entities/product-review.entity.js +0 -111
- package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/entities/product-review.entity.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/generated-admin-types.js +0 -616
- package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/generated-admin-types.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/generated-shop-types.js +0 -563
- package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/generated-shop-types.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/reviews-plugin.js +0 -135
- package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/reviews-plugin.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/types.js +0 -4
- package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/types.js.map +0 -1
- package/dist/plugin/.vendure-dashboard-temp/tsconfig.json +0 -10
- package/dist/plugin/vite-plugin-set-root.d.ts +0 -4
- package/dist/plugin/vite-plugin-set-root.js +0 -15
- package/src/app/routeTree.gen.ts +0 -1372
|
@@ -1,217 +1,217 @@
|
|
|
1
|
-
import { NEW_ENTITY_PATH } from '@/constants.js';
|
|
2
|
-
import { api, Variables } from '@/graphql/api.js';
|
|
3
|
-
import type { TypedDocumentNode } from '@graphql-typed-document-node/core';
|
|
4
|
-
import {
|
|
5
|
-
DefinedInitialDataOptions,
|
|
6
|
-
queryOptions,
|
|
7
|
-
useMutation,
|
|
8
|
-
useQueryClient,
|
|
9
|
-
useSuspenseQuery,
|
|
10
|
-
} from '@tanstack/react-query';
|
|
11
|
-
import { ResultOf, VariablesOf } from 'gql.tada';
|
|
12
|
-
import { DocumentNode } from 'graphql';
|
|
13
|
-
import { FormEvent } from 'react';
|
|
14
|
-
import { UseFormReturn } from 'react-hook-form';
|
|
15
|
-
|
|
16
|
-
import { addCustomFields } from '../document-introspection/add-custom-fields.js';
|
|
17
|
-
import { getMutationName, getQueryName } from '../document-introspection/get-document-structure.js';
|
|
18
|
-
import { useGeneratedForm } from '../form-engine/use-generated-form.js';
|
|
19
|
-
|
|
20
|
-
import { DetailEntityPath } from './page-types.js';
|
|
21
|
-
|
|
22
|
-
// Utility type to remove null from a type union
|
|
23
|
-
type RemoveNull<T> = T extends null ? never : T;
|
|
24
|
-
|
|
25
|
-
type RemoveNullFields<T> = {
|
|
26
|
-
[K in keyof T]: RemoveNull<T[K]>;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
export interface DetailPageOptions<
|
|
30
|
-
T extends TypedDocumentNode<any, any>,
|
|
31
|
-
C extends TypedDocumentNode<any, any>,
|
|
32
|
-
U extends TypedDocumentNode<any, any>,
|
|
33
|
-
EntityField extends keyof ResultOf<T> = DetailEntityPath<T>,
|
|
34
|
-
VarNameCreate extends keyof VariablesOf<C> = 'input',
|
|
35
|
-
VarNameUpdate extends keyof VariablesOf<U> = 'input',
|
|
36
|
-
> {
|
|
37
|
-
/**
|
|
38
|
-
* @description
|
|
39
|
-
* The query document to fetch the entity.
|
|
40
|
-
*/
|
|
41
|
-
queryDocument: T;
|
|
42
|
-
/**
|
|
43
|
-
* @description
|
|
44
|
-
* The field of the query document that contains the entity.
|
|
45
|
-
*/
|
|
46
|
-
entityField?: EntityField;
|
|
47
|
-
/**
|
|
48
|
-
* @description
|
|
49
|
-
* The parameters used to identify the entity.
|
|
50
|
-
*/
|
|
51
|
-
params: {
|
|
52
|
-
id: string;
|
|
53
|
-
};
|
|
54
|
-
/**
|
|
55
|
-
* @description
|
|
56
|
-
* The document to create the entity.
|
|
57
|
-
*/
|
|
58
|
-
createDocument?: C;
|
|
59
|
-
/**
|
|
60
|
-
* @description
|
|
61
|
-
* The document to update the entity.
|
|
62
|
-
*/
|
|
63
|
-
updateDocument?: U;
|
|
64
|
-
/**
|
|
65
|
-
* @description
|
|
66
|
-
* The function to set the values for the update document.
|
|
67
|
-
*/
|
|
68
|
-
setValuesForUpdate: (entity: NonNullable<ResultOf<T>[EntityField]>) => VariablesOf<U>[VarNameUpdate];
|
|
69
|
-
transformCreateInput?: (input: VariablesOf<C>[VarNameCreate]) => VariablesOf<C>[VarNameCreate];
|
|
70
|
-
transformUpdateInput?: (input: VariablesOf<U>[VarNameUpdate]) => VariablesOf<U>[VarNameUpdate];
|
|
71
|
-
/**
|
|
72
|
-
* @description
|
|
73
|
-
* The function to call when the update is successful.
|
|
74
|
-
*/
|
|
75
|
-
onSuccess?: (entity: ResultOf<C>[keyof ResultOf<C>] | ResultOf<U>[keyof ResultOf<U>]) => void;
|
|
76
|
-
/**
|
|
77
|
-
* @description
|
|
78
|
-
* The function to call when the update is successful.
|
|
79
|
-
*/
|
|
80
|
-
onError?: (error: unknown) => void;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export function getDetailQueryOptions<T, V extends Variables = Variables>(
|
|
84
|
-
document: TypedDocumentNode<T, V> | DocumentNode,
|
|
85
|
-
variables: V,
|
|
86
|
-
): DefinedInitialDataOptions {
|
|
87
|
-
const queryName = getQueryName(document);
|
|
88
|
-
return queryOptions({
|
|
89
|
-
queryKey: ['DetailPage', queryName, variables],
|
|
90
|
-
queryFn: () => api.query(document, variables),
|
|
91
|
-
}) as DefinedInitialDataOptions;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* @description
|
|
96
|
-
* Adds a "customFields" property to the translations if the entity has translations.
|
|
97
|
-
*/
|
|
98
|
-
export type DetailPageTranslations<
|
|
99
|
-
T extends TypedDocumentNode<any, any>,
|
|
100
|
-
EntityField extends keyof ResultOf<T>,
|
|
101
|
-
> = 'translations' extends keyof NonNullable<ResultOf<T>[EntityField]>
|
|
102
|
-
? Array<NonNullable<ResultOf<T>[EntityField]>['translations'][number] & { customFields?: any }>
|
|
103
|
-
: undefined;
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* @description
|
|
107
|
-
* Adds a "customFields" property to the entity and a "translations" property to the entity.
|
|
108
|
-
*/
|
|
109
|
-
export type DetailPageEntity<
|
|
110
|
-
T extends TypedDocumentNode<any, any>,
|
|
111
|
-
EntityField extends keyof ResultOf<T>,
|
|
112
|
-
> = ResultOf<T>[EntityField] & {
|
|
113
|
-
customFields?: any;
|
|
114
|
-
translations: DetailPageTranslations<T, EntityField>;
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
export interface UseDetailPageResult<
|
|
118
|
-
T extends TypedDocumentNode<any, any>,
|
|
119
|
-
C extends TypedDocumentNode<any, any>,
|
|
120
|
-
U extends TypedDocumentNode<any, any>,
|
|
121
|
-
EntityField extends keyof ResultOf<T>,
|
|
122
|
-
> {
|
|
123
|
-
form: UseFormReturn<RemoveNullFields<VariablesOf<U>['input']>>;
|
|
124
|
-
submitHandler: (event: FormEvent<HTMLFormElement>) => void;
|
|
125
|
-
entity?: DetailPageEntity<T, EntityField>;
|
|
126
|
-
isPending: boolean;
|
|
127
|
-
refreshEntity: () => void;
|
|
128
|
-
resetForm: () => void;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* @description
|
|
133
|
-
* This hook is used to create an entity detail page which can read
|
|
134
|
-
* and update an entity.
|
|
135
|
-
*/
|
|
136
|
-
export function useDetailPage<
|
|
137
|
-
T extends TypedDocumentNode<any, any>,
|
|
138
|
-
C extends TypedDocumentNode<any, any>,
|
|
139
|
-
U extends TypedDocumentNode<any, any>,
|
|
140
|
-
EntityField extends keyof ResultOf<T> = keyof ResultOf<T>,
|
|
141
|
-
VarNameUpdate extends keyof VariablesOf<U> = 'input',
|
|
142
|
-
VarNameCreate extends keyof VariablesOf<C> = 'input',
|
|
143
|
-
>(
|
|
144
|
-
options: DetailPageOptions<T, C, U, EntityField, VarNameCreate, VarNameUpdate>,
|
|
145
|
-
): UseDetailPageResult<T, C, U, EntityField> {
|
|
146
|
-
const {
|
|
147
|
-
queryDocument,
|
|
148
|
-
createDocument,
|
|
149
|
-
updateDocument,
|
|
150
|
-
setValuesForUpdate,
|
|
151
|
-
transformCreateInput,
|
|
152
|
-
transformUpdateInput,
|
|
153
|
-
params,
|
|
154
|
-
entityField,
|
|
155
|
-
onSuccess,
|
|
156
|
-
onError,
|
|
157
|
-
} = options;
|
|
158
|
-
const isNew = params.id === NEW_ENTITY_PATH;
|
|
159
|
-
const queryClient = useQueryClient();
|
|
160
|
-
const detailQueryOptions = getDetailQueryOptions(addCustomFields(queryDocument), {
|
|
161
|
-
id: isNew ? '__NEW__' : params.id,
|
|
162
|
-
});
|
|
163
|
-
const detailQuery = useSuspenseQuery(detailQueryOptions);
|
|
164
|
-
const entityQueryField = entityField ?? getQueryName(queryDocument);
|
|
165
|
-
const entity = (detailQuery?.data as any)[entityQueryField] as
|
|
166
|
-
| DetailPageEntity<T, EntityField>
|
|
167
|
-
| undefined;
|
|
168
|
-
|
|
169
|
-
const resetForm = () => {
|
|
170
|
-
form.reset(form.getValues());
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
const createMutation = useMutation({
|
|
174
|
-
mutationFn: createDocument ? api.mutate(createDocument) : undefined,
|
|
175
|
-
onSuccess: data => {
|
|
176
|
-
if (createDocument) {
|
|
177
|
-
const createMutationName = getMutationName(createDocument);
|
|
178
|
-
onSuccess?.((data as any)[createMutationName]);
|
|
179
|
-
}
|
|
180
|
-
},
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
const updateMutation = useMutation({
|
|
184
|
-
mutationFn: updateDocument ? api.mutate(updateDocument) : undefined,
|
|
185
|
-
onSuccess: data => {
|
|
186
|
-
if (updateDocument) {
|
|
187
|
-
const updateMutationName = getMutationName(updateDocument);
|
|
188
|
-
onSuccess?.((data as any)[updateMutationName]);
|
|
189
|
-
void queryClient.invalidateQueries({ queryKey: detailQueryOptions.queryKey });
|
|
190
|
-
}
|
|
191
|
-
},
|
|
192
|
-
onError,
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
const document = isNew ? (createDocument ?? updateDocument) : updateDocument;
|
|
196
|
-
const { form, submitHandler } = useGeneratedForm({
|
|
197
|
-
document,
|
|
198
|
-
entity,
|
|
199
|
-
setValues: setValuesForUpdate,
|
|
200
|
-
onSubmit(values: any) {
|
|
201
|
-
if (isNew) {
|
|
202
|
-
createMutation.mutate({ input: transformCreateInput?.(values) ?? values });
|
|
203
|
-
} else {
|
|
204
|
-
updateMutation.mutate({ input: transformUpdateInput?.(values) ?? values });
|
|
205
|
-
}
|
|
206
|
-
},
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
return {
|
|
210
|
-
form: form as any,
|
|
211
|
-
submitHandler,
|
|
212
|
-
entity,
|
|
213
|
-
isPending: updateMutation.isPending || detailQuery?.isPending,
|
|
214
|
-
refreshEntity: detailQuery.refetch,
|
|
215
|
-
resetForm,
|
|
216
|
-
};
|
|
217
|
-
}
|
|
1
|
+
import { NEW_ENTITY_PATH } from '@/constants.js';
|
|
2
|
+
import { api, Variables } from '@/graphql/api.js';
|
|
3
|
+
import type { TypedDocumentNode } from '@graphql-typed-document-node/core';
|
|
4
|
+
import {
|
|
5
|
+
DefinedInitialDataOptions,
|
|
6
|
+
queryOptions,
|
|
7
|
+
useMutation,
|
|
8
|
+
useQueryClient,
|
|
9
|
+
useSuspenseQuery,
|
|
10
|
+
} from '@tanstack/react-query';
|
|
11
|
+
import { ResultOf, VariablesOf } from 'gql.tada';
|
|
12
|
+
import { DocumentNode } from 'graphql';
|
|
13
|
+
import { FormEvent } from 'react';
|
|
14
|
+
import { UseFormReturn } from 'react-hook-form';
|
|
15
|
+
|
|
16
|
+
import { addCustomFields } from '../document-introspection/add-custom-fields.js';
|
|
17
|
+
import { getMutationName, getQueryName } from '../document-introspection/get-document-structure.js';
|
|
18
|
+
import { useGeneratedForm } from '../form-engine/use-generated-form.js';
|
|
19
|
+
|
|
20
|
+
import { DetailEntityPath } from './page-types.js';
|
|
21
|
+
|
|
22
|
+
// Utility type to remove null from a type union
|
|
23
|
+
type RemoveNull<T> = T extends null ? never : T;
|
|
24
|
+
|
|
25
|
+
type RemoveNullFields<T> = {
|
|
26
|
+
[K in keyof T]: RemoveNull<T[K]>;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export interface DetailPageOptions<
|
|
30
|
+
T extends TypedDocumentNode<any, any>,
|
|
31
|
+
C extends TypedDocumentNode<any, any>,
|
|
32
|
+
U extends TypedDocumentNode<any, any>,
|
|
33
|
+
EntityField extends keyof ResultOf<T> = DetailEntityPath<T>,
|
|
34
|
+
VarNameCreate extends keyof VariablesOf<C> = 'input',
|
|
35
|
+
VarNameUpdate extends keyof VariablesOf<U> = 'input',
|
|
36
|
+
> {
|
|
37
|
+
/**
|
|
38
|
+
* @description
|
|
39
|
+
* The query document to fetch the entity.
|
|
40
|
+
*/
|
|
41
|
+
queryDocument: T;
|
|
42
|
+
/**
|
|
43
|
+
* @description
|
|
44
|
+
* The field of the query document that contains the entity.
|
|
45
|
+
*/
|
|
46
|
+
entityField?: EntityField;
|
|
47
|
+
/**
|
|
48
|
+
* @description
|
|
49
|
+
* The parameters used to identify the entity.
|
|
50
|
+
*/
|
|
51
|
+
params: {
|
|
52
|
+
id: string;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* @description
|
|
56
|
+
* The document to create the entity.
|
|
57
|
+
*/
|
|
58
|
+
createDocument?: C;
|
|
59
|
+
/**
|
|
60
|
+
* @description
|
|
61
|
+
* The document to update the entity.
|
|
62
|
+
*/
|
|
63
|
+
updateDocument?: U;
|
|
64
|
+
/**
|
|
65
|
+
* @description
|
|
66
|
+
* The function to set the values for the update document.
|
|
67
|
+
*/
|
|
68
|
+
setValuesForUpdate: (entity: NonNullable<ResultOf<T>[EntityField]>) => VariablesOf<U>[VarNameUpdate];
|
|
69
|
+
transformCreateInput?: (input: VariablesOf<C>[VarNameCreate]) => VariablesOf<C>[VarNameCreate];
|
|
70
|
+
transformUpdateInput?: (input: VariablesOf<U>[VarNameUpdate]) => VariablesOf<U>[VarNameUpdate];
|
|
71
|
+
/**
|
|
72
|
+
* @description
|
|
73
|
+
* The function to call when the update is successful.
|
|
74
|
+
*/
|
|
75
|
+
onSuccess?: (entity: ResultOf<C>[keyof ResultOf<C>] | ResultOf<U>[keyof ResultOf<U>]) => void;
|
|
76
|
+
/**
|
|
77
|
+
* @description
|
|
78
|
+
* The function to call when the update is successful.
|
|
79
|
+
*/
|
|
80
|
+
onError?: (error: unknown) => void;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function getDetailQueryOptions<T, V extends Variables = Variables>(
|
|
84
|
+
document: TypedDocumentNode<T, V> | DocumentNode,
|
|
85
|
+
variables: V,
|
|
86
|
+
): DefinedInitialDataOptions {
|
|
87
|
+
const queryName = getQueryName(document);
|
|
88
|
+
return queryOptions({
|
|
89
|
+
queryKey: ['DetailPage', queryName, variables],
|
|
90
|
+
queryFn: () => api.query(document, variables),
|
|
91
|
+
}) as DefinedInitialDataOptions;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* @description
|
|
96
|
+
* Adds a "customFields" property to the translations if the entity has translations.
|
|
97
|
+
*/
|
|
98
|
+
export type DetailPageTranslations<
|
|
99
|
+
T extends TypedDocumentNode<any, any>,
|
|
100
|
+
EntityField extends keyof ResultOf<T>,
|
|
101
|
+
> = 'translations' extends keyof NonNullable<ResultOf<T>[EntityField]>
|
|
102
|
+
? Array<NonNullable<ResultOf<T>[EntityField]>['translations'][number] & { customFields?: any }>
|
|
103
|
+
: undefined;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* @description
|
|
107
|
+
* Adds a "customFields" property to the entity and a "translations" property to the entity.
|
|
108
|
+
*/
|
|
109
|
+
export type DetailPageEntity<
|
|
110
|
+
T extends TypedDocumentNode<any, any>,
|
|
111
|
+
EntityField extends keyof ResultOf<T>,
|
|
112
|
+
> = ResultOf<T>[EntityField] & {
|
|
113
|
+
customFields?: any;
|
|
114
|
+
translations: DetailPageTranslations<T, EntityField>;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
export interface UseDetailPageResult<
|
|
118
|
+
T extends TypedDocumentNode<any, any>,
|
|
119
|
+
C extends TypedDocumentNode<any, any>,
|
|
120
|
+
U extends TypedDocumentNode<any, any>,
|
|
121
|
+
EntityField extends keyof ResultOf<T>,
|
|
122
|
+
> {
|
|
123
|
+
form: UseFormReturn<RemoveNullFields<VariablesOf<U>['input']>>;
|
|
124
|
+
submitHandler: (event: FormEvent<HTMLFormElement>) => void;
|
|
125
|
+
entity?: DetailPageEntity<T, EntityField>;
|
|
126
|
+
isPending: boolean;
|
|
127
|
+
refreshEntity: () => void;
|
|
128
|
+
resetForm: () => void;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* @description
|
|
133
|
+
* This hook is used to create an entity detail page which can read
|
|
134
|
+
* and update an entity.
|
|
135
|
+
*/
|
|
136
|
+
export function useDetailPage<
|
|
137
|
+
T extends TypedDocumentNode<any, any>,
|
|
138
|
+
C extends TypedDocumentNode<any, any>,
|
|
139
|
+
U extends TypedDocumentNode<any, any>,
|
|
140
|
+
EntityField extends keyof ResultOf<T> = keyof ResultOf<T>,
|
|
141
|
+
VarNameUpdate extends keyof VariablesOf<U> = 'input',
|
|
142
|
+
VarNameCreate extends keyof VariablesOf<C> = 'input',
|
|
143
|
+
>(
|
|
144
|
+
options: DetailPageOptions<T, C, U, EntityField, VarNameCreate, VarNameUpdate>,
|
|
145
|
+
): UseDetailPageResult<T, C, U, EntityField> {
|
|
146
|
+
const {
|
|
147
|
+
queryDocument,
|
|
148
|
+
createDocument,
|
|
149
|
+
updateDocument,
|
|
150
|
+
setValuesForUpdate,
|
|
151
|
+
transformCreateInput,
|
|
152
|
+
transformUpdateInput,
|
|
153
|
+
params,
|
|
154
|
+
entityField,
|
|
155
|
+
onSuccess,
|
|
156
|
+
onError,
|
|
157
|
+
} = options;
|
|
158
|
+
const isNew = params.id === NEW_ENTITY_PATH;
|
|
159
|
+
const queryClient = useQueryClient();
|
|
160
|
+
const detailQueryOptions = getDetailQueryOptions(addCustomFields(queryDocument), {
|
|
161
|
+
id: isNew ? '__NEW__' : params.id,
|
|
162
|
+
});
|
|
163
|
+
const detailQuery = useSuspenseQuery(detailQueryOptions);
|
|
164
|
+
const entityQueryField = entityField ?? getQueryName(queryDocument);
|
|
165
|
+
const entity = (detailQuery?.data as any)[entityQueryField] as
|
|
166
|
+
| DetailPageEntity<T, EntityField>
|
|
167
|
+
| undefined;
|
|
168
|
+
|
|
169
|
+
const resetForm = () => {
|
|
170
|
+
form.reset(form.getValues());
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
const createMutation = useMutation({
|
|
174
|
+
mutationFn: createDocument ? api.mutate(createDocument) : undefined,
|
|
175
|
+
onSuccess: data => {
|
|
176
|
+
if (createDocument) {
|
|
177
|
+
const createMutationName = getMutationName(createDocument);
|
|
178
|
+
onSuccess?.((data as any)[createMutationName]);
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
const updateMutation = useMutation({
|
|
184
|
+
mutationFn: updateDocument ? api.mutate(updateDocument) : undefined,
|
|
185
|
+
onSuccess: data => {
|
|
186
|
+
if (updateDocument) {
|
|
187
|
+
const updateMutationName = getMutationName(updateDocument);
|
|
188
|
+
onSuccess?.((data as any)[updateMutationName]);
|
|
189
|
+
void queryClient.invalidateQueries({ queryKey: detailQueryOptions.queryKey });
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
onError,
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
const document = isNew ? (createDocument ?? updateDocument) : updateDocument;
|
|
196
|
+
const { form, submitHandler } = useGeneratedForm({
|
|
197
|
+
document,
|
|
198
|
+
entity,
|
|
199
|
+
setValues: setValuesForUpdate,
|
|
200
|
+
onSubmit(values: any) {
|
|
201
|
+
if (isNew) {
|
|
202
|
+
createMutation.mutate({ input: transformCreateInput?.(values) ?? values });
|
|
203
|
+
} else {
|
|
204
|
+
updateMutation.mutate({ input: transformUpdateInput?.(values) ?? values });
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
return {
|
|
210
|
+
form: form as any,
|
|
211
|
+
submitHandler,
|
|
212
|
+
entity,
|
|
213
|
+
isPending: updateMutation.isPending || detailQuery?.isPending,
|
|
214
|
+
refreshEntity: detailQuery.refetch,
|
|
215
|
+
resetForm,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
import { ErrorPage } from '@/components/shared/error-page.js';
|
|
2
|
-
import { useDashboardExtensions } from '@/framework/extension-api/use-dashboard-extensions.js';
|
|
3
|
-
import { ListPage } from '@/framework/page/list-page.js';
|
|
4
|
-
import { extensionRoutes } from '@/framework/page/page-api.js';
|
|
5
|
-
import { AUTHENTICATED_ROUTE_PREFIX } from '@/constants.js';
|
|
6
|
-
import { AnyRoute, createRoute, Router } from '@tanstack/react-router';
|
|
7
|
-
import { useMemo } from 'react';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Extends the TanStack Router with additional routes for each dashboard
|
|
11
|
-
* extension.
|
|
12
|
-
*/
|
|
13
|
-
export const useExtendedRouter = (router: Router<AnyRoute, any, any>) => {
|
|
14
|
-
const { extensionsLoaded } = useDashboardExtensions();
|
|
15
|
-
|
|
16
|
-
return useMemo(() => {
|
|
17
|
-
if (!extensionsLoaded) {
|
|
18
|
-
return router;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const authenticatedRouteIndex = router.routeTree.children.findIndex(
|
|
22
|
-
(r: AnyRoute) => r.id === AUTHENTICATED_ROUTE_PREFIX,
|
|
23
|
-
);
|
|
24
|
-
|
|
25
|
-
if (authenticatedRouteIndex === -1) {
|
|
26
|
-
return router;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
let authenticatedRoute: AnyRoute = router.routeTree.children[authenticatedRouteIndex];
|
|
30
|
-
|
|
31
|
-
const newRoutes: AnyRoute[] = [];
|
|
32
|
-
// Create new routes for each extension
|
|
33
|
-
for (const [path, config] of extensionRoutes.entries()) {
|
|
34
|
-
const pathWithoutLeadingSlash = path.startsWith('/') ? path.slice(1) : path;
|
|
35
|
-
if (
|
|
36
|
-
authenticatedRoute.children.findIndex((r: AnyRoute) => r.path === pathWithoutLeadingSlash) >
|
|
37
|
-
-1
|
|
38
|
-
) {
|
|
39
|
-
// Skip if the route already exists
|
|
40
|
-
continue;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const newRoute: AnyRoute = createRoute({
|
|
44
|
-
path: `/${pathWithoutLeadingSlash}`,
|
|
45
|
-
getParentRoute: () => authenticatedRoute,
|
|
46
|
-
loader: config.loader,
|
|
47
|
-
component: () => config.component(newRoute),
|
|
48
|
-
errorComponent: ({ error }) => <ErrorPage message={error.message} />,
|
|
49
|
-
});
|
|
50
|
-
newRoutes.push(newRoute);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const childrenWithoutAuthenticated = router.routeTree.children.filter(
|
|
54
|
-
(r: AnyRoute) => r.id !== AUTHENTICATED_ROUTE_PREFIX,
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
// Create a new router with the modified route tree
|
|
58
|
-
const newRouter = new Router({
|
|
59
|
-
routeTree: router.routeTree.addChildren([
|
|
60
|
-
...childrenWithoutAuthenticated,
|
|
61
|
-
authenticatedRoute.addChildren([...authenticatedRoute.children, ...newRoutes]),
|
|
62
|
-
]),
|
|
63
|
-
basepath: router.basepath,
|
|
64
|
-
defaultPreload: router.options.defaultPreload,
|
|
65
|
-
defaultPreloadDelay: router.options.defaultPreloadDelay,
|
|
66
|
-
});
|
|
67
|
-
return newRouter;
|
|
68
|
-
}, [router, extensionsLoaded]);
|
|
69
|
-
};
|
|
1
|
+
import { ErrorPage } from '@/components/shared/error-page.js';
|
|
2
|
+
import { useDashboardExtensions } from '@/framework/extension-api/use-dashboard-extensions.js';
|
|
3
|
+
import { ListPage } from '@/framework/page/list-page.js';
|
|
4
|
+
import { extensionRoutes } from '@/framework/page/page-api.js';
|
|
5
|
+
import { AUTHENTICATED_ROUTE_PREFIX } from '@/constants.js';
|
|
6
|
+
import { AnyRoute, createRoute, Router } from '@tanstack/react-router';
|
|
7
|
+
import { useMemo } from 'react';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Extends the TanStack Router with additional routes for each dashboard
|
|
11
|
+
* extension.
|
|
12
|
+
*/
|
|
13
|
+
export const useExtendedRouter = (router: Router<AnyRoute, any, any>) => {
|
|
14
|
+
const { extensionsLoaded } = useDashboardExtensions();
|
|
15
|
+
|
|
16
|
+
return useMemo(() => {
|
|
17
|
+
if (!extensionsLoaded) {
|
|
18
|
+
return router;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const authenticatedRouteIndex = router.routeTree.children.findIndex(
|
|
22
|
+
(r: AnyRoute) => r.id === AUTHENTICATED_ROUTE_PREFIX,
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
if (authenticatedRouteIndex === -1) {
|
|
26
|
+
return router;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
let authenticatedRoute: AnyRoute = router.routeTree.children[authenticatedRouteIndex];
|
|
30
|
+
|
|
31
|
+
const newRoutes: AnyRoute[] = [];
|
|
32
|
+
// Create new routes for each extension
|
|
33
|
+
for (const [path, config] of extensionRoutes.entries()) {
|
|
34
|
+
const pathWithoutLeadingSlash = path.startsWith('/') ? path.slice(1) : path;
|
|
35
|
+
if (
|
|
36
|
+
authenticatedRoute.children.findIndex((r: AnyRoute) => r.path === pathWithoutLeadingSlash) >
|
|
37
|
+
-1
|
|
38
|
+
) {
|
|
39
|
+
// Skip if the route already exists
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const newRoute: AnyRoute = createRoute({
|
|
44
|
+
path: `/${pathWithoutLeadingSlash}`,
|
|
45
|
+
getParentRoute: () => authenticatedRoute,
|
|
46
|
+
loader: config.loader,
|
|
47
|
+
component: () => config.component(newRoute),
|
|
48
|
+
errorComponent: ({ error }) => <ErrorPage message={error.message} />,
|
|
49
|
+
});
|
|
50
|
+
newRoutes.push(newRoute);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const childrenWithoutAuthenticated = router.routeTree.children.filter(
|
|
54
|
+
(r: AnyRoute) => r.id !== AUTHENTICATED_ROUTE_PREFIX,
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
// Create a new router with the modified route tree
|
|
58
|
+
const newRouter = new Router({
|
|
59
|
+
routeTree: router.routeTree.addChildren([
|
|
60
|
+
...childrenWithoutAuthenticated,
|
|
61
|
+
authenticatedRoute.addChildren([...authenticatedRoute.children, ...newRoutes]),
|
|
62
|
+
]),
|
|
63
|
+
basepath: router.basepath,
|
|
64
|
+
defaultPreload: router.options.defaultPreload,
|
|
65
|
+
defaultPreloadDelay: router.options.defaultPreloadDelay,
|
|
66
|
+
});
|
|
67
|
+
return newRouter;
|
|
68
|
+
}, [router, extensionsLoaded]);
|
|
69
|
+
};
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
import { GlobalRegistryContents } from './registry-types.js';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* There are certain global objects that are used in the configuration and extension
|
|
5
|
-
* of the dashboard. Due to the way that Vite bundles and executes the code,
|
|
6
|
-
* we cannot rely on closures over variables in the root scope, as the same variable
|
|
7
|
-
* in different bundles will be different instances.
|
|
8
|
-
*
|
|
9
|
-
* This class is used to register and retrieve these global objects.
|
|
10
|
-
*/
|
|
11
|
-
class GlobalRegistry {
|
|
12
|
-
private static instance: GlobalRegistry;
|
|
13
|
-
private registry: Map<string, any> = new Map();
|
|
14
|
-
|
|
15
|
-
constructor() {
|
|
16
|
-
if (!GlobalRegistry.instance) {
|
|
17
|
-
GlobalRegistry.instance = this;
|
|
18
|
-
}
|
|
19
|
-
return GlobalRegistry.instance;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
public register<T extends GlobalRegistryKey>(key: T, value: GlobalRegistryContents[T]) {
|
|
23
|
-
if (!this.registry.has(key)) {
|
|
24
|
-
this.registry.set(key, value);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
public get<T extends GlobalRegistryKey>(key: T): GlobalRegistryContents[T] {
|
|
29
|
-
return this.registry.get(key);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
public set<T extends GlobalRegistryKey>(
|
|
33
|
-
key: T,
|
|
34
|
-
updater: (oldValue: GlobalRegistryContents[T]) => GlobalRegistryContents[T],
|
|
35
|
-
) {
|
|
36
|
-
const oldValue = this.get(key);
|
|
37
|
-
this.registry.set(key, updater(oldValue));
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export type GlobalRegistryKey = keyof GlobalRegistryContents;
|
|
42
|
-
|
|
43
|
-
const _globalRegistry: GlobalRegistry = (globalThis as any).globalRegistry ?? new GlobalRegistry();
|
|
44
|
-
(globalThis as any).globalRegistry = _globalRegistry;
|
|
45
|
-
|
|
46
|
-
export const globalRegistry = _globalRegistry;
|
|
1
|
+
import { GlobalRegistryContents } from './registry-types.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* There are certain global objects that are used in the configuration and extension
|
|
5
|
+
* of the dashboard. Due to the way that Vite bundles and executes the code,
|
|
6
|
+
* we cannot rely on closures over variables in the root scope, as the same variable
|
|
7
|
+
* in different bundles will be different instances.
|
|
8
|
+
*
|
|
9
|
+
* This class is used to register and retrieve these global objects.
|
|
10
|
+
*/
|
|
11
|
+
class GlobalRegistry {
|
|
12
|
+
private static instance: GlobalRegistry;
|
|
13
|
+
private registry: Map<string, any> = new Map();
|
|
14
|
+
|
|
15
|
+
constructor() {
|
|
16
|
+
if (!GlobalRegistry.instance) {
|
|
17
|
+
GlobalRegistry.instance = this;
|
|
18
|
+
}
|
|
19
|
+
return GlobalRegistry.instance;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public register<T extends GlobalRegistryKey>(key: T, value: GlobalRegistryContents[T]) {
|
|
23
|
+
if (!this.registry.has(key)) {
|
|
24
|
+
this.registry.set(key, value);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public get<T extends GlobalRegistryKey>(key: T): GlobalRegistryContents[T] {
|
|
29
|
+
return this.registry.get(key);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public set<T extends GlobalRegistryKey>(
|
|
33
|
+
key: T,
|
|
34
|
+
updater: (oldValue: GlobalRegistryContents[T]) => GlobalRegistryContents[T],
|
|
35
|
+
) {
|
|
36
|
+
const oldValue = this.get(key);
|
|
37
|
+
this.registry.set(key, updater(oldValue));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export type GlobalRegistryKey = keyof GlobalRegistryContents;
|
|
42
|
+
|
|
43
|
+
const _globalRegistry: GlobalRegistry = (globalThis as any).globalRegistry ?? new GlobalRegistry();
|
|
44
|
+
(globalThis as any).globalRegistry = _globalRegistry;
|
|
45
|
+
|
|
46
|
+
export const globalRegistry = _globalRegistry;
|