feat(i18n): localize assignment validation messages

This commit is contained in:
2026-06-15 01:15:24 +02:00
parent bfea2b77ab
commit 349559f4e0
12 changed files with 446 additions and 67 deletions
+72 -37
View File
@@ -1,52 +1,87 @@
import { z } from "zod"
export const assignmentSchema = z.object({
id: z.string().optional(),
quantity: z.coerce.number().int().nonnegative().min(1, {
error: "Quantity is required",
}),
notes: z.string().optional(),
itemId: z
.string()
.min(1, {
error: "Item is required",
})
.optional(),
assetId: z.string().optional(),
recipientId: z.string().min(1, {
error: "Recipient is required",
}),
assignmentDate: z.date().optional(),
returnDate: z.date().optional(),
})
import type { Dictionary } from "@/i18n/dictionaries"
export const createAssignmentSchema = assignmentSchema.omit({
id: true,
returnDate: true,
})
export type AssignmentSchemaCopy =
Dictionary["inventory"]["assignments"]["schema"]
const defaultAssignmentSchemaCopy: AssignmentSchemaCopy = {
recipientRequired: "Recipient is required",
itemIdRequired: "Item is required",
quantityMinOne: "Quantity must be at least 1",
assetIdRequired: "Asset ID is required when item ID is provided",
idRequired: "Assignment ID is required",
}
function buildAssignmentBaseSchema(copy: AssignmentSchemaCopy) {
return z.object({
id: z.string().optional(),
quantity: z.coerce.number().int().nonnegative().min(1, {
error: copy.quantityMinOne,
}),
notes: z.string().optional(),
itemId: z
.string()
.min(1, {
error: copy.itemIdRequired,
})
.optional(),
assetId: z.string().optional(),
recipientId: z.string().min(1, {
error: copy.recipientRequired,
}),
assignmentDate: z.date().optional(),
returnDate: z.date().optional(),
})
}
export const assignmentSchema = buildAssignmentBaseSchema(
defaultAssignmentSchemaCopy,
)
export function buildCreateAssignmentSchema(copy: AssignmentSchemaCopy) {
return buildAssignmentBaseSchema(copy).omit({
id: true,
returnDate: true,
})
}
export const createAssignmentSchema = buildCreateAssignmentSchema(
defaultAssignmentSchemaCopy,
)
export type CreateAssignmentFormType = z.input<typeof createAssignmentSchema>
export type CreateAssignmentData = z.output<typeof createAssignmentSchema>
export const updateAssignmentSchema = assignmentSchema
.omit({
returnDate: true,
})
.superRefine((data, ctx) => {
if (data.itemId && !data.assetId) {
ctx.addIssue({
code: "custom",
message: "Asset ID is required when item ID is provided",
path: ["assetId"],
})
}
})
export function buildUpdateAssignmentSchema(copy: AssignmentSchemaCopy) {
return buildAssignmentBaseSchema(copy)
.omit({
returnDate: true,
})
.extend({
id: z.string().min(1, {
error: copy.idRequired,
}),
})
.superRefine((data, ctx) => {
if (data.itemId && !data.assetId) {
ctx.addIssue({
code: "custom",
message: copy.assetIdRequired,
path: ["assetId"],
})
}
})
}
export const updateAssignmentSchema = buildUpdateAssignmentSchema(
defaultAssignmentSchemaCopy,
)
export type UpdateAssignmentFormType = z.input<typeof updateAssignmentSchema>
export type UpdateAssignmentData = z.output<typeof updateAssignmentSchema>
export const returnAssignmentSchema = z.object({
id: z.string().min(1, {
error: "Assignment ID is required",
error: defaultAssignmentSchemaCopy.idRequired,
}),
})
export type ReturnAssignmentFormType = z.infer<typeof returnAssignmentSchema>