Form Validation Schemas
8.1 campaignFormSchema
Location: src/components/forms/campaignForm/campaign.schema.ts
Purpose: Zod schema for campaign form validation with complex type handling.
Key Validations:
-
Campaign Name:
- Minimum 1 character
- String type
-
Status:
- Enum:
["active", "inactive"] - Custom error message
- Enum:
-
Jurisdiction:
jurisdictionName- Min 1 characterjurisdictionType- Min 1 character
-
Signature Requirements:
requiredSignatures- Positive integertargetSignatures- Positive integer- Union type: accepts number or string
- String transformation: converts to number, truncates decimals
-
Date Fields:
startDate- Coerced to datetargetDate- Coerced to dateendDate- Optional, nullable, coerced to date
-
Colors:
primaryColor- Hex color regex (#RRGGBBor#RGB)- Default:
#000000 secondaryColor- Hex color regex- Default:
#FFFFFF
-
Banner Image:
- Optional object with:
path,id,fullPath,publicURL(required strings)altText(optional string)
- Optional object with:
-
Jurisdiction Addition:
- Enum:
["county", "none"]
- Enum:
Number/String Union:
z.union([
z.number().int().positive(),
z.string().transform((val) => {
const num = Number(val);
return isNaN(num) ? 0 : Math.trunc(num);
}).refine((num) => num > 0, "Must be positive")
])
Notes:
- Handles form inputs that may be strings or numbers
- Truncates decimals (no partial signatures)
- Validates hex colors with regex
- Coerces dates from strings
8.2 transactionFormSchema
Location: src/components/forms/transactionForm/transaction.schema.ts
Purpose: Zod schema for transaction form with percentage and amount validation.
Key Validations:
-
Total Amount:
- Positive number
- Union type (number or string)
- Allows decimals
-
Kitty Percentage (
kittyP):- Range: 0-100
- Union type (number or string)
- Allows decimals
- Two separate refines for min/max
-
Dates:
datePaid- Coerced to dateturnInDate- Coerced to date
-
Campaign:
- String, minimum 36 characters (UUID length)
-
Circulator:
- Optional, nullable string
- Minimum 1 character if provided
-
Type & Method:
- String types (no specific validation)
Percentage Validation:
z.union([
z.number().min(0).max(100).positive(),
z.string().transform((val) => Number(val))
.refine((num) => num >= 0, "Must be at least 0")
.refine((num) => num <= 100, "Must be at most 100")
])
Notes:
- Percentage allows 0 (unlike amount which must be positive)
- Handles string inputs from form fields
- Validates UUID length for campaign ID