140 lines
3.1 KiB
TypeScript
140 lines
3.1 KiB
TypeScript
|
import type { z } from 'zod'
|
|||
|
|
|||
|
export type TFormSchemaCtrlArgs = {
|
|||
|
key?: string
|
|||
|
type?: string
|
|||
|
label?: string
|
|||
|
component?: string
|
|||
|
|
|||
|
hidden?: boolean
|
|||
|
description?: string
|
|||
|
readonly?: boolean
|
|||
|
multiple?: boolean
|
|||
|
disabled?: boolean
|
|||
|
cssClass?: string
|
|||
|
}
|
|||
|
|
|||
|
export class FormSchemaCtrl {
|
|||
|
key: string
|
|||
|
type: string
|
|||
|
label: string
|
|||
|
component: string
|
|||
|
|
|||
|
hidden?: boolean
|
|||
|
description?: string
|
|||
|
readonly?: boolean
|
|||
|
multiple?: boolean
|
|||
|
disabled?: boolean
|
|||
|
cssClass?: string
|
|||
|
|
|||
|
static toString(ctrl: TFormSchemaCtrlArgs, description?: string) {
|
|||
|
let result = ''
|
|||
|
try {
|
|||
|
if (description) {
|
|||
|
const descObj = JSON.parse(description)
|
|||
|
ctrl = Object.assign(descObj, ctrl)
|
|||
|
}
|
|||
|
result = JSON.stringify(ctrl)
|
|||
|
} catch (ex) {}
|
|||
|
|
|||
|
return result
|
|||
|
}
|
|||
|
|
|||
|
constructor(args: TFormSchemaCtrlArgs, shape: z.ZodTypeAny) {
|
|||
|
let desc: any = {}
|
|||
|
|
|||
|
try {
|
|||
|
if (shape.description) {
|
|||
|
desc = JSON.parse(shape.description)
|
|||
|
} else {
|
|||
|
desc = JSON.parse(shape?._def?.innerType?._def?.description || '{}')
|
|||
|
}
|
|||
|
} catch (ex: any) {
|
|||
|
desc = { label: shape.description || 'Unknown' }
|
|||
|
}
|
|||
|
|
|||
|
this.key = desc.key || args.key || 'unknown'
|
|||
|
this.label = desc.label || args.label || 'Label'
|
|||
|
|
|||
|
// Тип.
|
|||
|
this.type = desc.type || args.type
|
|||
|
|
|||
|
if (!this.type && shape) {
|
|||
|
if (
|
|||
|
shape?._def?.innerType?._def?.innerType?._def?.schema?._def?.typeName
|
|||
|
) {
|
|||
|
this.type =
|
|||
|
shape?._def?.innerType?._def?.innerType?._def?.schema?._def?.typeName
|
|||
|
}
|
|||
|
|
|||
|
if (shape._def?.innerType?._def?.innerType?._def?.typeName) {
|
|||
|
this.type = shape?._def?.innerType?._def?.innerType._def.typeName
|
|||
|
}
|
|||
|
|
|||
|
if (shape._def.innerType?._def?.schema?._def?.typeName) {
|
|||
|
this.type = shape._def.innerType?._def?.schema?._def?.typeName
|
|||
|
}
|
|||
|
|
|||
|
if (shape._def.innerType?._def?.typeName) {
|
|||
|
this.type = shape._def.innerType._def.typeName
|
|||
|
}
|
|||
|
|
|||
|
if (shape._def.schema?._def?.typeName) {
|
|||
|
this.type = shape._def.schema._def.typeName
|
|||
|
}
|
|||
|
|
|||
|
if (!this.type) {
|
|||
|
this.type = shape._def.typeName
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Переименовываем тип.
|
|||
|
switch (this.type) {
|
|||
|
case 'ZodString':
|
|||
|
this.type = 'string'
|
|||
|
break
|
|||
|
case 'ZodNumber':
|
|||
|
this.type = 'number'
|
|||
|
break
|
|||
|
case 'ZodBoolean':
|
|||
|
this.type = 'boolean'
|
|||
|
break
|
|||
|
case 'ZodArray':
|
|||
|
this.type = 'array'
|
|||
|
break
|
|||
|
case 'ZodDate':
|
|||
|
this.type = 'date'
|
|||
|
break
|
|||
|
}
|
|||
|
|
|||
|
// Компонент.
|
|||
|
this.component = desc.component || args.component
|
|||
|
if (!this.component) {
|
|||
|
switch (this.type) {
|
|||
|
case 'string':
|
|||
|
this.component = 'ui-field-text'
|
|||
|
break
|
|||
|
case 'number':
|
|||
|
this.component = 'ui-field-number'
|
|||
|
break
|
|||
|
case 'boolean':
|
|||
|
this.component = 'ui-field-checkbox'
|
|||
|
break
|
|||
|
case 'date':
|
|||
|
this.component = 'ui-field-date'
|
|||
|
break
|
|||
|
default:
|
|||
|
this.component = 'ui-field'
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Не обязательные.
|
|||
|
this.hidden = desc.hidden || args.hidden
|
|||
|
this.description = desc.description || args.description
|
|||
|
this.readonly = desc.readonly || args.readonly
|
|||
|
this.multiple = desc.multiple || args.multiple
|
|||
|
this.disabled = desc.disabled || args.disabled
|
|||
|
this.cssClass = desc.cssClass || args.cssClass
|
|||
|
}
|
|||
|
}
|