From a5ad6c05428e1bb090bbc5a51345a00821781c06 Mon Sep 17 00:00:00 2001 From: Philip Korsholm <88927411+pKorsholm@users.noreply.github.com> Date: Sun, 2 Apr 2023 11:57:41 +0200 Subject: [PATCH] fix(admin-ui, medusa): Require name in create stock location (#3670) * initial fix * add changeset * remove company from required fields --- .changeset/fifty-ears-relax.md | 6 + .../components/general-form/index.tsx | 2 +- .../src/domain/inventory/locations/index.tsx | 14 +-- .../domain/inventory/locations/new/index.tsx | 109 ++++++++++-------- .../stock-locations/create-stock-location.ts | 15 ++- 5 files changed, 88 insertions(+), 58 deletions(-) create mode 100644 .changeset/fifty-ears-relax.md diff --git a/.changeset/fifty-ears-relax.md b/.changeset/fifty-ears-relax.md new file mode 100644 index 0000000000..89788702c5 --- /dev/null +++ b/.changeset/fifty-ears-relax.md @@ -0,0 +1,6 @@ +--- +"@medusajs/admin-ui": patch +"@medusajs/medusa": patch +--- + +Fix(admin-ui,medusa): Ensure stock locations are created with a name diff --git a/packages/admin-ui/ui/src/domain/inventory/locations/components/general-form/index.tsx b/packages/admin-ui/ui/src/domain/inventory/locations/components/general-form/index.tsx index eb725c87f6..0f7abfee60 100644 --- a/packages/admin-ui/ui/src/domain/inventory/locations/components/general-form/index.tsx +++ b/packages/admin-ui/ui/src/domain/inventory/locations/components/general-form/index.tsx @@ -1,5 +1,5 @@ -import InputField from "../../../../../components/molecules/input" import FormValidator from "../../../../../utils/form-validator" +import InputField from "../../../../../components/molecules/input" import { NestedForm } from "../../../../../utils/nested-form" export type GeneralFormType = { diff --git a/packages/admin-ui/ui/src/domain/inventory/locations/index.tsx b/packages/admin-ui/ui/src/domain/inventory/locations/index.tsx index 10402dd28f..be44aedb9d 100644 --- a/packages/admin-ui/ui/src/domain/inventory/locations/index.tsx +++ b/packages/admin-ui/ui/src/domain/inventory/locations/index.tsx @@ -1,13 +1,13 @@ -import { useAdminStockLocations } from "medusa-react" -import Fade from "../../../components/atoms/fade-wrapper" -import Spinner from "../../../components/atoms/spinner" -import Button from "../../../components/fundamentals/button" -import PlusIcon from "../../../components/fundamentals/icons/plus-icon" import BodyCard from "../../../components/organisms/body-card" -import useToggleState from "../../../hooks/use-toggle-state" +import Button from "../../../components/fundamentals/button" +import Fade from "../../../components/atoms/fade-wrapper" import InventoryPageTableHeader from "../header" -import NewLocation from "./new" import LocationCard from "./components/location-card" +import NewLocation from "./new" +import PlusIcon from "../../../components/fundamentals/icons/plus-icon" +import Spinner from "../../../components/atoms/spinner" +import { useAdminStockLocations } from "medusa-react" +import useToggleState from "../../../hooks/use-toggle-state" const Locations = () => { const { diff --git a/packages/admin-ui/ui/src/domain/inventory/locations/new/index.tsx b/packages/admin-ui/ui/src/domain/inventory/locations/new/index.tsx index 771fb500d7..f9fddbd864 100644 --- a/packages/admin-ui/ui/src/domain/inventory/locations/new/index.tsx +++ b/packages/admin-ui/ui/src/domain/inventory/locations/new/index.tsx @@ -1,37 +1,39 @@ import { AdminPostStockLocationsReq, SalesChannel } from "@medusajs/medusa" -import { - useAdminAddLocationToSalesChannel, - useAdminCreateStockLocation -} from "medusa-react" import GeneralForm, { GeneralFormType } from "../components/general-form" - import { StockLocationAddressDTO, - StockLocationAddressInput + StockLocationAddressInput, } from "@medusajs/types" -import { useForm } from "react-hook-form" +import { + useAdminAddLocationToSalesChannel, + useAdminCreateStockLocation, +} from "medusa-react" + +import Accordion from "../../../../components/organisms/accordion" +import AddressForm from "../components/address-form" import Button from "../../../../components/fundamentals/button" import CrossIcon from "../../../../components/fundamentals/icons/cross-icon" -import FocusModal from "../../../../components/molecules/modal/focus-modal" -import Accordion from "../../../../components/organisms/accordion" import DeletePrompt from "../../../../components/organisms/delete-prompt" -import useNotification from "../../../../hooks/use-notification" -import useToggleState from "../../../../hooks/use-toggle-state" -import { useFeatureFlag } from "../../../../providers/feature-flag-provider" +import FocusModal from "../../../../components/molecules/modal/focus-modal" +import React from "react" +import SalesChannelsForm from "../components/sales-channels-form" import { getErrorMessage } from "../../../../utils/error-messages" import { nestedForm } from "../../../../utils/nested-form" -import AddressForm from "../components/address-form" -import SalesChannelsForm from "../components/sales-channels-form" +import { useFeatureFlag } from "../../../../providers/feature-flag-provider" +import { useForm } from "react-hook-form" +import useNotification from "../../../../hooks/use-notification" +import useToggleState from "../../../../hooks/use-toggle-state" type NewLocationForm = { general: GeneralFormType address: StockLocationAddressDTO salesChannels: { - channels: SalesChannel[] + channels: Omit[] } } const NewLocation = ({ onClose }: { onClose: () => void }) => { + const [accordionValue, setAccordionValue] = React.useState("general") const form = useForm({ defaultValues: { general: { @@ -80,39 +82,49 @@ const NewLocation = ({ onClose }: { onClose: () => void }) => { } } - const onSubmit = () => - handleSubmit(async (data) => { - const { locationPayload, salesChannelsPayload } = createPayload(data) - try { - const { stock_location } = await createStockLocation(locationPayload) - Promise.all( - salesChannelsPayload.map((salesChannel) => - createSalesChannelAssociationPromise( - salesChannel.id, - stock_location.id - ) + const onSubmit = async (data) => { + if (!data.general.name) { + setAccordionValue("general") + return + } + + const addressFields = [data.address.address_1, data.address.country_code] + if (addressFields.some(Boolean) && !addressFields.every(Boolean)) { + setAccordionValue("general") + return + } + + const { locationPayload, salesChannelsPayload } = createPayload(data) + try { + const { stock_location } = await createStockLocation(locationPayload) + Promise.all( + salesChannelsPayload.map((salesChannel) => + createSalesChannelAssociationPromise( + salesChannel.id, + stock_location.id ) ) - .then(() => { - notification("Success", "Location added successfully", "success") - }) - .catch(() => { - notification( - "Error", - "Location was created successfully, but there was an error associating sales channels", - "error" - ) - }) - .finally(() => { - onClose() - }) - } catch (err) { - notification("Error", getErrorMessage(err), "error") - } - }) + ) + .then(() => { + notification("Success", "Location added successfully", "success") + }) + .catch(() => { + notification( + "Error", + "Location was created successfully, but there was an error associating sales channels", + "error" + ) + }) + .finally(() => { + onClose() + }) + } catch (err) { + notification("Error", getErrorMessage(err), "error") + } + } return ( -
+
@@ -138,9 +150,8 @@ const NewLocation = ({ onClose }: { onClose: () => void }) => { @@ -152,7 +163,11 @@ const NewLocation = ({ onClose }: { onClose: () => void }) => {

Add new location

- + value?.trim()) name: string @IsOptional()