Files
RenewCMS/web/src/lib/schemaBuilderPayload.ts
T

67 lines
1.4 KiB
TypeScript

import {
effectiveDefault,
isUnique,
supportsLimits,
trimmedOptions,
type BuilderField,
type BuilderForm,
} from '@/lib/schemaBuilderModel'
export interface PayloadField {
key: string
label: string
type: string
required: boolean
unique: boolean
default: string | number | boolean | null
min: number | string | null
max: number | string | null
options: string[]
}
export interface ContentTypePayload {
key: string
name: string
fields: PayloadField[]
}
function limit(field: BuilderField, text: string) {
if (!supportsLimits(field.type) || text.trim() === '') {
return null
}
return field.type === 'date' ? text : Number(text)
}
function defaultFor(field: BuilderField) {
if (field.type === 'boolean') {
return field.defaultOn ? true : null
}
const given = effectiveDefault(field)
if (given === '') {
return null
}
return field.type === 'number' ? Number(given) : given
}
export function payloadField(field: BuilderField): PayloadField {
return {
key: field.key,
label: field.label.trim(),
type: field.type,
required: field.required,
unique: isUnique(field),
default: defaultFor(field),
min: limit(field, field.min),
max: limit(field, field.max),
options: field.type === 'select' ? trimmedOptions(field) : [],
}
}
export function buildPayload(form: BuilderForm): ContentTypePayload {
return {
key: form.key,
name: form.name.trim(),
fields: form.fields.map(payloadField),
}
}