UNPKG

@jdlinker/ui

Version:

jdLinker UI库,基于ant-design-vue封装

645 lines (551 loc) 19.4 kB
import { deepClone, FormValidators } from '@jdlinker/utils'; export default { inject: ['refList', 'getFormConfig', 'getGlobalDsv', 'globalOptionData', 'globalModel', 'getOptionData'], computed: { formConfig() { return this.getFormConfig(); }, widgetSize() { return this.field.options.size || 'default'; }, subFormName() { return !!this.parentWidget ? this.parentWidget.options.name : ''; }, subFormItemFlag() { return !!this.parentWidget ? this.parentWidget.type === 'sub-form' : false; }, formModel: { cache: false, get() { return this.globalModel.formModel; } } }, methods: { //--------------------- 组件内部方法 begin ------------------// getPropName() { if (this.subFormItemFlag && !this.designState) { return this.subFormName + '.' + this.subFormRowIndex + '.' + this.field.options.name + ''; } else { return this.field.options.name; } }, initFieldModel() { if (!this.field.formItemFlag) { return; } if (!!this.subFormItemFlag && !this.designState) { //SubForm子表单组件需要特殊处理!! let subFormData = this.formModel[this.subFormName]; if ( (subFormData === undefined || subFormData[this.subFormRowIndex] === undefined || subFormData[this.subFormRowIndex][this.field.options.name] === undefined) && this.field.options.defaultValue !== undefined ) { this.fieldModel = this.field.options.defaultValue; subFormData[this.subFormRowIndex][this.field.options.name] = this.field.options.defaultValue; } else if (subFormData[this.subFormRowIndex][this.field.options.name] === undefined) { this.fieldModel = null; subFormData[this.subFormRowIndex][this.field.options.name] = null; } else { this.fieldModel = subFormData[this.subFormRowIndex][this.field.options.name]; } /* 主动触发子表单内field-widget的onChange事件!! */ setTimeout(() => { //延时触发onChange事件, 便于更新计算字段!! this.handleOnChangeForSubForm(this.fieldModel, this.oldFieldValue, subFormData, this.subFormRowId); }, 800); this.oldFieldValue = deepClone(this.fieldModel); this.initFileList(); //处理图片上传、文件上传字段 return; } if (this.formModel[this.field.options.name] === undefined && this.field.options.defaultValue !== undefined) { this.fieldModel = this.field.options.defaultValue; } else if (this.formModel[this.field.options.name] === undefined) { //如果formModel为空对象,则初始化字段值为null!! this.formModel[this.field.options.name] = null; } else { this.fieldModel = this.formModel[this.field.options.name]; } this.oldFieldValue = deepClone(this.fieldModel); this.initFileList(); //处理图片上传、文件上传字段 }, initFileList() { //初始化上传组件的已上传文件列表 if ((this.field.type !== 'picture-upload' && this.field.type !== 'file-upload') || this.designState === true) { return; } if (!!this.fieldModel) { if (Array.isArray(this.fieldModel)) { this.fileList = deepClone(this.fieldModel); } else { this.fileList.splice(0, 0, deepClone(this.fieldModel)); } } }, initEventHandler() { this.on$('setFormData', (newFormData) => { if (!this.subFormItemFlag) { this.setValue(newFormData[this.field.options.name]); } }); this.on$('field-value-changed', (values) => { if (!!this.subFormItemFlag) { let subFormData = this.formModel[this.subFormName]; this.handleOnChangeForSubForm(values[0], values[1], subFormData, this.subFormRowId); } else { this.handleOnChange(values[0], values[1]); } }); this.on$('reloadOptionItems', (widgetNames) => { if (widgetNames.length === 0 || widgetNames.indexOf(this.field.options.name) > -1) { this.initOptionItems(true); } }); }, handleOnCreated() { if (!!this.field.options.onCreated) { let customFunc = new Function(this.field.options.onCreated); customFunc.call(this); } }, handleOnMounted() { if (!!this.field.options.onMounted) { let mountFunc = new Function(this.field.options.onMounted); mountFunc.call(this); } }, registerToRefList(oldRefName) { if (this.refList !== null && !!this.field.options.name) { if (this.subFormItemFlag && !this.designState) { //处理子表单元素(且非设计状态) if (!!oldRefName) { delete this.refList[oldRefName + '@row' + this.subFormRowId]; } this.refList[this.field.options.name + '@row' + this.subFormRowId] = this; } else { if (!!oldRefName) { delete this.refList[oldRefName]; } this.refList[this.field.options.name] = this; } } }, unregisterFromRefList() { //销毁组件时注销组件ref if (this.refList !== null && !!this.field.options.name) { let oldRefName = this.field.options.name; if (this.subFormItemFlag && !this.designState) { //处理子表单元素(且非设计状态) delete this.refList[oldRefName + '@row' + this.subFormRowId]; } else { delete this.refList[oldRefName]; } } }, initOptionItems(keepSelected) { if (this.designState) { return; } if ( this.field.type === 'radio' || this.field.type === 'checkbox' || this.field.type === 'select' || this.field.type === 'cascader' ) { /* 异步更新option-data之后globalOptionData不能获取到最新值,改用provide的getOptionData()方法 */ const newOptionItems = this.getOptionData(); if (!!newOptionItems && newOptionItems.hasOwnProperty(this.field.options.name)) { if (!!keepSelected) { this.reloadOptions(newOptionItems[this.field.options.name]); } else { this.loadOptions(newOptionItems[this.field.options.name]); } } } }, refreshDefaultValue() { if (this.designState === true && this.field.options.defaultValue !== undefined) { this.fieldModel = this.field.options.defaultValue; } }, clearFieldRules() { if (!this.field.formItemFlag) { return; } this.rules.splice(0, this.rules.length); //清空已有 }, buildFieldRules() { if (!this.field.formItemFlag && this.field.options.hidden) { return; } this.rules.splice(0, this.rules.length); //清空已有 if (!!this.field.options.required) { this.rules.push({ required: true, //trigger: ['blur', 'change'], trigger: [ 'blur' ] /* 去掉change事件触发校验,change事件触发时formModel数据尚未更新,导致radio/checkbox必填校验出错!! */, message: this.field.options.requiredHint || this.i18nt('render.hint.fieldRequired') }); } if (!!this.field.options.validation) { let vldName = this.field.options.validation; if (!!FormValidators[vldName]) { this.rules.push({ validator: FormValidators[vldName], trigger: ['blur', 'change'], label: this.field.options.label, errorMsg: this.field.options.validationHint }); } else { this.rules.push({ validator: FormValidators['regExp'], trigger: ['blur', 'change'], regExp: vldName, label: this.field.options.label, errorMsg: this.field.options.validationHint }); } } if (!!this.field.options.onValidate) { let customFn = (rule, value, callback) => { let tmpFunc = new Function('rule', 'value', 'callback', this.field.options.onValidate); return tmpFunc.call(this, rule, value, callback); }; this.rules.push({ validator: customFn, trigger: ['blur', 'change'], label: this.field.options.label }); } }, /** * 禁用字段值变动触发表单校验 */ disableChangeValidate() { if (!this.rules) { return; } this.rules.forEach((rule) => { if (!!rule.trigger) { rule.trigger.splice(0, rule.trigger.length); } }); }, /** * 启用字段值变动触发表单校验 */ enableChangeValidate() { if (!this.rules) { return; } this.rules.forEach((rule) => { if (!!rule.trigger) { rule.trigger.push('blur'); rule.trigger.push('change'); } }); }, disableOptionOfList(optionList, optionValue) { if (!!optionList && optionList.length > 0) { optionList.forEach((opt) => { if (opt.value === optionValue) { opt.disabled = true; } }); } }, enableOptionOfList(optionList, optionValue) { if (!!optionList && optionList.length > 0) { optionList.forEach((opt) => { if (opt.value === optionValue) { opt.disabled = false; } }); } }, //--------------------- 组件内部方法 end ------------------// //--------------------- 事件处理 begin ------------------// emitFieldDataChange(newValue, oldValue) { this.emit$('field-value-changed', [newValue, oldValue]); /* 必须用dispatch向指定父组件派发消息!! */ this.dispatch('VFormRender', 'fieldChange', [ this.field.options.name, newValue, oldValue, this.subFormName, this.subFormRowIndex ]); }, syncUpdateFormModel(value) { if (!!this.designState) { return; } if (!!this.subFormItemFlag) { let subFormData = this.formModel[this.subFormName] || [{}]; let subFormDataRow = subFormData[this.subFormRowIndex]; if (!!subFormDataRow) { // 重置表单后subFormDataRow为undefined,应跳过!! subFormDataRow[this.field.options.name] = value; } } else { this.formModel[this.field.options.name] = value; } }, handleChangeEvent(value) { this.syncUpdateFormModel(value); this.emitFieldDataChange(value, this.oldFieldValue); //number组件一般不会触发focus事件,故此处需要手工赋值oldFieldValue!! this.oldFieldValue = deepClone(value); /* oldFieldValue需要在initFieldModel()方法中赋初值!! */ /* 主动触发表单的单个字段校验,用于清除字段可能存在的校验错误提示 */ this.dispatch('VFormRender', 'fieldValidation', [this.getPropName()]); }, handleFocusCustomEvent(event) { this.oldFieldValue = deepClone(this.fieldModel); //保存修改change之前的值 if (!!this.field.options.onFocus) { let customFn = new Function('event', this.field.options.onFocus); customFn.call(this, event); } }, handleBlurCustomEvent(event) { if (!!this.field.options.onBlur) { let customFn = new Function('event', this.field.options.onBlur); customFn.call(this, event); } }, handleInputCustomEvent(value) { this.syncUpdateFormModel(value); /* 主动触发表单的单个字段校验,用于清除字段可能存在的校验错误提示 */ this.dispatch('VFormRender', 'fieldValidation', [this.getPropName()]); if (!!this.field.options.onInput) { let customFn = new Function('value', this.field.options.onInput); customFn.call(this, value); } }, emitAppendButtonClick() { if (!!this.designState) { //设计状态不触发点击事件 return; } if (!!this.field.options.onAppendButtonClick) { let customFn = new Function(this.field.options.onAppendButtonClick); customFn.call(this); } else { /* 必须调用mixins中的dispatch方法逐级向父组件发送消息!! */ this.dispatch('VFormRender', 'appendButtonClick', [this]); } }, handleOnChange(val, oldVal) { //自定义onChange事件 if (!!this.field.options.onChange) { let changeFn = new Function('value', 'oldValue', this.field.options.onChange); changeFn.call(this, val, oldVal); } }, handleOnChangeForSubForm(val, oldVal, subFormData, rowId) { //子表单自定义onChange事件 if (!!this.field.options.onChange) { let changeFn = new Function('value', 'oldValue', 'subFormData', 'rowId', this.field.options.onChange); changeFn.call(this, val, oldVal, subFormData, rowId); } }, handleButtonWidgetClick() { if (!!this.designState) { //设计状态不触发点击事件 return; } if (!!this.field.options.onClick) { let changeFn = new Function(this.field.options.onClick); changeFn.call(this); } else { this.dispatch('VFormRender', 'buttonClick', [this]); } }, remoteQuery(keyword) { if (!!this.field.options.onRemoteQuery) { let remoteFn = new Function('keyword', this.field.options.onRemoteQuery); remoteFn.call(this, keyword); } }, //--------------------- 事件处理 end ------------------// //--------------------- 以下为组件支持外部调用的API方法 begin ------------------// /* 提示:用户可自行扩充这些方法!!! */ getFormRef() { /* 获取VFrom引用,必须在VForm组件created之后方可调用 */ return this.refList['v_form_ref']; }, getWidgetRef(widgetName, showError) { let foundRef = this.refList[widgetName]; if (!foundRef && !!showError) { this.$message.error(this.i18nt('render.hint.refNotFound') + widgetName); } return foundRef; }, getFieldEditor() { //获取内置的el表单组件 return this.$refs['fieldEditor']; }, /* 注意:VFormRender的setFormData方法不会触发子表单内field-widget的setValue方法, 因为setFormData方法调用后,子表单内所有field-widget组件已被清空,接收不到setFormData事件!! * */ setValue(newValue) { /* if ((this.field.type === 'picture-upload') || (this.field.type === 'file-upload')) { this.fileList = newValue } else */ if (!!this.field.formItemFlag) { let oldValue = deepClone(this.fieldModel); this.fieldModel = newValue; this.initFileList(); this.syncUpdateFormModel(newValue); this.emitFieldDataChange(newValue, oldValue); } }, getValue() { /* if ((this.field.type === 'picture-upload') || (this.field.type === 'file-upload')) { return this.fileList } else */ { return this.fieldModel; } }, resetField() { let defaultValue = this.field.options.defaultValue; this.setValue(defaultValue); this.$nextTick(() => { // }); //清空上传组件文件列表 if (this.field.type === 'picture-upload' || this.field.type === 'file-upload') { this.$refs['fieldEditor'].clearFiles(); this.fileList.splice(0, this.fileList.length); } }, setWidgetOption(optionName, optionValue) { //通用组件选项修改API if (this.field.options.hasOwnProperty(optionName)) { this.field.options[optionName] = optionValue; //TODO: 是否重新构建组件??有些属性修改后必须重新构建组件才能生效,比如字段校验规则。 } }, setReadonly(flag) { this.field.options.readonly = flag; }, setDisabled(flag) { this.field.options.disabled = flag; }, setAppendButtonVisible(flag) { this.field.options.appendButton = flag; }, setAppendButtonDisabled(flag) { this.field.options.appendButtonDisabled = flag; }, setHidden(flag) { this.field.options.hidden = flag; if (!!flag) { //清除组件校验规则 this.clearFieldRules(); } else { //重建组件校验规则 this.buildFieldRules(); } }, setRequired(flag) { this.field.options.required = flag; this.buildFieldRules(); }, setLabel(newLabel) { this.field.options.label = newLabel; }, focus() { if (!!this.getFieldEditor() && !!this.getFieldEditor().focus) { this.getFieldEditor().focus(); } }, clearSelectedOptions() { //清空已选选项 if (this.field.type !== 'checkbox' && this.field.type !== 'radio' && this.field.type !== 'select') { return; } if (this.field.type === 'checkbox' || (this.field.type === 'select' && this.field.options.multiple)) { this.fieldModel = []; } else { this.fieldModel = ''; } }, /** * 加载选项,并清空字段值 * @param options */ loadOptions(options) { this.field.options.optionItems = deepClone(options); //this.clearSelectedOptions() //清空已选选项 }, /** * 重新加载选项,不清空字段值 * @param options */ reloadOptions(options) { this.field.options.optionItems = deepClone(options); }, disableOption(optionValue) { this.disableOptionOfList(this.field.options.optionItems, optionValue); }, enableOption(optionValue) { this.enableOptionOfList(this.field.options.optionItems, optionValue); }, /** * 返回选择项 * @returns {*} */ getOptionItems() { return this.field.options.optionItems; }, setUploadHeader(name, value) { this.uploadHeaders[name] = value; }, setUploadData(name, value) { this.uploadData[name] = value; }, setToolbar(customToolbar) { this.customToolbar = customToolbar; }, /** * 是否子表单内嵌的组件 * @returns {boolean} */ isSubFormItem() { return !!this.parentWidget ? this.parentWidget.type === 'sub-form' : false; }, /** * 动态增加自定义css样式 * @param className */ addCssClass(className) { if (!this.field.options.customClass) { this.field.options.customClass = [className]; } else { this.field.options.customClass.push(className); } }, /** * 动态移除自定义css样式 * @param className */ removeCssClass(className) { if (!this.field.options.customClass) { return; } let foundIdx = -1; this.field.options.customClass.map((cc, idx) => { if (cc === className) { foundIdx = idx; } }); if (foundIdx > -1) { this.field.options.customClass.splice(foundIdx, 1); } } } };