diff --git a/.changeset/neat-lamps-repeat.md b/.changeset/neat-lamps-repeat.md
new file mode 100644
index 0000000000..d268ff9034
--- /dev/null
+++ b/.changeset/neat-lamps-repeat.md
@@ -0,0 +1,5 @@
+---
+"@medusajs/admin-ui": patch
+---
+
+fix(admin-ui): Revamps gift card manage page
diff --git a/packages/admin-ui/ui/src/components/atoms/switch/index.tsx b/packages/admin-ui/ui/src/components/atoms/switch/index.tsx
index 71b9584f00..11c419a484 100644
--- a/packages/admin-ui/ui/src/components/atoms/switch/index.tsx
+++ b/packages/admin-ui/ui/src/components/atoms/switch/index.tsx
@@ -1,25 +1,30 @@
import * as RadixSwitch from "@radix-ui/react-switch"
import clsx from "clsx"
+import React from "react"
/**
* A controlled switch component atom.
*/
-function Switch(props: RadixSwitch.SwitchProps) {
- return (
-
- (
+ (props, ref) => {
+ return (
+
-
- )
-}
+ >
+
+
+ )
+ }
+)
+
+Switch.displayName = "Switch"
export default Switch
diff --git a/packages/admin-ui/ui/src/components/atoms/tooltip/index.tsx b/packages/admin-ui/ui/src/components/atoms/tooltip/index.tsx
index a279a817c4..cf313f86c1 100644
--- a/packages/admin-ui/ui/src/components/atoms/tooltip/index.tsx
+++ b/packages/admin-ui/ui/src/components/atoms/tooltip/index.tsx
@@ -42,7 +42,7 @@ const Tooltip = ({
sideOffset={8}
align="center"
className={clsx(
- "inter-small-semibold text-grey-50",
+ "inter-small-semibold text-grey-50 z-[999]",
"bg-grey-0 shadow-dropdown rounded-rounded py-2 px-3",
"border-grey-20 border border-solid",
className
diff --git a/packages/admin-ui/ui/src/domain/products/components/prices-form/index.tsx b/packages/admin-ui/ui/src/components/forms/general/prices-form/index.tsx
similarity index 100%
rename from packages/admin-ui/ui/src/domain/products/components/prices-form/index.tsx
rename to packages/admin-ui/ui/src/components/forms/general/prices-form/index.tsx
diff --git a/packages/admin-ui/ui/src/domain/products/components/prices-form/nested-price.tsx b/packages/admin-ui/ui/src/components/forms/general/prices-form/nested-price.tsx
similarity index 91%
rename from packages/admin-ui/ui/src/domain/products/components/prices-form/nested-price.tsx
rename to packages/admin-ui/ui/src/components/forms/general/prices-form/nested-price.tsx
index a45647edb2..aa72df7a32 100644
--- a/packages/admin-ui/ui/src/domain/products/components/prices-form/nested-price.tsx
+++ b/packages/admin-ui/ui/src/components/forms/general/prices-form/nested-price.tsx
@@ -1,13 +1,13 @@
import clsx from "clsx"
import { Controller } from "react-hook-form"
import { NestedPriceObject, PricesFormType } from "."
-import IncludesTaxTooltip from "../../../../components/atoms/includes-tax-tooltip"
-import CoinsIcon from "../../../../components/fundamentals/icons/coins-icon"
-import MapPinIcon from "../../../../components/fundamentals/icons/map-pin-icon"
-import TriangleRightIcon from "../../../../components/fundamentals/icons/triangle-right-icon"
import useToggleState from "../../../../hooks/use-toggle-state"
import { currencies } from "../../../../utils/currencies"
import { NestedForm } from "../../../../utils/nested-form"
+import IncludesTaxTooltip from "../../../atoms/includes-tax-tooltip"
+import CoinsIcon from "../../../fundamentals/icons/coins-icon"
+import MapPinIcon from "../../../fundamentals/icons/map-pin-icon"
+import TriangleRightIcon from "../../../fundamentals/icons/triangle-right-icon"
import PriceFormInput from "./price-form-input"
type Props = {
@@ -21,7 +21,7 @@ const NestedPrice = ({ form, nestedPrice }: Props) => {
const { control, path } = form
const { currencyPrice, regionPrices } = nestedPrice
return (
-
+
)
diff --git a/packages/admin-ui/ui/src/domain/products/components/general-form/index.tsx b/packages/admin-ui/ui/src/components/forms/product/general-form/index.tsx
similarity index 73%
rename from packages/admin-ui/ui/src/domain/products/components/general-form/index.tsx
rename to packages/admin-ui/ui/src/components/forms/product/general-form/index.tsx
index 82c0b5251c..c399dd0453 100644
--- a/packages/admin-ui/ui/src/domain/products/components/general-form/index.tsx
+++ b/packages/admin-ui/ui/src/components/forms/product/general-form/index.tsx
@@ -1,7 +1,7 @@
-import InputField from "../../../../components/molecules/input"
-import TextArea from "../../../../components/molecules/textarea"
import FormValidator from "../../../../utils/form-validator"
import { NestedForm } from "../../../../utils/nested-form"
+import InputField from "../../../molecules/input"
+import TextArea from "../../../molecules/textarea"
export type GeneralFormType = {
title: string
@@ -14,9 +14,10 @@ export type GeneralFormType = {
type Props = {
form: NestedForm
requireHandle?: boolean
+ isGiftCard?: boolean
}
-const GeneralForm = ({ form, requireHandle = true }: Props) => {
+const GeneralForm = ({ form, requireHandle = true, isGiftCard }: Props) => {
const {
register,
path,
@@ -28,7 +29,7 @@ const GeneralForm = ({ form, requireHandle = true }: Props) => {
{
/>
- Give your product a short and clear title.
+ Give your {isGiftCard ? "gift card" : "product"} a short and clear
+ title.
50-60 characters is the recommended length for search engines.
@@ -59,10 +61,12 @@ const GeneralForm = ({ form, requireHandle = true }: Props) => {
label="Handle"
tooltipContent={
!requireHandle
- ? "The handle is the part of the URL that identifies the product. If not specified, it will be generated from the title."
+ ? `The handle is the part of the URL that identifies the ${
+ isGiftCard ? "gift card" : "product"
+ }. If not specified, it will be generated from the title.`
: undefined
}
- placeholder="winter-jacket"
+ placeholder={isGiftCard ? "gift-card" : "winter-jacket"}
required={requireHandle}
{...register(path("handle"), {
required: requireHandle ? "Handle is required" : undefined,
@@ -74,7 +78,7 @@ const GeneralForm = ({ form, requireHandle = true }: Props) => {
/>
{
- Give your product a short and clear description.
+ Give your {isGiftCard ? "gift card" : "product"} a short and clear
+ description.
120-160 characters is the recommended length for search engines.
diff --git a/packages/admin-ui/ui/src/domain/products/components/media-form/index.tsx b/packages/admin-ui/ui/src/components/forms/product/media-form/index.tsx
similarity index 93%
rename from packages/admin-ui/ui/src/domain/products/components/media-form/index.tsx
rename to packages/admin-ui/ui/src/components/forms/product/media-form/index.tsx
index 92b73967eb..ae93b7dd10 100644
--- a/packages/admin-ui/ui/src/domain/products/components/media-form/index.tsx
+++ b/packages/admin-ui/ui/src/components/forms/product/media-form/index.tsx
@@ -6,15 +6,13 @@ import {
useFieldArray,
useWatch,
} from "react-hook-form"
-import FileUploadField from "../../../../components/atoms/file-upload-field"
-import Button from "../../../../components/fundamentals/button"
-import CheckCircleFillIcon from "../../../../components/fundamentals/icons/check-circle-fill-icon"
-import TrashIcon from "../../../../components/fundamentals/icons/trash-icon"
-import Actionables, {
- ActionType,
-} from "../../../../components/molecules/actionables"
import { FormImage } from "../../../../types/shared"
import { NestedForm } from "../../../../utils/nested-form"
+import FileUploadField from "../../../atoms/file-upload-field"
+import Button from "../../../fundamentals/button"
+import CheckCircleFillIcon from "../../../fundamentals/icons/check-circle-fill-icon"
+import TrashIcon from "../../../fundamentals/icons/trash-icon"
+import Actionables, { ActionType } from "../../../molecules/actionables"
type ImageType = { selected: boolean } & FormImage
diff --git a/packages/admin-ui/ui/src/domain/products/components/organize-form/index.tsx b/packages/admin-ui/ui/src/components/forms/product/organize-form/index.tsx
similarity index 86%
rename from packages/admin-ui/ui/src/domain/products/components/organize-form/index.tsx
rename to packages/admin-ui/ui/src/components/forms/product/organize-form/index.tsx
index 3f51fa8227..01145cafe1 100644
--- a/packages/admin-ui/ui/src/domain/products/components/organize-form/index.tsx
+++ b/packages/admin-ui/ui/src/components/forms/product/organize-form/index.tsx
@@ -1,18 +1,18 @@
import { Controller } from "react-hook-form"
+import NestedMultiselect from "../../../../domain/categories/components/multiselect"
+import {
+ FeatureFlag,
+ useFeatureFlag,
+} from "../../../../providers/feature-flag-provider"
+import { Option } from "../../../../types/shared"
+import { NestedForm } from "../../../../utils/nested-form"
+import InputHeader from "../../../fundamentals/input-header"
import {
NextCreateableSelect,
NextSelect,
-} from "../../../../components/molecules/select/next-select"
-import TagInput from "../../../../components/molecules/tag-input"
-import { Option } from "../../../../types/shared"
-import { NestedForm } from "../../../../utils/nested-form"
+} from "../../../molecules/select/next-select"
+import TagInput from "../../../molecules/tag-input"
import useOrganizeData from "./use-organize-data"
-import NestedMultiselect from "../../../categories/components/multiselect"
-import InputHeader from "../../../../components/fundamentals/input-header"
-import {
- useFeatureFlag,
- FeatureFlag,
-} from "../../../../providers/feature-flag-provider"
export type OrganizeFormType = {
type: Option | null
@@ -86,21 +86,18 @@ const OrganizeForm = ({ form }: Props) => {
/>
- {isFeatureEnabled(FeatureFlag.PRODUCT_CATEGORIES) && (
+ {isFeatureEnabled(FeatureFlag.PRODUCT_CATEGORIES) &&
+ categoriesOptions?.length ? (
<>
{
- if (categoriesOptions.length === 0) {
- return null
- }
-
const initiallySelected = (value || []).reduce((acc, val) => {
acc[val] = true
return acc
- }, {})
+ }, {} as Record)
return (
{
}}
/>
>
- )}
+ ) : null}
diff --git a/packages/admin-ui/ui/src/domain/products/components/organize-form/use-organize-data.tsx b/packages/admin-ui/ui/src/components/forms/product/organize-form/use-organize-data.tsx
similarity index 83%
rename from packages/admin-ui/ui/src/domain/products/components/organize-form/use-organize-data.tsx
rename to packages/admin-ui/ui/src/components/forms/product/organize-form/use-organize-data.tsx
index 8b82c20ae0..5b6b9c0c99 100644
--- a/packages/admin-ui/ui/src/domain/products/components/organize-form/use-organize-data.tsx
+++ b/packages/admin-ui/ui/src/components/forms/product/organize-form/use-organize-data.tsx
@@ -3,14 +3,13 @@ import { useMemo } from "react"
import {
useAdminCollections,
useAdminProductCategories,
- useAdminProductTypes,
+ useAdminProductTypes
} from "medusa-react"
-import { NestedMultiselectOption } from "../../../categories/components/multiselect"
-import { transformCategoryToNestedFormOptions } from "../../../categories/utils/transform-response"
+import { NestedMultiselectOption } from "../../../../domain/categories/components/multiselect"
+import { transformCategoryToNestedFormOptions } from "../../../../domain/categories/utils/transform-response"
import {
- useFeatureFlag,
- FeatureFlag,
+ FeatureFlag, useFeatureFlag
} from "../../../../providers/feature-flag-provider"
const useOrganizeData = () => {
diff --git a/packages/admin-ui/ui/src/domain/products/components/sales-channels-modal/add-screen.tsx b/packages/admin-ui/ui/src/components/forms/product/sales-channels-modal/add-screen.tsx
similarity index 88%
rename from packages/admin-ui/ui/src/domain/products/components/sales-channels-modal/add-screen.tsx
rename to packages/admin-ui/ui/src/components/forms/product/sales-channels-modal/add-screen.tsx
index 24511d9237..2e9620d948 100644
--- a/packages/admin-ui/ui/src/domain/products/components/sales-channels-modal/add-screen.tsx
+++ b/packages/admin-ui/ui/src/components/forms/product/sales-channels-modal/add-screen.tsx
@@ -1,10 +1,10 @@
import { useAdminSalesChannels } from "medusa-react"
-import React, { useContext, useMemo, useState } from "react"
+import React, { useMemo, useState } from "react"
import { usePagination, useRowSelect, useTable } from "react-table"
-import Button from "../../../../components/fundamentals/button"
-import Modal from "../../../../components/molecules/modal"
-import { LayeredModalContext } from "../../../../components/molecules/modal/layered-modal"
import { useDebounce } from "../../../../hooks/use-debounce"
+import Button from "../../../fundamentals/button"
+import Modal from "../../../molecules/modal"
+import { useLayeredModal } from "../../../molecules/modal/layered-modal"
import SalesChannelTable, { useSalesChannelsTableColumns } from "./table"
import { useSalesChannelsModal } from "./use-sales-channels-modal"
@@ -33,7 +33,7 @@ const AddScreen = () => {
return salesChannels?.filter(({ id }) => !ids.includes(id)) || []
}, [salesChannels, source])
- const { pop, reset } = useContext(LayeredModalContext)
+ const { pop, reset } = useLayeredModal()
const state = useTable(
{
@@ -120,7 +120,7 @@ const AddScreen = () => {
}
export const useAddChannelsModalScreen = () => {
- const { pop } = React.useContext(LayeredModalContext)
+ const { pop } = useLayeredModal()
return {
title: "Add Sales Channels",
diff --git a/packages/admin-ui/ui/src/domain/products/components/sales-channels-modal/available-screen.tsx b/packages/admin-ui/ui/src/components/forms/product/sales-channels-modal/available-screen.tsx
similarity index 97%
rename from packages/admin-ui/ui/src/domain/products/components/sales-channels-modal/available-screen.tsx
rename to packages/admin-ui/ui/src/components/forms/product/sales-channels-modal/available-screen.tsx
index 5838a57734..84cbea66ba 100644
--- a/packages/admin-ui/ui/src/domain/products/components/sales-channels-modal/available-screen.tsx
+++ b/packages/admin-ui/ui/src/components/forms/product/sales-channels-modal/available-screen.tsx
@@ -1,12 +1,12 @@
import React, { useState } from "react"
+import { usePagination, useRowSelect, useTable } from "react-table"
import SalesChannelTable, {
SalesChannelTableActions,
useSalesChannelsTableColumns,
} from "./table"
-import { usePagination, useRowSelect, useTable } from "react-table"
-import Modal from "../../../../components/molecules/modal"
import { useDebounce } from "../../../../hooks/use-debounce"
+import Modal from "../../../molecules/modal"
import { useSalesChannelsModal } from "./use-sales-channels-modal"
const LIMIT = 12
diff --git a/packages/admin-ui/ui/src/domain/products/components/sales-channels-modal/index.tsx b/packages/admin-ui/ui/src/components/forms/product/sales-channels-modal/index.tsx
similarity index 83%
rename from packages/admin-ui/ui/src/domain/products/components/sales-channels-modal/index.tsx
rename to packages/admin-ui/ui/src/components/forms/product/sales-channels-modal/index.tsx
index 93b950dbde..627cebeea8 100644
--- a/packages/admin-ui/ui/src/domain/products/components/sales-channels-modal/index.tsx
+++ b/packages/admin-ui/ui/src/components/forms/product/sales-channels-modal/index.tsx
@@ -1,10 +1,9 @@
import { SalesChannel } from "@medusajs/medusa"
-import React from "react"
-import Button from "../../../../components/fundamentals/button"
-import Modal from "../../../../components/molecules/modal"
+import Button from "../../../fundamentals/button"
+import Modal from "../../../molecules/modal"
import LayeredModal, {
- LayeredModalContext,
-} from "../../../../components/molecules/modal/layered-modal"
+ useLayeredModal,
+} from "../../../molecules/modal/layered-modal"
import AvailableScreen from "./available-screen"
import { SalesChannelsModalContext } from "./use-sales-channels-modal"
@@ -19,7 +18,7 @@ type Props = {
* Re-usable Sales Channels Modal, used for adding and editing sales channels both when creating a new product and editing an existing product.
*/
const SalesChannelsModal = ({ open, source = [], onClose, onSave }: Props) => {
- const context = React.useContext(LayeredModalContext)
+ const context = useLayeredModal()
return (
diff --git a/packages/admin-ui/ui/src/domain/products/components/sales-channels-modal/use-sales-channels-modal.tsx b/packages/admin-ui/ui/src/components/forms/product/sales-channels-modal/use-sales-channels-modal.tsx
similarity index 100%
rename from packages/admin-ui/ui/src/domain/products/components/sales-channels-modal/use-sales-channels-modal.tsx
rename to packages/admin-ui/ui/src/components/forms/product/sales-channels-modal/use-sales-channels-modal.tsx
diff --git a/packages/admin-ui/ui/src/domain/products/components/thumbnail-form/index.tsx b/packages/admin-ui/ui/src/components/forms/product/thumbnail-form/index.tsx
similarity index 92%
rename from packages/admin-ui/ui/src/domain/products/components/thumbnail-form/index.tsx
rename to packages/admin-ui/ui/src/components/forms/product/thumbnail-form/index.tsx
index c2cda7df80..ac875208e3 100644
--- a/packages/admin-ui/ui/src/domain/products/components/thumbnail-form/index.tsx
+++ b/packages/admin-ui/ui/src/components/forms/product/thumbnail-form/index.tsx
@@ -1,11 +1,11 @@
import { FieldArrayWithId, useFieldArray } from "react-hook-form"
-import FileUploadField from "../../../../components/atoms/file-upload-field"
-import TrashIcon from "../../../../components/fundamentals/icons/trash-icon"
-import Actionables, {
- ActionType,
-} from "../../../../components/molecules/actionables"
import { FormImage } from "../../../../types/shared"
import { NestedForm } from "../../../../utils/nested-form"
+import FileUploadField from "../../../atoms/file-upload-field"
+import TrashIcon from "../../../fundamentals/icons/trash-icon"
+import Actionables, {
+ ActionType
+} from "../../../molecules/actionables"
export type ThumbnailFormType = {
images: FormImage[]
diff --git a/packages/admin-ui/ui/src/domain/products/components/variant-form/create-flow-variant-form/index.tsx b/packages/admin-ui/ui/src/components/forms/product/variant-form/create-flow-variant-form/index.tsx
similarity index 93%
rename from packages/admin-ui/ui/src/domain/products/components/variant-form/create-flow-variant-form/index.tsx
rename to packages/admin-ui/ui/src/components/forms/product/variant-form/create-flow-variant-form/index.tsx
index f0a12addcf..c4a758ae8f 100644
--- a/packages/admin-ui/ui/src/domain/products/components/variant-form/create-flow-variant-form/index.tsx
+++ b/packages/admin-ui/ui/src/components/forms/product/variant-form/create-flow-variant-form/index.tsx
@@ -1,11 +1,11 @@
import { UseFormReturn } from "react-hook-form"
-import InputError from "../../../../../components/atoms/input-error"
-import IconTooltip from "../../../../../components/molecules/icon-tooltip"
-import Accordion from "../../../../../components/organisms/accordion"
import { nestedForm } from "../../../../../utils/nested-form"
+import InputError from "../../../../atoms/input-error"
+import IconTooltip from "../../../../molecules/icon-tooltip"
+import Accordion from "../../../../organisms/accordion"
+import { PricesFormType } from "../../../general/prices-form"
import CustomsForm, { CustomsFormType } from "../../customs-form"
import DimensionsForm, { DimensionsFormType } from "../../dimensions-form"
-import { PricesFormType } from "../../prices-form"
import VariantGeneralForm, {
VariantGeneralFormType,
} from "../variant-general-form"
diff --git a/packages/admin-ui/ui/src/domain/products/components/variant-form/edit-flow-variant-form/index.tsx b/packages/admin-ui/ui/src/components/forms/product/variant-form/edit-flow-variant-form/index.tsx
similarity index 92%
rename from packages/admin-ui/ui/src/domain/products/components/variant-form/edit-flow-variant-form/index.tsx
rename to packages/admin-ui/ui/src/components/forms/product/variant-form/edit-flow-variant-form/index.tsx
index ccf65572e0..8aa506a148 100644
--- a/packages/admin-ui/ui/src/domain/products/components/variant-form/edit-flow-variant-form/index.tsx
+++ b/packages/admin-ui/ui/src/components/forms/product/variant-form/edit-flow-variant-form/index.tsx
@@ -1,18 +1,18 @@
+import { useFieldArray, UseFormReturn } from "react-hook-form"
import CustomsForm, { CustomsFormType } from "../../customs-form"
import DimensionsForm, { DimensionsFormType } from "../../dimensions-form"
-import { UseFormReturn, useFieldArray } from "react-hook-form"
import VariantGeneralForm, {
- VariantGeneralFormType,
+ VariantGeneralFormType
} from "../variant-general-form"
import VariantStockForm, { VariantStockFormType } from "../variant-stock-form"
-import Accordion from "../../../../../components/organisms/accordion"
-import IconTooltip from "../../../../../components/molecules/icon-tooltip"
-import InputField from "../../../../../components/molecules/input"
-import { PricesFormType } from "../../prices-form"
-import VariantPricesForm from "../variant-prices-form"
-import { nestedForm } from "../../../../../utils/nested-form"
import { useFeatureFlag } from "../../../../../providers/feature-flag-provider"
+import { nestedForm } from "../../../../../utils/nested-form"
+import IconTooltip from "../../../../molecules/icon-tooltip"
+import InputField from "../../../../molecules/input"
+import Accordion from "../../../../organisms/accordion"
+import { PricesFormType } from "../../../general/prices-form"
+import VariantPricesForm from "../variant-prices-form"
export type EditFlowVariantFormType = {
/**
diff --git a/packages/admin-ui/ui/src/domain/products/components/variant-form/variant-general-form/index.tsx b/packages/admin-ui/ui/src/components/forms/product/variant-form/variant-general-form/index.tsx
similarity index 94%
rename from packages/admin-ui/ui/src/domain/products/components/variant-form/variant-general-form/index.tsx
rename to packages/admin-ui/ui/src/components/forms/product/variant-form/variant-general-form/index.tsx
index 3898773f14..7091d29df8 100644
--- a/packages/admin-ui/ui/src/domain/products/components/variant-form/variant-general-form/index.tsx
+++ b/packages/admin-ui/ui/src/components/forms/product/variant-form/variant-general-form/index.tsx
@@ -1,6 +1,6 @@
-import InputField from "../../../../../components/molecules/input"
import FormValidator from "../../../../../utils/form-validator"
import { NestedForm } from "../../../../../utils/nested-form"
+import InputField from "../../../../molecules/input"
export type VariantGeneralFormType = {
title: string | null
diff --git a/packages/admin-ui/ui/src/domain/products/components/variant-form/variant-prices-form/index.tsx b/packages/admin-ui/ui/src/components/forms/product/variant-form/variant-prices-form/index.tsx
similarity index 85%
rename from packages/admin-ui/ui/src/domain/products/components/variant-form/variant-prices-form/index.tsx
rename to packages/admin-ui/ui/src/components/forms/product/variant-form/variant-prices-form/index.tsx
index 1e85c2bb1d..87a558c6a1 100644
--- a/packages/admin-ui/ui/src/domain/products/components/variant-form/variant-prices-form/index.tsx
+++ b/packages/admin-ui/ui/src/components/forms/product/variant-form/variant-prices-form/index.tsx
@@ -1,5 +1,5 @@
import { NestedForm } from "../../../../../utils/nested-form"
-import PricesForm, { PricesFormType } from "../../prices-form"
+import PricesForm, { PricesFormType } from "../../../general/prices-form"
type Props = {
form: NestedForm
diff --git a/packages/admin-ui/ui/src/domain/products/components/variant-form/variant-select-options-form/hooks.tsx b/packages/admin-ui/ui/src/components/forms/product/variant-form/variant-select-options-form/hooks.tsx
similarity index 95%
rename from packages/admin-ui/ui/src/domain/products/components/variant-form/variant-select-options-form/hooks.tsx
rename to packages/admin-ui/ui/src/components/forms/product/variant-form/variant-select-options-form/hooks.tsx
index c5c97968aa..58105fd227 100644
--- a/packages/admin-ui/ui/src/domain/products/components/variant-form/variant-select-options-form/hooks.tsx
+++ b/packages/admin-ui/ui/src/components/forms/product/variant-form/variant-select-options-form/hooks.tsx
@@ -2,8 +2,8 @@ import { isEqual } from "lodash"
import { useMemo } from "react"
import { useWatch } from "react-hook-form"
import { VariantOptionValueType } from "."
+import { AddVariantsFormType } from "../../../../../domain/products/new/add-variants"
import { NestedForm } from "../../../../../utils/nested-form"
-import { AddVariantsFormType } from "../../../new/add-variants"
const useCheckOptions = (variantForm: NestedForm) => {
const { control: variantControl, path: variantPath } = variantForm
diff --git a/packages/admin-ui/ui/src/domain/products/components/variant-form/variant-select-options-form/index.tsx b/packages/admin-ui/ui/src/components/forms/product/variant-form/variant-select-options-form/index.tsx
similarity index 95%
rename from packages/admin-ui/ui/src/domain/products/components/variant-form/variant-select-options-form/index.tsx
rename to packages/admin-ui/ui/src/components/forms/product/variant-form/variant-select-options-form/index.tsx
index 62753cead8..a1cd2e9577 100644
--- a/packages/admin-ui/ui/src/domain/products/components/variant-form/variant-select-options-form/index.tsx
+++ b/packages/admin-ui/ui/src/components/forms/product/variant-form/variant-select-options-form/index.tsx
@@ -1,6 +1,6 @@
import { Controller, useFieldArray } from "react-hook-form"
-import { NextCreateableSelect } from "../../../../../components/molecules/select/next-select"
import { NestedForm } from "../../../../../utils/nested-form"
+import { NextCreateableSelect } from "../../../../molecules/select/next-select"
export type VariantOptionValueType = {
option_id: string
diff --git a/packages/admin-ui/ui/src/domain/products/components/variant-form/variant-stock-form/index.tsx b/packages/admin-ui/ui/src/components/forms/product/variant-form/variant-stock-form/index.tsx
similarity index 93%
rename from packages/admin-ui/ui/src/domain/products/components/variant-form/variant-stock-form/index.tsx
rename to packages/admin-ui/ui/src/components/forms/product/variant-form/variant-stock-form/index.tsx
index 9111c9974d..86b18e8981 100644
--- a/packages/admin-ui/ui/src/domain/products/components/variant-form/variant-stock-form/index.tsx
+++ b/packages/admin-ui/ui/src/components/forms/product/variant-form/variant-stock-form/index.tsx
@@ -1,20 +1,20 @@
-import { Controller, useFieldArray } from "react-hook-form"
import { InventoryLevelDTO, StockLocationDTO } from "@medusajs/medusa"
+import { Controller, useFieldArray } from "react-hook-form"
-import BuildingsIcon from "../../../../../components/fundamentals/icons/buildings-icon"
-import Button from "../../../../../components/fundamentals/button"
-import FeatureToggle from "../../../../../components/fundamentals/feature-toggle"
-import IconBadge from "../../../../../components/fundamentals/icon-badge"
-import InputField from "../../../../../components/molecules/input"
-import { LayeredModalContext } from "../../../../../components/molecules/modal/layered-modal"
-import { ManageLocationsScreen } from "../../variant-inventory-form/variant-stock-form"
-import { NestedForm } from "../../../../../utils/nested-form"
-import React from "react"
-import Switch from "../../../../../components/atoms/switch"
import clsx from "clsx"
import { sum } from "lodash"
import { useAdminStockLocations } from "medusa-react"
+import React from "react"
import { useFeatureFlag } from "../../../../../providers/feature-flag-provider"
+import { NestedForm } from "../../../../../utils/nested-form"
+import Switch from "../../../../atoms/switch"
+import Button from "../../../../fundamentals/button"
+import FeatureToggle from "../../../../fundamentals/feature-toggle"
+import IconBadge from "../../../../fundamentals/icon-badge"
+import BuildingsIcon from "../../../../fundamentals/icons/buildings-icon"
+import InputField from "../../../../molecules/input"
+import { LayeredModalContext } from "../../../../molecules/modal/layered-modal"
+import { ManageLocationsScreen } from "../../variant-inventory-form/variant-stock-form"
export type VariantStockFormType = {
manage_inventory: boolean
diff --git a/packages/admin-ui/ui/src/domain/products/components/variant-inventory-form/edit-flow-variant-form/index.tsx b/packages/admin-ui/ui/src/components/forms/product/variant-inventory-form/edit-flow-variant-form/index.tsx
similarity index 100%
rename from packages/admin-ui/ui/src/domain/products/components/variant-inventory-form/edit-flow-variant-form/index.tsx
rename to packages/admin-ui/ui/src/components/forms/product/variant-inventory-form/edit-flow-variant-form/index.tsx
diff --git a/packages/admin-ui/ui/src/domain/products/components/variant-inventory-form/variant-stock-form/index.tsx b/packages/admin-ui/ui/src/components/forms/product/variant-inventory-form/variant-stock-form/index.tsx
similarity index 94%
rename from packages/admin-ui/ui/src/domain/products/components/variant-inventory-form/variant-stock-form/index.tsx
rename to packages/admin-ui/ui/src/components/forms/product/variant-inventory-form/variant-stock-form/index.tsx
index 502072dfcd..441d9930f1 100644
--- a/packages/admin-ui/ui/src/domain/products/components/variant-inventory-form/variant-stock-form/index.tsx
+++ b/packages/admin-ui/ui/src/components/forms/product/variant-inventory-form/variant-stock-form/index.tsx
@@ -1,16 +1,15 @@
-import { Controller, useFieldArray } from "react-hook-form"
import { InventoryLevelDTO, StockLocationDTO } from "@medusajs/medusa"
-import React, { useContext, useMemo, useState } from "react"
-
-import BuildingsIcon from "../../../../../components/fundamentals/icons/buildings-icon"
-import Button from "../../../../../components/fundamentals/button"
-import IconBadge from "../../../../../components/fundamentals/icon-badge"
-import InputField from "../../../../../components/molecules/input"
-import { LayeredModalContext } from "../../../../../components/molecules/modal/layered-modal"
-import Modal from "../../../../../components/molecules/modal"
-import { NestedForm } from "../../../../../utils/nested-form"
-import Switch from "../../../../../components/atoms/switch"
import { useAdminStockLocations } from "medusa-react"
+import React, { useMemo, useState } from "react"
+import { Controller, useFieldArray } from "react-hook-form"
+import { NestedForm } from "../../../../../utils/nested-form"
+import Switch from "../../../../atoms/switch"
+import Button from "../../../../fundamentals/button"
+import IconBadge from "../../../../fundamentals/icon-badge"
+import BuildingsIcon from "../../../../fundamentals/icons/buildings-icon"
+import InputField from "../../../../molecules/input"
+import Modal from "../../../../molecules/modal"
+import { useLayeredModal } from "../../../../molecules/modal/layered-modal"
export type VariantStockFormType = {
manage_inventory?: boolean
@@ -34,7 +33,7 @@ const VariantStockForm = ({ form, locationLevels }: Props) => {
[locationLevels]
)
- const layeredModalContext = useContext(LayeredModalContext)
+ const layeredModalContext = useLayeredModal()
const { stock_locations: locations, isLoading } = useAdminStockLocations()
@@ -238,7 +237,7 @@ const ManageLocationsForm = ({
locationOptions,
onSubmit,
}: ManageLocationFormProps) => {
- const layeredModalContext = useContext(LayeredModalContext)
+ const layeredModalContext = useLayeredModal()
const { pop } = layeredModalContext
const existingLocations = useMemo(() => {
diff --git a/packages/admin-ui/ui/src/components/molecules/indeterminate-checkbox/index.tsx b/packages/admin-ui/ui/src/components/molecules/indeterminate-checkbox/index.tsx
index 46ae3bfda7..ea735cc55b 100644
--- a/packages/admin-ui/ui/src/components/molecules/indeterminate-checkbox/index.tsx
+++ b/packages/admin-ui/ui/src/components/molecules/indeterminate-checkbox/index.tsx
@@ -2,6 +2,7 @@ import clsx from "clsx"
import React, { useImperativeHandle } from "react"
import CheckIcon from "../../fundamentals/icons/check-icon"
+import MinusIcon from "../../fundamentals/icons/minus-icon"
type IndeterminateCheckboxProps = {
type?: "checkbox" | "radio"
@@ -66,6 +67,7 @@ const IndeterminateCheckbox = React.forwardRef<
>
{checked && }
+ {indeterminate && }
- storeCurrency: string
- currencyCodes: string[]
- handleClose: () => void
-}
-
-const AddDenominationModal: React.FC = ({
- giftCard,
- storeCurrency,
- currencyCodes,
- handleClose,
-}) => {
- const { watch, handleSubmit, control } = useForm<{
- default_price: number
- prices: {
- price: {
- amount: number
- currency_code: string
- }
- }[]
- }>()
- const notification = useNotification()
- const { mutate, isLoading } = useAdminCreateVariant(giftCard.id)
-
- // passed to useValuesFieldArray so new prices are intialized with the currenct default price
- const defaultValue = watch("default_price", 10000)
-
- const { fields, appendPrice, deletePrice, availableCurrencies } =
- useValuesFieldArray(
- currencyCodes,
- {
- control,
- name: "prices",
- keyName: "indexId",
- },
- {
- defaultAmount: defaultValue,
- defaultCurrencyCode: storeCurrency,
- }
- )
-
- const onSubmit = async (data: any) => {
- const prices = [
- {
- amount: data.default_price,
- currency_code: storeCurrency,
- },
- ]
-
- if (data.prices) {
- data.prices.forEach((p) => {
- prices.push({
- amount: p.price.amount,
- currency_code: p.price.currency_code,
- })
- })
- }
-
- mutate(
- {
- title: `${giftCard.variants.length}`,
- options: [
- {
- value: `${data.default_price}`,
- option_id: giftCard.options[0].id,
- },
- ],
- prices,
- inventory_quantity: 0,
- manage_inventory: false,
- },
- {
- onSuccess: () => {
- notification("Success", "Denomination added successfully", "success")
- handleClose()
- },
- onError: (error) => {
- const errorMessage = () => {
- // @ts-ignore
- if (error.response?.data?.type === "duplicate_error") {
- return `A denomination with that default value already exists`
- } else {
- return getErrorMessage(error)
- }
- }
-
- notification("Error", errorMessage(), "error")
- },
- }
- )
- }
-
- return (
-
-
-
- )
-}
-
-export default AddDenominationModal
diff --git a/packages/admin-ui/ui/src/components/organisms/add-denomination-modal/use-values-field-array.ts b/packages/admin-ui/ui/src/components/organisms/add-denomination-modal/use-values-field-array.ts
deleted file mode 100644
index eb1b7d7c54..0000000000
--- a/packages/admin-ui/ui/src/components/organisms/add-denomination-modal/use-values-field-array.ts
+++ /dev/null
@@ -1,72 +0,0 @@
-import { useFieldArray, UseFieldArrayOptions, useWatch } from "react-hook-form"
-
-type UseValuesFieldArrayOptions = {
- defaultAmount: number
- defaultCurrencyCode: string
-}
-
-type ValuesFormValue = {
- price: {
- currency_code: string
- amount: number
- }
-}
-
-export const useValuesFieldArray = (
- currencyCodes: string[],
- { control, name, keyName }: UseFieldArrayOptions,
- options: UseValuesFieldArrayOptions = {
- defaultAmount: 1000,
- defaultCurrencyCode: "usd",
- }
-) => {
- const { defaultAmount } = options
- const { fields, append, remove } = useFieldArray({
- control,
- name,
- keyName,
- })
- const watchedFields = useWatch({
- control,
- name,
- defaultValue: fields,
- })
-
- const selectedCurrencies = watchedFields.map(
- (field) => field?.price?.currency_code
- )
- const availableCurrencies = currencyCodes?.filter(
- (currency) => !selectedCurrencies.includes(currency)
- )
-
- const controlledFields = fields.map((field, index) => {
- return {
- ...field,
- ...watchedFields[index],
- }
- })
-
- const appendPrice = () => {
- const newCurrency = availableCurrencies[0]
- append({
- price: {
- currency_code: newCurrency,
- amount: defaultAmount,
- },
- })
- }
-
- const deletePrice = (index) => {
- return () => {
- remove(index)
- }
- }
-
- return {
- fields: controlledFields,
- appendPrice,
- deletePrice,
- availableCurrencies,
- selectedCurrencies,
- } as const
-}
diff --git a/packages/admin-ui/ui/src/components/organisms/edit-denominations-modal/index.tsx b/packages/admin-ui/ui/src/components/organisms/edit-denominations-modal/index.tsx
deleted file mode 100644
index 72577fc8a0..0000000000
--- a/packages/admin-ui/ui/src/components/organisms/edit-denominations-modal/index.tsx
+++ /dev/null
@@ -1,179 +0,0 @@
-import _ from "lodash"
-import * as React from "react"
-import { v4 as uuidv4 } from "uuid"
-import Button from "../../fundamentals/button"
-import PlusIcon from "../../fundamentals/icons/plus-icon"
-import TrashIcon from "../../fundamentals/icons/trash-icon"
-import IconTooltip from "../../molecules/icon-tooltip"
-import Modal from "../../molecules/modal"
-import CurrencyInput from "../../organisms/currency-input"
-
-export type PriceType = {
- currency_code: string
- amount: number
- id?: string
-}
-
-type EditDenominationsModalProps = {
- defaultDenominations: PriceType[]
- handleClose: () => void
- onSubmit: (denominations: PriceType[]) => void
- defaultNewAmount?: number
- defaultNewCurrencyCode?: string
- currencyCodes?: string[]
-}
-
-const EditDenominationsModal = ({
- defaultDenominations = [],
- onSubmit,
- handleClose,
- currencyCodes = [],
- defaultNewAmount = 1000,
-}: EditDenominationsModalProps) => {
- const [denominations, setDenominations] = React.useState(
- augmentWithIds(defaultDenominations)
- )
- const selectedCurrencies = denominations.map(
- (denomination) => denomination.currency_code
- )
- const availableCurrencies = currencyCodes?.filter(
- (currency) => !selectedCurrencies.includes(currency)
- )
-
- const onAmountChange = (index) => {
- return (amount) => {
- const newDenominations = denominations.slice()
- newDenominations[index] = { ...newDenominations[index], amount }
- setDenominations(newDenominations)
- }
- }
-
- const onCurrencyChange = (index) => {
- return (currencyCode) => {
- const newDenominations = denominations.slice()
- newDenominations[index] = {
- ...newDenominations[index],
- currency_code: currencyCode,
- }
- setDenominations(newDenominations)
- }
- }
-
- const onClickDelete = (index) => {
- return () => {
- const newDenominations = denominations.slice()
- newDenominations.splice(index, 1)
- setDenominations(newDenominations)
- }
- }
-
- const appendDenomination = () => {
- const newDenomination = {
- amount: defaultNewAmount,
- currency_code: availableCurrencies[0],
- }
- setDenominations([...denominations, augmentWithId(newDenomination)])
- }
-
- const submitHandler = () => {
- const strippedDenominations = stripDenominationFromIndexId(denominations)
-
- if (onSubmit) {
- onSubmit(strippedDenominations)
- }
- }
-
- return (
-
-
-
- Edit Denominations
-
-
-