67 lines
1.4 KiB
TypeScript
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),
|
|
}
|
|
}
|