@vendure-platform/create 0.5.0 → 0.5.1
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/CHANGELOG.md +4 -0
- package/README.md +39 -39
- package/dist/add-to-existing.js +1 -1
- package/dist/assets/demo-data/initial-data.json +663 -663
- package/dist/assets/storefront/components.json +20 -20
- package/dist/assets/storefront/eslint.config.mjs +10 -10
- package/dist/assets/storefront/graphql.config.yml +1 -1
- package/dist/assets/storefront/next.config.ts +5 -4
- package/dist/assets/storefront/package.json +1 -1
- package/dist/assets/storefront/postcss.config.mjs +1 -1
- package/dist/assets/storefront/src/app/[locale]/(catalog)/catalog/page.tsx +17 -21
- package/dist/assets/storefront/src/app/[locale]/(catalog)/collection/[slug]/page.tsx +64 -42
- package/dist/assets/storefront/src/app/[locale]/(catalog)/layout.tsx +1 -5
- package/dist/assets/storefront/src/app/[locale]/(catalog)/product/[slug]/actions.ts +69 -65
- package/dist/assets/storefront/src/app/[locale]/(catalog)/product/[slug]/page.tsx +64 -38
- package/dist/assets/storefront/src/app/[locale]/(catalog)/search/page.tsx +24 -27
- package/dist/assets/storefront/src/app/[locale]/(catalog)/search/search-results.tsx +11 -9
- package/dist/assets/storefront/src/app/[locale]/(catalog)/search/search-term.tsx +4 -4
- package/dist/assets/storefront/src/app/[locale]/(scenario)/[...path]/page.tsx +1 -1
- package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/accept-invitation-client.tsx +8 -13
- package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/actions.ts +11 -14
- package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/page.tsx +30 -33
- package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/sign-out-and-retry.tsx +6 -6
- package/dist/assets/storefront/src/app/[locale]/account/addresses/actions.ts +30 -45
- package/dist/assets/storefront/src/app/[locale]/account/addresses/address-form.tsx +166 -159
- package/dist/assets/storefront/src/app/[locale]/account/addresses/addresses-client.tsx +35 -26
- package/dist/assets/storefront/src/app/[locale]/account/addresses/loading.tsx +1 -3
- package/dist/assets/storefront/src/app/[locale]/account/addresses/page.tsx +16 -18
- package/dist/assets/storefront/src/app/[locale]/account/approvals/actions.ts +5 -8
- package/dist/assets/storefront/src/app/[locale]/account/approvals/page.tsx +77 -69
- package/dist/assets/storefront/src/app/[locale]/account/company/actions.ts +10 -11
- package/dist/assets/storefront/src/app/[locale]/account/company/addresses/actions.ts +6 -15
- package/dist/assets/storefront/src/app/[locale]/account/company/addresses/address-form.tsx +57 -49
- package/dist/assets/storefront/src/app/[locale]/account/company/addresses/addresses-client.tsx +23 -25
- package/dist/assets/storefront/src/app/[locale]/account/company/addresses/page.tsx +30 -30
- package/dist/assets/storefront/src/app/[locale]/account/company/business-units/actions.ts +20 -29
- package/dist/assets/storefront/src/app/[locale]/account/company/business-units/business-unit-form.tsx +32 -37
- package/dist/assets/storefront/src/app/[locale]/account/company/business-units/business-units-client.tsx +32 -25
- package/dist/assets/storefront/src/app/[locale]/account/company/business-units/page.tsx +24 -24
- package/dist/assets/storefront/src/app/[locale]/account/company/business-units/types.ts +7 -4
- package/dist/assets/storefront/src/app/[locale]/account/company/edit-company-form.tsx +11 -21
- package/dist/assets/storefront/src/app/[locale]/account/company/page.tsx +23 -28
- package/dist/assets/storefront/src/app/[locale]/account/company/payment-methods/page.tsx +24 -24
- package/dist/assets/storefront/src/app/[locale]/account/company/payment-methods/payment-methods-client.tsx +5 -7
- package/dist/assets/storefront/src/app/[locale]/account/company/roles/page.tsx +22 -25
- package/dist/assets/storefront/src/app/[locale]/account/company/roles/roles-client.tsx +11 -26
- package/dist/assets/storefront/src/app/[locale]/account/company/tax-ids/actions.ts +6 -10
- package/dist/assets/storefront/src/app/[locale]/account/company/tax-ids/page.tsx +18 -16
- package/dist/assets/storefront/src/app/[locale]/account/company/tax-ids/tax-ids-client.tsx +74 -67
- package/dist/assets/storefront/src/app/[locale]/account/company/users/actions.ts +16 -25
- package/dist/assets/storefront/src/app/[locale]/account/company/users/edit-user-form.tsx +27 -25
- package/dist/assets/storefront/src/app/[locale]/account/company/users/invite-user-form.tsx +27 -19
- package/dist/assets/storefront/src/app/[locale]/account/company/users/page.tsx +32 -29
- package/dist/assets/storefront/src/app/[locale]/account/company/users/users-client.tsx +35 -38
- package/dist/assets/storefront/src/app/[locale]/account/error.tsx +1 -3
- package/dist/assets/storefront/src/app/[locale]/account/layout.tsx +16 -22
- package/dist/assets/storefront/src/app/[locale]/account/orders/[code]/page.tsx +151 -103
- package/dist/assets/storefront/src/app/[locale]/account/orders/[code]/reorder-actions.ts +6 -7
- package/dist/assets/storefront/src/app/[locale]/account/orders/[code]/reorder-dialog.tsx +22 -48
- package/dist/assets/storefront/src/app/[locale]/account/orders/loading.tsx +8 -8
- package/dist/assets/storefront/src/app/[locale]/account/orders/page.tsx +101 -61
- package/dist/assets/storefront/src/app/[locale]/account/profile/actions.ts +32 -23
- package/dist/assets/storefront/src/app/[locale]/account/profile/change-password-form.tsx +6 -16
- package/dist/assets/storefront/src/app/[locale]/account/profile/edit-email-form.tsx +7 -17
- package/dist/assets/storefront/src/app/[locale]/account/profile/edit-profile-form.tsx +6 -16
- package/dist/assets/storefront/src/app/[locale]/account/profile/loading.tsx +12 -18
- package/dist/assets/storefront/src/app/[locale]/account/profile/page.tsx +15 -15
- package/dist/assets/storefront/src/app/[locale]/account/quick-order/file-upload-tab.tsx +2 -6
- package/dist/assets/storefront/src/app/[locale]/account/quick-order/manual-entry-tab.tsx +18 -15
- package/dist/assets/storefront/src/app/[locale]/account/quick-order/page.tsx +3 -6
- package/dist/assets/storefront/src/app/[locale]/account/quick-order/preview-table.tsx +10 -2
- package/dist/assets/storefront/src/app/[locale]/account/quick-order/save-to-list-dialog.tsx +24 -26
- package/dist/assets/storefront/src/app/[locale]/account/quick-order/sku-autocomplete.tsx +19 -10
- package/dist/assets/storefront/src/app/[locale]/account/quick-order/text-input-tab.tsx +3 -8
- package/dist/assets/storefront/src/app/[locale]/account/quotes/[id]/page.tsx +86 -59
- package/dist/assets/storefront/src/app/[locale]/account/quotes/actions.ts +38 -45
- package/dist/assets/storefront/src/app/[locale]/account/quotes/new/new-quote-form.tsx +3 -5
- package/dist/assets/storefront/src/app/[locale]/account/quotes/new/page.tsx +6 -6
- package/dist/assets/storefront/src/app/[locale]/account/quotes/page.tsx +92 -59
- package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/add-item-search.tsx +11 -9
- package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/add-member-form.tsx +31 -15
- package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/members-panel.tsx +52 -33
- package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/page.tsx +22 -14
- package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/rename-dialog.tsx +34 -13
- package/dist/assets/storefront/src/app/[locale]/account/shared-carts/actions.ts +117 -72
- package/dist/assets/storefront/src/app/[locale]/account/shared-carts/new/new-shared-cart-form.tsx +21 -14
- package/dist/assets/storefront/src/app/[locale]/account/shared-carts/new/page.tsx +10 -10
- package/dist/assets/storefront/src/app/[locale]/account/shared-carts/page.tsx +54 -41
- package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/[id]/page.tsx +22 -8
- package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/[id]/shopping-list-detail-client.tsx +62 -49
- package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/actions.ts +9 -4
- package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/create-shopping-list-form.tsx +5 -11
- package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/loading.tsx +1 -1
- package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/page.tsx +32 -42
- package/dist/assets/storefront/src/app/[locale]/account/store-credits/actions.ts +8 -8
- package/dist/assets/storefront/src/app/[locale]/account/store-credits/claim-form.tsx +6 -10
- package/dist/assets/storefront/src/app/[locale]/account/store-credits/page.tsx +76 -55
- package/dist/assets/storefront/src/app/[locale]/account/store-credits/reveal-code.tsx +10 -6
- package/dist/assets/storefront/src/app/[locale]/account/verify-email/page.tsx +32 -39
- package/dist/assets/storefront/src/app/[locale]/cart/actions.ts +29 -23
- package/dist/assets/storefront/src/app/[locale]/cart/cart-items.tsx +111 -40
- package/dist/assets/storefront/src/app/[locale]/cart/cart-line-actions.tsx +9 -9
- package/dist/assets/storefront/src/app/[locale]/cart/cart-quantity-control.tsx +61 -48
- package/dist/assets/storefront/src/app/[locale]/cart/cart-remove-button.tsx +15 -9
- package/dist/assets/storefront/src/app/[locale]/cart/cart.tsx +38 -41
- package/dist/assets/storefront/src/app/[locale]/cart/code-input.tsx +8 -8
- package/dist/assets/storefront/src/app/[locale]/cart/order-summary.tsx +50 -32
- package/dist/assets/storefront/src/app/[locale]/cart/page.tsx +11 -11
- package/dist/assets/storefront/src/app/[locale]/cart/promotion-code.tsx +48 -42
- package/dist/assets/storefront/src/app/[locale]/cart/reapproval-confirm.tsx +22 -20
- package/dist/assets/storefront/src/app/[locale]/cart/request-quote-button.tsx +7 -16
- package/dist/assets/storefront/src/app/[locale]/checkout/actions.ts +39 -65
- package/dist/assets/storefront/src/app/[locale]/checkout/cancel-quote-checkout-button.tsx +5 -5
- package/dist/assets/storefront/src/app/[locale]/checkout/checkout-flow.tsx +202 -202
- package/dist/assets/storefront/src/app/[locale]/checkout/checkout-provider.tsx +142 -142
- package/dist/assets/storefront/src/app/[locale]/checkout/order-summary.tsx +158 -139
- package/dist/assets/storefront/src/app/[locale]/checkout/page.tsx +56 -47
- package/dist/assets/storefront/src/app/[locale]/checkout/steps/delivery-step.tsx +86 -88
- package/dist/assets/storefront/src/app/[locale]/checkout/steps/payment-step.tsx +90 -91
- package/dist/assets/storefront/src/app/[locale]/checkout/steps/review-step.tsx +166 -161
- package/dist/assets/storefront/src/app/[locale]/checkout/steps/shipping-address-step.tsx +573 -494
- package/dist/assets/storefront/src/app/[locale]/error.tsx +3 -5
- package/dist/assets/storefront/src/app/[locale]/forgot-password/actions.ts +10 -7
- package/dist/assets/storefront/src/app/[locale]/forgot-password/forgot-password-form.tsx +10 -25
- package/dist/assets/storefront/src/app/[locale]/forgot-password/page.tsx +5 -5
- package/dist/assets/storefront/src/app/[locale]/globals.css +48 -48
- package/dist/assets/storefront/src/app/[locale]/layout.tsx +53 -47
- package/dist/assets/storefront/src/app/[locale]/not-found.tsx +3 -5
- package/dist/assets/storefront/src/app/[locale]/order-confirmation/[code]/order-confirmation.tsx +71 -44
- package/dist/assets/storefront/src/app/[locale]/order-confirmation/[code]/page.tsx +7 -5
- package/dist/assets/storefront/src/app/[locale]/page.tsx +33 -35
- package/dist/assets/storefront/src/app/[locale]/register/actions.ts +7 -7
- package/dist/assets/storefront/src/app/[locale]/register/page.tsx +22 -16
- package/dist/assets/storefront/src/app/[locale]/register/registration-form.tsx +22 -34
- package/dist/assets/storefront/src/app/[locale]/register-company/actions.ts +15 -19
- package/dist/assets/storefront/src/app/[locale]/register-company/page.tsx +17 -15
- package/dist/assets/storefront/src/app/[locale]/register-company/registration-form.tsx +9 -15
- package/dist/assets/storefront/src/app/[locale]/reset-password/actions.ts +7 -8
- package/dist/assets/storefront/src/app/[locale]/reset-password/page.tsx +18 -12
- package/dist/assets/storefront/src/app/[locale]/reset-password/reset-password-form.tsx +8 -16
- package/dist/assets/storefront/src/app/[locale]/shopping-list/[code]/add-to-cart-button.tsx +10 -4
- package/dist/assets/storefront/src/app/[locale]/shopping-list/[code]/page.tsx +62 -30
- package/dist/assets/storefront/src/app/[locale]/sign-in/actions.ts +14 -16
- package/dist/assets/storefront/src/app/[locale]/sign-in/login-form.tsx +17 -30
- package/dist/assets/storefront/src/app/[locale]/sign-in/page.tsx +35 -30
- package/dist/assets/storefront/src/app/[locale]/verify/actions.ts +8 -8
- package/dist/assets/storefront/src/app/[locale]/verify/page.tsx +18 -14
- package/dist/assets/storefront/src/app/[locale]/verify/verify-content.tsx +25 -27
- package/dist/assets/storefront/src/app/[locale]/verify-pending/page.tsx +23 -23
- package/dist/assets/storefront/src/app/api/clear-company-context/route.ts +6 -3
- package/dist/assets/storefront/src/app/api/revalidate/route.ts +19 -28
- package/dist/assets/storefront/src/app/api/search-analytics/route.ts +1 -1
- package/dist/assets/storefront/src/components/commerce/account-nav-items.ts +43 -18
- package/dist/assets/storefront/src/components/commerce/account-sidebar.tsx +30 -22
- package/dist/assets/storefront/src/components/commerce/active-filters.tsx +1 -1
- package/dist/assets/storefront/src/components/commerce/add-to-shared-cart.tsx +49 -27
- package/dist/assets/storefront/src/components/commerce/approval-decision-form.tsx +9 -13
- package/dist/assets/storefront/src/components/commerce/approval-status-badge.tsx +23 -15
- package/dist/assets/storefront/src/components/commerce/business-unit-switcher.tsx +11 -11
- package/dist/assets/storefront/src/components/commerce/catalog-search-bar.tsx +2 -2
- package/dist/assets/storefront/src/components/commerce/category-product-section.tsx +28 -16
- package/dist/assets/storefront/src/components/commerce/category-sidebar.tsx +31 -18
- package/dist/assets/storefront/src/components/commerce/collection-hero-banner.tsx +2 -4
- package/dist/assets/storefront/src/components/commerce/company-state-badge.tsx +10 -16
- package/dist/assets/storefront/src/components/commerce/company-switcher.tsx +12 -12
- package/dist/assets/storefront/src/components/commerce/configurator-form.tsx +188 -79
- package/dist/assets/storefront/src/components/commerce/facet-filters.tsx +29 -49
- package/dist/assets/storefront/src/components/commerce/gift-card-pdp.tsx +4 -4
- package/dist/assets/storefront/src/components/commerce/gift-card-product-info.tsx +20 -30
- package/dist/assets/storefront/src/components/commerce/instant-search-dropdown.tsx +258 -227
- package/dist/assets/storefront/src/components/commerce/order-status-badge.tsx +27 -19
- package/dist/assets/storefront/src/components/commerce/packaging-unit-selector.tsx +27 -26
- package/dist/assets/storefront/src/components/commerce/permission-gate.tsx +4 -4
- package/dist/assets/storefront/src/components/commerce/price-range-filter.tsx +5 -5
- package/dist/assets/storefront/src/components/commerce/price-tiers.tsx +38 -21
- package/dist/assets/storefront/src/components/commerce/price.tsx +3 -3
- package/dist/assets/storefront/src/components/commerce/product-card-list.tsx +35 -14
- package/dist/assets/storefront/src/components/commerce/product-card.tsx +31 -16
- package/dist/assets/storefront/src/components/commerce/product-carousel.tsx +20 -12
- package/dist/assets/storefront/src/components/commerce/product-grid.tsx +14 -13
- package/dist/assets/storefront/src/components/commerce/product-image-carousel.tsx +10 -8
- package/dist/assets/storefront/src/components/commerce/product-info.tsx +118 -74
- package/dist/assets/storefront/src/components/commerce/product-list-expansion.tsx +102 -74
- package/dist/assets/storefront/src/components/commerce/product-list-view.tsx +1 -1
- package/dist/assets/storefront/src/components/commerce/product-sidebar.tsx +36 -11
- package/dist/assets/storefront/src/components/commerce/product-view-switcher.tsx +33 -21
- package/dist/assets/storefront/src/components/commerce/quote-action-buttons.tsx +54 -36
- package/dist/assets/storefront/src/components/commerce/quote-activity-timeline.tsx +126 -50
- package/dist/assets/storefront/src/components/commerce/quote-comment-form.tsx +9 -13
- package/dist/assets/storefront/src/components/commerce/quote-csv-export-button.tsx +6 -6
- package/dist/assets/storefront/src/components/commerce/quote-product-search.tsx +22 -18
- package/dist/assets/storefront/src/components/commerce/quote-request-form.tsx +28 -27
- package/dist/assets/storefront/src/components/commerce/quote-status-badge.tsx +26 -18
- package/dist/assets/storefront/src/components/commerce/quote-validity-indicator.tsx +7 -7
- package/dist/assets/storefront/src/components/commerce/quote-version-comparison.tsx +50 -30
- package/dist/assets/storefront/src/components/commerce/related-products.tsx +37 -28
- package/dist/assets/storefront/src/components/commerce/shared-cart-status-badge.tsx +12 -8
- package/dist/assets/storefront/src/components/commerce/shop-by-category.tsx +8 -7
- package/dist/assets/storefront/src/components/commerce/shopping-list-toggle.tsx +14 -20
- package/dist/assets/storefront/src/components/commerce/sort-dropdown.tsx +9 -16
- package/dist/assets/storefront/src/components/commerce/store-credit-summary.tsx +30 -32
- package/dist/assets/storefront/src/components/commerce/subcollection-tiles.tsx +11 -13
- package/dist/assets/storefront/src/components/layout/auth-page-shell.tsx +2 -2
- package/dist/assets/storefront/src/components/layout/draft-mode-indicator.tsx +2 -7
- package/dist/assets/storefront/src/components/layout/draft-mode-link.tsx +4 -2
- package/dist/assets/storefront/src/components/layout/footer.tsx +70 -28
- package/dist/assets/storefront/src/components/layout/navbar/actions.ts +9 -12
- package/dist/assets/storefront/src/components/layout/navbar/cart-icon.tsx +9 -9
- package/dist/assets/storefront/src/components/layout/navbar/channel-picker-wrapper.tsx +4 -9
- package/dist/assets/storefront/src/components/layout/navbar/channel-picker.tsx +13 -8
- package/dist/assets/storefront/src/components/layout/navbar/currency-picker-wrapper.tsx +4 -4
- package/dist/assets/storefront/src/components/layout/navbar/currency-picker.tsx +11 -6
- package/dist/assets/storefront/src/components/layout/navbar/language-picker.tsx +7 -7
- package/dist/assets/storefront/src/components/layout/navbar/login-button.tsx +24 -21
- package/dist/assets/storefront/src/components/layout/navbar/mobile-nav.tsx +8 -8
- package/dist/assets/storefront/src/components/layout/navbar/nav-menu-items.tsx +4 -6
- package/dist/assets/storefront/src/components/layout/navbar/navbar-cart.tsx +1 -1
- package/dist/assets/storefront/src/components/layout/navbar/navbar-collections.tsx +41 -42
- package/dist/assets/storefront/src/components/layout/navbar/navbar-link.tsx +7 -10
- package/dist/assets/storefront/src/components/layout/navbar/navbar-user.tsx +18 -23
- package/dist/assets/storefront/src/components/layout/navbar/theme-switcher.tsx +9 -9
- package/dist/assets/storefront/src/components/layout/navbar.tsx +36 -31
- package/dist/assets/storefront/src/components/layout/search-input.tsx +35 -32
- package/dist/assets/storefront/src/components/providers/awaiting-approval-banner.tsx +12 -10
- package/dist/assets/storefront/src/components/providers/cart-count-server.tsx +14 -12
- package/dist/assets/storefront/src/components/providers/company-context-guard.tsx +4 -4
- package/dist/assets/storefront/src/components/providers/company-permissions-server.tsx +2 -6
- package/dist/assets/storefront/src/components/providers/theme-provider.tsx +3 -3
- package/dist/assets/storefront/src/components/shared/breadcrumbs.tsx +4 -1
- package/dist/assets/storefront/src/components/shared/country-select.tsx +63 -67
- package/dist/assets/storefront/src/components/shared/pagination.tsx +15 -28
- package/dist/assets/storefront/src/components/shared/prefetch-link.tsx +1 -1
- package/dist/assets/storefront/src/components/shared/skeletons/search-input-skeleton.tsx +1 -3
- package/dist/assets/storefront/src/components/ui/accordion.tsx +46 -51
- package/dist/assets/storefront/src/components/ui/alert-dialog.tsx +94 -121
- package/dist/assets/storefront/src/components/ui/alert.tsx +48 -54
- package/dist/assets/storefront/src/components/ui/aspect-ratio.tsx +5 -7
- package/dist/assets/storefront/src/components/ui/avatar.tsx +29 -44
- package/dist/assets/storefront/src/components/ui/badge.tsx +28 -37
- package/dist/assets/storefront/src/components/ui/breadcrumb.tsx +82 -89
- package/dist/assets/storefront/src/components/ui/button.tsx +43 -49
- package/dist/assets/storefront/src/components/ui/calendar.tsx +157 -198
- package/dist/assets/storefront/src/components/ui/card.tsx +53 -76
- package/dist/assets/storefront/src/components/ui/carousel.tsx +194 -212
- package/dist/assets/storefront/src/components/ui/chart.tsx +274 -317
- package/dist/assets/storefront/src/components/ui/checkbox.tsx +24 -27
- package/dist/assets/storefront/src/components/ui/collapsible.tsx +9 -21
- package/dist/assets/storefront/src/components/ui/command.tsx +114 -159
- package/dist/assets/storefront/src/components/ui/context-menu.tsx +167 -199
- package/dist/assets/storefront/src/components/ui/dialog.tsx +97 -114
- package/dist/assets/storefront/src/components/ui/drawer.tsx +93 -107
- package/dist/assets/storefront/src/components/ui/dropdown-menu.tsx +171 -206
- package/dist/assets/storefront/src/components/ui/empty-state.tsx +5 -5
- package/dist/assets/storefront/src/components/ui/field.tsx +196 -208
- package/dist/assets/storefront/src/components/ui/form.tsx +115 -139
- package/dist/assets/storefront/src/components/ui/hover-card.tsx +27 -33
- package/dist/assets/storefront/src/components/ui/input-otp.tsx +50 -59
- package/dist/assets/storefront/src/components/ui/input.tsx +17 -17
- package/dist/assets/storefront/src/components/ui/kbd-shortcut.tsx +3 -1
- package/dist/assets/storefront/src/components/ui/label.tsx +16 -19
- package/dist/assets/storefront/src/components/ui/menubar.tsx +193 -223
- package/dist/assets/storefront/src/components/ui/navigation-menu.tsx +123 -130
- package/dist/assets/storefront/src/components/ui/pagination.tsx +87 -108
- package/dist/assets/storefront/src/components/ui/popover.tsx +29 -35
- package/dist/assets/storefront/src/components/ui/progress.tsx +19 -26
- package/dist/assets/storefront/src/components/ui/radio-group.tsx +32 -38
- package/dist/assets/storefront/src/components/ui/resizable.tsx +37 -42
- package/dist/assets/storefront/src/components/ui/scroll-area.tsx +41 -47
- package/dist/assets/storefront/src/components/ui/select.tsx +130 -152
- package/dist/assets/storefront/src/components/ui/separator.tsx +21 -21
- package/dist/assets/storefront/src/components/ui/sheet.tsx +90 -111
- package/dist/assets/storefront/src/components/ui/sidebar.tsx +611 -649
- package/dist/assets/storefront/src/components/ui/skeleton.tsx +10 -10
- package/dist/assets/storefront/src/components/ui/slider.tsx +50 -55
- package/dist/assets/storefront/src/components/ui/sonner.tsx +20 -20
- package/dist/assets/storefront/src/components/ui/switch.tsx +23 -26
- package/dist/assets/storefront/src/components/ui/table.tsx +65 -97
- package/dist/assets/storefront/src/components/ui/tabs.tsx +39 -55
- package/dist/assets/storefront/src/components/ui/textarea.tsx +14 -14
- package/dist/assets/storefront/src/components/ui/toggle-group.tsx +56 -62
- package/dist/assets/storefront/src/components/ui/toggle.tsx +37 -38
- package/dist/assets/storefront/src/components/ui/tooltip.tsx +38 -46
- package/dist/assets/storefront/src/config/scenario-meta.ts +2 -2
- package/dist/assets/storefront/src/config/scenario.ts +14 -16
- package/dist/assets/storefront/src/contexts/auth-context.tsx +5 -6
- package/dist/assets/storefront/src/graphql.ts +5 -5
- package/dist/assets/storefront/src/hooks/use-mobile.ts +13 -13
- package/dist/assets/storefront/src/i18n/locale-utils.ts +3 -3
- package/dist/assets/storefront/src/i18n/navigation.ts +4 -4
- package/dist/assets/storefront/src/i18n/request.ts +4 -4
- package/dist/assets/storefront/src/i18n/routing.ts +5 -5
- package/dist/assets/storefront/src/i18n/server.ts +3 -3
- package/dist/assets/storefront/src/lib/actions/switch-channel.ts +9 -9
- package/dist/assets/storefront/src/lib/actions/switch-currency.ts +7 -7
- package/dist/assets/storefront/src/lib/auth.ts +1 -1
- package/dist/assets/storefront/src/lib/backend-health.ts +3 -3
- package/dist/assets/storefront/src/lib/cart-count-context.tsx +10 -4
- package/dist/assets/storefront/src/lib/cart-guard-utils.ts +2 -1
- package/dist/assets/storefront/src/lib/cart-guard.ts +7 -6
- package/dist/assets/storefront/src/lib/channel-server.ts +4 -4
- package/dist/assets/storefront/src/lib/company-context.ts +1 -1
- package/dist/assets/storefront/src/lib/company-permissions-context.tsx +1 -5
- package/dist/assets/storefront/src/lib/currency-server.ts +4 -4
- package/dist/assets/storefront/src/lib/format.ts +16 -7
- package/dist/assets/storefront/src/lib/metadata.ts +39 -44
- package/dist/assets/storefront/src/lib/quantity.ts +2 -4
- package/dist/assets/storefront/src/lib/search-bar-context.tsx +7 -4
- package/dist/assets/storefront/src/lib/use-recent-searches.ts +8 -6
- package/dist/assets/storefront/src/lib/utils.ts +3 -3
- package/dist/assets/storefront/src/lib/vendure/actions.ts +18 -16
- package/dist/assets/storefront/src/lib/vendure/api.ts +36 -23
- package/dist/assets/storefront/src/lib/vendure/approval-utils.ts +9 -8
- package/dist/assets/storefront/src/lib/vendure/cached.ts +20 -15
- package/dist/assets/storefront/src/lib/vendure/queries.ts +15 -5
- package/dist/assets/storefront/src/middleware.ts +1 -1
- package/dist/assets/storefront/src/scenarios/customer/hero.tsx +2 -2
- package/dist/assets/storefront/src/scenarios/customer/meta.ts +1 -1
- package/dist/bin/run.js +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.js +1 -1
- package/dist/scaffold-storefront-only.js +1 -1
- package/dist/scaffolder.js +1 -1
- package/dist/template-renderer.js +1 -1
- package/package.json +2 -2
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
1
|
+
import { Price } from '@/components/commerce/price';
|
|
2
|
+
import { QuoteActionButtons } from '@/components/commerce/quote-action-buttons';
|
|
3
|
+
import { QuoteActivityTimeline } from '@/components/commerce/quote-activity-timeline';
|
|
4
|
+
import { QuoteCsvExportButton } from '@/components/commerce/quote-csv-export-button';
|
|
5
|
+
import { QuoteStatusBadge } from '@/components/commerce/quote-status-badge';
|
|
6
|
+
import { QuoteValidityIndicator } from '@/components/commerce/quote-validity-indicator';
|
|
7
|
+
import { QuoteVersionComparison } from '@/components/commerce/quote-version-comparison';
|
|
8
|
+
import { Button } from '@/components/ui/button';
|
|
9
|
+
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
|
|
10
|
+
import { Separator } from '@/components/ui/separator';
|
|
11
|
+
import { Link, redirect } from '@/i18n/navigation';
|
|
12
|
+
import { getActiveChannelToken } from '@/lib/channel-server';
|
|
13
|
+
import { formatDate } from '@/lib/format';
|
|
14
|
+
import { client } from '@/lib/vendure/api';
|
|
15
|
+
import { getActiveChannelCached } from '@/lib/vendure/cached';
|
|
16
|
+
import { GetMyQuoteDetailQuery } from '@/lib/vendure/queries';
|
|
17
|
+
import { AlertTriangle, ChevronLeft, Info } from 'lucide-react';
|
|
18
|
+
import type { Metadata } from 'next';
|
|
19
|
+
import { getTranslations, setRequestLocale } from 'next-intl/server';
|
|
20
|
+
import { Suspense } from 'react';
|
|
21
21
|
|
|
22
22
|
const TERMINAL_STATUSES = new Set(['ACCEPTED', 'REJECTED', 'CANCELLED', 'EXPIRED']);
|
|
23
23
|
|
|
24
24
|
interface QuoteDetailPageProps {
|
|
25
|
-
params: Promise<{locale: string; id: string}>;
|
|
25
|
+
params: Promise<{ locale: string; id: string }>;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
export async function generateMetadata({params}: QuoteDetailPageProps): Promise<Metadata> {
|
|
29
|
-
const {id} = await params;
|
|
28
|
+
export async function generateMetadata({ params }: QuoteDetailPageProps): Promise<Metadata> {
|
|
29
|
+
const { id } = await params;
|
|
30
30
|
return {
|
|
31
31
|
title: `Quote ${id}`,
|
|
32
32
|
};
|
|
@@ -36,19 +36,15 @@ type QuoteDetailTranslations = Awaited<ReturnType<typeof getTranslations<'Quotes
|
|
|
36
36
|
|
|
37
37
|
function getValidityBanner(validUntil: string | null | undefined, t: QuoteDetailTranslations) {
|
|
38
38
|
if (!validUntil) return null;
|
|
39
|
-
const daysRemaining = Math.ceil(
|
|
40
|
-
(new Date(validUntil).getTime() - Date.now()) / (1000 * 60 * 60 * 24),
|
|
41
|
-
);
|
|
39
|
+
const daysRemaining = Math.ceil((new Date(validUntil).getTime() - Date.now()) / (1000 * 60 * 60 * 24));
|
|
42
40
|
if (daysRemaining < 0) {
|
|
43
41
|
return (
|
|
44
42
|
<div className="rounded-lg border border-red-200 bg-red-50 p-4 mb-6">
|
|
45
43
|
<div className="flex gap-3">
|
|
46
|
-
<AlertTriangle className="h-5 w-5 text-red-600 flex-shrink-0 mt-0.5"/>
|
|
44
|
+
<AlertTriangle className="h-5 w-5 text-red-600 flex-shrink-0 mt-0.5" />
|
|
47
45
|
<div>
|
|
48
46
|
<h3 className="font-medium text-red-900">{t('quoteExpiredTitle')}</h3>
|
|
49
|
-
<p className="text-sm text-red-800 mt-1">
|
|
50
|
-
{t('quoteExpiredMessage')}
|
|
51
|
-
</p>
|
|
47
|
+
<p className="text-sm text-red-800 mt-1">{t('quoteExpiredMessage')}</p>
|
|
52
48
|
</div>
|
|
53
49
|
</div>
|
|
54
50
|
</div>
|
|
@@ -58,11 +54,11 @@ function getValidityBanner(validUntil: string | null | undefined, t: QuoteDetail
|
|
|
58
54
|
return (
|
|
59
55
|
<div className="rounded-lg border border-amber-200 bg-amber-50 p-4 mb-6">
|
|
60
56
|
<div className="flex gap-3">
|
|
61
|
-
<AlertTriangle className="h-5 w-5 text-amber-600 flex-shrink-0 mt-0.5"/>
|
|
57
|
+
<AlertTriangle className="h-5 w-5 text-amber-600 flex-shrink-0 mt-0.5" />
|
|
62
58
|
<div>
|
|
63
59
|
<h3 className="font-medium text-amber-900">{t('quoteExpiringSoonTitle')}</h3>
|
|
64
60
|
<p className="text-sm text-amber-800 mt-1">
|
|
65
|
-
{t('quoteExpiresIn', {days: daysRemaining})}
|
|
61
|
+
{t('quoteExpiresIn', { days: daysRemaining })}
|
|
66
62
|
</p>
|
|
67
63
|
</div>
|
|
68
64
|
</div>
|
|
@@ -74,19 +70,29 @@ function getValidityBanner(validUntil: string | null | undefined, t: QuoteDetail
|
|
|
74
70
|
|
|
75
71
|
export default async function QuoteDetailPage(props: QuoteDetailPageProps) {
|
|
76
72
|
return (
|
|
77
|
-
<Suspense
|
|
73
|
+
<Suspense
|
|
74
|
+
fallback={
|
|
75
|
+
<div>
|
|
76
|
+
<p className="text-sm text-muted-foreground">Loading quote...</p>
|
|
77
|
+
</div>
|
|
78
|
+
}
|
|
79
|
+
>
|
|
78
80
|
<QuoteDetailContent paramsPromise={props.params} />
|
|
79
81
|
</Suspense>
|
|
80
82
|
);
|
|
81
83
|
}
|
|
82
84
|
|
|
83
|
-
async function QuoteDetailContent({
|
|
84
|
-
|
|
85
|
+
async function QuoteDetailContent({
|
|
86
|
+
paramsPromise,
|
|
87
|
+
}: {
|
|
88
|
+
paramsPromise: Promise<{ locale: string; id: string }>;
|
|
89
|
+
}) {
|
|
90
|
+
const { locale, id } = await paramsPromise;
|
|
85
91
|
setRequestLocale(locale);
|
|
86
92
|
const channelToken = await getActiveChannelToken();
|
|
87
93
|
const [t, [result, error], channel] = await Promise.all([
|
|
88
94
|
getTranslations('Quotes'),
|
|
89
|
-
client.query(GetMyQuoteDetailQuery, {id}),
|
|
95
|
+
client.query(GetMyQuoteDetailQuery, { id }),
|
|
90
96
|
getActiveChannelCached(channelToken),
|
|
91
97
|
]);
|
|
92
98
|
const currencyCode = channel.defaultCurrencyCode;
|
|
@@ -100,17 +106,18 @@ async function QuoteDetailContent({paramsPromise}: {paramsPromise: Promise<{loca
|
|
|
100
106
|
}
|
|
101
107
|
const version = quote.currentVersion;
|
|
102
108
|
const isTerminal = TERMINAL_STATUSES.has(quote.status);
|
|
103
|
-
const v1 = quote.versions.find(v => v.versionNumber === 1);
|
|
104
|
-
const v1LineItems =
|
|
105
|
-
|
|
106
|
-
|
|
109
|
+
const v1 = quote.versions.find((v) => v.versionNumber === 1);
|
|
110
|
+
const v1LineItems =
|
|
111
|
+
v1 && quote.versions.length > 1
|
|
112
|
+
? v1.lineItems.map((item) => ({ sku: item.sku, unitPrice: item.unitPrice }))
|
|
113
|
+
: undefined;
|
|
107
114
|
|
|
108
115
|
return (
|
|
109
116
|
<div>
|
|
110
117
|
<div className="mb-6">
|
|
111
118
|
<Button variant="ghost" size="sm" asChild className="mb-4">
|
|
112
119
|
<Link href="/account/quotes">
|
|
113
|
-
<ChevronLeft className="h-4 w-4 mr-2"/>
|
|
120
|
+
<ChevronLeft className="h-4 w-4 mr-2" />
|
|
114
121
|
{t('backToQuotes')}
|
|
115
122
|
</Link>
|
|
116
123
|
</Button>
|
|
@@ -119,7 +126,7 @@ async function QuoteDetailContent({paramsPromise}: {paramsPromise: Promise<{loca
|
|
|
119
126
|
<div>
|
|
120
127
|
<h1 className="text-3xl font-bold">Quote {quote.quoteNumber}</h1>
|
|
121
128
|
<p className="text-muted-foreground mt-1">
|
|
122
|
-
{t('createdOn', {date: formatDate(quote.createdAt, locale, 'long')})}
|
|
129
|
+
{t('createdOn', { date: formatDate(quote.createdAt, locale, 'long') })}
|
|
123
130
|
</p>
|
|
124
131
|
</div>
|
|
125
132
|
</div>
|
|
@@ -134,7 +141,7 @@ async function QuoteDetailContent({paramsPromise}: {paramsPromise: Promise<{loca
|
|
|
134
141
|
v1LineItems={v1LineItems}
|
|
135
142
|
/>
|
|
136
143
|
)}
|
|
137
|
-
<QuoteStatusBadge status={quote.status}/>
|
|
144
|
+
<QuoteStatusBadge status={quote.status} />
|
|
138
145
|
</div>
|
|
139
146
|
</div>
|
|
140
147
|
</div>
|
|
@@ -142,12 +149,10 @@ async function QuoteDetailContent({paramsPromise}: {paramsPromise: Promise<{loca
|
|
|
142
149
|
{quote.status === 'IN_REVIEW' && (
|
|
143
150
|
<div className="rounded-lg border border-blue-200 bg-blue-50 p-4 mb-6">
|
|
144
151
|
<div className="flex gap-3">
|
|
145
|
-
<Info className="h-5 w-5 text-blue-600 flex-shrink-0 mt-0.5"/>
|
|
152
|
+
<Info className="h-5 w-5 text-blue-600 flex-shrink-0 mt-0.5" />
|
|
146
153
|
<div>
|
|
147
154
|
<h3 className="font-medium text-blue-900">{t('inReviewBannerTitle')}</h3>
|
|
148
|
-
<p className="text-sm text-blue-800 mt-1">
|
|
149
|
-
{t('inReviewBannerMessage')}
|
|
150
|
-
</p>
|
|
155
|
+
<p className="text-sm text-blue-800 mt-1">{t('inReviewBannerMessage')}</p>
|
|
151
156
|
</div>
|
|
152
157
|
</div>
|
|
153
158
|
</div>
|
|
@@ -176,23 +181,41 @@ async function QuoteDetailContent({paramsPromise}: {paramsPromise: Promise<{loca
|
|
|
176
181
|
<CardContent>
|
|
177
182
|
<div className="space-y-2">
|
|
178
183
|
<div className="flex justify-between text-sm">
|
|
179
|
-
<span className="text-muted-foreground">
|
|
180
|
-
|
|
184
|
+
<span className="text-muted-foreground">
|
|
185
|
+
{t('subtotal')}{' '}
|
|
186
|
+
<span className="text-[10px]">({t('subtotalExclTax')})</span>
|
|
187
|
+
</span>
|
|
188
|
+
<span>
|
|
189
|
+
<Price value={version.subtotal} currencyCode={currencyCode} />
|
|
190
|
+
</span>
|
|
181
191
|
</div>
|
|
182
192
|
<div className="flex justify-between text-sm">
|
|
183
193
|
<span className="text-muted-foreground">{t('shipping')}</span>
|
|
184
194
|
<span>
|
|
185
|
-
{version.shippingCost > 0
|
|
186
|
-
|
|
187
|
-
|
|
195
|
+
{version.shippingCost > 0 ? (
|
|
196
|
+
<Price
|
|
197
|
+
value={version.shippingCost}
|
|
198
|
+
currencyCode={currencyCode}
|
|
199
|
+
/>
|
|
200
|
+
) : (
|
|
201
|
+
t('shippingIncluded')
|
|
202
|
+
)}
|
|
188
203
|
</span>
|
|
189
204
|
</div>
|
|
190
|
-
<Separator className="my-2"/>
|
|
205
|
+
<Separator className="my-2" />
|
|
191
206
|
<div className="flex justify-between font-bold text-lg">
|
|
192
207
|
<span>{t('total')}</span>
|
|
193
|
-
<span
|
|
208
|
+
<span>
|
|
209
|
+
<Price
|
|
210
|
+
value={version.total}
|
|
211
|
+
currencyCode={currencyCode}
|
|
212
|
+
taxLabel="excl"
|
|
213
|
+
/>
|
|
214
|
+
</span>
|
|
194
215
|
</div>
|
|
195
|
-
<p className="text-xs text-muted-foreground mt-2 italic">
|
|
216
|
+
<p className="text-xs text-muted-foreground mt-2 italic">
|
|
217
|
+
{t('taxCalculatedAtCheckout')}
|
|
218
|
+
</p>
|
|
196
219
|
</div>
|
|
197
220
|
</CardContent>
|
|
198
221
|
</Card>
|
|
@@ -217,7 +240,7 @@ async function QuoteDetailContent({paramsPromise}: {paramsPromise: Promise<{loca
|
|
|
217
240
|
<CardContent className="space-y-3 text-sm">
|
|
218
241
|
<div className="flex items-center justify-between">
|
|
219
242
|
<span className="text-muted-foreground">{t('infoStatus')}</span>
|
|
220
|
-
<QuoteStatusBadge status={quote.status}/>
|
|
243
|
+
<QuoteStatusBadge status={quote.status} />
|
|
221
244
|
</div>
|
|
222
245
|
<div className="flex justify-between">
|
|
223
246
|
<span className="text-muted-foreground">{t('infoQuoteNumber')}</span>
|
|
@@ -226,20 +249,24 @@ async function QuoteDetailContent({paramsPromise}: {paramsPromise: Promise<{loca
|
|
|
226
249
|
{quote.validUntil && (
|
|
227
250
|
<div className="flex justify-between">
|
|
228
251
|
<span className="text-muted-foreground">{t('infoValidUntil')}</span>
|
|
229
|
-
<QuoteValidityIndicator validUntil={quote.validUntil}/>
|
|
252
|
+
<QuoteValidityIndicator validUntil={quote.validUntil} />
|
|
230
253
|
</div>
|
|
231
254
|
)}
|
|
232
255
|
{quote.convertedOrderId && (
|
|
233
256
|
<div className="flex justify-between">
|
|
234
257
|
<span className="text-muted-foreground">{t('infoConvertedOrder')}</span>
|
|
235
|
-
<span className="font-medium text-green-700">
|
|
258
|
+
<span className="font-medium text-green-700">
|
|
259
|
+
{t('infoConvertedOrderYes')}
|
|
260
|
+
</span>
|
|
236
261
|
</div>
|
|
237
262
|
)}
|
|
238
263
|
</CardContent>
|
|
239
264
|
</Card>
|
|
240
265
|
|
|
241
266
|
{/* Actions */}
|
|
242
|
-
{(quote.status === 'DRAFT' ||
|
|
267
|
+
{(quote.status === 'DRAFT' ||
|
|
268
|
+
quote.status === 'QUOTED' ||
|
|
269
|
+
(quote.status === 'ACCEPTED' && !quote.convertedOrderId)) && (
|
|
243
270
|
<Card>
|
|
244
271
|
<CardHeader>
|
|
245
272
|
<CardTitle>{t('actionsCardTitle')}</CardTitle>
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
'use server';
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { redirect } from '@/i18n/navigation';
|
|
4
|
+
import { client } from '@/lib/vendure/api';
|
|
4
5
|
import {
|
|
5
|
-
|
|
6
|
-
SubmitQuoteMutation,
|
|
6
|
+
AcceptAndConvertQuoteMutation,
|
|
7
7
|
AcceptQuoteMutation,
|
|
8
|
+
AddQuoteCommentMutation,
|
|
9
|
+
CancelQuoteCheckoutMutation,
|
|
8
10
|
RejectQuoteMutation,
|
|
11
|
+
RemoveAllOrderLinesMutation,
|
|
9
12
|
RequestQuoteChangesMutation,
|
|
10
|
-
|
|
11
|
-
AddQuoteCommentMutation,
|
|
13
|
+
RequestQuoteFromCartMutation,
|
|
12
14
|
RequestQuoteMutation,
|
|
13
|
-
|
|
14
|
-
CancelQuoteCheckoutMutation,
|
|
15
|
+
SubmitQuoteMutation,
|
|
15
16
|
} from '@/lib/vendure/mutations';
|
|
16
|
-
import {QuoteStockCheckQuery, SearchVariantsQuery} from '@/lib/vendure/queries';
|
|
17
|
-
import {revalidatePath, updateTag} from 'next/cache';
|
|
18
|
-
import {redirect} from '@/i18n/navigation';
|
|
17
|
+
import { QuoteStockCheckQuery, SearchVariantsQuery } from '@/lib/vendure/queries';
|
|
18
|
+
import { revalidatePath, updateTag } from 'next/cache';
|
|
19
19
|
|
|
20
20
|
function invalidateCart() {
|
|
21
21
|
updateTag('cart');
|
|
@@ -29,17 +29,16 @@ type QuoteLineItemInput = { productVariantId: string; quantity: number; note?: s
|
|
|
29
29
|
* Returns the quote ID on success, or throws on failure.
|
|
30
30
|
*/
|
|
31
31
|
async function createAndSubmitQuote(lineItems: QuoteLineItemInput[], note?: string) {
|
|
32
|
-
const [result, error] = await client.mutate(
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
);
|
|
32
|
+
const [result, error] = await client.mutate(RequestQuoteMutation, {
|
|
33
|
+
input: { lineItems, note: note || undefined },
|
|
34
|
+
});
|
|
36
35
|
if (error) {
|
|
37
36
|
throw new Error(error.message || 'Failed to create quote');
|
|
38
37
|
}
|
|
39
38
|
const quoteId = result.data.requestQuote.id;
|
|
40
39
|
// Auto-submit — if this fails, user lands on the quote detail page
|
|
41
40
|
// where they can see the DRAFT and manually submit
|
|
42
|
-
const [, submitError] = await client.mutate(SubmitQuoteMutation, {quoteId});
|
|
41
|
+
const [, submitError] = await client.mutate(SubmitQuoteMutation, { quoteId });
|
|
43
42
|
if (submitError) {
|
|
44
43
|
console.error('[createAndSubmitQuote] Submit failed:', submitError);
|
|
45
44
|
}
|
|
@@ -57,8 +56,8 @@ export async function searchVariantsForQuote(term: string) {
|
|
|
57
56
|
}
|
|
58
57
|
|
|
59
58
|
return result.data.search.items
|
|
60
|
-
.filter(item => item.price.__typename === 'SinglePrice')
|
|
61
|
-
.map(item => ({
|
|
59
|
+
.filter((item) => item.price.__typename === 'SinglePrice')
|
|
60
|
+
.map((item) => ({
|
|
62
61
|
productVariantId: item.productVariantId,
|
|
63
62
|
productName: item.productName,
|
|
64
63
|
variantName: item.productVariantName,
|
|
@@ -75,13 +74,13 @@ export async function requestQuoteFromCart() {
|
|
|
75
74
|
if (error) {
|
|
76
75
|
const message = error.message || 'Failed to request quote';
|
|
77
76
|
console.error('[requestQuoteFromCart] FAILED:', message);
|
|
78
|
-
return {success: false, message};
|
|
77
|
+
return { success: false, message };
|
|
79
78
|
}
|
|
80
79
|
const quoteId = result.data.requestQuoteFromCart.id;
|
|
81
80
|
|
|
82
81
|
// Auto-submit — if this fails, user still lands on the quote detail page
|
|
83
82
|
// where they can see the DRAFT and manually submit
|
|
84
|
-
const [, submitError] = await client.mutate(SubmitQuoteMutation, {quoteId});
|
|
83
|
+
const [, submitError] = await client.mutate(SubmitQuoteMutation, { quoteId });
|
|
85
84
|
if (submitError) {
|
|
86
85
|
console.error('[requestQuoteFromCart] Submit failed, redirecting to draft:', submitError);
|
|
87
86
|
}
|
|
@@ -91,20 +90,20 @@ export async function requestQuoteFromCart() {
|
|
|
91
90
|
}
|
|
92
91
|
|
|
93
92
|
export async function submitQuote(quoteId: string) {
|
|
94
|
-
const [, error] = await client.mutate(SubmitQuoteMutation, {quoteId});
|
|
93
|
+
const [, error] = await client.mutate(SubmitQuoteMutation, { quoteId });
|
|
95
94
|
|
|
96
95
|
if (error) {
|
|
97
96
|
const message = error.message || 'Failed to submit quote';
|
|
98
97
|
console.error('[submitQuote] FAILED:', message);
|
|
99
|
-
return {success: false, message};
|
|
98
|
+
return { success: false, message };
|
|
100
99
|
}
|
|
101
100
|
|
|
102
101
|
revalidatePath('/account/quotes', 'layout');
|
|
103
|
-
return {success: true};
|
|
102
|
+
return { success: true };
|
|
104
103
|
}
|
|
105
104
|
|
|
106
105
|
export async function acceptQuote(quoteId: string) {
|
|
107
|
-
const [, error] = await client.mutate(AcceptQuoteMutation, {quoteId});
|
|
106
|
+
const [, error] = await client.mutate(AcceptQuoteMutation, { quoteId });
|
|
108
107
|
|
|
109
108
|
if (error) {
|
|
110
109
|
return {
|
|
@@ -114,11 +113,11 @@ export async function acceptQuote(quoteId: string) {
|
|
|
114
113
|
}
|
|
115
114
|
|
|
116
115
|
revalidatePath('/account/quotes', 'layout');
|
|
117
|
-
return {success: true};
|
|
116
|
+
return { success: true };
|
|
118
117
|
}
|
|
119
118
|
|
|
120
119
|
export async function rejectQuote(quoteId: string, reason?: string) {
|
|
121
|
-
const [, error] = await client.mutate(RejectQuoteMutation, {quoteId, reason: reason ?? null});
|
|
120
|
+
const [, error] = await client.mutate(RejectQuoteMutation, { quoteId, reason: reason ?? null });
|
|
122
121
|
|
|
123
122
|
if (error) {
|
|
124
123
|
return {
|
|
@@ -128,11 +127,11 @@ export async function rejectQuote(quoteId: string, reason?: string) {
|
|
|
128
127
|
}
|
|
129
128
|
|
|
130
129
|
revalidatePath('/account/quotes', 'layout');
|
|
131
|
-
return {success: true};
|
|
130
|
+
return { success: true };
|
|
132
131
|
}
|
|
133
132
|
|
|
134
133
|
export async function requestQuoteChanges(quoteId: string, reason?: string) {
|
|
135
|
-
const [, error] = await client.mutate(RequestQuoteChangesMutation, {quoteId, reason: reason ?? null});
|
|
134
|
+
const [, error] = await client.mutate(RequestQuoteChangesMutation, { quoteId, reason: reason ?? null });
|
|
136
135
|
|
|
137
136
|
if (error) {
|
|
138
137
|
return {
|
|
@@ -142,11 +141,11 @@ export async function requestQuoteChanges(quoteId: string, reason?: string) {
|
|
|
142
141
|
}
|
|
143
142
|
|
|
144
143
|
revalidatePath('/account/quotes', 'layout');
|
|
145
|
-
return {success: true};
|
|
144
|
+
return { success: true };
|
|
146
145
|
}
|
|
147
146
|
|
|
148
147
|
export async function acceptAndConvertQuote(quoteId: string) {
|
|
149
|
-
const [result, error] = await client.mutate(AcceptAndConvertQuoteMutation, {quoteId});
|
|
148
|
+
const [result, error] = await client.mutate(AcceptAndConvertQuoteMutation, { quoteId });
|
|
150
149
|
|
|
151
150
|
if (error) {
|
|
152
151
|
return {
|
|
@@ -167,15 +166,15 @@ export async function acceptAndConvertQuote(quoteId: string) {
|
|
|
167
166
|
export async function cancelQuoteCheckout() {
|
|
168
167
|
const [, error] = await client.mutate(CancelQuoteCheckoutMutation, {});
|
|
169
168
|
if (error) {
|
|
170
|
-
return {success: false, message: error.message || 'Failed to cancel'};
|
|
169
|
+
return { success: false, message: error.message || 'Failed to cancel' };
|
|
171
170
|
}
|
|
172
171
|
invalidateCart();
|
|
173
172
|
revalidatePath('/checkout', 'layout');
|
|
174
|
-
return {success: true};
|
|
173
|
+
return { success: true };
|
|
175
174
|
}
|
|
176
175
|
|
|
177
176
|
export async function addQuoteComment(quoteId: string, text: string) {
|
|
178
|
-
const [, error] = await client.mutate(AddQuoteCommentMutation, {quoteId, text});
|
|
177
|
+
const [, error] = await client.mutate(AddQuoteCommentMutation, { quoteId, text });
|
|
179
178
|
|
|
180
179
|
if (error) {
|
|
181
180
|
return {
|
|
@@ -185,23 +184,20 @@ export async function addQuoteComment(quoteId: string, text: string) {
|
|
|
185
184
|
}
|
|
186
185
|
|
|
187
186
|
revalidatePath('/account/quotes', 'layout');
|
|
188
|
-
return {success: true};
|
|
187
|
+
return { success: true };
|
|
189
188
|
}
|
|
190
189
|
|
|
191
190
|
/**
|
|
192
191
|
* Standalone flow: create quote from line items, submit, redirect to detail.
|
|
193
192
|
* On success, redirects (throws NEXT_REDIRECT) — only failure returns a result.
|
|
194
193
|
*/
|
|
195
|
-
export async function requestQuoteWithItems(
|
|
196
|
-
lineItems: QuoteLineItemInput[],
|
|
197
|
-
note?: string,
|
|
198
|
-
) {
|
|
194
|
+
export async function requestQuoteWithItems(lineItems: QuoteLineItemInput[], note?: string) {
|
|
199
195
|
let quoteId: string;
|
|
200
196
|
try {
|
|
201
197
|
quoteId = await createAndSubmitQuote(lineItems, note);
|
|
202
198
|
} catch (err) {
|
|
203
199
|
const message = err instanceof Error ? err.message : 'Failed to create quote';
|
|
204
|
-
return {success: false as const, message};
|
|
200
|
+
return { success: false as const, message };
|
|
205
201
|
}
|
|
206
202
|
revalidatePath('/account/quotes', 'layout');
|
|
207
203
|
await redirect(`/account/quotes/${quoteId}`);
|
|
@@ -211,16 +207,13 @@ export async function requestQuoteWithItems(
|
|
|
211
207
|
* Cart flow: create quote from line items, submit, clear cart, redirect.
|
|
212
208
|
* On success, redirects (throws NEXT_REDIRECT) — only failure returns a result.
|
|
213
209
|
*/
|
|
214
|
-
export async function requestQuoteFromCartWithReview(
|
|
215
|
-
lineItems: QuoteLineItemInput[],
|
|
216
|
-
note?: string,
|
|
217
|
-
) {
|
|
210
|
+
export async function requestQuoteFromCartWithReview(lineItems: QuoteLineItemInput[], note?: string) {
|
|
218
211
|
let quoteId: string;
|
|
219
212
|
try {
|
|
220
213
|
quoteId = await createAndSubmitQuote(lineItems, note);
|
|
221
214
|
} catch (err) {
|
|
222
215
|
const message = err instanceof Error ? err.message : 'Failed to create quote';
|
|
223
|
-
return {success: false as const, message};
|
|
216
|
+
return { success: false as const, message };
|
|
224
217
|
}
|
|
225
218
|
const [, clearError] = await client.mutate(RemoveAllOrderLinesMutation, {});
|
|
226
219
|
if (clearError) {
|
|
@@ -242,12 +235,12 @@ type StockCheckResult = {
|
|
|
242
235
|
};
|
|
243
236
|
|
|
244
237
|
export async function checkQuoteStock(quoteId: string): Promise<StockCheckResult> {
|
|
245
|
-
const [result, error] = await client.query(QuoteStockCheckQuery, {quoteId});
|
|
238
|
+
const [result, error] = await client.query(QuoteStockCheckQuery, { quoteId });
|
|
246
239
|
if (error) {
|
|
247
240
|
// Fail open — if the stock check itself fails, let the conversion
|
|
248
241
|
// service catch real stock issues. Better than showing an empty warning.
|
|
249
242
|
console.error('[checkQuoteStock] Failed:', error);
|
|
250
|
-
return {allInStock: true, outOfStockItems: []};
|
|
243
|
+
return { allInStock: true, outOfStockItems: [] };
|
|
251
244
|
}
|
|
252
245
|
return result.data.quoteStockCheck as StockCheckResult;
|
|
253
246
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { QuoteRequestForm } from '@/components/commerce/quote-request-form';
|
|
4
|
-
import { QuoteProductSearch } from '@/components/commerce/quote-product-search';
|
|
5
3
|
import { requestQuoteWithItems } from '@/app/[locale]/account/quotes/actions';
|
|
4
|
+
import { QuoteProductSearch } from '@/components/commerce/quote-product-search';
|
|
5
|
+
import { QuoteRequestForm } from '@/components/commerce/quote-request-form';
|
|
6
6
|
import { useRouter } from '@/i18n/navigation';
|
|
7
7
|
|
|
8
8
|
interface NewQuoteFormProps {
|
|
@@ -20,9 +20,7 @@ export function NewQuoteForm({ sender, currencyCode }: NewQuoteFormProps) {
|
|
|
20
20
|
mode="standalone"
|
|
21
21
|
onSubmit={requestQuoteWithItems}
|
|
22
22
|
onCancel={() => router.push('/account/quotes')}
|
|
23
|
-
renderSearch={(addItem) =>
|
|
24
|
-
<QuoteProductSearch onAddItem={addItem} currencyCode={currencyCode} />
|
|
25
|
-
)}
|
|
23
|
+
renderSearch={(addItem) => <QuoteProductSearch onAddItem={addItem} currencyCode={currencyCode} />}
|
|
26
24
|
/>
|
|
27
25
|
);
|
|
28
26
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import type { Metadata } from 'next';
|
|
2
|
-
import { client } from '@/lib/vendure/api';
|
|
3
1
|
import { readFragment } from '@/graphql';
|
|
4
|
-
import { GetActiveCustomerQuery, GetActiveChannelQuery, GetCompanyAccountQuery } from '@/lib/vendure/queries';
|
|
5
|
-
import { ActiveCustomerFragment, CompanyFragment } from '@/lib/vendure/fragments';
|
|
6
2
|
import { redirect } from '@/i18n/navigation';
|
|
7
|
-
import { NewQuoteForm } from './new-quote-form';
|
|
8
|
-
import { locale as rootLocale } from 'next/root-params';
|
|
9
3
|
import type { Locale } from '@/i18n/routing';
|
|
4
|
+
import { client } from '@/lib/vendure/api';
|
|
5
|
+
import { ActiveCustomerFragment, CompanyFragment } from '@/lib/vendure/fragments';
|
|
6
|
+
import { GetActiveChannelQuery, GetActiveCustomerQuery, GetCompanyAccountQuery } from '@/lib/vendure/queries';
|
|
7
|
+
import type { Metadata } from 'next';
|
|
10
8
|
import { getTranslations } from 'next-intl/server';
|
|
9
|
+
import { locale as rootLocale } from 'next/root-params';
|
|
10
|
+
import { NewQuoteForm } from './new-quote-form';
|
|
11
11
|
|
|
12
12
|
export async function generateMetadata(): Promise<Metadata> {
|
|
13
13
|
const locale = (await rootLocale()) as Locale;
|