src/types/MEnumType.ts (60 lines of code) (raw):
import { MUtil } from "../framework/MUtil";
import { MValidationResult, MFieldSchemaAnonymity } from '../framework/Schema';
import { MType } from "./MType";
import { validateRequired } from "../framework/Validator";
import { Assembly, assembly } from '../framework/Assembly';
import _ from "lodash";
// 选项是否合法、开放选项是否合法
function validateCandidate(a: Assembly, schema: MFieldSchemaAnonymity, value: any, path: string): MValidationResult {
let fs = MUtil.option(schema);
console.log('validateCandidate', value)
for (let f of fs) {
// @ts-ignore
if (MUtil.isEquals(f.value, _.isObject(value) ? value?.value : value, schema.tolerate)) {
return undefined;
}
}
const openOption = _.clone(schema.openOption ?? schema.enumOpen)
if (openOption) {
openOption.required = true; // 既然勾上了开放选项,就必须填, TODO 把开放选项标注成必填,可以在schema预处理做
return assembly.validate(openOption, value, "")
}
return { message: '请选择一个选项', path }
}
export const MEnumType: MType = {
validators: [validateRequired, validateCandidate],
createDefaultValue: (assembly: Assembly, s: MFieldSchemaAnonymity): any => {
if (s.defaultValue) {
return _.clone(s.defaultValue);
} else {
return undefined;
}
},
toReadable: (assembly: Assembly, s: MFieldSchemaAnonymity, v: any): string => {
const fs = MUtil.option(s);
for (let f of fs) {
if (f.value === v) {
return f.label ?? v;
}
}
if (s.openOption) {
return v;
} else {
return assembly.theme.READABLE_BLANK;
}
},
standardValue: (assembly: Assembly, s: MFieldSchemaAnonymity, value: any, strict: boolean): any => {
if (!strict) { // value的类型各种可能都有,如果不要求严格,就不用处理了
return value;
}
const fs = MUtil.option(s);
for (let f of fs) {
// @ts-ignore
if (MUtil.isEquals(f.value, _.isObject(value) ? value?.value : value, s.tolerate)) {
return value;
}
}
if (s.openOption || s.enumOpen) {
return value;
} else {
return undefined;
}
}
}