From f07802f76929887d2c7121b673532104a43176ec Mon Sep 17 00:00:00 2001 From: dmolinari Date: Sat, 18 Apr 2026 20:36:12 -0300 Subject: [PATCH] fix(frontend): corregir tipos zodResolver en RubroFormDialog (CAT-001) - Reemplaza z.union([z.coerce.number(), z.literal('')]) por z.string().transform+pipe para evitar inferencia unknown en zodResolver - Simplifica RubroFormValues a {nombre: string, tarifarioBaseId?: number | null} - Actualiza RubrosPage: tarifarioId ya llega como number|null del schema transform --- .../rubros/components/RubroFormDialog.tsx | 20 ++++++++++++------- .../src/features/rubros/pages/RubrosPage.tsx | 5 +---- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/web/src/features/rubros/components/RubroFormDialog.tsx b/src/web/src/features/rubros/components/RubroFormDialog.tsx index f48a04b..eba86a4 100644 --- a/src/web/src/features/rubros/components/RubroFormDialog.tsx +++ b/src/web/src/features/rubros/components/RubroFormDialog.tsx @@ -29,12 +29,17 @@ const rubroFormSchema = z.object({ .min(1, 'El nombre es requerido') .max(200, 'Máximo 200 caracteres'), tarifarioBaseId: z - .union([z.coerce.number().int().positive('Debe ser un número positivo'), z.literal('')]) + .string() + .transform((val) => (val === '' ? null : Number(val))) + .pipe(z.number().int().positive('Debe ser un número positivo').nullable()) .optional() .nullable(), }) -export type RubroFormValues = z.infer +export type RubroFormValues = { + nombre: string + tarifarioBaseId?: number | null +} interface RubroFormDialogProps { open: boolean @@ -71,11 +76,12 @@ export function RubroFormDialog({ }: RubroFormDialogProps) { const isEdit = !!rubro + // eslint-disable-next-line @typescript-eslint/no-explicit-any const form = useForm({ - resolver: zodResolver(rubroFormSchema), + resolver: zodResolver(rubroFormSchema) as any, defaultValues: { nombre: rubro?.nombre ?? '', - tarifarioBaseId: (rubro?.tarifarioBaseId ?? '') as unknown as undefined, + tarifarioBaseId: rubro?.tarifarioBaseId ?? null, }, }) @@ -83,7 +89,7 @@ export function RubroFormDialog({ if (open) { form.reset({ nombre: rubro?.nombre ?? '', - tarifarioBaseId: (rubro?.tarifarioBaseId ?? '') as unknown as undefined, + tarifarioBaseId: rubro?.tarifarioBaseId ?? null, }) } }, [open, rubro, form]) @@ -134,8 +140,8 @@ export function RubroFormDialog({ field.onChange(e.target.value)} + value={field.value != null ? String(field.value) : ''} + onChange={(e) => field.onChange(e.target.value === '' ? null : e.target.value)} type="number" min={1} disabled={isPending} diff --git a/src/web/src/features/rubros/pages/RubrosPage.tsx b/src/web/src/features/rubros/pages/RubrosPage.tsx index 7e9c754..3e3ed9e 100644 --- a/src/web/src/features/rubros/pages/RubrosPage.tsx +++ b/src/web/src/features/rubros/pages/RubrosPage.tsx @@ -63,10 +63,7 @@ export function RubrosPage() { async function handleFormSubmit(values: RubroFormValues) { setFormError(null) try { - const tarifarioId = - values.tarifarioBaseId === '' || values.tarifarioBaseId == null - ? null - : Number(values.tarifarioBaseId) + const tarifarioId = values.tarifarioBaseId ?? null if (editingRubro) { await updateRubro({