x-render / packages /form-render /src /models /validates.ts
AbdulElahGwaith's picture
Upload folder using huggingface_hub
c9d0005 verified
Raw History Blame Contribute Delete
3.78 kB
import Color from 'color';
import { isUrl, isObject, isFunction } from '../utils';
import { cloneDeep } from 'lodash-es';
const insertLengthRule = (schema: any, rules: any[]) => {
const { type, max, min, message } = schema;
if (max || max === 0) {
rules.push({ type, max, message: message?.max });
}
if (min || min === 0) {
rules.push({ type, min, message: message?.min });
}
};
const insertRequiredRule = (schema: any, rules: any[]) => {
let {
type,
format,
required,
message,
widget,
title
} = schema;
const requiredAlready = schema?.rules?.some((item: any) => item?.required);
// 未声明 required,或已经存在 required 校验
if (!required || requiredAlready) {
return;
}
let rule: any = { required: true, message: message?.required };
if (['year','quarter', 'month', 'week', 'date', 'dateTime', 'time'].includes(format) && type === 'range') {
rule = {
type: 'array',
required: true,
len: 2,
fields: {
0: { type: 'string', required: true },
1: { type: 'string', required: true },
}
};
} else if (widget === 'checkbox') {
rule = { type, required: true, whitespace: true, message: title + '必填' };
} else if (type === 'string') {
rule = { type: 'string', required: true, whitespace: true, message: message?.required || (!title ? '内容必填' : undefined) };
}
rules.push(rule);
};
export const transformRules = (rules = [], methods: any, form: any) => {
return rules.map(((item: any) => {
if (item.validator && !item.transformed) {
const validator = isFunction(item.validator) ? item.validator : methods[item.validator];
item.validator = async (_: any, value: any) => {
const result = await validator(_, value, { form });
if (isObject(result)) {
return result?.status ? Promise.resolve() : Promise.reject(new Error(result.message || item.message));
}
return result ? Promise.resolve() : Promise.reject(new Error(item.message));
};;
item.transformed = true;
}
return item;
}));
};
export default (_schema: any, form: any, methods: any, fieldRef: any) => {
const schema = cloneDeep(_schema);
let {
format,
rules: ruleList = [],
pattern,
message,
} = schema;
const rules: any = [...ruleList];
insertRequiredRule(schema, rules);
insertLengthRule(schema, rules);
rules.push({
validator: async (_: any) => {
if (!isFunction(fieldRef?.current?.validator)) {
return true;
}
const res = await fieldRef.current?.validator();
return res;
}
});
if (pattern) {
rules.push({ pattern, message: message?.pattern });
}
if (format === 'url') {
rules.push({ type: 'url', message: message?.url });
}
if (format === 'email') {
rules.push({ type: 'email', message: message?.email });
}
if (format === 'image') {
rules.push({
validator: (_: any, value: any) => {
if (!value) {
return true;
}
const imagePattern = '([/|.|w|s|-])*.(?:jpg|gif|png|bmp|apng|webp|jpeg|json)';
const _isUrl = isUrl(value);
const _isImg = new RegExp(imagePattern).test(value);
return _isUrl || _isImg;
},
message: message?.email ?? '请输入正确的图片格式'
});
}
if (format === 'color') {
rules.push({
validator: (_: any, value: any) => {
try {
Color(value || null); // 空字符串无法解析会报错,出现空的情况传 null
return true;
} catch (e) {
return false;
}
},
message: message?.color ?? '请填写正确的颜色格式'
});
}
return transformRules(rules, methods, form);
}