UNPKG

@jdlinker/utils

Version:

jdLinker 工具库

144 lines (124 loc) 3.95 kB
import { isNotNull, traverseContainerWidgets, traverseFieldWidgets } from './util'; import { translate } from './i18n'; import { FormValidators, getRegExp } from './validators'; export function buildDefaultValueListFn(formConfig, widgetList, resultList) { return function (fieldWidget) { const fop = fieldWidget.options; const fd = fop.defaultValue; if (isNotNull(fd)) { resultList.push(`${fop.name}: ${JSON.stringify(fd)},`); } else { resultList.push(`${fop.name}: null,`); } }; } export function buildRulesListFn(formConfig, widgetList, resultList) { return function (fieldWidget) { const fop = fieldWidget.options; let fieldRules = []; if (!!fop.required) { fieldRules.push(`{ required: true, message: '${translate('render.hint.fieldRequired')}', }`); } if (!!fop.validation) { let vldName = fop.validation; if (!!FormValidators[vldName]) { fieldRules.push(`{ pattern: ${eval(getRegExp(vldName))}, trigger: ['blur', 'change'], message: '${fop.validationHint}' }`); } else { fieldRules.push(`{ pattern: '${eval(vldName)}', trigger: ['blur', 'change'], message: '${fop.validationHint}' }`); } } //TODO: 自定义校验函数 fieldRules.length > 0 && resultList.push(`${fop.name}: [${fieldRules.join(',')}],`); }; } export function buildFieldOptionsFn(formConfig, widgetList, resultList) { return function (fieldWidget) { const fop = fieldWidget.options; const ft = fieldWidget.type; if (ft === 'radio' || ft === 'checkbox' || ft === 'select' || ft === 'cascader') { resultList.push(`${fop.name}Options: ${JSON.stringify(fop.optionItems)},`); } }; } export function buildUploadDataFn(formConfig, widgetList, resultList) { return function (fieldWidget) { const fop = fieldWidget.options; const ft = fieldWidget.type; if (ft === 'picture-upload' || ft === 'file-upload') { resultList.push(`${fop.name}FileList: [],`); resultList.push(`${fop.name}UploadHeaders: {},`); resultList.push(`${fop.name}UploadData: {},`); } }; } export function buildActiveTabs(formConfig, widgetList) { let resultList = []; const handlerFn = function (cw) { const cop = cw.options; const ct = cw.type; if (ct === 'tab') { cw.tabs.length > 0 && resultList.push(`'${cop.name}ActiveTab': '${cw.tabs[0].options.name}',`); } }; traverseContainerWidgets(widgetList, handlerFn); return resultList; } export const genVue2JS = function (formConfig, widgetList) { let defaultValueList = []; let rulesList = []; let fieldOptions = []; let uploadData = []; traverseFieldWidgets(widgetList, (widget) => { buildDefaultValueListFn(formConfig, widgetList, defaultValueList)(widget); buildRulesListFn(formConfig, widgetList, rulesList)(widget); buildFieldOptionsFn(formConfig, widgetList, fieldOptions)(widget); buildUploadDataFn(formConfig, widgetList, uploadData)(widget); }); const activeTabs = buildActiveTabs(formConfig, widgetList); const v2JSTemplate = ` export default { components: {}, props: {}, data() { return { ${formConfig.modelName}: { ${defaultValueList.join('\n')} }, ${formConfig.rulesName}: { ${rulesList.join('\n')} }, ${activeTabs.join('\n')} ${fieldOptions.join('\n')} ${uploadData.join('\n')} } }, computed: {}, watch: {}, created() { }, mounted() { }, methods: { submitForm() { this.$refs['vForm'].validate(valid => { if (!valid) return //TODO: 提交表单 }) }, resetForm() { this.$refs['vForm'].resetFields() } } }`; return v2JSTemplate; };