Files
pn-new-crm/src/lib/validators/custom-fields.ts
Matt Ciaccio 8699f81879
Some checks failed
Build & Push Docker Images / lint (push) Failing after 1m18s
Build & Push Docker Images / build-and-push (push) Has been skipped
chore(style): codebase em-dash sweep + minor layout polish
Replaces every em-dash and en-dash with regular ASCII hyphens
across comments, JSX strings, and dev-facing logs. Mostly cosmetic
but stops the inconsistent mix that crept in over the last few
months (some files used em-dashes in comments, others didn't,
some used both).

Bundles two small dashboard-layout tweaks that touch a couple of
already-modified files:
- (dashboard)/layout.tsx main padding goes from p-6 to pt-3 px-6
  pb-6 so page content sits closer to the topbar.
- Sidebar now receives the ports list it needs for the footer
  port switcher.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-04 22:57:01 +02:00

48 lines
1.5 KiB
TypeScript

import { z } from 'zod';
const CUSTOM_FIELD_TYPES = ['text', 'number', 'date', 'boolean', 'select'] as const;
const CUSTOM_FIELD_ENTITIES = ['client', 'interest', 'berth'] as const;
export const createFieldSchema = z
.object({
entityType: z.enum(CUSTOM_FIELD_ENTITIES),
fieldName: z
.string()
.min(1)
.max(50)
.regex(/^[a-z_][a-z0-9_]*$/, 'Must be snake_case'),
fieldLabel: z.string().min(1).max(100),
fieldType: z.enum(CUSTOM_FIELD_TYPES),
selectOptions: z.array(z.string().min(1).max(100)).min(1).max(50).optional(),
isRequired: z.boolean().default(false),
sortOrder: z.number().int().min(0).default(0),
})
.refine(
(data) => data.fieldType !== 'select' || (data.selectOptions && data.selectOptions.length > 0),
{
message: 'Select fields must have at least one option',
path: ['selectOptions'],
},
);
export const updateFieldSchema = z.object({
fieldLabel: z.string().min(1).max(100).optional(),
selectOptions: z.array(z.string().min(1).max(100)).optional(),
isRequired: z.boolean().optional(),
sortOrder: z.number().int().min(0).optional(),
// fieldType intentionally omitted - cannot be changed after creation
});
export const setValuesSchema = z.object({
values: z.array(
z.object({
fieldId: z.string().uuid(),
value: z.unknown(),
}),
),
});
export type CreateFieldInput = z.infer<typeof createFieldSchema>;
export type UpdateFieldInput = z.infer<typeof updateFieldSchema>;
export type SetValuesInput = z.infer<typeof setValuesSchema>;