diff --git a/packages/admin-next/dashboard/public/locales/en-US/translation.json b/packages/admin-next/dashboard/public/locales/en-US/translation.json index 250e9b82c4..effe2c4628 100644 --- a/packages/admin-next/dashboard/public/locales/en-US/translation.json +++ b/packages/admin-next/dashboard/public/locales/en-US/translation.json @@ -288,9 +288,9 @@ "editConditions": "Edit conditions", "conditionsHint": "Create conditions to apply on the discount", "isTemplateDiscount": "Is this a template discount?", - "percentageDescription" : "Discount applied in %", - "fixedDescription" : "Amount discount", - "shippingDescription" : "Override delivery amount", + "percentageDescription": "Discount applied in %", + "fixedDescription": "Amount discount", + "shippingDescription": "Override delivery amount", "selectRegionFirst": "Select region first", "templateHint": "Template discounts allow you to define a set of rules that can be used across a group of discounts. This is useful in campaigns that should generate unique codes for each user, but where the rules for all unique codes should be the same.", "conditions": { @@ -505,6 +505,15 @@ "createdBy": "Created by", "revokedBy": "Revoked by" }, + "returnReasons": { + "domain": "Return Reasons", + "calloutHint": "Manage the reasons to categorize returns.", + "deleteReasonWarning": "You are about to delete the return reason {{label}}. This action cannot be undone.", + "createReason": "Create Return Reason", + "createReasonHint": "Create a new return reason to categorize returns.", + "editReason": "Edit Return Reason", + "valueTooltip": "The value should be a unique identifier for the return reason." + }, "login": { "forgotPassword": "Forgot password? - <0>Reset", "title": "Log in", @@ -696,6 +705,7 @@ "maxSubtotal": "Max. Subtotal", "shippingProfile": "Shipping Profile", "summary": "Summary", + "label": "Label", "rate": "Rate", "requiresShipping": "Requires shipping" }, diff --git a/packages/admin-next/dashboard/src/components/layout/settings-layout/settings-layout.tsx b/packages/admin-next/dashboard/src/components/layout/settings-layout/settings-layout.tsx index 9702645749..69b15651f6 100644 --- a/packages/admin-next/dashboard/src/components/layout/settings-layout/settings-layout.tsx +++ b/packages/admin-next/dashboard/src/components/layout/settings-layout/settings-layout.tsx @@ -37,6 +37,10 @@ const useSettingRoutes = (): NavItemProps[] => { label: t("regions.domain"), to: "/settings/regions", }, + { + label: t("returnReasons.domain"), + to: "/settings/return-reasons", + }, { label: "Taxes", to: "/settings/taxes", diff --git a/packages/admin-next/dashboard/src/providers/router-provider/router-provider.tsx b/packages/admin-next/dashboard/src/providers/router-provider/router-provider.tsx index 77d0986f53..a0a8d76262 100644 --- a/packages/admin-next/dashboard/src/providers/router-provider/router-provider.tsx +++ b/packages/admin-next/dashboard/src/providers/router-provider/router-provider.tsx @@ -494,6 +494,34 @@ const router = createBrowserRouter([ }, ], }, + { + path: "return-reasons", + element: , + handle: { + crumb: () => "Return Reasons", + }, + children: [ + { + path: "", + lazy: () => + import("../../routes/return-reasons/return-reason-list"), + children: [ + { + path: "create", + lazy: () => + import( + "../../routes/return-reasons/return-reason-create" + ), + }, + { + path: ":id/edit", + lazy: () => + import("../../routes/return-reasons/return-reason-edit"), + }, + ], + }, + ], + }, { path: "regions", element: , diff --git a/packages/admin-next/dashboard/src/routes/return-reasons/return-reason-create/components/create-return-reason-form/create-return-reason-form.tsx b/packages/admin-next/dashboard/src/routes/return-reasons/return-reason-create/components/create-return-reason-form/create-return-reason-form.tsx new file mode 100644 index 0000000000..4b9efc5b1b --- /dev/null +++ b/packages/admin-next/dashboard/src/routes/return-reasons/return-reason-create/components/create-return-reason-form/create-return-reason-form.tsx @@ -0,0 +1,130 @@ +import { zodResolver } from "@hookform/resolvers/zod" +import { Button, Heading, Input, Text, Textarea, clx } from "@medusajs/ui" +import { useAdminCreateReturnReason } from "medusa-react" +import { useForm } from "react-hook-form" +import { useTranslation } from "react-i18next" +import { z } from "zod" +import { Form } from "../../../../../components/common/form" +import { + RouteFocusModal, + useRouteModal, +} from "../../../../../components/route-modal" + +const CreateReturnReasonSchema = z.object({ + value: z.string().min(1, "Value is required"), + label: z.string().min(1, "Label is required"), + description: z.string().optional(), +}) + +export const CreateReturnReasonForm = () => { + const { t } = useTranslation() + const { handleSuccess } = useRouteModal() + + const form = useForm>({ + defaultValues: { + value: "", + label: "", + description: "", + }, + resolver: zodResolver(CreateReturnReasonSchema), + }) + + const { mutateAsync, isLoading } = useAdminCreateReturnReason() + + const handleSubmit = form.handleSubmit(async (data) => { + await mutateAsync(data, { + onSuccess: () => { + handleSuccess() + }, + }) + }) + + return ( + +
+ +
+ + + + +
+
+ +
+
+
+ {t("returnReasons.createReason")} + + {t("returnReasons.createReasonHint")} + +
+
+ { + return ( + + {t("fields.label")} + + + + + + ) + }} + /> + { + return ( + + + {t("fields.value")} + + + + + + + ) + }} + /> +
+ { + return ( + + + {t("fields.description")} + + +