From c1740218e94471533f8b57c84886e1e371985285 Mon Sep 17 00:00:00 2001 From: Kasper Fabricius Kristensen <45367945+kasperkristensen@users.noreply.github.com> Date: Fri, 28 Jun 2024 16:08:23 +0200 Subject: [PATCH] feat(dashboard,types,js-sdk,ui): Add missing Price List features (#7856) **What** - Adds missing features to Price List domain - Adds `StackedFocusModal` and `StackedDrawer` components that should replace SplitView across the project. - Add Footer to FocusModal - Adds missing js-sdk functions and types **Note** The DatePickers in the PriceLists forms do not work as intended atm. The component is broken, and needs to be fixed. I am working on a fix, but choose to move that work into a separate branch, to prevent this PR from getting bigger then it already is. Will update once the fixes have been merged. --- .../condition-block/condition-block.tsx | 59 ++ .../date-range-display/date-range-display.tsx | 73 +++ .../common/date-range-display/index.ts | 1 + .../data-grid-root/data-grid-root.tsx | 15 +- .../src/components/data-grid/hooks.tsx | 9 +- .../src/components/data-grid/types.ts | 4 + .../layout/main-layout/main-layout.tsx | 4 +- .../dashboard/src/components/modals/index.ts | 7 + .../route-drawer/index.ts | 0 .../route-drawer/route-drawer.tsx | 27 +- .../route-focus-modal/index.ts | 0 .../route-focus-modal/route-focus-modal.tsx | 29 +- .../modals/route-modal-form/index.ts | 1 + .../route-modal-form/route-modal-form.tsx} | 6 +- .../modals/route-modal-provider/index.ts | 2 + .../route-modal-context.tsx | 8 + .../route-modal-provider/route-provider.tsx | 20 +- .../route-modal-provider/use-route-modal.tsx | 12 + .../components/modals/stacked-drawer/index.ts | 1 + .../modals/stacked-drawer/stacked-drawer.tsx | 85 +++ .../modals/stacked-focus-modal/index.ts | 1 + .../stacked-foucs-modal.tsx | 88 +++ .../modals/stacked-modal-provider/index.ts | 2 + .../stacked-modal-context.tsx | 10 + .../stacked-modal-provider.tsx | 54 ++ .../use-stacked-modal.ts | 14 + .../src/components/route-modal/index.ts | 3 - .../route-modal/route-form/index.ts | 1 - .../route-modal/route-modal-provider/index.ts | 1 - .../data-table-search/data-table-search.tsx | 1 + .../src/hooks/api/customer-groups.tsx | 6 +- .../dashboard/src/hooks/api/price-lists.tsx | 97 +-- .../dashboard/src/hooks/api/store.tsx | 41 +- .../dashboard/src/i18n/translations/en.json | 127 ++-- .../src/providers/keybind-provider/hooks.tsx | 2 +- .../providers/router-provider/route-map.tsx | 27 +- .../src/providers/theme-provider/index.ts | 6 +- .../theme-provider/theme-provider.tsx | 36 +- .../providers/theme-provider/use-theme.tsx | 12 +- .../api-key-management-create.tsx | 2 +- .../api-key-create-form.tsx | 2 +- .../api-key-management-edit.tsx | 2 +- .../edit-api-key-form/edit-api-key-form.tsx | 2 +- .../api-key-management-sales-channels.tsx | 2 +- .../api-key-sales-channels-form.tsx | 2 +- .../add-campaign-promotions.tsx | 2 +- .../add-campaign-promotions-form.tsx | 6 +- .../campaign-budget-edit.tsx | 2 +- .../edit-campaign-budget-form.tsx | 2 +- .../campaign-create/campaign-create.tsx | 2 +- .../create-campaign-form.tsx | 2 +- .../campaigns/campaign-edit/campaign-edit.tsx | 2 +- .../edit-campaign-form/edit-campaign-form.tsx | 2 +- .../category-create/category-create.tsx | 2 +- .../create-category-form.tsx | 2 +- .../category-edit/category-edit.tsx | 2 +- .../edit-category-form/edit-category-form.tsx | 2 +- .../category-organize/category-organize.tsx | 2 +- .../organize-category-form.tsx | 2 +- .../category-products/category-products.tsx | 2 +- .../edit-category-products-form.tsx | 2 +- .../collection-add-products.tsx | 2 +- .../add-products-to-collection-form.tsx | 2 +- .../collection-create/collection-create.tsx | 2 +- .../create-collection-form.tsx | 2 +- .../collection-edit/collection-edit.tsx | 2 +- .../edit-collection-form.tsx | 4 +- .../add-customers-form/add-customers-form.tsx | 4 +- .../customer-group-add-customers.tsx | 2 +- .../create-customer-group-form.tsx | 2 +- .../customer-group-create.tsx | 2 +- .../edit-customer-group-form.tsx | 4 +- .../customer-group-edit.tsx | 2 +- .../create-customer-form.tsx | 2 +- .../customer-create/customer-create.tsx | 2 +- .../edit-customer-form/edit-customer-form.tsx | 4 +- .../customers/customer-edit/customer-edit.tsx | 2 +- ...transfer-customer-order-ownership-form.tsx | 2 +- .../customer-transfer-ownership.tsx | 2 +- .../add-customer-groups-form.tsx | 2 +- .../customer-add-customer-groups.tsx | 2 +- .../create-inventory-item-form.tsx | 16 +- .../inventory-create/inventory-create.tsx | 2 +- .../adjust-inventory-drawer.tsx | 12 +- .../components/adjust-inventory-form.tsx | 8 +- .../components/edit-item-attributes-form.tsx | 2 +- .../edit-item-attributes-drawer.tsx | 8 +- .../components/edit-item-form.tsx | 8 +- .../edit-inventory-item/edit-item-drawer.tsx | 8 +- .../components/manage-locations-form.tsx | 8 +- .../manage-locations-drawer.tsx | 6 +- .../create-location-form.tsx | 2 +- .../location-create/location-create.tsx | 2 +- .../edit-location-form/edit-location-form.tsx | 2 +- .../locations/location-edit/location-edit.tsx | 2 +- .../edit-sales-channels-form.tsx | 2 +- .../location-sales-channels.tsx | 2 +- .../create-service-zone-form.tsx | 2 +- .../location-service-zone-create.tsx | 2 +- .../edit-service-zone-form.tsx | 2 +- .../location-service-zone-edit.tsx | 2 +- .../edit-service-zone-areas-form.tsx | 2 +- .../location-service-zone-manage-areas.tsx | 2 +- .../create-shipping-options-form.tsx | 2 +- ...on-service-zone-shipping-option-create.tsx | 2 +- .../edit-shipping-option-form.tsx | 2 +- ...tion-service-zone-shipping-option-edit.tsx | 2 +- .../edit-shipping-options-pricing-form.tsx | 2 +- ...n-service-zone-shipping-option-pricing.tsx | 2 +- .../order-create-fulfillment-form.tsx | 6 +- .../order-create-fulfillments.tsx | 4 +- .../index.ts | 1 + .../price-list-customer-group-rule-form.tsx | 187 ++++++ .../common/constants.ts | 0 .../hooks/use-delete-price-list-action.tsx | 56 ++ .../hooks/use-price-list-currency-data.tsx | 51 ++ .../hooks/use-price-list-grid-columns.tsx | 104 ++++ .../src/routes/price-lists/common/schemas.ts | 96 +++ .../src/routes/price-lists/common/utils.ts | 123 ++++ .../price-list-configuration-form/index.ts | 0 .../price-list-configuration-form.tsx | 307 ++++++++++ .../price-list-configuration/index.ts | 1 + .../price-list-configuration.tsx | 68 +++ .../price-list-create-form/index.ts | 1 + .../price-list-create-form.tsx} | 155 ++--- .../price-list-details-form.tsx | 326 +++++++++++ .../price-list-prices-form.tsx} | 63 +- .../price-list-products-form.tsx} | 13 +- .../price-list-create-form}/schema.ts | 15 +- .../price-lists/price-list-create/index.ts | 1 + .../price-list-create/price-list-create.tsx | 15 + .../price-list-configuration-section/index.ts | 1 + .../price-list-configuration-section.tsx | 96 +++ .../price-list-general-section/index.ts | 1 + .../price-list-general-section.tsx} | 46 +- .../price-list-product-section/index.ts | 1 + .../price-list-product-section.tsx} | 81 ++- .../price-lists/price-list-detail/index.ts | 2 + .../price-list-detail}/loader.ts | 4 +- .../price-list-detail/price-list-detail.tsx} | 18 +- .../edit-price-list-form.tsx | 123 ++-- .../components/price-list-edit-form}/index.ts | 0 .../price-lists/price-list-edit/index.ts | 1 + .../price-list-edit/price-list-edit.tsx} | 10 +- .../components/price-list-list-table/index.ts | 1 + .../price-list-list-table-actions.tsx | 42 ++ .../price-list-list-table.tsx} | 11 +- .../use-pricing-table-columns.tsx | 17 +- .../use-pricing-table-filters.tsx | 7 + .../use-pricing-table-query.tsx | 8 +- .../price-lists/price-list-list/index.ts | 1 + .../price-list-list/price-list-list.tsx} | 6 +- .../price-list-prices-add-form/index.ts | 1 + .../price-list-prices-add-form.tsx | 296 ++++++++++ .../price-list-prices-add-prices-form.tsx | 87 +++ ...price-list-prices-add-product-ids-form.tsx | 220 +++++++ .../price-list-prices-add-form/schema.ts | 27 + .../price-list-prices-add/index.ts | 1 + .../price-list-prices-add.tsx | 30 + .../price-list-prices-edit-form/index.ts | 1 + .../price-list-prices-edit-form.tsx | 299 ++++++++++ .../price-list-prices-edit/index.ts | 1 + .../price-list-prices-edit.tsx} | 20 +- .../hooks/use-price-list-grid-columns.tsx | 77 --- .../src/routes/pricing/common/schemas.ts | 31 - .../src/routes/pricing/common/utils.ts | 59 -- .../price-list-configuration-form.tsx | 197 ------- .../pricing/pricing-configuration/index.ts | 1 - .../pricing-configuration.tsx | 28 - .../components/pricing-create-form/index.ts | 1 - .../pricing-details-form.tsx | 553 ------------------ .../routes/pricing/pricing-create/index.ts | 1 - .../pricing/pricing-create/pricing-create.tsx | 10 - .../pricing-configuration-section/index.ts | 1 - .../pricing-configuration-section.tsx | 90 --- .../pricing-general-section/index.ts | 1 - .../pricing-product-section/index.ts | 1 - .../routes/pricing/pricing-detail/index.ts | 2 - .../src/routes/pricing/pricing-edit/index.ts | 1 - .../components/pricing-list-table/index.ts | 1 - .../pricing-table-actions.tsx | 61 -- .../use-pricing-table-filters.tsx | 18 - .../src/routes/pricing/pricing-list/index.ts | 1 - .../pricing-products-prices-form/index.ts | 1 - .../pricing-products-prices-form.tsx | 378 ------------ .../pricing/pricing-products-prices/index.ts | 1 - .../routes/pricing/pricing-products/index.ts | 1 - .../pricing-products/pricing-products.tsx | 5 - .../create-product-type-form.tsx | 2 +- .../product-type-create.tsx | 2 +- .../edit-product-type-form.tsx | 2 +- .../product-type-edit/product-type-edit.tsx | 2 +- .../product-edit-variant-form.tsx | 4 +- .../product-variant-edit.tsx | 4 +- .../manage-variant-inventory-items-form.tsx | 20 +- ...product-variant-manage-inventory-items.tsx | 4 +- .../product-attributes-form.tsx | 4 +- .../product-attributes/product-attributes.tsx | 4 +- .../create-product-option-form.tsx | 4 +- .../product-create-option.tsx | 4 +- .../create-product-variant-form.tsx | 4 +- .../product-create-variant.tsx | 2 +- .../product-create-form.tsx | 12 +- .../product-create/product-create.tsx | 6 +- .../edit-product-option-form.tsx | 4 +- .../product-edit-option.tsx | 4 +- .../edit-product-form/edit-product-form.tsx | 4 +- .../products/product-edit/product-edit.tsx | 4 +- .../edit-product-media-form.tsx | 8 +- .../product-media-gallery.tsx | 4 +- .../products/product-media/product-media.tsx | 4 +- .../product-organization-form.tsx | 2 +- .../product-organization.tsx | 2 +- .../products/product-prices/pricing-edit.tsx | 9 +- .../product-prices/product-prices.tsx | 2 +- .../edit-sales-channels-form.tsx | 8 +- .../product-sales-channels.tsx | 4 +- .../edit-profile-form/edit-profile-form.tsx | 2 +- .../profile/profile-edit/profile-edit.tsx | 2 +- .../edit-rules-form/edit-rules-form.tsx | 2 +- .../edit-rules-wrapper/edit-rules-wrapper.tsx | 2 +- .../common/edit-rules/edit-rules.tsx | 2 +- .../add-campaign-promotion-form.tsx | 2 +- .../promotion-add-campaign.tsx | 2 +- .../create-promotion-form.tsx | 2 +- .../promotion-create/promotion-create.tsx | 2 +- .../edit-promotion-details-form.tsx | 2 +- .../promotion-edit-details.tsx | 2 +- .../add-countries-form/add-countries-form.tsx | 6 +- .../region-add-countries.tsx | 4 +- .../create-region-form/create-region-form.tsx | 2 +- .../regions/region-create/region-create.tsx | 6 +- .../edit-region-form/edit-region-form.tsx | 2 +- .../regions/region-edit/region-edit.tsx | 8 +- .../components/edit-reservation-form.tsx | 12 +- .../edit-reservation-modal.tsx | 10 +- .../create-reservation-form.tsx | 2 +- .../create-reservation-modal.tsx | 4 +- .../add-products-to-sales-channel-form.tsx | 7 +- .../sales-channel-add-products.tsx | 2 +- .../create-sales-channel-form.tsx | 2 +- .../sales-channel-create.tsx | 2 +- .../edit-sales-channel-form.tsx | 2 +- .../sales-channel-edit/sales-channel-edit.tsx | 2 +- .../create-shipping-profile-form.tsx | 2 +- .../shipping-profile-create.tsx | 3 +- .../add-currencies-form.tsx | 4 +- .../store-add-currencies.tsx | 2 +- .../store-currency-section.tsx | 13 +- .../store/store-detail/store-detail.tsx | 2 +- .../edit-store-form/edit-store-form.tsx | 4 +- .../routes/store/store-edit/store-edit.tsx | 2 +- .../tax-region-create-form.tsx | 6 +- .../tax-province-create.tsx | 2 +- .../tax-rate-create-form.tsx | 2 +- .../taxes/tax-rate-create/tax-rate-create.tsx | 2 +- .../tax-rate-edit-form/tax-rate-edit-form.tsx | 20 +- .../taxes/tax-rate-edit/tax-rate-edit.tsx | 2 +- .../tax-region-create/tax-region-create.tsx | 2 +- .../edit-user-form/edit-user-form.tsx | 2 +- .../src/routes/users/user-edit/user-edit.tsx | 2 +- .../invite-user-form/invite-user-form.tsx | 8 +- .../routes/users/user-invite/user-invite.tsx | 2 +- packages/core/js-sdk/src/admin/index.ts | 3 + packages/core/js-sdk/src/admin/price-list.ts | 89 +++ packages/core/js-sdk/src/admin/store.ts | 53 ++ packages/core/types/src/common/common.ts | 5 + .../types/src/http/currency/admin/entities.ts | 14 + .../types/src/http/currency/admin/index.ts | 1 + .../core/types/src/http/currency/index.ts | 1 + packages/core/types/src/http/index.ts | 3 + .../src/http/price-list/admin/entities.ts | 22 + .../types/src/http/price-list/admin/index.ts | 4 + .../src/http/price-list/admin/payloads.ts | 51 ++ .../src/http/price-list/admin/queries.ts | 16 + .../src/http/price-list/admin/responses.ts | 14 + .../core/types/src/http/price-list/index.ts | 1 + .../types/src/http/pricing/admin/entities.ts | 16 - .../types/src/http/pricing/admin/index.ts | 3 - .../types/src/http/pricing/admin/payloads.ts | 3 - .../types/src/http/pricing/admin/queries.ts | 3 - .../types/src/http/pricing/admin/responses.ts | 5 - .../types/src/http/store/admin/entities.ts | 24 + .../core/types/src/http/store/admin/index.ts | 4 + .../types/src/http/store/admin/payloads.ts | 13 + .../types/src/http/store/admin/queries.ts | 12 + .../types/src/http/store/admin/responses.ts | 11 + packages/core/types/src/http/store/index.ts | 1 + .../ui/src/components/button/button.tsx | 2 +- .../components/date-picker/date-picker.tsx | 8 +- .../ui/src/components/drawer/drawer.tsx | 26 +- .../components/focus-modal/focus-modal.tsx | 53 +- .../progress-tabs/progress-tabs.tsx | 2 +- .../src/api/admin/price-lists/validators.ts | 4 +- yarn.lock | 379 +++++++++++- 295 files changed, 4488 insertions(+), 2350 deletions(-) create mode 100644 packages/admin-next/dashboard/src/components/common/condition-block/condition-block.tsx create mode 100644 packages/admin-next/dashboard/src/components/common/date-range-display/date-range-display.tsx create mode 100644 packages/admin-next/dashboard/src/components/common/date-range-display/index.ts create mode 100644 packages/admin-next/dashboard/src/components/modals/index.ts rename packages/admin-next/dashboard/src/components/{route-modal => modals}/route-drawer/index.ts (100%) rename packages/admin-next/dashboard/src/components/{route-modal => modals}/route-drawer/route-drawer.tsx (62%) rename packages/admin-next/dashboard/src/components/{route-modal => modals}/route-focus-modal/index.ts (100%) rename packages/admin-next/dashboard/src/components/{route-modal => modals}/route-focus-modal/route-focus-modal.tsx (61%) create mode 100644 packages/admin-next/dashboard/src/components/modals/route-modal-form/index.ts rename packages/admin-next/dashboard/src/components/{route-modal/route-form/route-form.tsx => modals/route-modal-form/route-modal-form.tsx} (90%) create mode 100644 packages/admin-next/dashboard/src/components/modals/route-modal-provider/index.ts create mode 100644 packages/admin-next/dashboard/src/components/modals/route-modal-provider/route-modal-context.tsx rename packages/admin-next/dashboard/src/components/{route-modal => modals}/route-modal-provider/route-provider.tsx (53%) create mode 100644 packages/admin-next/dashboard/src/components/modals/route-modal-provider/use-route-modal.tsx create mode 100644 packages/admin-next/dashboard/src/components/modals/stacked-drawer/index.ts create mode 100644 packages/admin-next/dashboard/src/components/modals/stacked-drawer/stacked-drawer.tsx create mode 100644 packages/admin-next/dashboard/src/components/modals/stacked-focus-modal/index.ts create mode 100644 packages/admin-next/dashboard/src/components/modals/stacked-focus-modal/stacked-foucs-modal.tsx create mode 100644 packages/admin-next/dashboard/src/components/modals/stacked-modal-provider/index.ts create mode 100644 packages/admin-next/dashboard/src/components/modals/stacked-modal-provider/stacked-modal-context.tsx create mode 100644 packages/admin-next/dashboard/src/components/modals/stacked-modal-provider/stacked-modal-provider.tsx create mode 100644 packages/admin-next/dashboard/src/components/modals/stacked-modal-provider/use-stacked-modal.ts delete mode 100644 packages/admin-next/dashboard/src/components/route-modal/index.ts delete mode 100644 packages/admin-next/dashboard/src/components/route-modal/route-form/index.ts delete mode 100644 packages/admin-next/dashboard/src/components/route-modal/route-modal-provider/index.ts create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/common/components/price-list-customer-group-rule-form/index.ts create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/common/components/price-list-customer-group-rule-form/price-list-customer-group-rule-form.tsx rename packages/admin-next/dashboard/src/routes/{pricing => price-lists}/common/constants.ts (100%) create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/common/hooks/use-delete-price-list-action.tsx create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/common/hooks/use-price-list-currency-data.tsx create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/common/hooks/use-price-list-grid-columns.tsx create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/common/schemas.ts create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/common/utils.ts rename packages/admin-next/dashboard/src/routes/{pricing/pricing-configuration => price-lists/price-list-configuration}/components/price-list-configuration-form/index.ts (100%) create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-configuration/components/price-list-configuration-form/price-list-configuration-form.tsx create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-configuration/index.ts create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-configuration/price-list-configuration.tsx create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-create/components/price-list-create-form/index.ts rename packages/admin-next/dashboard/src/routes/{pricing/pricing-create/components/pricing-create-form/pricing-create-form.tsx => price-lists/price-list-create/components/price-list-create-form/price-list-create-form.tsx} (70%) create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-create/components/price-list-create-form/price-list-details-form.tsx rename packages/admin-next/dashboard/src/routes/{pricing/pricing-create/components/pricing-create-form/pricing-prices-form.tsx => price-lists/price-list-create/components/price-list-create-form/price-list-prices-form.tsx} (60%) rename packages/admin-next/dashboard/src/routes/{pricing/pricing-create/components/pricing-create-form/pricing-products-form.tsx => price-lists/price-list-create/components/price-list-create-form/price-list-products-form.tsx} (93%) rename packages/admin-next/dashboard/src/routes/{pricing/pricing-create/components/pricing-create-form => price-lists/price-list-create/components/price-list-create-form}/schema.ts (79%) create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-create/index.ts create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-create/price-list-create.tsx create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-detail/components/price-list-configuration-section/index.ts create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-detail/components/price-list-configuration-section/price-list-configuration-section.tsx create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-detail/components/price-list-general-section/index.ts rename packages/admin-next/dashboard/src/routes/{pricing/pricing-detail/components/pricing-general-section/pricing-general-section.tsx => price-lists/price-list-detail/components/price-list-general-section/price-list-general-section.tsx} (67%) create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-detail/components/price-list-product-section/index.ts rename packages/admin-next/dashboard/src/routes/{pricing/pricing-detail/components/pricing-product-section/pricing-product-section.tsx => price-lists/price-list-detail/components/price-list-product-section/price-list-product-section.tsx} (76%) create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-detail/index.ts rename packages/admin-next/dashboard/src/routes/{pricing/pricing-detail => price-lists/price-list-detail}/loader.ts (85%) rename packages/admin-next/dashboard/src/routes/{pricing/pricing-detail/pricing-detail.tsx => price-lists/price-list-detail/price-list-detail.tsx} (76%) rename packages/admin-next/dashboard/src/routes/{pricing/pricing-edit/components/edit-price-list-form => price-lists/price-list-edit/components/price-list-edit-form}/edit-price-list-form.tsx (57%) rename packages/admin-next/dashboard/src/routes/{pricing/pricing-edit/components/edit-price-list-form => price-lists/price-list-edit/components/price-list-edit-form}/index.ts (100%) create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-edit/index.ts rename packages/admin-next/dashboard/src/routes/{pricing/pricing-edit/pricing-edit.tsx => price-lists/price-list-edit/price-list-edit.tsx} (65%) create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-list/components/price-list-list-table/index.ts create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-list/components/price-list-list-table/price-list-list-table-actions.tsx rename packages/admin-next/dashboard/src/routes/{pricing/pricing-list/components/pricing-list-table/pricing-list-table.tsx => price-lists/price-list-list/components/price-list-list-table/price-list-list-table.tsx} (86%) rename packages/admin-next/dashboard/src/routes/{pricing/pricing-list/components/pricing-list-table => price-lists/price-list-list/components/price-list-list-table}/use-pricing-table-columns.tsx (68%) create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-list/components/price-list-list-table/use-pricing-table-filters.tsx rename packages/admin-next/dashboard/src/routes/{pricing/pricing-list/components/pricing-list-table => price-lists/price-list-list/components/price-list-list-table}/use-pricing-table-query.tsx (54%) create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-list/index.ts rename packages/admin-next/dashboard/src/routes/{pricing/pricing-list/pricing-list.tsx => price-lists/price-list-list/price-list-list.tsx} (80%) create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-prices-add/components/price-list-prices-add-form/index.ts create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-prices-add/components/price-list-prices-add-form/price-list-prices-add-form.tsx create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-prices-add/components/price-list-prices-add-form/price-list-prices-add-prices-form.tsx create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-prices-add/components/price-list-prices-add-form/price-list-prices-add-product-ids-form.tsx create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-prices-add/components/price-list-prices-add-form/schema.ts create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-prices-add/index.ts create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-prices-add/price-list-prices-add.tsx create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-prices-edit/components/price-list-prices-edit-form/index.ts create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-prices-edit/components/price-list-prices-edit-form/price-list-prices-edit-form.tsx create mode 100644 packages/admin-next/dashboard/src/routes/price-lists/price-list-prices-edit/index.ts rename packages/admin-next/dashboard/src/routes/{pricing/pricing-products-prices/pricing-products-prices.tsx => price-lists/price-list-prices-edit/price-list-prices-edit.tsx} (58%) delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/common/hooks/use-price-list-grid-columns.tsx delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/common/schemas.ts delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/common/utils.ts delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-configuration/components/price-list-configuration-form/price-list-configuration-form.tsx delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-configuration/index.ts delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-configuration/pricing-configuration.tsx delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-create/components/pricing-create-form/index.ts delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-create/components/pricing-create-form/pricing-details-form.tsx delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-create/index.ts delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-create/pricing-create.tsx delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-detail/components/pricing-configuration-section/index.ts delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-detail/components/pricing-configuration-section/pricing-configuration-section.tsx delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-detail/components/pricing-general-section/index.ts delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-detail/components/pricing-product-section/index.ts delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-detail/index.ts delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-edit/index.ts delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-list/components/pricing-list-table/index.ts delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-list/components/pricing-list-table/pricing-table-actions.tsx delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-list/components/pricing-list-table/use-pricing-table-filters.tsx delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-list/index.ts delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-products-prices/components/pricing-products-prices-form/index.ts delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-products-prices/components/pricing-products-prices-form/pricing-products-prices-form.tsx delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-products-prices/index.ts delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-products/index.ts delete mode 100644 packages/admin-next/dashboard/src/routes/pricing/pricing-products/pricing-products.tsx create mode 100644 packages/core/js-sdk/src/admin/store.ts create mode 100644 packages/core/types/src/http/currency/admin/entities.ts create mode 100644 packages/core/types/src/http/currency/admin/index.ts create mode 100644 packages/core/types/src/http/currency/index.ts create mode 100644 packages/core/types/src/http/price-list/admin/entities.ts create mode 100644 packages/core/types/src/http/price-list/admin/index.ts create mode 100644 packages/core/types/src/http/price-list/admin/payloads.ts create mode 100644 packages/core/types/src/http/price-list/admin/queries.ts create mode 100644 packages/core/types/src/http/price-list/admin/responses.ts create mode 100644 packages/core/types/src/http/price-list/index.ts delete mode 100644 packages/core/types/src/http/pricing/admin/payloads.ts delete mode 100644 packages/core/types/src/http/pricing/admin/queries.ts delete mode 100644 packages/core/types/src/http/pricing/admin/responses.ts create mode 100644 packages/core/types/src/http/store/admin/entities.ts create mode 100644 packages/core/types/src/http/store/admin/index.ts create mode 100644 packages/core/types/src/http/store/admin/payloads.ts create mode 100644 packages/core/types/src/http/store/admin/queries.ts create mode 100644 packages/core/types/src/http/store/admin/responses.ts create mode 100644 packages/core/types/src/http/store/index.ts diff --git a/packages/admin-next/dashboard/src/components/common/condition-block/condition-block.tsx b/packages/admin-next/dashboard/src/components/common/condition-block/condition-block.tsx new file mode 100644 index 0000000000..fa9a230b94 --- /dev/null +++ b/packages/admin-next/dashboard/src/components/common/condition-block/condition-block.tsx @@ -0,0 +1,59 @@ +import { PropsWithChildren, createContext } from "react" + +type ConditionOperator = + | "eq" + | "ne" + | "gt" + | "lt" + | "gte" + | "lte" + | "in" + | "nin" + +type ConditionBlockValue = { + attribute: string + operator: ConditionOperator + value: TValue +} + +type ConditionBlockState = { + defaultValue?: ConditionBlockValue + value?: ConditionBlockValue + onChange: (value: ConditionBlockValue) => void +} + +const ConditionBlockContext = createContext | null>( + null +) + +const useConditionBlock = () => { + const context = ConditionBlockContext + + if (!context) { + throw new Error("useConditionBlock must be used within a ConditionBlock") + } + + return context +} + +type ConditionBlockProps = PropsWithChildren< + ConditionBlockState +> + +const Root = ({ children, ...props }: ConditionBlockProps) => { + return ( + + {children} + + ) +} + +const Divider = () => {} + +const Operator = () => {} + +const Item = () => {} + +export const ConditionBlock = Object.assign(Root, { + Divider, +}) diff --git a/packages/admin-next/dashboard/src/components/common/date-range-display/date-range-display.tsx b/packages/admin-next/dashboard/src/components/common/date-range-display/date-range-display.tsx new file mode 100644 index 0000000000..8243e41b54 --- /dev/null +++ b/packages/admin-next/dashboard/src/components/common/date-range-display/date-range-display.tsx @@ -0,0 +1,73 @@ +import { Text, clx } from "@medusajs/ui" +import { useTranslation } from "react-i18next" +import { useDate } from "../../../hooks/use-date" + +type DateRangeDisplayProps = { + startsAt?: Date | string | null + endsAt?: Date | string | null + showTime?: boolean +} + +export const DateRangeDisplay = ({ + startsAt, + endsAt, + showTime = false, +}: DateRangeDisplayProps) => { + const startDate = startsAt ? new Date(startsAt) : null + const endDate = endsAt ? new Date(endsAt) : null + + const { t } = useTranslation() + const { getFullDate } = useDate() + + return ( +
+
+ +
+ + {t("fields.startDate")} + + + {startDate + ? getFullDate({ + date: startDate, + includeTime: showTime, + }) + : "-"} + +
+
+ +
+ +
+ + {t("fields.endDate")} + + + {endDate + ? getFullDate({ + date: endDate, + includeTime: showTime, + }) + : "-"} + +
+
+
+ ) +} + +const Bar = ({ date }: { date: Date | null }) => { + const now = new Date() + + const isDateInFuture = date && date > now + + return ( +
+ ) +} diff --git a/packages/admin-next/dashboard/src/components/common/date-range-display/index.ts b/packages/admin-next/dashboard/src/components/common/date-range-display/index.ts new file mode 100644 index 0000000000..f703c45152 --- /dev/null +++ b/packages/admin-next/dashboard/src/components/common/date-range-display/index.ts @@ -0,0 +1 @@ +export * from "./date-range-display" diff --git a/packages/admin-next/dashboard/src/components/data-grid/data-grid-root/data-grid-root.tsx b/packages/admin-next/dashboard/src/components/data-grid/data-grid-root/data-grid-root.tsx index c89b600add..e2767bbd52 100644 --- a/packages/admin-next/dashboard/src/components/data-grid/data-grid-root/data-grid-root.tsx +++ b/packages/admin-next/dashboard/src/components/data-grid/data-grid-root/data-grid-root.tsx @@ -7,11 +7,11 @@ import { useState, } from "react" +import { Adjustments } from "@medusajs/icons" import { Button, DropdownMenu, clx } from "@medusajs/ui" import { CellContext, ColumnDef, - OnChangeFn, Row, VisibilityState, flexRender, @@ -41,7 +41,7 @@ interface DataGridRootProps< data?: TData[] columns: ColumnDef[] state: UseFormReturn - getSubRows?: (row: TData) => TData[] + getSubRows?: (row: TData) => TData[] | undefined } const ARROW_KEYS = ["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"] @@ -93,13 +93,6 @@ export const DataGridRoot = < const [columnVisibility, setColumnVisibility] = useState({}) - const onColumnVisibilityChange: OnChangeFn = useCallback( - (next) => { - const update = typeof next === "function" ? next(columnVisibility) : next - }, - [columnVisibility] - ) - const grid = useReactTable({ data: data, columns, @@ -663,7 +656,8 @@ export const DataGridRoot = < @@ -799,6 +793,7 @@ export const DataGridRoot = < {flexRender(cell.column.columnDef.cell, { ...cell.getContext(), columnIndex, + rowIndex: virtualRow.index, } as CellContext)} {isAnchor && (
({ field, context, }: UseDataGridCellProps) => { - const { row, columnIndex } = context as DataGridCellContext + const { rowIndex, columnIndex } = context as DataGridCellContext< + TData, + TValue + > const coords: CellCoords = useMemo( - () => ({ row: row.index, col: columnIndex }), - [row, columnIndex] + () => ({ row: rowIndex, col: columnIndex }), + [rowIndex, columnIndex] ) const id = generateCellId(coords) diff --git a/packages/admin-next/dashboard/src/components/data-grid/types.ts b/packages/admin-next/dashboard/src/components/data-grid/types.ts index eaccfee1be..7e73e24535 100644 --- a/packages/admin-next/dashboard/src/components/data-grid/types.ts +++ b/packages/admin-next/dashboard/src/components/data-grid/types.ts @@ -22,6 +22,10 @@ export interface DataGridCellContext * The index of the column in the grid. */ columnIndex: number + /** + * The index of the row in the grid. + */ + rowIndex: number } export interface DataGridCellContainerProps { diff --git a/packages/admin-next/dashboard/src/components/layout/main-layout/main-layout.tsx b/packages/admin-next/dashboard/src/components/layout/main-layout/main-layout.tsx index ece52d3190..ae4c3602a6 100644 --- a/packages/admin-next/dashboard/src/components/layout/main-layout/main-layout.tsx +++ b/packages/admin-next/dashboard/src/components/layout/main-layout/main-layout.tsx @@ -150,8 +150,8 @@ const useCoreRoutes = (): Omit[] => { }, { icon: , - label: t("pricing.domain"), - to: "/pricing", + label: t("priceLists.domain"), + to: "/price-lists", }, ] } diff --git a/packages/admin-next/dashboard/src/components/modals/index.ts b/packages/admin-next/dashboard/src/components/modals/index.ts new file mode 100644 index 0000000000..566853b6d5 --- /dev/null +++ b/packages/admin-next/dashboard/src/components/modals/index.ts @@ -0,0 +1,7 @@ +export { RouteDrawer } from "./route-drawer" +export { RouteFocusModal } from "./route-focus-modal" +export { useRouteModal } from "./route-modal-provider" + +export { StackedDrawer } from "./stacked-drawer" +export { StackedFocusModal } from "./stacked-focus-modal" +export { useStackedModal } from "./stacked-modal-provider" diff --git a/packages/admin-next/dashboard/src/components/route-modal/route-drawer/index.ts b/packages/admin-next/dashboard/src/components/modals/route-drawer/index.ts similarity index 100% rename from packages/admin-next/dashboard/src/components/route-modal/route-drawer/index.ts rename to packages/admin-next/dashboard/src/components/modals/route-drawer/index.ts diff --git a/packages/admin-next/dashboard/src/components/route-modal/route-drawer/route-drawer.tsx b/packages/admin-next/dashboard/src/components/modals/route-drawer/route-drawer.tsx similarity index 62% rename from packages/admin-next/dashboard/src/components/route-modal/route-drawer/route-drawer.tsx rename to packages/admin-next/dashboard/src/components/modals/route-drawer/route-drawer.tsx index cad73d9589..cf88f6d5b7 100644 --- a/packages/admin-next/dashboard/src/components/route-modal/route-drawer/route-drawer.tsx +++ b/packages/admin-next/dashboard/src/components/modals/route-drawer/route-drawer.tsx @@ -1,8 +1,9 @@ -import { Drawer } from "@medusajs/ui" +import { Drawer, clx } from "@medusajs/ui" import { PropsWithChildren, useEffect, useState } from "react" import { useNavigate } from "react-router-dom" -import { RouteForm } from "../route-form" +import { RouteModalForm } from "../route-modal-form" import { RouteModalProvider } from "../route-modal-provider/route-provider" +import { StackedModalProvider } from "../stacked-modal-provider" type RouteDrawerProps = PropsWithChildren<{ prev?: string @@ -11,6 +12,7 @@ type RouteDrawerProps = PropsWithChildren<{ const Root = ({ prev = "..", children }: RouteDrawerProps) => { const navigate = useNavigate() const [open, setOpen] = useState(false) + const [stackedModalOpen, onStackedModalOpen] = useState(false) /** * Open the modal when the component mounts. This @@ -18,6 +20,11 @@ const Root = ({ prev = "..", children }: RouteDrawerProps) => { */ useEffect(() => { setOpen(true) + + return () => { + setOpen(false) + onStackedModalOpen(false) + } }, []) const handleOpenChange = (open: boolean) => { @@ -33,17 +40,27 @@ const Root = ({ prev = "..", children }: RouteDrawerProps) => { return ( - {children} + + + {children} + + ) } const Header = Drawer.Header +const Title = Drawer.Title +const Description = Drawer.Description const Body = Drawer.Body const Footer = Drawer.Footer const Close = Drawer.Close -const Form = RouteForm +const Form = RouteModalForm /** * Drawer that is used to render a form on a separate route. @@ -52,7 +69,9 @@ const Form = RouteForm */ export const RouteDrawer = Object.assign(Root, { Header, + Title, Body, + Description, Footer, Close, Form, diff --git a/packages/admin-next/dashboard/src/components/route-modal/route-focus-modal/index.ts b/packages/admin-next/dashboard/src/components/modals/route-focus-modal/index.ts similarity index 100% rename from packages/admin-next/dashboard/src/components/route-modal/route-focus-modal/index.ts rename to packages/admin-next/dashboard/src/components/modals/route-focus-modal/index.ts diff --git a/packages/admin-next/dashboard/src/components/route-modal/route-focus-modal/route-focus-modal.tsx b/packages/admin-next/dashboard/src/components/modals/route-focus-modal/route-focus-modal.tsx similarity index 61% rename from packages/admin-next/dashboard/src/components/route-modal/route-focus-modal/route-focus-modal.tsx rename to packages/admin-next/dashboard/src/components/modals/route-focus-modal/route-focus-modal.tsx index 006dbdaa61..f8443ae139 100644 --- a/packages/admin-next/dashboard/src/components/route-modal/route-focus-modal/route-focus-modal.tsx +++ b/packages/admin-next/dashboard/src/components/modals/route-focus-modal/route-focus-modal.tsx @@ -1,8 +1,9 @@ -import { FocusModal } from "@medusajs/ui" +import { FocusModal, clx } from "@medusajs/ui" import { PropsWithChildren, useEffect, useState } from "react" import { useNavigate } from "react-router-dom" -import { RouteForm } from "../route-form" +import { RouteModalForm } from "../route-modal-form" import { RouteModalProvider } from "../route-modal-provider/route-provider" +import { StackedModalProvider } from "../stacked-modal-provider" type RouteFocusModalProps = PropsWithChildren<{ prev?: string @@ -11,6 +12,7 @@ type RouteFocusModalProps = PropsWithChildren<{ const Root = ({ prev = "..", children }: RouteFocusModalProps) => { const navigate = useNavigate() const [open, setOpen] = useState(false) + const [stackedModalOpen, onStackedModalOpen] = useState(false) /** * Open the modal when the component mounts. This @@ -18,6 +20,11 @@ const Root = ({ prev = "..", children }: RouteFocusModalProps) => { */ useEffect(() => { setOpen(true) + + return () => { + setOpen(false) + onStackedModalOpen(false) + } }, []) const handleOpenChange = (open: boolean) => { @@ -33,16 +40,27 @@ const Root = ({ prev = "..", children }: RouteFocusModalProps) => { return ( - {children} + + + {children} + + ) } const Header = FocusModal.Header +const Title = FocusModal.Title +const Description = FocusModal.Description +const Footer = FocusModal.Footer const Body = FocusModal.Body const Close = FocusModal.Close -const Form = RouteForm +const Form = RouteModalForm /** * FocusModal that is used to render a form on a separate route. @@ -52,7 +70,10 @@ const Form = RouteForm */ export const RouteFocusModal = Object.assign(Root, { Header, + Title, Body, + Description, + Footer, Close, Form, }) diff --git a/packages/admin-next/dashboard/src/components/modals/route-modal-form/index.ts b/packages/admin-next/dashboard/src/components/modals/route-modal-form/index.ts new file mode 100644 index 0000000000..0e1450edaf --- /dev/null +++ b/packages/admin-next/dashboard/src/components/modals/route-modal-form/index.ts @@ -0,0 +1 @@ +export * from "./route-modal-form" diff --git a/packages/admin-next/dashboard/src/components/route-modal/route-form/route-form.tsx b/packages/admin-next/dashboard/src/components/modals/route-modal-form/route-modal-form.tsx similarity index 90% rename from packages/admin-next/dashboard/src/components/route-modal/route-form/route-form.tsx rename to packages/admin-next/dashboard/src/components/modals/route-modal-form/route-modal-form.tsx index d008ae115c..8fbc01fa46 100644 --- a/packages/admin-next/dashboard/src/components/route-modal/route-form/route-form.tsx +++ b/packages/admin-next/dashboard/src/components/modals/route-modal-form/route-modal-form.tsx @@ -5,16 +5,16 @@ import { useTranslation } from "react-i18next" import { useBlocker } from "react-router-dom" import { Form } from "../../common/form" -type RouteFormProps = PropsWithChildren<{ +type RouteModalFormProps = PropsWithChildren<{ form: UseFormReturn blockSearch?: boolean }> -export const RouteForm = ({ +export const RouteModalForm = ({ form, blockSearch = false, children, -}: RouteFormProps) => { +}: RouteModalFormProps) => { const { t } = useTranslation() const { diff --git a/packages/admin-next/dashboard/src/components/modals/route-modal-provider/index.ts b/packages/admin-next/dashboard/src/components/modals/route-modal-provider/index.ts new file mode 100644 index 0000000000..f819a0196d --- /dev/null +++ b/packages/admin-next/dashboard/src/components/modals/route-modal-provider/index.ts @@ -0,0 +1,2 @@ +export * from "./route-provider" +export * from "./use-route-modal" diff --git a/packages/admin-next/dashboard/src/components/modals/route-modal-provider/route-modal-context.tsx b/packages/admin-next/dashboard/src/components/modals/route-modal-provider/route-modal-context.tsx new file mode 100644 index 0000000000..1f4fe25f0a --- /dev/null +++ b/packages/admin-next/dashboard/src/components/modals/route-modal-provider/route-modal-context.tsx @@ -0,0 +1,8 @@ +import { createContext } from "react" + +type RouteModalProviderState = { + handleSuccess: (path?: string) => void +} + +export const RouteModalProviderContext = + createContext(null) diff --git a/packages/admin-next/dashboard/src/components/route-modal/route-modal-provider/route-provider.tsx b/packages/admin-next/dashboard/src/components/modals/route-modal-provider/route-provider.tsx similarity index 53% rename from packages/admin-next/dashboard/src/components/route-modal/route-modal-provider/route-provider.tsx rename to packages/admin-next/dashboard/src/components/modals/route-modal-provider/route-provider.tsx index 84d8664944..b1b353431f 100644 --- a/packages/admin-next/dashboard/src/components/route-modal/route-modal-provider/route-provider.tsx +++ b/packages/admin-next/dashboard/src/components/modals/route-modal-provider/route-provider.tsx @@ -1,22 +1,6 @@ -import { PropsWithChildren, createContext, useContext } from "react" +import { PropsWithChildren } from "react" import { useNavigate } from "react-router-dom" - -type RouteModalProviderContextType = { - handleSuccess: (path?: string) => void -} - -const RouteModalProviderContext = - createContext(null) - -export const useRouteModal = () => { - const context = useContext(RouteModalProviderContext) - - if (!context) { - throw new Error("useRouteModal must be used within a RouteModalProvider") - } - - return context -} +import { RouteModalProviderContext } from "./route-modal-context" type RouteModalProviderProps = PropsWithChildren<{ prev: string diff --git a/packages/admin-next/dashboard/src/components/modals/route-modal-provider/use-route-modal.tsx b/packages/admin-next/dashboard/src/components/modals/route-modal-provider/use-route-modal.tsx new file mode 100644 index 0000000000..04dad573aa --- /dev/null +++ b/packages/admin-next/dashboard/src/components/modals/route-modal-provider/use-route-modal.tsx @@ -0,0 +1,12 @@ +import { useContext } from "react" +import { RouteModalProviderContext } from "./route-modal-context" + +export const useRouteModal = () => { + const context = useContext(RouteModalProviderContext) + + if (!context) { + throw new Error("useRouteModal must be used within a RouteModalProvider") + } + + return context +} diff --git a/packages/admin-next/dashboard/src/components/modals/stacked-drawer/index.ts b/packages/admin-next/dashboard/src/components/modals/stacked-drawer/index.ts new file mode 100644 index 0000000000..2467d18d3b --- /dev/null +++ b/packages/admin-next/dashboard/src/components/modals/stacked-drawer/index.ts @@ -0,0 +1 @@ +export * from "./stacked-drawer" diff --git a/packages/admin-next/dashboard/src/components/modals/stacked-drawer/stacked-drawer.tsx b/packages/admin-next/dashboard/src/components/modals/stacked-drawer/stacked-drawer.tsx new file mode 100644 index 0000000000..9c3c2091fd --- /dev/null +++ b/packages/admin-next/dashboard/src/components/modals/stacked-drawer/stacked-drawer.tsx @@ -0,0 +1,85 @@ +import { Drawer, clx } from "@medusajs/ui" +import { + ComponentPropsWithoutRef, + PropsWithChildren, + forwardRef, + useEffect, +} from "react" +import { useStackedModal } from "../stacked-modal-provider" + +type StackedDrawerProps = PropsWithChildren<{ + /** + * A unique identifier for the modal. This is used to differentiate stacked modals, + * when multiple stacked modals are registered to the same parent modal. + */ + id: string +}> + +/** + * A stacked modal that can be rendered above a parent modal. + */ +export const Root = ({ id, children }: StackedDrawerProps) => { + const { register, unregister, getIsOpen, setIsOpen } = useStackedModal() + + useEffect(() => { + register(id) + + return () => unregister(id) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) + + return ( + setIsOpen(id, open)}> + {children} + + ) +} + +const Close = Drawer.Close +Close.displayName = "StackedDrawer.Close" + +const Header = Drawer.Header +Header.displayName = "StackedDrawer.Header" + +const Body = Drawer.Body +Body.displayName = "StackedDrawer.Body" + +const Trigger = Drawer.Trigger +Trigger.displayName = "StackedDrawer.Trigger" + +const Footer = Drawer.Footer +Footer.displayName = "StackedDrawer.Footer" + +const Title = Drawer.Title +Title.displayName = "StackedDrawer.Title" + +const Description = Drawer.Description +Description.displayName = "StackedDrawer.Description" + +const Content = forwardRef< + HTMLDivElement, + ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + return ( + + ) +}) +Content.displayName = "StackedDrawer.Content" + +export const StackedDrawer = Object.assign(Root, { + Close, + Header, + Body, + Content, + Trigger, + Footer, + Description, + Title, +}) diff --git a/packages/admin-next/dashboard/src/components/modals/stacked-focus-modal/index.ts b/packages/admin-next/dashboard/src/components/modals/stacked-focus-modal/index.ts new file mode 100644 index 0000000000..e130e6356a --- /dev/null +++ b/packages/admin-next/dashboard/src/components/modals/stacked-focus-modal/index.ts @@ -0,0 +1 @@ +export * from "./stacked-foucs-modal" diff --git a/packages/admin-next/dashboard/src/components/modals/stacked-focus-modal/stacked-foucs-modal.tsx b/packages/admin-next/dashboard/src/components/modals/stacked-focus-modal/stacked-foucs-modal.tsx new file mode 100644 index 0000000000..9ab5f35190 --- /dev/null +++ b/packages/admin-next/dashboard/src/components/modals/stacked-focus-modal/stacked-foucs-modal.tsx @@ -0,0 +1,88 @@ +import { FocusModal, clx } from "@medusajs/ui" +import { + ComponentPropsWithoutRef, + PropsWithChildren, + forwardRef, + useEffect, +} from "react" +import { useStackedModal } from "../stacked-modal-provider" + +type StackedFocusModalProps = PropsWithChildren<{ + /** + * A unique identifier for the modal. This is used to differentiate stacked modals, + * when multiple stacked modals are registered to the same parent modal. + */ + id: string +}> + +/** + * A stacked modal that can be rendered above a parent modal. + */ +export const Root = ({ id, children }: StackedFocusModalProps) => { + const { register, unregister, getIsOpen, setIsOpen } = useStackedModal() + + useEffect(() => { + register(id) + + return () => unregister(id) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) + + return ( + setIsOpen(id, open)} + > + {children} + + ) +} + +const Close = FocusModal.Close +Close.displayName = "StackedFocusModal.Close" + +const Header = FocusModal.Header +Header.displayName = "StackedFocusModal.Header" + +const Body = FocusModal.Body +Body.displayName = "StackedFocusModal.Body" + +const Trigger = FocusModal.Trigger +Trigger.displayName = "StackedFocusModal.Trigger" + +const Footer = FocusModal.Footer +Footer.displayName = "StackedFocusModal.Footer" + +const Title = FocusModal.Title +Title.displayName = "StackedFocusModal.Title" + +const Description = FocusModal.Description +Description.displayName = "StackedFocusModal.Description" + +const Content = forwardRef< + HTMLDivElement, + ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + return ( + + ) +}) +Content.displayName = "StackedFocusModal.Content" + +export const StackedFocusModal = Object.assign(Root, { + Close, + Header, + Body, + Content, + Trigger, + Footer, + Description, + Title, +}) diff --git a/packages/admin-next/dashboard/src/components/modals/stacked-modal-provider/index.ts b/packages/admin-next/dashboard/src/components/modals/stacked-modal-provider/index.ts new file mode 100644 index 0000000000..998c3fbab9 --- /dev/null +++ b/packages/admin-next/dashboard/src/components/modals/stacked-modal-provider/index.ts @@ -0,0 +1,2 @@ +export * from "./stacked-modal-provider" +export * from "./use-stacked-modal" diff --git a/packages/admin-next/dashboard/src/components/modals/stacked-modal-provider/stacked-modal-context.tsx b/packages/admin-next/dashboard/src/components/modals/stacked-modal-provider/stacked-modal-context.tsx new file mode 100644 index 0000000000..ebd50944d6 --- /dev/null +++ b/packages/admin-next/dashboard/src/components/modals/stacked-modal-provider/stacked-modal-context.tsx @@ -0,0 +1,10 @@ +import { createContext } from "react" + +type StackedModalState = { + getIsOpen: (id: string) => boolean + setIsOpen: (id: string, open: boolean) => void + register: (id: string) => void + unregister: (id: string) => void +} + +export const StackedModalContext = createContext(null) diff --git a/packages/admin-next/dashboard/src/components/modals/stacked-modal-provider/stacked-modal-provider.tsx b/packages/admin-next/dashboard/src/components/modals/stacked-modal-provider/stacked-modal-provider.tsx new file mode 100644 index 0000000000..ca3799cc4a --- /dev/null +++ b/packages/admin-next/dashboard/src/components/modals/stacked-modal-provider/stacked-modal-provider.tsx @@ -0,0 +1,54 @@ +import { PropsWithChildren, useState } from "react" +import { StackedModalContext } from "./stacked-modal-context" + +type StackedModalProviderProps = PropsWithChildren<{ + onOpenChange: (open: boolean) => void +}> + +export const StackedModalProvider = ({ + children, + onOpenChange, +}: StackedModalProviderProps) => { + const [state, setState] = useState>({}) + + const getIsOpen = (id: string) => { + return state[id] || false + } + + const setIsOpen = (id: string, open: boolean) => { + setState((prevState) => ({ + ...prevState, + [id]: open, + })) + + onOpenChange(open) + } + + const register = (id: string) => { + setState((prevState) => ({ + ...prevState, + [id]: false, + })) + } + + const unregister = (id: string) => { + setState((prevState) => { + const newState = { ...prevState } + delete newState[id] + return newState + }) + } + + return ( + + {children} + + ) +} diff --git a/packages/admin-next/dashboard/src/components/modals/stacked-modal-provider/use-stacked-modal.ts b/packages/admin-next/dashboard/src/components/modals/stacked-modal-provider/use-stacked-modal.ts new file mode 100644 index 0000000000..f246c0d065 --- /dev/null +++ b/packages/admin-next/dashboard/src/components/modals/stacked-modal-provider/use-stacked-modal.ts @@ -0,0 +1,14 @@ +import { useContext } from "react" +import { StackedModalContext } from "./stacked-modal-context" + +export const useStackedModal = () => { + const context = useContext(StackedModalContext) + + if (!context) { + throw new Error( + "useStackedModal must be used within a StackedModalProvider" + ) + } + + return context +} diff --git a/packages/admin-next/dashboard/src/components/route-modal/index.ts b/packages/admin-next/dashboard/src/components/route-modal/index.ts deleted file mode 100644 index 2122e387de..0000000000 --- a/packages/admin-next/dashboard/src/components/route-modal/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { RouteDrawer } from "./route-drawer" -export { RouteFocusModal } from "./route-focus-modal" -export { useRouteModal } from "./route-modal-provider" diff --git a/packages/admin-next/dashboard/src/components/route-modal/route-form/index.ts b/packages/admin-next/dashboard/src/components/route-modal/route-form/index.ts deleted file mode 100644 index 684d9b013c..0000000000 --- a/packages/admin-next/dashboard/src/components/route-modal/route-form/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./route-form" diff --git a/packages/admin-next/dashboard/src/components/route-modal/route-modal-provider/index.ts b/packages/admin-next/dashboard/src/components/route-modal/route-modal-provider/index.ts deleted file mode 100644 index 0caf0a36b0..0000000000 --- a/packages/admin-next/dashboard/src/components/route-modal/route-modal-provider/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./route-provider" diff --git a/packages/admin-next/dashboard/src/components/table/data-table/data-table-search/data-table-search.tsx b/packages/admin-next/dashboard/src/components/table/data-table/data-table-search/data-table-search.tsx index f1bdb01027..763aa1dadd 100644 --- a/packages/admin-next/dashboard/src/components/table/data-table/data-table-search/data-table-search.tsx +++ b/packages/admin-next/dashboard/src/components/table/data-table/data-table-search/data-table-search.tsx @@ -46,6 +46,7 @@ export const DataTableSearch = ({ return ( , options?: Omit< UseQueryOptions< - PaginatedResponse, + PaginatedResponse<{ customer_groups: HttpTypes.AdminCustomerGroup[] }>, Error, - PaginatedResponse, + PaginatedResponse<{ customer_groups: HttpTypes.AdminCustomerGroup[] }>, QueryKey >, "queryFn" | "queryKey" diff --git a/packages/admin-next/dashboard/src/hooks/api/price-lists.tsx b/packages/admin-next/dashboard/src/hooks/api/price-lists.tsx index afa00d6a37..a73aca7459 100644 --- a/packages/admin-next/dashboard/src/hooks/api/price-lists.tsx +++ b/packages/admin-next/dashboard/src/hooks/api/price-lists.tsx @@ -7,20 +7,10 @@ import { useMutation, useQuery, } from "@tanstack/react-query" -import { client, sdk } from "../../lib/client" +import { sdk } from "../../lib/client" import { queryClient } from "../../lib/query-client" import { queryKeysFactory } from "../../lib/query-key-factory" -import { - AddPriceListPricesReq, - CreatePriceListReq, - DeletePriceListPricesReq, - UpdatePriceListReq, -} from "../../types/api-payloads" -import { - PriceListDeleteRes, - PriceListListRes, - PriceListRes, -} from "../../types/api-responses" +import { customerGroupsQueryKeys } from "./customer-groups" import { productsQueryKeys } from "./products" const PRICE_LISTS_QUERY_KEY = "price-lists" as const @@ -28,14 +18,19 @@ export const priceListsQueryKeys = queryKeysFactory(PRICE_LISTS_QUERY_KEY) export const usePriceList = ( id: string, - query?: Record, + query?: HttpTypes.AdminPriceListListParams, options?: Omit< - UseQueryOptions, + UseQueryOptions< + HttpTypes.AdminPriceListResponse, + FetchError, + HttpTypes.AdminPriceListResponse, + QueryKey + >, "queryKey" | "queryFn" > ) => { const { data, ...rest } = useQuery({ - queryFn: () => client.priceLists.retrieve(id, query), + queryFn: () => sdk.admin.priceList.retrieve(id, query), queryKey: priceListsQueryKeys.detail(id), ...options, }) @@ -44,14 +39,19 @@ export const usePriceList = ( } export const usePriceLists = ( - query?: Record, + query?: HttpTypes.AdminPriceListListParams, options?: Omit< - UseQueryOptions, + UseQueryOptions< + HttpTypes.AdminPriceListListResponse, + FetchError, + HttpTypes.AdminPriceListListResponse, + QueryKey + >, "queryKey" | "queryFn" > ) => { const { data, ...rest } = useQuery({ - queryFn: () => client.priceLists.list(query), + queryFn: () => sdk.admin.priceList.list(query), queryKey: priceListsQueryKeys.list(query), ...options, }) @@ -60,13 +60,20 @@ export const usePriceLists = ( } export const useCreatePriceList = ( - options?: UseMutationOptions + query?: HttpTypes.AdminPriceListParams, + options?: UseMutationOptions< + HttpTypes.AdminPriceListResponse, + FetchError, + HttpTypes.AdminCreatePriceList + > ) => { return useMutation({ - mutationFn: (payload) => client.priceLists.create(payload), + mutationFn: (payload) => sdk.admin.priceList.create(payload, query), onSuccess: (data, variables, context) => { queryClient.invalidateQueries({ queryKey: priceListsQueryKeys.list() }) + queryClient.invalidateQueries({ queryKey: customerGroupsQueryKeys.all }) + options?.onSuccess?.(data, variables, context) }, ...options, @@ -75,16 +82,23 @@ export const useCreatePriceList = ( export const useUpdatePriceList = ( id: string, - options?: UseMutationOptions + query?: HttpTypes.AdminPriceListParams, + options?: UseMutationOptions< + HttpTypes.AdminPriceListResponse, + FetchError, + HttpTypes.AdminUpdatePriceList + > ) => { return useMutation({ - mutationFn: (payload) => client.priceLists.update(id, payload), + mutationFn: (payload) => sdk.admin.priceList.update(id, payload, query), onSuccess: (data, variables, context) => { queryClient.invalidateQueries({ queryKey: priceListsQueryKeys.list() }) queryClient.invalidateQueries({ queryKey: priceListsQueryKeys.detail(id), }) + queryClient.invalidateQueries({ queryKey: customerGroupsQueryKeys.all }) + options?.onSuccess?.(data, variables, context) }, ...options, @@ -93,10 +107,14 @@ export const useUpdatePriceList = ( export const useDeletePriceList = ( id: string, - options?: UseMutationOptions + options?: UseMutationOptions< + HttpTypes.AdminPriceListDeleteResponse, + FetchError, + void + > ) => { return useMutation({ - mutationFn: () => client.priceLists.delete(id), + mutationFn: () => sdk.admin.priceList.delete(id), onSuccess: (data, variables, context) => { queryClient.invalidateQueries({ queryKey: priceListsQueryKeys.list() }) @@ -106,17 +124,22 @@ export const useDeletePriceList = ( }) } -export const usePriceListAddPrices = ( +export const useBatchPriceListPrices = ( id: string, - options?: UseMutationOptions + query?: HttpTypes.AdminPriceListParams, + options?: UseMutationOptions< + HttpTypes.AdminPriceListResponse, + FetchError, + HttpTypes.AdminBatchPriceListPrice + > ) => { return useMutation({ - mutationFn: (payload) => client.priceLists.addPrices(id, payload), + mutationFn: (payload) => + sdk.admin.priceList.batchPrices(id, payload, query), onSuccess: (data, variables, context) => { queryClient.invalidateQueries({ queryKey: priceListsQueryKeys.detail(id), }) - queryClient.invalidateQueries({ queryKey: priceListsQueryKeys.lists() }) queryClient.invalidateQueries({ queryKey: productsQueryKeys.lists() }) options?.onSuccess?.(data, variables, context) @@ -125,24 +148,6 @@ export const usePriceListAddPrices = ( }) } -export const usePriceListRemovePrices = ( - id: string, - options?: UseMutationOptions -) => { - return useMutation({ - mutationFn: (payload) => client.priceLists.removePrices(id, payload), - onSuccess: (data, variables, context) => { - queryClient.invalidateQueries({ - queryKey: priceListsQueryKeys.detail(id), - }) - queryClient.invalidateQueries({ queryKey: priceListsQueryKeys.lists() }) - - options?.onSuccess?.(data, variables, context) - }, - ...options, - }) -} - export const usePriceListLinkProducts = ( id: string, options?: UseMutationOptions< diff --git a/packages/admin-next/dashboard/src/hooks/api/store.tsx b/packages/admin-next/dashboard/src/hooks/api/store.tsx index 2e251e02d3..7bd3465e67 100644 --- a/packages/admin-next/dashboard/src/hooks/api/store.tsx +++ b/packages/admin-next/dashboard/src/hooks/api/store.tsx @@ -6,23 +6,46 @@ import { useQuery, } from "@tanstack/react-query" -import { client } from "../../lib/client" +import { FetchError } from "@medusajs/js-sdk" +import { HttpTypes } from "@medusajs/types" +import { sdk } from "../../lib/client" import { queryClient } from "../../lib/query-client" import { queryKeysFactory } from "../../lib/query-key-factory" -import { UpdateStoreReq } from "../../types/api-payloads" -import { StoreRes } from "../../types/api-responses" const STORE_QUERY_KEY = "store" as const export const storeQueryKeys = queryKeysFactory(STORE_QUERY_KEY) +/** + * Workaround to keep the V1 version of retrieving the store. + */ +async function retrieveActiveStore( + query?: HttpTypes.AdminStoreParams +): Promise { + const response = await sdk.admin.store.list(query) + + const activeStore = response.stores?.[0] + + if (!activeStore) { + throw new FetchError("No active store found", "Not Found", 404) + } + + return { store: activeStore } +} + export const useStore = ( + query?: Record, options?: Omit< - UseQueryOptions, + UseQueryOptions< + HttpTypes.AdminStoreResponse, + FetchError, + HttpTypes.AdminStoreResponse, + QueryKey + >, "queryFn" | "queryKey" > ) => { const { data, ...rest } = useQuery({ - queryFn: () => client.stores.retrieve(), + queryFn: () => retrieveActiveStore(query), queryKey: storeQueryKeys.details(), ...options, }) @@ -35,10 +58,14 @@ export const useStore = ( export const useUpdateStore = ( id: string, - options?: MutationOptions + options?: MutationOptions< + HttpTypes.AdminStoreResponse, + FetchError, + HttpTypes.AdminUpdateStore + > ) => { return useMutation({ - mutationFn: (payload) => client.stores.update(id, payload), + mutationFn: (payload) => sdk.admin.store.update(id, payload), onSuccess: (data, variables, context) => { queryClient.invalidateQueries({ queryKey: storeQueryKeys.details() }) options?.onSuccess?.(data, variables, context) diff --git a/packages/admin-next/dashboard/src/i18n/translations/en.json b/packages/admin-next/dashboard/src/i18n/translations/en.json index 73267e10a5..6c94142044 100644 --- a/packages/admin-next/dashboard/src/i18n/translations/en.json +++ b/packages/admin-next/dashboard/src/i18n/translations/en.json @@ -86,8 +86,12 @@ "apply": "Apply", "add": "Add", "select": "Select", + "browse": "Browse", "logout": "Logout" }, + "operators": { + "in": "In" + }, "app": { "search": { "allAreas": "All areas", @@ -1295,61 +1299,96 @@ "deleteCampaignWarning": "You are about to delete the campaign {{name}}. This action cannot be undone.", "totalSpend": "<0>{{amount}} <1>{{currency}}" }, - "pricing": { - "domain": "Pricing", + "priceLists": { + "domain": "Price Lists", + "delete": { + "confirmation": "You are about to delete the price list {{title}}. This action cannot be undone.", + "successToast": "Price list {{title}} was successfully deleted." + }, "create": { "header": "Create Price List", - "hint": "Create a new price list to manage the prices of your products." + "subheader": "Create a new price list to manage the prices of your products.", + "tabs": { + "details": "Details", + "products": "Products", + "prices": "Prices" + }, + "successToast": "Price list {{title}} was successfully created." }, "edit": { - "header": "Edit Price List" + "header": "Edit Price List", + "successToast": "Price list {{title}} was successfully updated." }, "configuration": { "header": "Configuration", - "editHeader": "Edit Price List Configuration" - }, - "warnings": { - "delete": "You are about to delete the price list {{name}}. This action cannot be undone." - }, - "status": { - "draft": "Draft", - "expired": "Expired", - "active": "Active", - "scheduled": "Scheduled" - }, - "type": { - "sale": "Sale", - "override": "Override" + "edit": { + "header": "Edit Price List Configuration", + "description": "Edit the configuration of the price list.", + "successToast": "Price list configuration was successfully updated." + } }, "products": { - "deleteProductsPricesWarning": "You are about to delete all prices of {{count}} product(s). This action cannot be undone." - }, - "prices": { - "addPrices": "Add prices", - "editPrices": "Edit prices" - }, - "table": { - "pricesHeader": "Prices" + "header": "Products", + "actions": { + "addProducts": "Add products", + "editPrices": "Edit prices" + }, + "delete": { + "confirmation_one": "You are about to delete the prices for {{count}} product in the price list. This action cannot be undone.", + "confirmation_other": "You are about to delete the prices for {{count}} products in the price list. This action cannot be undone.", + "successToast_one": "Successfully deleted prices for {{count}} product.", + "successToast_other": "Successfully deleted prices for {{count}} products." + }, + "add": { + "successToast": "Prices were successfully added to the price list." + }, + "edit": { + "successToast": "Prices were successfully updated." + } }, "fields": { - "statusTooltip": "Status can also be expired or scheduled depending on the start and end date.", - "typeHint": "Choose the type of price you want to create.", - "statusHint": "Choose if price should be published to users", - "draftTypeHint": "Prices will not be visible to users in a draft state", - "activeTypeHint": "Prices are visibile to users in an active state", - "saleTypeHint": "Sale prices are temporary price changes for products.", - "overrideTypeHint": "Overrides are usually used to create customer-specific prices.", - "startDateLabel": "Price list has a start date?", - "startDateHint": "Schedule the price list to activate in the future.", - "endDateLabel": "Price list has an expiry date?", - "endDateHint": "Schedule the price list to deactivate in the future.", - "customerAvailabilityLabel": "Customer availability", - "customerAvailabilityHint": "Choose which customer groups the price list should be applied to.", - "customerAvailabilityNoSelectionLabel": "No customer groups selected", - "priceOverridesLabel": "Price overrides" - }, - "actions": { - "addCustomerGroups": "Add customer groups" + "priceOverrides": { + "label": "Price overrides", + "header": "Price Overrides" + }, + "status": { + "label": "Status", + "options": { + "active": "Active", + "draft": "Draft", + "expired": "Expired", + "scheduled": "Scheduled" + } + }, + "type": { + "label": "Type", + "hint": "Choose the type of price list you want to create.", + "options": { + "sale": { + "label": "Sale", + "description": "Sale prices are temporary price changes for products." + }, + "override": { + "label": "Override", + "description": "Overrides are usually used to create customer-specific prices." + } + } + }, + "startsAt": { + "label": "Price list has a start date?", + "hint": "Schedule the price list to activate in the future." + }, + "endsAt": { + "label": "Price list has an expiry date?", + "hint": "Schedule the price list to deactivate in the future." + }, + "customerAvailability": { + "header": "Choose customer groups", + "label": "Customer availability", + "hint": "Choose which customer groups the price list should be applied to.", + "placeholder": "Search for customer groups", + "attribute": "Customer groups" + } } }, "profile": { diff --git a/packages/admin-next/dashboard/src/providers/keybind-provider/hooks.tsx b/packages/admin-next/dashboard/src/providers/keybind-provider/hooks.tsx index 0f7ebb1ad1..c6da202fa1 100644 --- a/packages/admin-next/dashboard/src/providers/keybind-provider/hooks.tsx +++ b/packages/admin-next/dashboard/src/providers/keybind-provider/hooks.tsx @@ -171,7 +171,7 @@ export const useGlobalShortcuts = () => { }, label: t("app.keyboardShortcuts.goToPriceLists"), type: "pageShortcut", - callback: () => navigate("/pricing"), + callback: () => navigate("/price-lists"), }, { keys: { diff --git a/packages/admin-next/dashboard/src/providers/router-provider/route-map.tsx b/packages/admin-next/dashboard/src/providers/router-provider/route-map.tsx index 7b6714b62d..2577816017 100644 --- a/packages/admin-next/dashboard/src/providers/router-provider/route-map.tsx +++ b/packages/admin-next/dashboard/src/providers/router-provider/route-map.tsx @@ -332,45 +332,51 @@ export const RouteMap: RouteObject[] = [ ], }, { - path: "/pricing", + path: "/price-lists", handle: { - crumb: () => "Pricing", + crumb: () => "Price Lists", }, children: [ { path: "", - lazy: () => import("../../routes/pricing/pricing-list"), + lazy: () => import("../../routes/price-lists/price-list-list"), children: [ { path: "create", - lazy: () => import("../../routes/pricing/pricing-create"), + lazy: () => + import("../../routes/price-lists/price-list-create"), }, ], }, { path: ":id", - lazy: () => import("../../routes/pricing/pricing-detail"), + lazy: () => + import("../../routes/price-lists/price-list-detail"), handle: { crumb: (data: PriceListRes) => data.price_list.title, }, children: [ { path: "edit", - lazy: () => import("../../routes/pricing/pricing-edit"), + lazy: () => + import("../../routes/price-lists/price-list-edit"), }, { path: "configuration", lazy: () => - import("../../routes/pricing/pricing-configuration"), + import( + "../../routes/price-lists/price-list-configuration" + ), }, { path: "products/add", - lazy: () => import("../../routes/pricing/pricing-products"), + lazy: () => + import("../../routes/price-lists/price-list-prices-add"), }, { path: "products/edit", lazy: () => - import("../../routes/pricing/pricing-products-prices"), + import("../../routes/price-lists/price-list-prices-edit"), }, ], }, @@ -780,7 +786,8 @@ export const RouteMap: RouteObject[] = [ { path: ":id", handle: { - crumb: (data) => data.shipping_profile.name, + crumb: (data: HttpTypes.AdminShippingProfileResponse) => + data.shipping_profile.name, }, lazy: () => import( diff --git a/packages/admin-next/dashboard/src/providers/theme-provider/index.ts b/packages/admin-next/dashboard/src/providers/theme-provider/index.ts index d12c36092f..17892d3c80 100644 --- a/packages/admin-next/dashboard/src/providers/theme-provider/index.ts +++ b/packages/admin-next/dashboard/src/providers/theme-provider/index.ts @@ -1,3 +1,3 @@ -export type { Theme } from "./theme-context"; -export * from "./theme-provider"; -export * from "./use-theme"; +export type { Theme } from "./theme-context" +export * from "./theme-provider" +export * from "./use-theme" diff --git a/packages/admin-next/dashboard/src/providers/theme-provider/theme-provider.tsx b/packages/admin-next/dashboard/src/providers/theme-provider/theme-provider.tsx index 0bb741620d..4460a1aa27 100644 --- a/packages/admin-next/dashboard/src/providers/theme-provider/theme-provider.tsx +++ b/packages/admin-next/dashboard/src/providers/theme-provider/theme-provider.tsx @@ -1,26 +1,26 @@ -import { PropsWithChildren, useEffect, useState } from "react"; -import { Theme, ThemeContext } from "./theme-context"; +import { PropsWithChildren, useEffect, useState } from "react" +import { Theme, ThemeContext } from "./theme-context" -const THEME_KEY = "medusa_admin_theme"; +const THEME_KEY = "medusa_admin_theme" export const ThemeProvider = ({ children }: PropsWithChildren) => { const [state, setState] = useState( (localStorage?.getItem(THEME_KEY) as Theme) || "light" - ); + ) const setTheme = (theme: Theme) => { - localStorage.setItem(THEME_KEY, theme); - setState(theme); - }; + localStorage.setItem(THEME_KEY, theme) + setState(theme) + } useEffect(() => { - const html = document.querySelector("html"); + const html = document.querySelector("html") if (html) { /** * Temporarily disable transitions to prevent * the theme change from flashing. */ - const css = document.createElement("style"); + const css = document.createElement("style") css.appendChild( document.createTextNode( `* { @@ -31,24 +31,24 @@ export const ThemeProvider = ({ children }: PropsWithChildren) => { transition: none !important; }` ) - ); - document.head.appendChild(css); + ) + document.head.appendChild(css) - html.classList.remove(state === "light" ? "dark" : "light"); - html.classList.add(state); + html.classList.remove(state === "light" ? "dark" : "light") + html.classList.add(state) /** * Re-enable transitions after the theme has been set, * and force the browser to repaint. */ - window.getComputedStyle(css).opacity; - document.head.removeChild(css); + window.getComputedStyle(css).opacity + document.head.removeChild(css) } - }, [state]); + }, [state]) return ( {children} - ); -}; + ) +} diff --git a/packages/admin-next/dashboard/src/providers/theme-provider/use-theme.tsx b/packages/admin-next/dashboard/src/providers/theme-provider/use-theme.tsx index e272a578b4..c265a50271 100644 --- a/packages/admin-next/dashboard/src/providers/theme-provider/use-theme.tsx +++ b/packages/admin-next/dashboard/src/providers/theme-provider/use-theme.tsx @@ -1,10 +1,10 @@ -import { useContext } from "react"; -import { ThemeContext } from "./theme-context"; +import { useContext } from "react" +import { ThemeContext } from "./theme-context" export const useTheme = () => { - const context = useContext(ThemeContext); + const context = useContext(ThemeContext) if (!context) { - throw new Error("useTheme must be used within a ThemeProvider"); + throw new Error("useTheme must be used within a ThemeProvider") } - return context; -}; + return context +} diff --git a/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-create/api-key-management-create.tsx b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-create/api-key-management-create.tsx index 7763930475..33396ea0de 100644 --- a/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-create/api-key-management-create.tsx +++ b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-create/api-key-management-create.tsx @@ -1,5 +1,5 @@ import { useLocation } from "react-router-dom" -import { RouteFocusModal } from "../../../components/route-modal" +import { RouteFocusModal } from "../../../components/modals" import { getApiKeyTypeFromPathname } from "../common/utils" import { ApiKeyCreateForm } from "./components/api-key-create-form" diff --git a/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-create/components/api-key-create-form/api-key-create-form.tsx b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-create/components/api-key-create-form/api-key-create-form.tsx index bf8ecbf03a..c0aeba9a51 100644 --- a/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-create/components/api-key-create-form/api-key-create-form.tsx +++ b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-create/components/api-key-create-form/api-key-create-form.tsx @@ -11,7 +11,7 @@ import { Form } from "../../../../../components/common/form" import { RouteFocusModal, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { useCreateApiKey } from "../../../../../hooks/api/api-keys" import { ApiKeyType } from "../../../common/constants" diff --git a/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-edit/api-key-management-edit.tsx b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-edit/api-key-management-edit.tsx index cdf2ea8e90..43ebb25378 100644 --- a/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-edit/api-key-management-edit.tsx +++ b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-edit/api-key-management-edit.tsx @@ -1,7 +1,7 @@ import { Heading } from "@medusajs/ui" import { useTranslation } from "react-i18next" import { useParams } from "react-router-dom" -import { RouteDrawer } from "../../../components/route-modal" +import { RouteDrawer } from "../../../components/modals" import { useApiKey } from "../../../hooks/api/api-keys" import { EditApiKeyForm } from "./components/edit-api-key-form" diff --git a/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-edit/components/edit-api-key-form/edit-api-key-form.tsx b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-edit/components/edit-api-key-form/edit-api-key-form.tsx index 0cf3264c50..d60bc0b243 100644 --- a/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-edit/components/edit-api-key-form/edit-api-key-form.tsx +++ b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-edit/components/edit-api-key-form/edit-api-key-form.tsx @@ -9,7 +9,7 @@ import { Form } from "../../../../../components/common/form" import { RouteDrawer, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { useUpdateApiKey } from "../../../../../hooks/api/api-keys" type EditApiKeyFormProps = { diff --git a/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-sales-channels/api-key-management-sales-channels.tsx b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-sales-channels/api-key-management-sales-channels.tsx index 12c5d0bad3..8b2363b6c7 100644 --- a/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-sales-channels/api-key-management-sales-channels.tsx +++ b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-sales-channels/api-key-management-sales-channels.tsx @@ -1,7 +1,7 @@ import { useParams } from "react-router-dom" import { AdminApiKeyResponse, AdminSalesChannelResponse } from "@medusajs/types" -import { RouteFocusModal } from "../../../components/route-modal" +import { RouteFocusModal } from "../../../components/modals" import { useApiKey } from "../../../hooks/api/api-keys" import { ApiKeySalesChannelsForm } from "./components/api-key-sales-channels-form" diff --git a/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-sales-channels/components/api-key-sales-channels-form/api-key-sales-channels-form.tsx b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-sales-channels/components/api-key-sales-channels-form/api-key-sales-channels-form.tsx index 95ebaacfba..14c84bd3b0 100644 --- a/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-sales-channels/components/api-key-sales-channels-form/api-key-sales-channels-form.tsx +++ b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-sales-channels/components/api-key-sales-channels-form/api-key-sales-channels-form.tsx @@ -14,7 +14,7 @@ import * as zod from "zod" import { RouteFocusModal, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { DataTable } from "../../../../../components/table/data-table" import { useBatchAddSalesChannelsToApiKey } from "../../../../../hooks/api/api-keys" import { useSalesChannels } from "../../../../../hooks/api/sales-channels" diff --git a/packages/admin-next/dashboard/src/routes/campaigns/add-campaign-promotions/add-campaign-promotions.tsx b/packages/admin-next/dashboard/src/routes/campaigns/add-campaign-promotions/add-campaign-promotions.tsx index 910fb8166a..a760cf7ad1 100644 --- a/packages/admin-next/dashboard/src/routes/campaigns/add-campaign-promotions/add-campaign-promotions.tsx +++ b/packages/admin-next/dashboard/src/routes/campaigns/add-campaign-promotions/add-campaign-promotions.tsx @@ -1,5 +1,5 @@ import { useParams } from "react-router-dom" -import { RouteFocusModal } from "../../../components/route-modal" +import { RouteFocusModal } from "../../../components/modals" import { useCampaign } from "../../../hooks/api/campaigns" import { AddCampaignPromotionsForm } from "./components" diff --git a/packages/admin-next/dashboard/src/routes/campaigns/add-campaign-promotions/components/add-campaign-promotions-form.tsx b/packages/admin-next/dashboard/src/routes/campaigns/add-campaign-promotions/components/add-campaign-promotions-form.tsx index ac1df29b16..6e701f01fb 100644 --- a/packages/admin-next/dashboard/src/routes/campaigns/add-campaign-promotions/components/add-campaign-promotions-form.tsx +++ b/packages/admin-next/dashboard/src/routes/campaigns/add-campaign-promotions/components/add-campaign-promotions-form.tsx @@ -1,11 +1,11 @@ import { zodResolver } from "@hookform/resolvers/zod" import { CampaignResponse, PromotionDTO } from "@medusajs/types" -import { Button, Checkbox, Hint, toast, Tooltip } from "@medusajs/ui" +import { Button, Checkbox, Hint, Tooltip, toast } from "@medusajs/ui" import { keepPreviousData } from "@tanstack/react-query" import { - createColumnHelper, OnChangeFn, RowSelectionState, + createColumnHelper, } from "@tanstack/react-table" import { useMemo, useState } from "react" import { useForm } from "react-hook-form" @@ -14,7 +14,7 @@ import * as zod from "zod" import { RouteFocusModal, useRouteModal, -} from "../../../../components/route-modal" +} from "../../../../components/modals" import { DataTable } from "../../../../components/table/data-table" import { useAddOrRemoveCampaignPromotions } from "../../../../hooks/api/campaigns" import { usePromotions } from "../../../../hooks/api/promotions" diff --git a/packages/admin-next/dashboard/src/routes/campaigns/campaign-budget-edit/campaign-budget-edit.tsx b/packages/admin-next/dashboard/src/routes/campaigns/campaign-budget-edit/campaign-budget-edit.tsx index 286414017e..2508677dba 100644 --- a/packages/admin-next/dashboard/src/routes/campaigns/campaign-budget-edit/campaign-budget-edit.tsx +++ b/packages/admin-next/dashboard/src/routes/campaigns/campaign-budget-edit/campaign-budget-edit.tsx @@ -1,7 +1,7 @@ import { Heading } from "@medusajs/ui" import { useTranslation } from "react-i18next" import { useParams } from "react-router-dom" -import { RouteDrawer } from "../../../components/route-modal" +import { RouteDrawer } from "../../../components/modals" import { useCampaign } from "../../../hooks/api/campaigns" import { EditCampaignBudgetForm } from "./components/edit-campaign-budget-form" diff --git a/packages/admin-next/dashboard/src/routes/campaigns/campaign-budget-edit/components/edit-campaign-budget-form/edit-campaign-budget-form.tsx b/packages/admin-next/dashboard/src/routes/campaigns/campaign-budget-edit/components/edit-campaign-budget-form/edit-campaign-budget-form.tsx index b22a3a8f5a..bb88fca79e 100644 --- a/packages/admin-next/dashboard/src/routes/campaigns/campaign-budget-edit/components/edit-campaign-budget-form/edit-campaign-budget-form.tsx +++ b/packages/admin-next/dashboard/src/routes/campaigns/campaign-budget-edit/components/edit-campaign-budget-form/edit-campaign-budget-form.tsx @@ -8,7 +8,7 @@ import { Form } from "../../../../../components/common/form" import { RouteDrawer, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { useUpdateCampaign } from "../../../../../hooks/api/campaigns" import { getCurrencySymbol } from "../../../../../lib/currencies" diff --git a/packages/admin-next/dashboard/src/routes/campaigns/campaign-create/campaign-create.tsx b/packages/admin-next/dashboard/src/routes/campaigns/campaign-create/campaign-create.tsx index d6a0a9e559..abfc24872b 100644 --- a/packages/admin-next/dashboard/src/routes/campaigns/campaign-create/campaign-create.tsx +++ b/packages/admin-next/dashboard/src/routes/campaigns/campaign-create/campaign-create.tsx @@ -1,4 +1,4 @@ -import { RouteFocusModal } from "../../../components/route-modal" +import { RouteFocusModal } from "../../../components/modals" import { CreateCampaignForm } from "./components/create-campaign-form" export const CampaignCreate = () => { diff --git a/packages/admin-next/dashboard/src/routes/campaigns/campaign-create/components/create-campaign-form/create-campaign-form.tsx b/packages/admin-next/dashboard/src/routes/campaigns/campaign-create/components/create-campaign-form/create-campaign-form.tsx index 76cd8d50f6..0dbec8e81b 100644 --- a/packages/admin-next/dashboard/src/routes/campaigns/campaign-create/components/create-campaign-form/create-campaign-form.tsx +++ b/packages/admin-next/dashboard/src/routes/campaigns/campaign-create/components/create-campaign-form/create-campaign-form.tsx @@ -8,7 +8,7 @@ import { CampaignBudgetTypeValues } from "@medusajs/types" import { RouteFocusModal, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { useCreateCampaign } from "../../../../../hooks/api/campaigns" import { CreateCampaignFormFields } from "../../../common/components/create-campaign-form-fields" diff --git a/packages/admin-next/dashboard/src/routes/campaigns/campaign-edit/campaign-edit.tsx b/packages/admin-next/dashboard/src/routes/campaigns/campaign-edit/campaign-edit.tsx index 30ad9cf63e..80ee8355de 100644 --- a/packages/admin-next/dashboard/src/routes/campaigns/campaign-edit/campaign-edit.tsx +++ b/packages/admin-next/dashboard/src/routes/campaigns/campaign-edit/campaign-edit.tsx @@ -1,7 +1,7 @@ import { Heading } from "@medusajs/ui" import { useTranslation } from "react-i18next" import { useParams } from "react-router-dom" -import { RouteDrawer } from "../../../components/route-modal" +import { RouteDrawer } from "../../../components/modals" import { useCampaign } from "../../../hooks/api/campaigns" import { EditCampaignForm } from "./components/edit-campaign-form" diff --git a/packages/admin-next/dashboard/src/routes/campaigns/campaign-edit/components/edit-campaign-form/edit-campaign-form.tsx b/packages/admin-next/dashboard/src/routes/campaigns/campaign-edit/components/edit-campaign-form/edit-campaign-form.tsx index 9a56ff8b35..6482bd74b9 100644 --- a/packages/admin-next/dashboard/src/routes/campaigns/campaign-edit/components/edit-campaign-form/edit-campaign-form.tsx +++ b/packages/admin-next/dashboard/src/routes/campaigns/campaign-edit/components/edit-campaign-form/edit-campaign-form.tsx @@ -8,7 +8,7 @@ import { Form } from "../../../../../components/common/form" import { RouteDrawer, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { useUpdateCampaign } from "../../../../../hooks/api/campaigns" type EditCampaignFormProps = { diff --git a/packages/admin-next/dashboard/src/routes/categories/category-create/category-create.tsx b/packages/admin-next/dashboard/src/routes/categories/category-create/category-create.tsx index b6575299dc..2e87050a57 100644 --- a/packages/admin-next/dashboard/src/routes/categories/category-create/category-create.tsx +++ b/packages/admin-next/dashboard/src/routes/categories/category-create/category-create.tsx @@ -1,6 +1,6 @@ import { useSearchParams } from "react-router-dom" -import { RouteFocusModal } from "../../../components/route-modal" +import { RouteFocusModal } from "../../../components/modals" import { CreateCategoryForm } from "./components/create-category-form/create-category-form" export const CategoryCreate = () => { diff --git a/packages/admin-next/dashboard/src/routes/categories/category-create/components/create-category-form/create-category-form.tsx b/packages/admin-next/dashboard/src/routes/categories/category-create/components/create-category-form/create-category-form.tsx index 9e949a529a..0f7d6e47a2 100644 --- a/packages/admin-next/dashboard/src/routes/categories/category-create/components/create-category-form/create-category-form.tsx +++ b/packages/admin-next/dashboard/src/routes/categories/category-create/components/create-category-form/create-category-form.tsx @@ -7,7 +7,7 @@ import { useState } from "react" import { RouteFocusModal, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { useCreateProductCategory } from "../../../../../hooks/api/categories" import { CreateCategoryDetails } from "./create-category-details" import { CreateCategoryNesting } from "./create-category-nesting" diff --git a/packages/admin-next/dashboard/src/routes/categories/category-edit/category-edit.tsx b/packages/admin-next/dashboard/src/routes/categories/category-edit/category-edit.tsx index 7f32a09a32..51fa819638 100644 --- a/packages/admin-next/dashboard/src/routes/categories/category-edit/category-edit.tsx +++ b/packages/admin-next/dashboard/src/routes/categories/category-edit/category-edit.tsx @@ -1,7 +1,7 @@ import { Heading } from "@medusajs/ui" import { useParams } from "react-router-dom" -import { RouteDrawer } from "../../../components/route-modal" +import { RouteDrawer } from "../../../components/modals" import { useProductCategory } from "../../../hooks/api/categories" import { EditCategoryForm } from "./components/edit-category-form" diff --git a/packages/admin-next/dashboard/src/routes/categories/category-edit/components/edit-category-form/edit-category-form.tsx b/packages/admin-next/dashboard/src/routes/categories/category-edit/components/edit-category-form/edit-category-form.tsx index 7725c1ccba..4edb2a6ede 100644 --- a/packages/admin-next/dashboard/src/routes/categories/category-edit/components/edit-category-form/edit-category-form.tsx +++ b/packages/admin-next/dashboard/src/routes/categories/category-edit/components/edit-category-form/edit-category-form.tsx @@ -7,7 +7,7 @@ import { z } from "zod" import { HttpTypes } from "@medusajs/types" import { Form } from "../../../../../components/common/form" import { HandleInput } from "../../../../../components/inputs/handle-input" -import { RouteDrawer } from "../../../../../components/route-modal" +import { RouteDrawer } from "../../../../../components/modals" const EditCategorySchema = z.object({ name: z.string().min(1), diff --git a/packages/admin-next/dashboard/src/routes/categories/category-organize/category-organize.tsx b/packages/admin-next/dashboard/src/routes/categories/category-organize/category-organize.tsx index 6ceb519680..f79439d7ff 100644 --- a/packages/admin-next/dashboard/src/routes/categories/category-organize/category-organize.tsx +++ b/packages/admin-next/dashboard/src/routes/categories/category-organize/category-organize.tsx @@ -1,4 +1,4 @@ -import { RouteFocusModal } from "../../../components/route-modal" +import { RouteFocusModal } from "../../../components/modals" import { OrganizeCategoryForm } from "./components/organize-category-form/organize-category-form" export const CategoryOrganize = () => { diff --git a/packages/admin-next/dashboard/src/routes/categories/category-organize/components/organize-category-form/organize-category-form.tsx b/packages/admin-next/dashboard/src/routes/categories/category-organize/components/organize-category-form/organize-category-form.tsx index fbc738433e..71e7504924 100644 --- a/packages/admin-next/dashboard/src/routes/categories/category-organize/components/organize-category-form/organize-category-form.tsx +++ b/packages/admin-next/dashboard/src/routes/categories/category-organize/components/organize-category-form/organize-category-form.tsx @@ -5,7 +5,7 @@ import { FetchError } from "@medusajs/js-sdk" import { HttpTypes } from "@medusajs/types" import { toast } from "@medusajs/ui" import { t } from "i18next" -import { RouteFocusModal } from "../../../../../components/route-modal" +import { RouteFocusModal } from "../../../../../components/modals" import { categoriesQueryKeys, useProductCategories, diff --git a/packages/admin-next/dashboard/src/routes/categories/category-products/category-products.tsx b/packages/admin-next/dashboard/src/routes/categories/category-products/category-products.tsx index 30134a45aa..eb0d0bc056 100644 --- a/packages/admin-next/dashboard/src/routes/categories/category-products/category-products.tsx +++ b/packages/admin-next/dashboard/src/routes/categories/category-products/category-products.tsx @@ -1,5 +1,5 @@ import { useParams } from "react-router-dom" -import { RouteFocusModal } from "../../../components/route-modal" +import { RouteFocusModal } from "../../../components/modals" import { useProductCategory } from "../../../hooks/api/categories" import { EditCategoryProductsForm } from "./components/edit-category-products-form" diff --git a/packages/admin-next/dashboard/src/routes/categories/category-products/components/edit-category-products-form/edit-category-products-form.tsx b/packages/admin-next/dashboard/src/routes/categories/category-products/components/edit-category-products-form/edit-category-products-form.tsx index 1c4575026a..93f7312f81 100644 --- a/packages/admin-next/dashboard/src/routes/categories/category-products/components/edit-category-products-form/edit-category-products-form.tsx +++ b/packages/admin-next/dashboard/src/routes/categories/category-products/components/edit-category-products-form/edit-category-products-form.tsx @@ -14,7 +14,7 @@ import { useTranslation } from "react-i18next" import { RouteFocusModal, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { DataTable } from "../../../../../components/table/data-table" import { useUpdateProductCategoryProducts } from "../../../../../hooks/api/categories" import { useProducts } from "../../../../../hooks/api/products" diff --git a/packages/admin-next/dashboard/src/routes/collections/collection-add-products/collection-add-products.tsx b/packages/admin-next/dashboard/src/routes/collections/collection-add-products/collection-add-products.tsx index f339bfd353..884a163767 100644 --- a/packages/admin-next/dashboard/src/routes/collections/collection-add-products/collection-add-products.tsx +++ b/packages/admin-next/dashboard/src/routes/collections/collection-add-products/collection-add-products.tsx @@ -1,6 +1,6 @@ import { useParams } from "react-router-dom" -import { RouteFocusModal } from "../../../components/route-modal" +import { RouteFocusModal } from "../../../components/modals" import { useCollection } from "../../../hooks/api/collections" import { AddProductsToCollectionForm } from "./components/add-products-to-collection-form" diff --git a/packages/admin-next/dashboard/src/routes/collections/collection-add-products/components/add-products-to-collection-form/add-products-to-collection-form.tsx b/packages/admin-next/dashboard/src/routes/collections/collection-add-products/components/add-products-to-collection-form/add-products-to-collection-form.tsx index 4658a6f537..fbeb6745fc 100644 --- a/packages/admin-next/dashboard/src/routes/collections/collection-add-products/components/add-products-to-collection-form/add-products-to-collection-form.tsx +++ b/packages/admin-next/dashboard/src/routes/collections/collection-add-products/components/add-products-to-collection-form/add-products-to-collection-form.tsx @@ -14,7 +14,7 @@ import * as zod from "zod" import { RouteFocusModal, useRouteModal, -} from "../../../../../components/route-modal/index.ts" +} from "../../../../../components/modals/index.ts" import { DataTable } from "../../../../../components/table/data-table/data-table.tsx" import { useUpdateCollectionProducts } from "../../../../../hooks/api/collections.tsx" import { useProducts } from "../../../../../hooks/api/products.tsx" diff --git a/packages/admin-next/dashboard/src/routes/collections/collection-create/collection-create.tsx b/packages/admin-next/dashboard/src/routes/collections/collection-create/collection-create.tsx index e5f50dd664..59796e2ad2 100644 --- a/packages/admin-next/dashboard/src/routes/collections/collection-create/collection-create.tsx +++ b/packages/admin-next/dashboard/src/routes/collections/collection-create/collection-create.tsx @@ -1,4 +1,4 @@ -import { RouteFocusModal } from "../../../components/route-modal" +import { RouteFocusModal } from "../../../components/modals" import { CreateCollectionForm } from "./components/create-collection-form" export const CollectionCreate = () => { diff --git a/packages/admin-next/dashboard/src/routes/collections/collection-create/components/create-collection-form/create-collection-form.tsx b/packages/admin-next/dashboard/src/routes/collections/collection-create/components/create-collection-form/create-collection-form.tsx index 4b4a057b4f..4807527706 100644 --- a/packages/admin-next/dashboard/src/routes/collections/collection-create/components/create-collection-form/create-collection-form.tsx +++ b/packages/admin-next/dashboard/src/routes/collections/collection-create/components/create-collection-form/create-collection-form.tsx @@ -9,7 +9,7 @@ import { HandleInput } from "../../../../../components/inputs/handle-input" import { RouteFocusModal, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { useCreateCollection } from "../../../../../hooks/api/collections" const CreateCollectionSchema = zod.object({ diff --git a/packages/admin-next/dashboard/src/routes/collections/collection-edit/collection-edit.tsx b/packages/admin-next/dashboard/src/routes/collections/collection-edit/collection-edit.tsx index 690c44bed6..7bdac8da5c 100644 --- a/packages/admin-next/dashboard/src/routes/collections/collection-edit/collection-edit.tsx +++ b/packages/admin-next/dashboard/src/routes/collections/collection-edit/collection-edit.tsx @@ -1,7 +1,7 @@ import { Heading } from "@medusajs/ui" import { useTranslation } from "react-i18next" import { useParams } from "react-router-dom" -import { RouteDrawer } from "../../../components/route-modal" +import { RouteDrawer } from "../../../components/modals" import { useCollection } from "../../../hooks/api/collections" import { EditCollectionForm } from "./components/edit-collection-form" diff --git a/packages/admin-next/dashboard/src/routes/collections/collection-edit/components/edit-collection-form/edit-collection-form.tsx b/packages/admin-next/dashboard/src/routes/collections/collection-edit/components/edit-collection-form/edit-collection-form.tsx index 285d92cefc..3047423c8c 100644 --- a/packages/admin-next/dashboard/src/routes/collections/collection-edit/components/edit-collection-form/edit-collection-form.tsx +++ b/packages/admin-next/dashboard/src/routes/collections/collection-edit/components/edit-collection-form/edit-collection-form.tsx @@ -4,13 +4,13 @@ import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" import * as zod from "zod" +import { HttpTypes } from "@medusajs/types" import { Form } from "../../../../../components/common/form" import { RouteDrawer, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { useUpdateCollection } from "../../../../../hooks/api/collections" -import { HttpTypes } from "@medusajs/types" type EditCollectionFormProps = { collection: HttpTypes.AdminCollection diff --git a/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-add-customers/components/add-customers-form/add-customers-form.tsx b/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-add-customers/components/add-customers-form/add-customers-form.tsx index 48fdfbfed2..5ec526e3b6 100644 --- a/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-add-customers/components/add-customers-form/add-customers-form.tsx +++ b/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-add-customers/components/add-customers-form/add-customers-form.tsx @@ -10,10 +10,11 @@ import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" import * as zod from "zod" +import { HttpTypes } from "@medusajs/types" import { RouteFocusModal, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { DataTable } from "../../../../../components/table/data-table" import { useAddCustomersToGroup } from "../../../../../hooks/api/customer-groups" import { useCustomers } from "../../../../../hooks/api/customers" @@ -21,7 +22,6 @@ import { useCustomerTableColumns } from "../../../../../hooks/table/columns/use- import { useCustomerTableFilters } from "../../../../../hooks/table/filters/use-customer-table-filters" import { useCustomerTableQuery } from "../../../../../hooks/table/query/use-customer-table-query" import { useDataTable } from "../../../../../hooks/use-data-table" -import { HttpTypes } from "@medusajs/types" type AddCustomersFormProps = { customerGroupId: string diff --git a/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-add-customers/customer-group-add-customers.tsx b/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-add-customers/customer-group-add-customers.tsx index ab29d0b1ab..6eede341fd 100644 --- a/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-add-customers/customer-group-add-customers.tsx +++ b/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-add-customers/customer-group-add-customers.tsx @@ -1,5 +1,5 @@ import { useParams } from "react-router-dom" -import { RouteFocusModal } from "../../../components/route-modal" +import { RouteFocusModal } from "../../../components/modals" import { AddCustomersForm } from "./components/add-customers-form" export const CustomerGroupAddCustomers = () => { diff --git a/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-create/components/create-customer-group-form/create-customer-group-form.tsx b/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-create/components/create-customer-group-form/create-customer-group-form.tsx index b6858d1aeb..8db2aced8e 100644 --- a/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-create/components/create-customer-group-form/create-customer-group-form.tsx +++ b/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-create/components/create-customer-group-form/create-customer-group-form.tsx @@ -8,7 +8,7 @@ import { Form } from "../../../../../components/common/form" import { RouteFocusModal, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { useCreateCustomerGroup } from "../../../../../hooks/api/customer-groups" export const CreateCustomerGroupSchema = zod.object({ diff --git a/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-create/customer-group-create.tsx b/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-create/customer-group-create.tsx index 50d763a27f..a9ab7b7b23 100644 --- a/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-create/customer-group-create.tsx +++ b/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-create/customer-group-create.tsx @@ -1,4 +1,4 @@ -import { RouteFocusModal } from "../../../components/route-modal" +import { RouteFocusModal } from "../../../components/modals" import { CreateCustomerGroupForm } from "./components/create-customer-group-form" export const CustomerGroupCreate = () => { diff --git a/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-edit/components/edit-customer-group-form/edit-customer-group-form.tsx b/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-edit/components/edit-customer-group-form/edit-customer-group-form.tsx index ac7a5fd218..f063344393 100644 --- a/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-edit/components/edit-customer-group-form/edit-customer-group-form.tsx +++ b/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-edit/components/edit-customer-group-form/edit-customer-group-form.tsx @@ -1,4 +1,5 @@ import { zodResolver } from "@hookform/resolvers/zod" +import { HttpTypes } from "@medusajs/types" import { Button, Input, toast } from "@medusajs/ui" import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" @@ -7,9 +8,8 @@ import { Form } from "../../../../../components/common/form" import { RouteDrawer, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { useUpdateCustomerGroup } from "../../../../../hooks/api/customer-groups" -import { HttpTypes } from "@medusajs/types" type EditCustomerGroupFormProps = { group: HttpTypes.AdminCustomerGroup diff --git a/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-edit/customer-group-edit.tsx b/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-edit/customer-group-edit.tsx index 72c90d3943..0b92d402b2 100644 --- a/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-edit/customer-group-edit.tsx +++ b/packages/admin-next/dashboard/src/routes/customer-groups/customer-group-edit/customer-group-edit.tsx @@ -1,7 +1,7 @@ import { Heading } from "@medusajs/ui" import { useTranslation } from "react-i18next" import { useParams } from "react-router-dom" -import { RouteDrawer } from "../../../components/route-modal" +import { RouteDrawer } from "../../../components/modals" import { useCustomerGroup } from "../../../hooks/api/customer-groups" import { EditCustomerGroupForm } from "./components/edit-customer-group-form" diff --git a/packages/admin-next/dashboard/src/routes/customers/customer-create/components/create-customer-form/create-customer-form.tsx b/packages/admin-next/dashboard/src/routes/customers/customer-create/components/create-customer-form/create-customer-form.tsx index 820f621971..cb7ea9de2a 100644 --- a/packages/admin-next/dashboard/src/routes/customers/customer-create/components/create-customer-form/create-customer-form.tsx +++ b/packages/admin-next/dashboard/src/routes/customers/customer-create/components/create-customer-form/create-customer-form.tsx @@ -8,7 +8,7 @@ import { Form } from "../../../../../components/common/form" import { RouteFocusModal, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { useCreateCustomer } from "../../../../../hooks/api/customers" const CreateCustomerSchema = zod.object({ diff --git a/packages/admin-next/dashboard/src/routes/customers/customer-create/customer-create.tsx b/packages/admin-next/dashboard/src/routes/customers/customer-create/customer-create.tsx index 61b826834d..0d57ca3734 100644 --- a/packages/admin-next/dashboard/src/routes/customers/customer-create/customer-create.tsx +++ b/packages/admin-next/dashboard/src/routes/customers/customer-create/customer-create.tsx @@ -1,4 +1,4 @@ -import { RouteFocusModal } from "../../../components/route-modal" +import { RouteFocusModal } from "../../../components/modals" import { CreateCustomerForm } from "./components/create-customer-form" export const CustomerCreate = () => { diff --git a/packages/admin-next/dashboard/src/routes/customers/customer-edit/components/edit-customer-form/edit-customer-form.tsx b/packages/admin-next/dashboard/src/routes/customers/customer-edit/components/edit-customer-form/edit-customer-form.tsx index 353b896fe5..3ea9c7e97d 100644 --- a/packages/admin-next/dashboard/src/routes/customers/customer-edit/components/edit-customer-form/edit-customer-form.tsx +++ b/packages/admin-next/dashboard/src/routes/customers/customer-edit/components/edit-customer-form/edit-customer-form.tsx @@ -1,4 +1,5 @@ import { zodResolver } from "@hookform/resolvers/zod" +import { HttpTypes } from "@medusajs/types" import { Button, Input, toast } from "@medusajs/ui" import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" @@ -9,14 +10,13 @@ import { Metadata } from "../../../../../components/forms/metadata/index.ts" import { RouteDrawer, useRouteModal, -} from "../../../../../components/route-modal/index.ts" +} from "../../../../../components/modals/index.ts" import { useUpdateCustomer } from "../../../../../hooks/api/customers.tsx" import { formValuesToMetadata, metadataToFormValues, } from "../../../../../lib/metadata.ts" import { metadataFormSchema } from "../../../../../lib/validation.ts" -import { HttpTypes } from "@medusajs/types" type EditCustomerFormProps = { customer: HttpTypes.AdminCustomer diff --git a/packages/admin-next/dashboard/src/routes/customers/customer-edit/customer-edit.tsx b/packages/admin-next/dashboard/src/routes/customers/customer-edit/customer-edit.tsx index 8834b8cbfd..c77bec0a83 100644 --- a/packages/admin-next/dashboard/src/routes/customers/customer-edit/customer-edit.tsx +++ b/packages/admin-next/dashboard/src/routes/customers/customer-edit/customer-edit.tsx @@ -1,7 +1,7 @@ import { Heading } from "@medusajs/ui" import { useTranslation } from "react-i18next" import { useParams } from "react-router-dom" -import { RouteDrawer } from "../../../components/route-modal" +import { RouteDrawer } from "../../../components/modals" import { useCustomer } from "../../../hooks/api/customers" import { EditCustomerForm } from "./components/edit-customer-form" diff --git a/packages/admin-next/dashboard/src/routes/customers/customer-transfer-ownership/components/transfer-customer-order-ownership-form/transfer-customer-order-ownership-form.tsx b/packages/admin-next/dashboard/src/routes/customers/customer-transfer-ownership/components/transfer-customer-order-ownership-form/transfer-customer-order-ownership-form.tsx index 42051cd595..a9afde1924 100644 --- a/packages/admin-next/dashboard/src/routes/customers/customer-transfer-ownership/components/transfer-customer-order-ownership-form/transfer-customer-order-ownership-form.tsx +++ b/packages/admin-next/dashboard/src/routes/customers/customer-transfer-ownership/components/transfer-customer-order-ownership-form/transfer-customer-order-ownership-form.tsx @@ -8,7 +8,7 @@ import { TransferOwnerShipForm } from "../../../../../components/forms/transfer- import { RouteDrawer, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { TransferOwnershipSchema } from "../../../../../lib/schemas" type TransferCustomerOrderOwnershipFormProps = { diff --git a/packages/admin-next/dashboard/src/routes/customers/customer-transfer-ownership/customer-transfer-ownership.tsx b/packages/admin-next/dashboard/src/routes/customers/customer-transfer-ownership/customer-transfer-ownership.tsx index 631c7ae808..d9e17738c9 100644 --- a/packages/admin-next/dashboard/src/routes/customers/customer-transfer-ownership/customer-transfer-ownership.tsx +++ b/packages/admin-next/dashboard/src/routes/customers/customer-transfer-ownership/customer-transfer-ownership.tsx @@ -2,7 +2,7 @@ import { Heading } from "@medusajs/ui" import { useTranslation } from "react-i18next" import { useParams } from "react-router-dom" -import { RouteDrawer } from "../../../components/route-modal" +import { RouteDrawer } from "../../../components/modals" import { useOrder } from "../../../hooks/api/orders" import { TransferCustomerOrderOwnershipForm } from "./components/transfer-customer-order-ownership-form" diff --git a/packages/admin-next/dashboard/src/routes/customers/customers-add-customer-group/components/add-customers-form/add-customer-groups-form.tsx b/packages/admin-next/dashboard/src/routes/customers/customers-add-customer-group/components/add-customers-form/add-customer-groups-form.tsx index a526ce1d30..70b1456b6a 100644 --- a/packages/admin-next/dashboard/src/routes/customers/customers-add-customer-group/components/add-customers-form/add-customer-groups-form.tsx +++ b/packages/admin-next/dashboard/src/routes/customers/customers-add-customer-group/components/add-customers-form/add-customer-groups-form.tsx @@ -13,7 +13,7 @@ import * as zod from "zod" import { RouteFocusModal, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { DataTable } from "../../../../../components/table/data-table" import { customerGroupsQueryKeys, diff --git a/packages/admin-next/dashboard/src/routes/customers/customers-add-customer-group/customer-add-customer-groups.tsx b/packages/admin-next/dashboard/src/routes/customers/customers-add-customer-group/customer-add-customer-groups.tsx index 3f4ad3fa9b..6da36ab035 100644 --- a/packages/admin-next/dashboard/src/routes/customers/customers-add-customer-group/customer-add-customer-groups.tsx +++ b/packages/admin-next/dashboard/src/routes/customers/customers-add-customer-group/customer-add-customer-groups.tsx @@ -1,5 +1,5 @@ import { useParams } from "react-router-dom" -import { RouteFocusModal } from "../../../components/route-modal" +import { RouteFocusModal } from "../../../components/modals" import { AddCustomerGroupsForm } from "./components/add-customers-form" export const CustomerAddCustomerGroups = () => { diff --git a/packages/admin-next/dashboard/src/routes/inventory/inventory-create/components/create-inventory-item-form/create-inventory-item-form.tsx b/packages/admin-next/dashboard/src/routes/inventory/inventory-create/components/create-inventory-item-form/create-inventory-item-form.tsx index b9ab2268b6..f159a1ce7d 100644 --- a/packages/admin-next/dashboard/src/routes/inventory/inventory-create/components/create-inventory-item-form/create-inventory-item-form.tsx +++ b/packages/admin-next/dashboard/src/routes/inventory/inventory-create/components/create-inventory-item-form/create-inventory-item-form.tsx @@ -6,30 +6,30 @@ import * as zod from "zod" import { Button, Heading, + Input, ProgressStatus, ProgressTabs, - clx, - Input, - Textarea, Switch, + Textarea, + clx, toast, } from "@medusajs/ui" import { useTranslation } from "react-i18next" +import { Form } from "../../../../../components/common/form" +import { CountrySelect } from "../../../../../components/inputs/country-select" import { RouteFocusModal, useRouteModal, -} from "../../../../../components/route-modal" -import { CreateInventoryAvailabilityForm } from "./create-inventory-availability-form" -import { CountrySelect } from "../../../../../components/inputs/country-select" -import { Form } from "../../../../../components/common/form" +} from "../../../../../components/modals" import { inventoryItemsQueryKeys, useCreateInventoryItem, } from "../../../../../hooks/api/inventory" import { sdk } from "../../../../../lib/client" -import { optionalInt } from "../../../../../lib/validation" import { queryClient } from "../../../../../lib/query-client" +import { optionalInt } from "../../../../../lib/validation" +import { CreateInventoryAvailabilityForm } from "./create-inventory-availability-form" enum Tab { DETAILS = "details", diff --git a/packages/admin-next/dashboard/src/routes/inventory/inventory-create/inventory-create.tsx b/packages/admin-next/dashboard/src/routes/inventory/inventory-create/inventory-create.tsx index 2091a981c1..0b083ed9fd 100644 --- a/packages/admin-next/dashboard/src/routes/inventory/inventory-create/inventory-create.tsx +++ b/packages/admin-next/dashboard/src/routes/inventory/inventory-create/inventory-create.tsx @@ -1,4 +1,4 @@ -import { RouteFocusModal } from "../../../components/route-modal" +import { RouteFocusModal } from "../../../components/modals" import { CreateInventoryItemForm } from "./components/create-inventory-item-form" export function InventoryCreate() { diff --git a/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/adjust-inventory/adjust-inventory-drawer.tsx b/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/adjust-inventory/adjust-inventory-drawer.tsx index d66385af8a..5fe7809a62 100644 --- a/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/adjust-inventory/adjust-inventory-drawer.tsx +++ b/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/adjust-inventory/adjust-inventory-drawer.tsx @@ -1,11 +1,11 @@ -import { AdjustInventoryForm } from "./components/adjust-inventory-form" -import { Heading } from "@medusajs/ui" import { InventoryTypes } from "@medusajs/types" -import { RouteDrawer } from "../../../../../components/route-modal" -import { useInventoryItem } from "../../../../../hooks/api/inventory" -import { useParams } from "react-router-dom" -import { useStockLocation } from "../../../../../hooks/api/stock-locations" +import { Heading } from "@medusajs/ui" import { useTranslation } from "react-i18next" +import { useParams } from "react-router-dom" +import { RouteDrawer } from "../../../../../components/modals" +import { useInventoryItem } from "../../../../../hooks/api/inventory" +import { useStockLocation } from "../../../../../hooks/api/stock-locations" +import { AdjustInventoryForm } from "./components/adjust-inventory-form" export const AdjustInventoryDrawer = () => { const { id, location_id } = useParams() diff --git a/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/adjust-inventory/components/adjust-inventory-form.tsx b/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/adjust-inventory/components/adjust-inventory-form.tsx index 5d5e75698e..53905d578e 100644 --- a/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/adjust-inventory/components/adjust-inventory-form.tsx +++ b/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/adjust-inventory/components/adjust-inventory-form.tsx @@ -1,16 +1,16 @@ -import * as zod from "zod" import { zodResolver } from "@hookform/resolvers/zod" +import * as zod from "zod" +import { HttpTypes, InventoryLevelDTO, StockLocationDTO } from "@medusajs/types" import { Button, Input, Text, toast } from "@medusajs/ui" -import { InventoryLevelDTO, StockLocationDTO, HttpTypes } from "@medusajs/types" import { RouteDrawer, useRouteModal, -} from "../../../../../../components/route-modal" +} from "../../../../../../components/modals" -import { Form } from "../../../../../../components/common/form" import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" +import { Form } from "../../../../../../components/common/form" import { useUpdateInventoryLevel } from "../../../../../../hooks/api/inventory" type AdjustInventoryFormProps = { diff --git a/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/edit-inventory-item-attributes/components/edit-item-attributes-form.tsx b/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/edit-inventory-item-attributes/components/edit-item-attributes-form.tsx index f75f5b4528..52e940d948 100644 --- a/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/edit-inventory-item-attributes/components/edit-item-attributes-form.tsx +++ b/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/edit-inventory-item-attributes/components/edit-item-attributes-form.tsx @@ -4,7 +4,7 @@ import { Button, Input, toast } from "@medusajs/ui" import { RouteDrawer, useRouteModal, -} from "../../../../../../components/route-modal" +} from "../../../../../../components/modals" import { zodResolver } from "@hookform/resolvers/zod" import { InventoryTypes } from "@medusajs/types" diff --git a/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/edit-inventory-item-attributes/edit-item-attributes-drawer.tsx b/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/edit-inventory-item-attributes/edit-item-attributes-drawer.tsx index fe9f4eb9c3..9784783085 100644 --- a/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/edit-inventory-item-attributes/edit-item-attributes-drawer.tsx +++ b/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/edit-inventory-item-attributes/edit-item-attributes-drawer.tsx @@ -1,9 +1,9 @@ -import { EditInventoryItemAttributesForm } from "./components/edit-item-attributes-form" import { Heading } from "@medusajs/ui" -import { RouteDrawer } from "../../../../../components/route-modal" -import { useInventoryItem } from "../../../../../hooks/api/inventory" -import { useParams } from "react-router-dom" import { useTranslation } from "react-i18next" +import { useParams } from "react-router-dom" +import { RouteDrawer } from "../../../../../components/modals" +import { useInventoryItem } from "../../../../../hooks/api/inventory" +import { EditInventoryItemAttributesForm } from "./components/edit-item-attributes-form" export const InventoryItemAttributesEdit = () => { const { id } = useParams() diff --git a/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/edit-inventory-item/components/edit-item-form.tsx b/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/edit-inventory-item/components/edit-item-form.tsx index 2de7b4492a..3bc2c6438e 100644 --- a/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/edit-inventory-item/components/edit-item-form.tsx +++ b/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/edit-inventory-item/components/edit-item-form.tsx @@ -4,15 +4,15 @@ import { Button, Input, toast } from "@medusajs/ui" import { RouteDrawer, useRouteModal, -} from "../../../../../../components/route-modal" +} from "../../../../../../components/modals" -import { Form } from "../../../../../../components/common/form" +import { zodResolver } from "@hookform/resolvers/zod" import { InventoryTypes } from "@medusajs/types" import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" -import { useUpdateInventoryItem } from "../../../../../../hooks/api/inventory" import { z } from "zod" -import { zodResolver } from "@hookform/resolvers/zod" +import { Form } from "../../../../../../components/common/form" +import { useUpdateInventoryItem } from "../../../../../../hooks/api/inventory" type EditInventoryItemFormProps = { item: InventoryTypes.InventoryItemDTO diff --git a/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/edit-inventory-item/edit-item-drawer.tsx b/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/edit-inventory-item/edit-item-drawer.tsx index 7d4996f2b7..89635fbcd1 100644 --- a/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/edit-inventory-item/edit-item-drawer.tsx +++ b/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/edit-inventory-item/edit-item-drawer.tsx @@ -1,9 +1,9 @@ -import { EditInventoryItemForm } from "./components/edit-item-form" import { Heading } from "@medusajs/ui" -import { RouteDrawer } from "../../../../../components/route-modal" -import { useInventoryItem } from "../../../../../hooks/api/inventory" -import { useParams } from "react-router-dom" import { useTranslation } from "react-i18next" +import { useParams } from "react-router-dom" +import { RouteDrawer } from "../../../../../components/modals" +import { useInventoryItem } from "../../../../../hooks/api/inventory" +import { EditInventoryItemForm } from "./components/edit-item-form" export const InventoryItemEdit = () => { const { id } = useParams() diff --git a/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/manage-locations/components/manage-locations-form.tsx b/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/manage-locations/components/manage-locations-form.tsx index 03acfa2334..17a8b7b35a 100644 --- a/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/manage-locations/components/manage-locations-form.tsx +++ b/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/manage-locations/components/manage-locations-form.tsx @@ -1,16 +1,16 @@ import * as zod from "zod" -import { Button, Text, toast } from "@medusajs/ui" +import { zodResolver } from "@hookform/resolvers/zod" import { AdminInventoryItem, AdminStockLocation } from "@medusajs/types" +import { Button, Text, toast } from "@medusajs/ui" +import { useFieldArray, useForm } from "react-hook-form" import { useTranslation } from "react-i18next" import { z } from "zod" -import { zodResolver } from "@hookform/resolvers/zod" import { RouteDrawer, useRouteModal, -} from "../../../../../../components/route-modal" +} from "../../../../../../components/modals" import { useBatchUpdateInventoryLevels } from "../../../../../../hooks/api/inventory" -import { useFieldArray, useForm } from "react-hook-form" import { LocationItem } from "./location-item" import { useEffect, useMemo } from "react" diff --git a/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/manage-locations/manage-locations-drawer.tsx b/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/manage-locations/manage-locations-drawer.tsx index 22800bf6d0..b5d0a14916 100644 --- a/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/manage-locations/manage-locations-drawer.tsx +++ b/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/manage-locations/manage-locations-drawer.tsx @@ -1,11 +1,11 @@ import { Heading } from "@medusajs/ui" import { useTranslation } from "react-i18next" -import { ManageLocationsForm } from "./components/manage-locations-form" -import { RouteDrawer } from "../../../../../components/route-modal" -import { useInventoryItem } from "../../../../../hooks/api/inventory" import { useParams } from "react-router-dom" +import { RouteDrawer } from "../../../../../components/modals" +import { useInventoryItem } from "../../../../../hooks/api/inventory" import { useStockLocations } from "../../../../../hooks/api/stock-locations" +import { ManageLocationsForm } from "./components/manage-locations-form" export const ManageLocationsDrawer = () => { const { id } = useParams() diff --git a/packages/admin-next/dashboard/src/routes/locations/location-create/components/create-location-form/create-location-form.tsx b/packages/admin-next/dashboard/src/routes/locations/location-create/components/create-location-form/create-location-form.tsx index 503392c70c..6ddf8b3d8b 100644 --- a/packages/admin-next/dashboard/src/routes/locations/location-create/components/create-location-form/create-location-form.tsx +++ b/packages/admin-next/dashboard/src/routes/locations/location-create/components/create-location-form/create-location-form.tsx @@ -8,7 +8,7 @@ import { CountrySelect } from "../../../../../components/inputs/country-select" import { RouteFocusModal, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { useCreateStockLocation } from "../../../../../hooks/api/stock-locations" const CreateLocationSchema = zod.object({ diff --git a/packages/admin-next/dashboard/src/routes/locations/location-create/location-create.tsx b/packages/admin-next/dashboard/src/routes/locations/location-create/location-create.tsx index 5d6a290e16..71cdb3455f 100644 --- a/packages/admin-next/dashboard/src/routes/locations/location-create/location-create.tsx +++ b/packages/admin-next/dashboard/src/routes/locations/location-create/location-create.tsx @@ -1,4 +1,4 @@ -import { RouteFocusModal } from "../../../components/route-modal" +import { RouteFocusModal } from "../../../components/modals" import { CreateLocationForm } from "./components/create-location-form" export const LocationCreate = () => { diff --git a/packages/admin-next/dashboard/src/routes/locations/location-edit/components/edit-location-form/edit-location-form.tsx b/packages/admin-next/dashboard/src/routes/locations/location-edit/components/edit-location-form/edit-location-form.tsx index 3be9c1a3b7..38228b9309 100644 --- a/packages/admin-next/dashboard/src/routes/locations/location-edit/components/edit-location-form/edit-location-form.tsx +++ b/packages/admin-next/dashboard/src/routes/locations/location-edit/components/edit-location-form/edit-location-form.tsx @@ -10,7 +10,7 @@ import { CountrySelect } from "../../../../../components/inputs/country-select" import { RouteDrawer, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { useUpdateStockLocation } from "../../../../../hooks/api/stock-locations" type EditLocationFormProps = { diff --git a/packages/admin-next/dashboard/src/routes/locations/location-edit/location-edit.tsx b/packages/admin-next/dashboard/src/routes/locations/location-edit/location-edit.tsx index 2701bae9f6..3fdc78e82c 100644 --- a/packages/admin-next/dashboard/src/routes/locations/location-edit/location-edit.tsx +++ b/packages/admin-next/dashboard/src/routes/locations/location-edit/location-edit.tsx @@ -1,7 +1,7 @@ import { Heading } from "@medusajs/ui" import { useTranslation } from "react-i18next" import { useParams } from "react-router-dom" -import { RouteDrawer } from "../../../components/route-modal" +import { RouteDrawer } from "../../../components/modals" import { useStockLocation } from "../../../hooks/api/stock-locations" import { EditLocationForm } from "./components/edit-location-form" diff --git a/packages/admin-next/dashboard/src/routes/locations/location-sales-channels/components/edit-sales-channels-form/edit-sales-channels-form.tsx b/packages/admin-next/dashboard/src/routes/locations/location-sales-channels/components/edit-sales-channels-form/edit-sales-channels-form.tsx index eb691d9f07..ee6aef799f 100644 --- a/packages/admin-next/dashboard/src/routes/locations/location-sales-channels/components/edit-sales-channels-form/edit-sales-channels-form.tsx +++ b/packages/admin-next/dashboard/src/routes/locations/location-sales-channels/components/edit-sales-channels-form/edit-sales-channels-form.tsx @@ -11,7 +11,7 @@ import { useForm } from "react-hook-form" import { RouteFocusModal, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { DataTable } from "../../../../../components/table/data-table" import { useSalesChannels } from "../../../../../hooks/api/sales-channels" import { useUpdateStockLocationSalesChannels } from "../../../../../hooks/api/stock-locations" diff --git a/packages/admin-next/dashboard/src/routes/locations/location-sales-channels/location-sales-channels.tsx b/packages/admin-next/dashboard/src/routes/locations/location-sales-channels/location-sales-channels.tsx index 816ffb7880..9bf4fa38b5 100644 --- a/packages/admin-next/dashboard/src/routes/locations/location-sales-channels/location-sales-channels.tsx +++ b/packages/admin-next/dashboard/src/routes/locations/location-sales-channels/location-sales-channels.tsx @@ -1,6 +1,6 @@ import { useParams } from "react-router-dom" -import { RouteFocusModal } from "../../../components/route-modal" +import { RouteFocusModal } from "../../../components/modals" import { useStockLocation } from "../../../hooks/api/stock-locations" import { LocationEditSalesChannelsForm } from "./components/edit-sales-channels-form" diff --git a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-create/components/create-service-zone-form/create-service-zone-form.tsx b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-create/components/create-service-zone-form/create-service-zone-form.tsx index 2305d9550b..d117d7be0a 100644 --- a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-create/components/create-service-zone-form/create-service-zone-form.tsx +++ b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-create/components/create-service-zone-form/create-service-zone-form.tsx @@ -12,7 +12,7 @@ import { SplitView } from "../../../../../components/layout/split-view" import { RouteFocusModal, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { useCreateFulfillmentSetServiceZone } from "../../../../../hooks/api/fulfillment-sets" import { GeoZoneForm } from "../../../common/components/geo-zone-form" import { FulfillmentSetType } from "../../../common/constants" diff --git a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-create/location-service-zone-create.tsx b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-create/location-service-zone-create.tsx index 671fa693b5..3e11712f0e 100644 --- a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-create/location-service-zone-create.tsx +++ b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-create/location-service-zone-create.tsx @@ -1,6 +1,6 @@ import { json, useLoaderData, useParams } from "react-router-dom" -import { RouteFocusModal } from "../../../components/route-modal" +import { RouteFocusModal } from "../../../components/modals" import { useStockLocation } from "../../../hooks/api/stock-locations" import { FulfillmentSetType } from "../common/constants" import { CreateServiceZoneForm } from "./components/create-service-zone-form" diff --git a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-edit/components/edit-region-form/edit-service-zone-form.tsx b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-edit/components/edit-region-form/edit-service-zone-form.tsx index 8296835969..a82fcaf7e3 100644 --- a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-edit/components/edit-region-form/edit-service-zone-form.tsx +++ b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-edit/components/edit-region-form/edit-service-zone-form.tsx @@ -9,7 +9,7 @@ import { InlineTip } from "../../../../../components/common/inline-tip" import { RouteDrawer, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { useUpdateFulfillmentSetServiceZone } from "../../../../../hooks/api/fulfillment-sets" type EditServiceZoneFormProps = { diff --git a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-edit/location-service-zone-edit.tsx b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-edit/location-service-zone-edit.tsx index 21bfce7524..db7c1854f3 100644 --- a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-edit/location-service-zone-edit.tsx +++ b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-edit/location-service-zone-edit.tsx @@ -2,7 +2,7 @@ import { Heading } from "@medusajs/ui" import { useTranslation } from "react-i18next" import { json, useParams } from "react-router-dom" -import { RouteDrawer } from "../../../components/route-modal" +import { RouteDrawer } from "../../../components/modals" import { useStockLocation } from "../../../hooks/api/stock-locations" import { EditServiceZoneForm } from "./components/edit-region-form" diff --git a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-manage-areas/components/edit-region-areas-form/edit-service-zone-areas-form.tsx b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-manage-areas/components/edit-region-areas-form/edit-service-zone-areas-form.tsx index 79d486f7e5..affd197c2d 100644 --- a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-manage-areas/components/edit-region-areas-form/edit-service-zone-areas-form.tsx +++ b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-manage-areas/components/edit-region-areas-form/edit-service-zone-areas-form.tsx @@ -10,7 +10,7 @@ import { SplitView } from "../../../../../components/layout/split-view" import { RouteFocusModal, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { useUpdateFulfillmentSetServiceZone } from "../../../../../hooks/api/fulfillment-sets" import { countries } from "../../../../../lib/countries" import { GeoZoneForm } from "../../../common/components/geo-zone-form" diff --git a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-manage-areas/location-service-zone-manage-areas.tsx b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-manage-areas/location-service-zone-manage-areas.tsx index 13b6b385aa..5ddc73aa1e 100644 --- a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-manage-areas/location-service-zone-manage-areas.tsx +++ b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-manage-areas/location-service-zone-manage-areas.tsx @@ -1,6 +1,6 @@ import { json, useParams } from "react-router-dom" -import { RouteFocusModal } from "../../../components/route-modal" +import { RouteFocusModal } from "../../../components/modals" import { useStockLocation } from "../../../hooks/api/stock-locations" import { EditServiceZoneAreasForm } from "./components/edit-region-areas-form" diff --git a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-create/components/create-shipping-options-form/create-shipping-options-form.tsx b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-create/components/create-shipping-options-form/create-shipping-options-form.tsx index 698958a235..dcdca698a2 100644 --- a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-create/components/create-shipping-options-form/create-shipping-options-form.tsx +++ b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-create/components/create-shipping-options-form/create-shipping-options-form.tsx @@ -8,7 +8,7 @@ import { useState } from "react" import { RouteFocusModal, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { useCreateShippingOptions } from "../../../../../hooks/api/shipping-options" import { castNumber } from "../../../../../lib/cast-number" import { ShippingOptionPriceType } from "../../../common/constants" diff --git a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-create/location-service-zone-shipping-option-create.tsx b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-create/location-service-zone-shipping-option-create.tsx index 4164dfbbc0..7381b181d2 100644 --- a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-create/location-service-zone-shipping-option-create.tsx +++ b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-create/location-service-zone-shipping-option-create.tsx @@ -5,7 +5,7 @@ import { useSearchParams, } from "react-router-dom" -import { RouteFocusModal } from "../../../components/route-modal" +import { RouteFocusModal } from "../../../components/modals" import { useStockLocation } from "../../../hooks/api/stock-locations" import { CreateShippingOptionsForm } from "./components/create-shipping-options-form" import { LOC_CREATE_SHIPPING_OPTION_FIELDS } from "./constants" diff --git a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-edit/components/edit-region-form/edit-shipping-option-form.tsx b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-edit/components/edit-region-form/edit-shipping-option-form.tsx index 006b32038a..50b9f8c0d3 100644 --- a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-edit/components/edit-region-form/edit-shipping-option-form.tsx +++ b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-edit/components/edit-region-form/edit-shipping-option-form.tsx @@ -11,7 +11,7 @@ import { Combobox } from "../../../../../components/inputs/combobox" import { RouteDrawer, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { useUpdateShippingOptions } from "../../../../../hooks/api/shipping-options" import { useComboboxData } from "../../../../../hooks/use-combobox-data" import { sdk } from "../../../../../lib/client" diff --git a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-edit/location-service-zone-shipping-option-edit.tsx b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-edit/location-service-zone-shipping-option-edit.tsx index df0187371d..9447ae7282 100644 --- a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-edit/location-service-zone-shipping-option-edit.tsx +++ b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-edit/location-service-zone-shipping-option-edit.tsx @@ -2,7 +2,7 @@ import { Heading } from "@medusajs/ui" import { useTranslation } from "react-i18next" import { json, useParams } from "react-router-dom" -import { RouteDrawer } from "../../../components/route-modal" +import { RouteDrawer } from "../../../components/modals" import { useShippingOptions } from "../../../hooks/api/shipping-options" import { EditShippingOptionForm } from "./components/edit-region-form" diff --git a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-pricing/components/create-shipping-options-form/edit-shipping-options-pricing-form.tsx b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-pricing/components/create-shipping-options-form/edit-shipping-options-pricing-form.tsx index 099196ff7a..ff0ee54f2a 100644 --- a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-pricing/components/create-shipping-options-form/edit-shipping-options-pricing-form.tsx +++ b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-pricing/components/create-shipping-options-form/edit-shipping-options-pricing-form.tsx @@ -11,7 +11,7 @@ import { DataGridRoot } from "../../../../../components/data-grid/data-grid-root import { RouteFocusModal, useRouteModal, -} from "../../../../../components/route-modal/index" +} from "../../../../../components/modals/index" import { useRegions } from "../../../../../hooks/api/regions" import { useUpdateShippingOptions } from "../../../../../hooks/api/shipping-options" import { useStore } from "../../../../../hooks/api/store" diff --git a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-pricing/location-service-zone-shipping-option-pricing.tsx b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-pricing/location-service-zone-shipping-option-pricing.tsx index 0ce1247d7a..695658a1c6 100644 --- a/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-pricing/location-service-zone-shipping-option-pricing.tsx +++ b/packages/admin-next/dashboard/src/routes/locations/location-service-zone-shipping-option-pricing/location-service-zone-shipping-option-pricing.tsx @@ -1,6 +1,6 @@ import { json, useParams } from "react-router-dom" -import { RouteFocusModal } from "../../../components/route-modal" +import { RouteFocusModal } from "../../../components/modals" import { useShippingOptions } from "../../../hooks/api/shipping-options" import { EditShippingOptionsPricingForm } from "./components/create-shipping-options-form" diff --git a/packages/admin-next/dashboard/src/routes/orders/order-create-fulfillment/components/order-create-fulfillment-form/order-create-fulfillment-form.tsx b/packages/admin-next/dashboard/src/routes/orders/order-create-fulfillment/components/order-create-fulfillment-form/order-create-fulfillment-form.tsx index 2870f13e1a..d71c6dada6 100644 --- a/packages/admin-next/dashboard/src/routes/orders/order-create-fulfillment/components/order-create-fulfillment-form/order-create-fulfillment-form.tsx +++ b/packages/admin-next/dashboard/src/routes/orders/order-create-fulfillment/components/order-create-fulfillment-form/order-create-fulfillment-form.tsx @@ -11,13 +11,13 @@ import { Form } from "../../../../../components/common/form" import { RouteFocusModal, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { useFulfillmentProviders } from "../../../../../hooks/api/fulfillment-providers" +import { useCreateOrderFulfillment } from "../../../../../hooks/api/orders" import { useStockLocations } from "../../../../../hooks/api/stock-locations" import { getFulfillableQuantity } from "../../../../../lib/order-item" -import { OrderCreateFulfillmentItem } from "./order-create-fulfillment-item" -import { useCreateOrderFulfillment } from "../../../../../hooks/api/orders" import { CreateFulfillmentSchema } from "./constants" +import { OrderCreateFulfillmentItem } from "./order-create-fulfillment-item" type OrderCreateFulfillmentFormProps = { order: AdminOrder diff --git a/packages/admin-next/dashboard/src/routes/orders/order-create-fulfillment/order-create-fulfillments.tsx b/packages/admin-next/dashboard/src/routes/orders/order-create-fulfillment/order-create-fulfillments.tsx index 4ff8cd4cd6..10f725df9e 100644 --- a/packages/admin-next/dashboard/src/routes/orders/order-create-fulfillment/order-create-fulfillments.tsx +++ b/packages/admin-next/dashboard/src/routes/orders/order-create-fulfillment/order-create-fulfillments.tsx @@ -1,8 +1,8 @@ import { useParams } from "react-router-dom" -import { RouteFocusModal } from "../../../components/route-modal" -import { OrderCreateFulfillmentForm } from "./components/order-create-fulfillment-form" +import { RouteFocusModal } from "../../../components/modals" import { useOrder } from "../../../hooks/api/orders" +import { OrderCreateFulfillmentForm } from "./components/order-create-fulfillment-form" export function OrderCreateFulfillment() { const { id } = useParams() diff --git a/packages/admin-next/dashboard/src/routes/price-lists/common/components/price-list-customer-group-rule-form/index.ts b/packages/admin-next/dashboard/src/routes/price-lists/common/components/price-list-customer-group-rule-form/index.ts new file mode 100644 index 0000000000..3276802054 --- /dev/null +++ b/packages/admin-next/dashboard/src/routes/price-lists/common/components/price-list-customer-group-rule-form/index.ts @@ -0,0 +1 @@ +export * from "./price-list-customer-group-rule-form" diff --git a/packages/admin-next/dashboard/src/routes/price-lists/common/components/price-list-customer-group-rule-form/price-list-customer-group-rule-form.tsx b/packages/admin-next/dashboard/src/routes/price-lists/common/components/price-list-customer-group-rule-form/price-list-customer-group-rule-form.tsx new file mode 100644 index 0000000000..89ac742325 --- /dev/null +++ b/packages/admin-next/dashboard/src/routes/price-lists/common/components/price-list-customer-group-rule-form/price-list-customer-group-rule-form.tsx @@ -0,0 +1,187 @@ +import { HttpTypes } from "@medusajs/types" +import { Button, Checkbox } from "@medusajs/ui" +import { keepPreviousData } from "@tanstack/react-query" +import { + OnChangeFn, + RowSelectionState, + createColumnHelper, +} from "@tanstack/react-table" +import { useEffect, useMemo, useState } from "react" +import { useTranslation } from "react-i18next" +import { StackedDrawer } from "../../../../../components/modals/stacked-drawer" +import { StackedFocusModal } from "../../../../../components/modals/stacked-focus-modal" +import { DataTable } from "../../../../../components/table/data-table" +import { useCustomerGroups } from "../../../../../hooks/api/customer-groups" +import { useCustomerGroupTableColumns } from "../../../../../hooks/table/columns/use-customer-group-table-columns" +import { useCustomerGroupTableFilters } from "../../../../../hooks/table/filters/use-customer-group-table-filters" +import { useCustomerGroupTableQuery } from "../../../../../hooks/table/query/use-customer-group-table-query" +import { useDataTable } from "../../../../../hooks/use-data-table" +import { PriceListCustomerGroup } from "../../schemas" + +const PAGE_SIZE = 50 +const PREFIX = "cg" + +type PriceListCustomerGroupRuleFormProps = { + type: "focus" | "drawer" + state: PriceListCustomerGroup[] + setState: (state: PriceListCustomerGroup[]) => void +} + +const initRowSelection = (state: PriceListCustomerGroup[]) => { + return state.reduce((acc, group) => { + acc[group.id] = true + return acc + }, {} as RowSelectionState) +} + +export const PriceListCustomerGroupRuleForm = ({ + state, + setState, + type, +}: PriceListCustomerGroupRuleFormProps) => { + const { t } = useTranslation() + + const [rowSelection, setRowSelection] = useState( + initRowSelection(state) + ) + const [intermediate, setIntermediate] = + useState(state) + + useEffect(() => { + // If the selected customer groups change outside of the drawer, + // update the row selection state and intermediate state + setRowSelection(initRowSelection(state)) + setIntermediate(state) + }, [state]) + + const { searchParams, raw } = useCustomerGroupTableQuery({ + pageSize: PAGE_SIZE, + prefix: PREFIX, + }) + const { customer_groups, count, isLoading, isError, error } = + useCustomerGroups(searchParams, { + placeholderData: keepPreviousData, + }) + + const updater: OnChangeFn = (value) => { + const state = typeof value === "function" ? value(rowSelection) : value + const currentIds = Object.keys(rowSelection) + + const ids = Object.keys(state) + + const newIds = ids.filter((id) => !currentIds.includes(id)) + const removedIds = currentIds.filter((id) => !ids.includes(id)) + + const newCustomerGroups = + customer_groups + ?.filter((cg) => newIds.includes(cg.id)) + .map((cg) => ({ id: cg.id, name: cg.name! })) || [] + + const filteredIntermediate = intermediate.filter( + (cg) => !removedIds.includes(cg.id) + ) + + setIntermediate([...filteredIntermediate, ...newCustomerGroups]) + setRowSelection(state) + } + + const handleSave = () => { + setState(intermediate) + } + + const filters = useCustomerGroupTableFilters() + const columns = useColumns() + + const { table } = useDataTable({ + data: customer_groups || [], + columns, + count, + enablePagination: true, + enableRowSelection: true, + getRowId: (row) => row.id, + rowSelection: { + state: rowSelection, + updater, + }, + pageSize: PAGE_SIZE, + prefix: PREFIX, + }) + + const Component = type === "focus" ? StackedFocusModal : StackedDrawer + + if (isError) { + throw error + } + + return ( +
+ + + + + + + + + +
+ ) +} + +const columnHelper = createColumnHelper() + +const useColumns = () => { + const base = useCustomerGroupTableColumns() + + return useMemo( + () => [ + columnHelper.display({ + id: "select", + header: ({ table }) => { + return ( + + table.toggleAllPageRowsSelected(!!value) + } + /> + ) + }, + cell: ({ row }) => { + return ( + row.toggleSelected(!!value)} + onClick={(e) => { + e.stopPropagation() + }} + /> + ) + }, + }), + ...base, + ], + [base] + ) +} diff --git a/packages/admin-next/dashboard/src/routes/pricing/common/constants.ts b/packages/admin-next/dashboard/src/routes/price-lists/common/constants.ts similarity index 100% rename from packages/admin-next/dashboard/src/routes/pricing/common/constants.ts rename to packages/admin-next/dashboard/src/routes/price-lists/common/constants.ts diff --git a/packages/admin-next/dashboard/src/routes/price-lists/common/hooks/use-delete-price-list-action.tsx b/packages/admin-next/dashboard/src/routes/price-lists/common/hooks/use-delete-price-list-action.tsx new file mode 100644 index 0000000000..0619bd1061 --- /dev/null +++ b/packages/admin-next/dashboard/src/routes/price-lists/common/hooks/use-delete-price-list-action.tsx @@ -0,0 +1,56 @@ +import { HttpTypes } from "@medusajs/types" +import { toast, usePrompt } from "@medusajs/ui" +import { useTranslation } from "react-i18next" +import { useNavigate } from "react-router-dom" + +import { useDeletePriceList } from "../../../../hooks/api/price-lists" + +export const useDeletePriceListAction = ({ + priceList, +}: { + priceList: HttpTypes.AdminPriceList +}) => { + const { t } = useTranslation() + const prompt = usePrompt() + const navigate = useNavigate() + + const { mutateAsync } = useDeletePriceList(priceList.id) + + const handleDelete = async () => { + const res = await prompt({ + title: t("general.areYouSure"), + description: t("priceLists.delete.confirmation", { + title: priceList.title, + }), + confirmText: t("actions.delete"), + cancelText: t("actions.cancel"), + }) + + if (!res) { + return + } + + await mutateAsync(undefined, { + onSuccess: () => { + toast.success(t("general.success"), { + description: t("priceLists.delete.successToast", { + name: priceList.title, + }), + dismissable: true, + dismissLabel: t("actions.close"), + }) + + navigate("/price-lists") + }, + onError: (e) => { + toast.error(t("general.error"), { + description: e.message, + dismissable: true, + dismissLabel: t("actions.close"), + }) + }, + }) + } + + return handleDelete +} diff --git a/packages/admin-next/dashboard/src/routes/price-lists/common/hooks/use-price-list-currency-data.tsx b/packages/admin-next/dashboard/src/routes/price-lists/common/hooks/use-price-list-currency-data.tsx new file mode 100644 index 0000000000..91a83d66ef --- /dev/null +++ b/packages/admin-next/dashboard/src/routes/price-lists/common/hooks/use-price-list-currency-data.tsx @@ -0,0 +1,51 @@ +import { HttpTypes } from "@medusajs/types" +import { useRegions } from "../../../../hooks/api/regions" +import { useStore } from "../../../../hooks/api/store" + +type UsePriceListCurrencyDataReturn = + | { isReady: false; currencies: undefined; regions: undefined } + | { + isReady: true + currencies: HttpTypes.AdminStoreCurrency[] + regions: HttpTypes.AdminRegion[] + } + +export const usePriceListCurrencyData = (): UsePriceListCurrencyDataReturn => { + const { + store, + isPending: isStorePending, + isError: isStoreError, + error: storeError, + } = useStore({ + fields: "+supported_currencies", + }) + + const currencies = store?.supported_currencies + + const { + regions, + isPending: isRegionsPending, + isError: isRegionsError, + error: regionsError, + } = useRegions({ + fields: "id,name,currency_code", + limit: 999, + }) + + const isReady = + !!currencies && !!regions && !isStorePending && !isRegionsPending + + if (isRegionsError) { + throw regionsError + } + + if (isStoreError) { + throw storeError + } + + if (!isReady) { + return { regions: undefined, currencies: undefined, isReady: false } + } + + return { regions, currencies, isReady } +} diff --git a/packages/admin-next/dashboard/src/routes/price-lists/common/hooks/use-price-list-grid-columns.tsx b/packages/admin-next/dashboard/src/routes/price-lists/common/hooks/use-price-list-grid-columns.tsx new file mode 100644 index 0000000000..7dc9254804 --- /dev/null +++ b/packages/admin-next/dashboard/src/routes/price-lists/common/hooks/use-price-list-grid-columns.tsx @@ -0,0 +1,104 @@ +import { HttpTypes, StoreCurrencyDTO } from "@medusajs/types" +import { ColumnDef } from "@tanstack/react-table" +import { useMemo } from "react" +import { useTranslation } from "react-i18next" + +import { Thumbnail } from "../../../../components/common/thumbnail" +import { DataGridCurrencyCell } from "../../../../components/data-grid/data-grid-cells/data-grid-currency-cell" +import { DataGridReadOnlyCell } from "../../../../components/data-grid/data-grid-cells/data-grid-readonly-cell" +import { createDataGridHelper } from "../../../../components/data-grid/utils" +import { isProductRow } from "../utils" + +const columnHelper = createDataGridHelper< + HttpTypes.AdminProduct | HttpTypes.AdminProductVariant +>() + +export const usePriceListGridColumns = ({ + currencies = [], + regions = [], +}: { + currencies?: StoreCurrencyDTO[] + regions?: HttpTypes.AdminRegion[] +}) => { + const { t } = useTranslation() + + const colDefs: ColumnDef< + HttpTypes.AdminProduct | HttpTypes.AdminProductVariant + >[] = useMemo(() => { + return [ + columnHelper.column({ + id: t("fields.title"), + header: t("fields.title"), + cell: ({ row }) => { + const entity = row.original + + if (isProductRow(entity)) { + return ( + +
+ + {entity.title} +
+
+ ) + } + + return ( + +
+ {entity.title} +
+
+ ) + }, + disableHiding: true, + }), + ...currencies.map((currency) => { + return columnHelper.column({ + id: `currency-price-${currency.currency_code}`, + name: `Price ${currency.currency_code.toUpperCase()}`, + header: `Price ${currency.currency_code.toUpperCase()}`, + cell: (context) => { + const entity = context.row.original + + if (isProductRow(entity)) { + return + } + + return ( + + ) + }, + }) + }), + ...regions.map((region) => { + return columnHelper.column({ + id: `region-price-${region.id}`, + name: `Price ${region.name}`, + header: `Price ${region.name}`, + cell: (context) => { + const entity = context.row.original + + if (isProductRow(entity)) { + return + } + + return ( + + ) + }, + }) + }), + ] + }, [t, currencies, regions]) + + return colDefs +} diff --git a/packages/admin-next/dashboard/src/routes/price-lists/common/schemas.ts b/packages/admin-next/dashboard/src/routes/price-lists/common/schemas.ts new file mode 100644 index 0000000000..344e43eb88 --- /dev/null +++ b/packages/admin-next/dashboard/src/routes/price-lists/common/schemas.ts @@ -0,0 +1,96 @@ +import { z } from "zod" + +const PriceListCustomerGroupSchema = z.object({ + id: z.string(), + name: z.string(), +}) + +export type PriceListCustomerGroup = z.infer< + typeof PriceListCustomerGroupSchema +> + +export const PriceListRulesSchema = z.object({ + customer_group_id: z.array(PriceListCustomerGroupSchema).nullish(), +}) + +const PriceListCreateCurrencyPriceSchema = z.object({ + amount: z.string().optional(), +}) + +export type PriceListCreateCurrencyPrice = z.infer< + typeof PriceListCreateCurrencyPriceSchema +> + +const PriceListCreateRegionPriceSchema = z.object({ + amount: z.string().optional(), +}) + +export type PriceListCreateRegionPriceSchema = z.infer< + typeof PriceListCreateRegionPriceSchema +> + +const PriceListCreateProductVariantSchema = z.object({ + currency_prices: z.record(PriceListCreateCurrencyPriceSchema.optional()), + region_prices: z.record(PriceListCreateRegionPriceSchema.optional()), +}) + +export type PriceListCreateProductVariantSchema = z.infer< + typeof PriceListCreateProductVariantSchema +> + +const PriceListCreateProductVariantsSchema = z.record( + PriceListCreateProductVariantSchema +) + +export type PriceListCreateProductVariantsSchema = z.infer< + typeof PriceListCreateProductVariantsSchema +> + +export const PriceListCreateProductsSchema = z.record( + z.object({ + variants: PriceListCreateProductVariantsSchema, + }) +) + +export type PriceListCreateProductsSchema = z.infer< + typeof PriceListCreateProductsSchema +> + +export const PriceListUpdateCurrencyPriceSchema = z.object({ + amount: z.string().nullish(), + id: z.string().nullish(), +}) + +export type PriceListUpdateCurrencyPrice = z.infer< + typeof PriceListUpdateCurrencyPriceSchema +> + +export const PriceListUpdateRegionPriceSchema = z.object({ + amount: z.string().nullish(), + id: z.string().nullish(), +}) + +export type PriceListUpdateRegionPrice = z.infer< + typeof PriceListUpdateRegionPriceSchema +> + +export const PriceListUpdateProductVariantsSchema = z.record( + z.object({ + currency_prices: z.record(PriceListUpdateCurrencyPriceSchema.optional()), + region_prices: z.record(PriceListUpdateRegionPriceSchema.optional()), + }) +) + +export type PriceListUpdateProductVariantsSchema = z.infer< + typeof PriceListUpdateProductVariantsSchema +> + +export const PriceListUpdateProductsSchema = z.record( + z.object({ + variants: PriceListUpdateProductVariantsSchema, + }) +) + +export type PriceListUpdateProductsSchema = z.infer< + typeof PriceListUpdateProductsSchema +> diff --git a/packages/admin-next/dashboard/src/routes/price-lists/common/utils.ts b/packages/admin-next/dashboard/src/routes/price-lists/common/utils.ts new file mode 100644 index 0000000000..4660da8336 --- /dev/null +++ b/packages/admin-next/dashboard/src/routes/price-lists/common/utils.ts @@ -0,0 +1,123 @@ +import { HttpTypes } from "@medusajs/types" +import { TFunction } from "i18next" +import { json } from "react-router-dom" +import { castNumber } from "../../../lib/cast-number" +import { PriceListDateStatus, PriceListStatus } from "./constants" +import { + PriceListCreateCurrencyPrice, + PriceListCreateProductVariantSchema, + PriceListCreateProductsSchema, +} from "./schemas" + +const getValues = (priceList: HttpTypes.AdminPriceList) => { + const startsAt = priceList.starts_at + const endsAt = priceList.ends_at + + const isExpired = endsAt ? new Date(endsAt) < new Date() : false + const isScheduled = startsAt ? new Date(startsAt) > new Date() : false + const isDraft = priceList.status === PriceListStatus.DRAFT + + return { + isExpired, + isScheduled, + isDraft, + } +} + +export const getPriceListStatus = ( + t: TFunction<"translation">, + priceList: HttpTypes.AdminPriceList +) => { + const { isExpired, isScheduled, isDraft } = getValues(priceList) + + let text = t("priceLists.fields.status.options.active") + let color: "red" | "grey" | "orange" | "green" = "green" + let status: string = PriceListStatus.ACTIVE + + if (isDraft) { + color = "grey" + text = t("priceLists.fields.status.options.draft") + status = PriceListStatus.DRAFT + } + + if (isExpired) { + color = "red" + text = t("priceLists.fields.status.options.expired") + status = PriceListDateStatus.EXPIRED + } + + if (isScheduled) { + color = "orange" + text = t("priceLists.fields.status.options.scheduled") + status = PriceListDateStatus.SCHEDULED + } + + return { + color, + text, + status, + } +} + +export const isProductRow = ( + row: HttpTypes.AdminProduct | HttpTypes.AdminProductVariant +): row is HttpTypes.AdminProduct => { + return "variants" in row +} + +const extractPricesFromVariants = ( + variantId: string, + variant: PriceListCreateProductVariantSchema, + regions: HttpTypes.AdminRegion[] +) => { + const extractPriceDetails = ( + price: PriceListCreateCurrencyPrice, + priceType: "region" | "currency", + id: string + ) => { + const currencyCode = + priceType === "currency" + ? id + : regions.find((r) => r.id === id)?.currency_code + + if (!currencyCode) { + throw json({ message: "Currency code not found" }, 400) + } + + return { + amount: castNumber(price.amount!), + ...(priceType === "region" ? { rules: { region_id: id } } : {}), + currency_code: currencyCode, + variant_id: variantId, + } + } + + const currencyPrices = Object.entries(variant.currency_prices || {}).flatMap( + ([currencyCode, currencyPrice]) => { + return currencyPrice?.amount + ? [extractPriceDetails(currencyPrice, "currency", currencyCode)] + : [] + } + ) + + const regionPrices = Object.entries(variant.region_prices || {}).flatMap( + ([regionId, regionPrice]) => { + return regionPrice?.amount + ? [extractPriceDetails(regionPrice, "region", regionId)] + : [] + } + ) + + return [...currencyPrices, ...regionPrices] +} + +export const exctractPricesFromProducts = ( + products: PriceListCreateProductsSchema, + regions: HttpTypes.AdminRegion[] +) => { + return Object.values(products).flatMap(({ variants }) => + Object.entries(variants).flatMap(([variantId, variant]) => + extractPricesFromVariants(variantId, variant, regions) + ) + ) +} diff --git a/packages/admin-next/dashboard/src/routes/pricing/pricing-configuration/components/price-list-configuration-form/index.ts b/packages/admin-next/dashboard/src/routes/price-lists/price-list-configuration/components/price-list-configuration-form/index.ts similarity index 100% rename from packages/admin-next/dashboard/src/routes/pricing/pricing-configuration/components/price-list-configuration-form/index.ts rename to packages/admin-next/dashboard/src/routes/price-lists/price-list-configuration/components/price-list-configuration-form/index.ts diff --git a/packages/admin-next/dashboard/src/routes/price-lists/price-list-configuration/components/price-list-configuration-form/price-list-configuration-form.tsx b/packages/admin-next/dashboard/src/routes/price-lists/price-list-configuration/components/price-list-configuration-form/price-list-configuration-form.tsx new file mode 100644 index 0000000000..f26d34a69f --- /dev/null +++ b/packages/admin-next/dashboard/src/routes/price-lists/price-list-configuration/components/price-list-configuration-form/price-list-configuration-form.tsx @@ -0,0 +1,307 @@ +import { zodResolver } from "@hookform/resolvers/zod" +import { MagnifyingGlass, XMark } from "@medusajs/icons" +import { HttpTypes } from "@medusajs/types" +import { + Button, + DatePicker, + Heading, + IconButton, + Text, + clx, + toast, +} from "@medusajs/ui" +import { useFieldArray, useForm } from "react-hook-form" +import { useTranslation } from "react-i18next" +import { z } from "zod" + +import { Divider } from "../../../../../components/common/divider" +import { Form } from "../../../../../components/common/form" +import { RouteDrawer, useRouteModal } from "../../../../../components/modals" +import { StackedDrawer } from "../../../../../components/modals/stacked-drawer" +import { useStackedModal } from "../../../../../components/modals/stacked-modal-provider" +import { useUpdatePriceList } from "../../../../../hooks/api/price-lists" +import { PriceListCustomerGroupRuleForm } from "../../../common/components/price-list-customer-group-rule-form" +import { PricingCustomerGroupsArrayType } from "../../../price-list-create/components/price-list-create-form/schema" + +type PriceListConfigurationFormProps = { + priceList: HttpTypes.AdminPriceList + customerGroups: { id: string; name: string }[] +} + +const PriceListConfigurationSchema = z.object({ + ends_at: z.date().nullable(), + starts_at: z.date().nullable(), + customer_group_id: z.array( + z.object({ + id: z.string(), + name: z.string(), + }) + ), +}) + +const STACKED_MODAL_ID = "cg" + +// TODO: Fix DatePickers once new version is merged. +export const PriceListConfigurationForm = ({ + priceList, + customerGroups, +}: PriceListConfigurationFormProps) => { + const { t } = useTranslation() + const { handleSuccess } = useRouteModal() + const { setIsOpen } = useStackedModal() + + const form = useForm>({ + defaultValues: { + ends_at: priceList.ends_at ? new Date(priceList.ends_at) : null, + starts_at: priceList.starts_at ? new Date(priceList.starts_at) : null, + customer_group_id: customerGroups, + }, + resolver: zodResolver(PriceListConfigurationSchema), + }) + + const { fields, remove, append } = useFieldArray({ + control: form.control, + name: "customer_group_id", + keyName: "cg_id", + }) + + const handleAddCustomerGroup = (groups: PricingCustomerGroupsArrayType) => { + if (!groups.length) { + form.setValue("customer_group_id", []) + setIsOpen(STACKED_MODAL_ID, false) + return + } + + const newIds = groups.map((group) => group.id) + + const fieldsToAdd = groups.filter( + (group) => !fields.some((field) => field.id === group.id) + ) + + for (const field of fields) { + if (!newIds.includes(field.id)) { + remove(fields.indexOf(field)) + } + } + + append(fieldsToAdd) + setIsOpen(STACKED_MODAL_ID, false) + } + + const { mutateAsync } = useUpdatePriceList(priceList.id) + + const handleSubmit = form.handleSubmit(async (values) => { + await mutateAsync( + { + starts_at: values.starts_at?.toISOString() || null, + ends_at: values.ends_at?.toISOString() || null, + rules: { + customer_group_id: values.customer_group_id.map((group) => group.id), + }, + }, + { + onSuccess: () => { + toast.success(t("priceLists.configuration.edit.successToast")) + handleSuccess() + }, + onError: (error) => toast.error(error.message), + } + ) + }) + + return ( + + + {t("priceLists.configuration.edit.description")} + +
+ + { + return ( + +
+
+ + {t("priceLists.fields.startsAt.label")} + + + {t("priceLists.fields.startsAt.hint")} + +
+ + {/* TODO: Add timepicker see CORE-2382 */} + onChange(value ?? null)} + value={value ?? undefined} + /> + +
+ +
+ ) + }} + /> + + { + return ( + +
+
+ + {t("priceLists.fields.endsAt.label")} + + + {t("priceLists.fields.endsAt.hint")} + +
+ + onChange(value ?? null)} + value={value ?? undefined} + /> + +
+ +
+ ) + }} + /> + + { + return ( + +
+ + {t("priceLists.fields.customerAvailability.label")} + + + {t("priceLists.fields.customerAvailability.hint")} + +
+ +
+
+
+ {t( + "priceLists.fields.customerAvailability.attribute" + )} +
+
+ {t("operators.in")} +
+
+
+ + + + + + + + + + + + {t( + "priceLists.fields.customerAvailability.header" + )} + + + + {t( + "priceLists.fields.customerAvailability.hint" + )} + + + + + +
+ {fields.length > 0 ? ( +
+ +
+ {fields.map((field, index) => { + return ( +
+ + {field.name} + + remove(index)} + > + + +
+ ) + })} +
+
+ ) : null} +
+
+ +
+ ) + }} + /> +
+ +
+ + + + +
+
+
+
+ ) +} diff --git a/packages/admin-next/dashboard/src/routes/price-lists/price-list-configuration/index.ts b/packages/admin-next/dashboard/src/routes/price-lists/price-list-configuration/index.ts new file mode 100644 index 0000000000..1efb849021 --- /dev/null +++ b/packages/admin-next/dashboard/src/routes/price-lists/price-list-configuration/index.ts @@ -0,0 +1 @@ +export { PriceListConfiguration as Component } from "./price-list-configuration" diff --git a/packages/admin-next/dashboard/src/routes/price-lists/price-list-configuration/price-list-configuration.tsx b/packages/admin-next/dashboard/src/routes/price-lists/price-list-configuration/price-list-configuration.tsx new file mode 100644 index 0000000000..3caa060904 --- /dev/null +++ b/packages/admin-next/dashboard/src/routes/price-lists/price-list-configuration/price-list-configuration.tsx @@ -0,0 +1,68 @@ +import { Heading } from "@medusajs/ui" +import { useTranslation } from "react-i18next" +import { useParams } from "react-router-dom" +import { RouteDrawer } from "../../../components/modals" +import { useCustomerGroups } from "../../../hooks/api/customer-groups" +import { usePriceList } from "../../../hooks/api/price-lists" +import { PriceListConfigurationForm } from "./components/price-list-configuration-form" + +export const PriceListConfiguration = () => { + const { t } = useTranslation() + const { id } = useParams() + + const { price_list, isPending, isError, error } = usePriceList(id!) + + const customerGroupIds = price_list?.rules.customer_group_id as + | string[] + | undefined + + const { + customer_groups, + isPending: isCustomerGroupsPending, + isError: isCustomerGroupsError, + error: customerGroupsError, + } = useCustomerGroups( + { + id: customerGroupIds, + }, + { enabled: !!customerGroupIds?.length } + ) + + const initialCustomerGroups = + customer_groups?.map((group) => ({ + id: group.id, + name: group.name!, + })) || [] + + const isCustomerGroupsReady = isPending + ? false + : !!customerGroupIds?.length && isCustomerGroupsPending + ? false + : true + + const ready = !isPending && !!price_list && isCustomerGroupsReady + + if (isError) { + throw error + } + + if (isCustomerGroupsError) { + throw customerGroupsError + } + + return ( + + + + {t("priceLists.configuration.edit.header")} + + + {ready && ( + + )} + + ) +} diff --git a/packages/admin-next/dashboard/src/routes/price-lists/price-list-create/components/price-list-create-form/index.ts b/packages/admin-next/dashboard/src/routes/price-lists/price-list-create/components/price-list-create-form/index.ts new file mode 100644 index 0000000000..aa9655069f --- /dev/null +++ b/packages/admin-next/dashboard/src/routes/price-lists/price-list-create/components/price-list-create-form/index.ts @@ -0,0 +1 @@ +export * from "./price-list-create-form" diff --git a/packages/admin-next/dashboard/src/routes/pricing/pricing-create/components/pricing-create-form/pricing-create-form.tsx b/packages/admin-next/dashboard/src/routes/price-lists/price-list-create/components/price-list-create-form/price-list-create-form.tsx similarity index 70% rename from packages/admin-next/dashboard/src/routes/pricing/pricing-create/components/pricing-create-form/pricing-create-form.tsx rename to packages/admin-next/dashboard/src/routes/price-lists/price-list-create/components/price-list-create-form/price-list-create-form.tsx index f4b580f29b..2476028c72 100644 --- a/packages/admin-next/dashboard/src/routes/pricing/pricing-create/components/pricing-create-form/pricing-create-form.tsx +++ b/packages/admin-next/dashboard/src/routes/price-lists/price-list-create/components/price-list-create-form/price-list-create-form.tsx @@ -1,20 +1,20 @@ import { zodResolver } from "@hookform/resolvers/zod" -import { Button, ProgressStatus, ProgressTabs } from "@medusajs/ui" +import { Button, ProgressStatus, ProgressTabs, toast } from "@medusajs/ui" import { FieldPath, useForm } from "react-hook-form" import { useTranslation } from "react-i18next" -import { CreatePriceListDTO, CreatePriceListPriceDTO } from "@medusajs/types" +import { HttpTypes, PriceListStatus, PriceListType } from "@medusajs/types" import { useState } from "react" import { z } from "zod" import { RouteFocusModal, useRouteModal, -} from "../../../../../components/route-modal" +} from "../../../../../components/modals" import { useCreatePriceList } from "../../../../../hooks/api/price-lists" -import { castNumber } from "../../../../../lib/cast-number" -import { PricingDetailsForm } from "./pricing-details-form" -import { PricingPricesForm } from "./pricing-prices-form" -import { PricingProductsForm } from "./pricing-products-form" +import { exctractPricesFromProducts } from "../../../common/utils" +import { PriceListDetailsForm } from "./price-list-details-form" +import { PriceListPricesForm } from "./price-list-prices-form" +import { PriceListProductsForm } from "./price-list-products-form" import { PricingCreateSchema, PricingCreateSchemaType, @@ -41,7 +41,16 @@ const initialTabState: TabState = { [Tab.PRICE]: "not-started", } -export const PricingCreateForm = () => { +type PriceListCreateFormProps = { + regions: HttpTypes.AdminRegion[] + currencies: HttpTypes.AdminStoreCurrency[] +} + +// TODO: Fix DatePickers once new version is merged. +export const PriceListCreateForm = ({ + regions, + currencies, +}: PriceListCreateFormProps) => { const [tab, setTab] = useState(Tab.DETAIL) const [tabState, setTabState] = useState(initialTabState) @@ -51,71 +60,57 @@ export const PricingCreateForm = () => { const form = useForm({ defaultValues: { type: "sale", + status: "active", title: "", description: "", starts_at: null, ends_at: null, - customer_group_ids: [], product_ids: [], products: {}, + rules: { + customer_group_id: [], + }, }, resolver: zodResolver(PricingCreateSchema), }) const { mutateAsync, isPending } = useCreatePriceList() - const handleSubmit = form.handleSubmit( - async (data) => { - const { customer_group_ids, products } = data + const handleSubmit = form.handleSubmit(async (data) => { + const { rules, products } = data - const rules = customer_group_ids?.length - ? { customer_group_id: customer_group_ids.map((cg) => cg.id) } - : undefined + const rulesPayload = rules?.customer_group_id?.length + ? { customer_group_id: rules.customer_group_id.map((cg) => cg.id) } + : undefined - const prices: CreatePriceListPriceDTO[] = [] + const prices = exctractPricesFromProducts(products, regions) - for (const [_, product] of Object.entries(products)) { - const { variants } = product - - for (const [variantId, variant] of Object.entries(variants)) { - const { currency_prices } = variant - - for (const [currencyCode, currencyPrice] of Object.entries( - currency_prices - )) { - if (!currencyPrice?.amount) { - continue - } - - prices.push({ - amount: castNumber(currencyPrice.amount), - currency_code: currencyCode, - // @ts-expect-error type is wrong - variant_id: variantId, + await mutateAsync( + { + title: data.title, + type: data.type as PriceListType, + status: data.status as PriceListStatus, + description: data.description, + starts_at: data.starts_at ? data.starts_at.toISOString() : null, + ends_at: data.ends_at ? data.ends_at.toISOString() : null, + rules: rulesPayload, + prices, + }, + { + onSuccess: ({ price_list }) => { + toast.success( + t("priceLists.create.successToast", { + title: price_list.title, }) - } - } - } - - await mutateAsync( - { - title: data.title, - type: data.type as CreatePriceListDTO["type"], - description: data.description, - starts_at: data.starts_at ? data.starts_at.toISOString() : null, - ends_at: data.ends_at ? data.ends_at.toISOString() : null, - rules, - prices: prices, + ) + handleSuccess(`../${price_list.id}`) }, - { - onSuccess: ({ price_list }) => { - handleSuccess(`../${price_list.id}`) - }, - } - ) - }, - (error) => console.error(error) - ) + onError: (error) => { + toast.error(error.message) + }, + } + ) + }) const partialFormValidation = ( fields: FieldPath[], @@ -131,9 +126,9 @@ export const PricingCreateForm = () => { const validationResult = schema.safeParse(values) if (!validationResult.success) { - validationResult.error.errors.forEach(({ path, message }) => { + validationResult.error.errors.forEach(({ path, message, code }) => { form.setError(path.join(".") as keyof PricingCreateSchemaType, { - type: "manual", + type: code, message, }) }) @@ -256,40 +251,28 @@ export const PricingCreateForm = () => {
-
+
- Details + {t("priceLists.create.tabs.details")} - Products + {t("priceLists.create.tabs.products")} - Prices + {t("priceLists.create.tabs.prices")}
-
- - - - -
@@ -297,21 +280,39 @@ export const PricingCreateForm = () => { className="size-full overflow-y-auto" value={Tab.DETAIL} > - + - + - + + +
+ + + + +
+
diff --git a/packages/admin-next/dashboard/src/routes/price-lists/price-list-create/components/price-list-create-form/price-list-details-form.tsx b/packages/admin-next/dashboard/src/routes/price-lists/price-list-create/components/price-list-create-form/price-list-details-form.tsx new file mode 100644 index 0000000000..63631690de --- /dev/null +++ b/packages/admin-next/dashboard/src/routes/price-lists/price-list-create/components/price-list-create-form/price-list-details-form.tsx @@ -0,0 +1,326 @@ +import { MagnifyingGlass, XMarkMini } from "@medusajs/icons" +import { + Button, + DatePicker, + Heading, + IconButton, + Input, + RadioGroup, + Select, + Text, + Textarea, + clx, +} from "@medusajs/ui" +import { useFieldArray, type UseFormReturn } from "react-hook-form" +import { useTranslation } from "react-i18next" + +import { Divider } from "../../../../../components/common/divider" +import { Form } from "../../../../../components/common/form" +import { StackedFocusModal } from "../../../../../components/modals/stacked-focus-modal" +import { useStackedModal } from "../../../../../components/modals/stacked-modal-provider" +import { PriceListCustomerGroupRuleForm } from "../../../common/components/price-list-customer-group-rule-form" +import type { + PricingCreateSchemaType, + PricingCustomerGroupsArrayType, +} from "./schema" + +type PriceListDetailsFormProps = { + form: UseFormReturn +} + +export const PriceListDetailsForm = ({ form }: PriceListDetailsFormProps) => { + const { t } = useTranslation() + + const { fields, remove, append } = useFieldArray({ + control: form.control, + name: "rules.customer_group_id", + keyName: "cg_id", + }) + + const { setIsOpen } = useStackedModal() + + const handleAddCustomerGroup = (groups: PricingCustomerGroupsArrayType) => { + const newIds = groups.map((group) => group.id) + + const fieldsToAdd = groups.filter( + (group) => !fields.some((field) => field.id === group.id) + ) + + for (const field of fields) { + if (!newIds.includes(field.id)) { + remove(fields.indexOf(field)) + } + } + + append(fieldsToAdd) + setIsOpen("cg", false) + } + + return ( +
+
+
+ {t("priceLists.create.header")} + + {t("priceLists.create.subheader")} + +
+ { + return ( + +
+
+ {t("priceLists.fields.type.label")} + {t("priceLists.fields.type.hint")} +
+ + + + + + +
+ +
+ ) + }} + /> +
+
+ { + return ( + + {t("fields.title")} + + + + + + ) + }} + /> + { + return ( + + + {t("priceLists.fields.status.label")} + + + + + + + ) + }} + /> +
+ { + return ( + + {t("fields.description")} + +