import { z } from 'zod'; /** * All CMS field types supported by the module engine. * Maps 1:1 to the cms_field_type Postgres enum. */ export const CmsFieldTypeEnum = z.enum([ 'text', 'textarea', 'richtext', 'checkbox', 'radio', 'hidden', 'select', 'password', 'file', 'date', 'time', 'decimal', 'integer', 'email', 'phone', 'url', 'currency', 'iban', 'color', 'computed', ]); export type CmsFieldType = z.infer; export const CmsModuleStatusEnum = z.enum(['active', 'inactive', 'archived']); export type CmsModuleStatus = z.infer; export const CmsRecordStatusEnum = z.enum([ 'active', 'locked', 'deleted', 'archived', ]); export type CmsRecordStatus = z.infer; /** * Schema for creating / updating a module definition. */ export const CreateModuleSchema = z.object({ accountId: z.string().uuid(), name: z .string() .min(1) .max(64) .regex(/^[a-z][a-z0-9_]*$/, { message: 'Module name must start with a letter and contain only lowercase letters, numbers, and underscores', }), displayName: z.string().min(1).max(128), description: z.string().max(1024).optional(), icon: z.string().max(64).default('table'), status: CmsModuleStatusEnum.default('active'), sortOrder: z.number().int().default(0), defaultSortField: z.string().optional(), defaultSortDirection: z.enum(['asc', 'desc']).default('asc'), defaultPageSize: z.number().int().min(5).max(200).default(25), enableSearch: z.boolean().default(true), enableFilter: z.boolean().default(true), enableExport: z.boolean().default(true), enableImport: z.boolean().default(false), enablePrint: z.boolean().default(true), enableCopy: z.boolean().default(false), enableBulkEdit: z.boolean().default(false), enableHistory: z.boolean().default(true), enableSoftDelete: z.boolean().default(true), enableLock: z.boolean().default(false), }); export type CreateModuleInput = z.infer; export const UpdateModuleSchema = CreateModuleSchema.partial().extend({ moduleId: z.string().uuid(), }); export type UpdateModuleInput = z.infer;