From a0034a0feff750546816a5722b4d3bda18521209 Mon Sep 17 00:00:00 2001 From: Kasper Fabricius Kristensen <45367945+kasperkristensen@users.noreply.github.com> Date: Mon, 4 Nov 2024 09:04:29 +0100 Subject: [PATCH] fix(dashboard): Allow float values for product prices (#9859) --- .../admin/dashboard/src/lib/validation.ts | 21 ++++++++++++++++++- .../product-create-form.tsx | 11 ++++++---- .../products/product-create/constants.ts | 4 ++-- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/packages/admin/dashboard/src/lib/validation.ts b/packages/admin/dashboard/src/lib/validation.ts index 4c94566927..e70ae6219f 100644 --- a/packages/admin/dashboard/src/lib/validation.ts +++ b/packages/admin/dashboard/src/lib/validation.ts @@ -1,7 +1,7 @@ import i18next from "i18next" +import { FieldPath, FieldValues, UseFormReturn } from "react-hook-form" import { z } from "zod" import { castNumber } from "./cast-number" -import { FieldPath, FieldValues, UseFormReturn } from "react-hook-form" /** * Validates that an optional value is an integer. @@ -34,6 +34,25 @@ export const optionalInt = z } ) +/** + * Validates that an optional value is an number. + */ +export const optionalFloat = z + .union([z.string(), z.number()]) + .optional() + .refine( + (value) => { + if (value === "" || value === undefined) { + return true + } + + return castNumber(value) >= 0 + }, + { + message: i18next.t("validation.mustBePositive"), + } + ) + /** * Schema for metadata form. */ diff --git a/packages/admin/dashboard/src/routes/products/product-create/components/product-create-form/product-create-form.tsx b/packages/admin/dashboard/src/routes/products/product-create/components/product-create-form/product-create-form.tsx index 5e3c0d3dc6..566ea2fa22 100644 --- a/packages/admin/dashboard/src/routes/products/product-create/components/product-create-form/product-create-form.tsx +++ b/packages/admin/dashboard/src/routes/products/product-create/components/product-create-form/product-create-form.tsx @@ -80,10 +80,13 @@ export const ProductCreateForm = ({ return {} } - return regions.reduce((acc, reg) => { - acc[reg.id] = reg.currency_code - return acc - }, {} as Record) + return regions.reduce( + (acc, reg) => { + acc[reg.id] = reg.currency_code + return acc + }, + {} as Record + ) }, [regions]) /** diff --git a/packages/admin/dashboard/src/routes/products/product-create/constants.ts b/packages/admin/dashboard/src/routes/products/product-create/constants.ts index af1e295ee2..519396ca14 100644 --- a/packages/admin/dashboard/src/routes/products/product-create/constants.ts +++ b/packages/admin/dashboard/src/routes/products/product-create/constants.ts @@ -1,6 +1,6 @@ import { z } from "zod" import { i18n } from "../../../components/utilities/i18n/i18n.tsx" -import { optionalInt } from "../../../lib/validation.ts" +import { optionalFloat, optionalInt } from "../../../lib/validation.ts" import { decorateVariantsWithDefaultValues } from "./utils.ts" export const MediaSchema = z.object({ @@ -32,7 +32,7 @@ const ProductCreateVariantSchema = z.object({ inventory_kit: z.boolean().optional(), options: z.record(z.string(), z.string()), variant_rank: z.number(), - prices: z.record(z.string(), optionalInt).optional(), + prices: z.record(z.string(), optionalFloat).optional(), inventory: z .array( z.object({