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
This commit is contained in:
2026-04-18 20:36:12 -03:00
parent f6733acfbb
commit f8d861a25a
2 changed files with 14 additions and 11 deletions

View File

@@ -29,12 +29,17 @@ const rubroFormSchema = z.object({
.min(1, 'El nombre es requerido') .min(1, 'El nombre es requerido')
.max(200, 'Máximo 200 caracteres'), .max(200, 'Máximo 200 caracteres'),
tarifarioBaseId: z 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() .optional()
.nullable(), .nullable(),
}) })
export type RubroFormValues = z.infer<typeof rubroFormSchema> export type RubroFormValues = {
nombre: string
tarifarioBaseId?: number | null
}
interface RubroFormDialogProps { interface RubroFormDialogProps {
open: boolean open: boolean
@@ -71,11 +76,12 @@ export function RubroFormDialog({
}: RubroFormDialogProps) { }: RubroFormDialogProps) {
const isEdit = !!rubro const isEdit = !!rubro
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const form = useForm<RubroFormValues>({ const form = useForm<RubroFormValues>({
resolver: zodResolver(rubroFormSchema), resolver: zodResolver(rubroFormSchema) as any,
defaultValues: { defaultValues: {
nombre: rubro?.nombre ?? '', nombre: rubro?.nombre ?? '',
tarifarioBaseId: (rubro?.tarifarioBaseId ?? '') as unknown as undefined, tarifarioBaseId: rubro?.tarifarioBaseId ?? null,
}, },
}) })
@@ -83,7 +89,7 @@ export function RubroFormDialog({
if (open) { if (open) {
form.reset({ form.reset({
nombre: rubro?.nombre ?? '', nombre: rubro?.nombre ?? '',
tarifarioBaseId: (rubro?.tarifarioBaseId ?? '') as unknown as undefined, tarifarioBaseId: rubro?.tarifarioBaseId ?? null,
}) })
} }
}, [open, rubro, form]) }, [open, rubro, form])
@@ -134,8 +140,8 @@ export function RubroFormDialog({
<FormControl> <FormControl>
<Input <Input
{...field} {...field}
value={(field.value as string | number | undefined) ?? ''} value={field.value != null ? String(field.value) : ''}
onChange={(e) => field.onChange(e.target.value)} onChange={(e) => field.onChange(e.target.value === '' ? null : e.target.value)}
type="number" type="number"
min={1} min={1}
disabled={isPending} disabled={isPending}

View File

@@ -63,10 +63,7 @@ export function RubrosPage() {
async function handleFormSubmit(values: RubroFormValues) { async function handleFormSubmit(values: RubroFormValues) {
setFormError(null) setFormError(null)
try { try {
const tarifarioId = const tarifarioId = values.tarifarioBaseId ?? null
values.tarifarioBaseId === '' || values.tarifarioBaseId == null
? null
: Number(values.tarifarioBaseId)
if (editingRubro) { if (editingRubro) {
await updateRubro({ await updateRubro({