| | |
| | | import moment from 'moment' |
| | | |
| | | import Api from '@/api' |
| | | import { formRule } from '@/utils/option.js' |
| | | import Utils from '@/utils/utils.js' |
| | | import asyncComponent from '@/utils/asyncComponent' |
| | | import MKEmitter from '@/utils/events.js' |
| | |
| | | send_type: '', |
| | | timestamp: '', |
| | | n_id: '', |
| | | focusId: '' |
| | | focusId: '', |
| | | reFocusId: '', |
| | | dict: window.GLOB.dict |
| | | } |
| | | |
| | | record = {} |
| | |
| | | |
| | | componentDidMount () { |
| | | const { action, unload } = this.props |
| | | const { dict } = this.state |
| | | |
| | | let data = {} |
| | | let BData = {} |
| | |
| | | } |
| | | |
| | | formlist = formlist.filter(item => { |
| | | if (item.type === 'hint') { |
| | | if (item.field && data[item.field.toLowerCase()]) { |
| | | item.message = data[item.field.toLowerCase()] |
| | | } |
| | | delete item.field |
| | | } |
| | | |
| | | if (item.supField) { // 多层表单控制 |
| | | if (['hint', 'split', 'formula'].includes(item.type)) { |
| | | item.field = item.uuid |
| | | fieldMap.set(item.field, item) |
| | | } |
| | | let supvals = [] |
| | | if (item.supvalue) { |
| | | item.supvalue.split(',').forEach(val => { |
| | |
| | | } |
| | | } |
| | | |
| | | if (item.type === 'split' || item.type === 'formula') return true |
| | | if (item.type === 'hint') { |
| | | if (item.field && data[item.field.toLowerCase()]) { |
| | | item.message = data[item.field.toLowerCase()] |
| | | } |
| | | delete item.field |
| | | return true |
| | | } else if (item.type === 'date') { |
| | | if (['hint', 'split', 'formula'].includes(item.type)) return true |
| | | if (item.type === 'date') { |
| | | item.precision = item.precision || 'day' |
| | | } else if (item.type === 'datetime') { |
| | | item.type = 'date' |
| | |
| | | item.readin = item.readin !== 'false' && item.readin !== 'top' |
| | | item.readonly = check || item.readonly === 'true' |
| | | item.writein = item.writein !== 'false' |
| | | item.defHidden = item.hidden === 'true' |
| | | item.hidden = item.hidden === 'true' |
| | | item.fieldlength = item.fieldlength || 50 |
| | | |
| | |
| | | } else { |
| | | newval = item.closeVal |
| | | } |
| | | } else if (item.type === 'popSelect') { |
| | | if (newval && newval !== '$empty') { |
| | | item.showValue = data[item.showField.toLowerCase()] || '' |
| | | } else { |
| | | item.showValue = '' |
| | | } |
| | | } |
| | | |
| | | if (newval !== '$empty') { |
| | |
| | | if (item.required === 'true') { |
| | | item.rules.push({ |
| | | required: true, |
| | | message: item.label + '不可为空!' |
| | | message: item.label + (dict['not_empty'] || '不可为空!') |
| | | }) |
| | | } |
| | | |
| | | item.rules.push({ |
| | | validator: (rule, value, callback) => { |
| | | if (/'/.test(value)) { |
| | | callback('不可使用英文状态的单引号!') |
| | | } else if (/--/.test(value)) { |
| | | callback('不可使用 -- !') |
| | | callback(dict['single_quot'] || '不可使用英文状态的单引号!') |
| | | // } else if (/--/.test(value)) { |
| | | // callback('不可使用 -- !') |
| | | } else { |
| | | callback() |
| | | } |
| | |
| | | if (!item.lenControl || item.lenControl === 'limit') { |
| | | item.rules.push({ |
| | | max: item.fieldlength, |
| | | message: formRule.input.formMessage.replace('@max', item.fieldlength) |
| | | message: (dict['max_char'] || '最多@max个字符').replace('@max', item.fieldlength) |
| | | }) |
| | | } |
| | | |
| | |
| | | } |
| | | item.rules.push({ |
| | | pattern: reg, |
| | | message: item.regularText || formRule.input.numbermsg |
| | | message: item.regularText || dict['enter_num'] || '请输入数字!' |
| | | }) |
| | | } else if (item.regular === 'letter') { |
| | | let reg = /^[a-zA-Z]*$/ |
| | |
| | | } |
| | | item.rules.push({ |
| | | pattern: reg, |
| | | message: item.regularText || formRule.input.lettermsg |
| | | message: item.regularText || dict['enter_letter'] || '请输入字母!' |
| | | }) |
| | | } else if (item.regular === 'letter_number') { |
| | | let reg = /^[a-zA-Z0-9]*$/ |
| | |
| | | } |
| | | item.rules.push({ |
| | | pattern: reg, |
| | | message: item.regularText || '请输入数字或字母' |
| | | message: item.regularText || dict['enter_num_letter'] || '请输入数字或字母' |
| | | }) |
| | | } else if (item.regular === 'letter&number') { |
| | | let reg = /^[a-zA-Z0-9@_.]*$/ |
| | |
| | | } |
| | | item.rules.push({ |
| | | pattern: reg, |
| | | message: item.regularText || '请输入数字、字母以及@_.' |
| | | message: item.regularText || dict['enter_num_letter_char'] || '请输入数字、字母以及@_.' |
| | | }) |
| | | } else if (item.regular === 'phone') { |
| | | item.rules.push({ |
| | | pattern: /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/, |
| | | message: item.regularText || '请正确输入手机号' |
| | | message: item.regularText || dict['phone_error'] || '请正确输入手机号' |
| | | }) |
| | | } else if (item.regular === 'email') { |
| | | item.rules.push({ |
| | | pattern: /^([a-zA-Z0-9._-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/, |
| | | message: item.regularText || '请正确输入邮箱地址' |
| | | message: item.regularText || dict['email_error'] || '请正确输入邮箱地址' |
| | | }) |
| | | } |
| | | } |
| | | } else if (item.type === 'number') { |
| | | item.rules = [{ |
| | | required: true, |
| | | message: item.label + '不可为空!' |
| | | message: item.label + (dict['not_empty'] || '不可为空!') |
| | | }] |
| | | |
| | | if (typeof(item.min) === 'number' || typeof(item.max) === 'number') { |
| | | if (typeof(item.min) === 'number' || typeof(item.max) === 'number' || item.notZero === 'true') { |
| | | item.rules.push({ |
| | | validator: (rule, value, callback) => { |
| | | if (isNaN(value)) { |
| | | callback() |
| | | } else if (item.notZero === 'true' && value === 0) { |
| | | callback(item.label + (dict['not_zero'] || '不可为0')) |
| | | } else if (typeof(item.min) === 'number' && value < item.min) { |
| | | if (item.min < 1e-6) { |
| | | if (item.min > 0 && item.min < 1e-6) { |
| | | if (item.min === 1e-6) { |
| | | callback(item.label + '最小值为 0.000001') |
| | | } else if (item.min === 1e-7) { |
| | |
| | | } else if (item.min === 1e-11) { |
| | | callback(item.label + '最小值为 0.00000000001') |
| | | } else { |
| | | callback(item.label + '最小值为 ' + item.min) |
| | | callback(item.label + (dict['less_limit'] || '最小值为 ') + item.min) |
| | | } |
| | | } else { |
| | | callback(item.label + '最小值为 ' + item.min) |
| | | callback(item.label + (dict['less_limit'] || '最小值为 ') + item.min) |
| | | } |
| | | } else if (typeof(item.max) === 'number' && value > item.max) { |
| | | callback(item.label + '最大值为 ' + item.max) |
| | | callback(item.label + (dict['max_limit'] || '最大值为 ') + item.max) |
| | | } else { |
| | | callback() |
| | | } |
| | |
| | | if (item.required === 'true') { |
| | | item.rules.push({ |
| | | required: true, |
| | | message: item.label + '不可为空!' |
| | | message: item.label + (dict['not_empty'] || '不可为空!') |
| | | }) |
| | | } |
| | | |
| | | item.rules.push({ |
| | | validator: (rule, value, callback) => { |
| | | if (/'/.test(value)) { |
| | | callback('不可使用英文状态的单引号!') |
| | | } else if (/--/.test(value)) { |
| | | callback('不可使用 -- !') |
| | | callback(dict['single_quot'] || '不可使用英文状态的单引号!') |
| | | // } else if (/--/.test(value)) { |
| | | // callback('不可使用 -- !') |
| | | } else { |
| | | callback() |
| | | } |
| | | } |
| | | }, { |
| | | max: item.fieldlength, |
| | | message: formRule.input.formMessage.replace('@max', item.fieldlength) |
| | | message: (dict['max_char'] || '最多@max个字符').replace('@max', item.fieldlength) |
| | | }) |
| | | } else if (item.type === 'brafteditor') { |
| | | if (item.required === 'true') { |
| | | item.rules.push({ |
| | | required: true, |
| | | message: item.label + '不可为空!' |
| | | message: item.label + (dict['not_empty'] || '不可为空!') |
| | | }) |
| | | } |
| | | |
| | | item.rules.push({ |
| | | max: item.fieldlength, |
| | | message: formRule.input.formMessage.replace('@max', item.fieldlength) |
| | | message: (dict['max_char'] || '最多@max个字符').replace('@max', item.fieldlength) |
| | | }) |
| | | } else if (item.type === 'linkMain' || item.type === 'vercode') { |
| | | if (item.required === 'true') { |
| | | item.rules.push({ |
| | | required: true, |
| | | message: item.label + '不可为空!' |
| | | message: item.label + (dict['not_empty'] || '不可为空!') |
| | | }) |
| | | } |
| | | } else { |
| | | if (item.required === 'true') { |
| | | item.rules.push({ |
| | | required: true, |
| | | message: '请选择' + item.label + '!' |
| | | message: (dict['select_tip'] || '请选择') + item.label + '!' |
| | | }) |
| | | } |
| | | if (['cascader', 'checkbox', 'checkcard', 'fileupload', 'multiselect'].includes(item.type) && item.fieldlength) { |
| | | item.rules.push({ |
| | | max: item.fieldlength, |
| | | message: (dict['max_char'] || '最多@max个字符').replace('@max', item.fieldlength) |
| | | }) |
| | | } |
| | | } |
| | |
| | | |
| | | let _hidden = false |
| | | |
| | | if (supItem.hidden) { |
| | | if (supItem.hidden && !supItem.defHidden) { |
| | | _hidden = true |
| | | } else { |
| | | let box = [...item.values] |
| | |
| | | cell.labelCol = {style: {width: cell.labelwidth + '%'}} |
| | | cell.wrapperCol = {style: {width: (100 - cell.labelwidth) + '%'}} |
| | | } |
| | | if (!cell.field || !fieldMap.has(cell.field)) return cell |
| | | if (!cell.field || !fieldMap.has(cell.field) || ['hint', 'split', 'formula'].includes(cell.type)) return cell |
| | | let item = fieldMap.get(cell.field) |
| | | |
| | | // 下级表单控制-字段写入 |
| | |
| | | item.subFields = [] |
| | | item.linkSubField.forEach(m => { |
| | | let n = fieldMap.get(m) |
| | | if (n && ['text', 'number', 'textarea'].includes(n.type)) { |
| | | if (n && ['text', 'number', 'textarea', 'select'].includes(n.type)) { |
| | | item.subFields.push({ |
| | | uuid: n.uuid, |
| | | field: m |
| | |
| | | item.subFields = [] |
| | | item.linkSubField.forEach(m => { |
| | | let n = fieldMap.get(m) |
| | | if (n && ['text', 'number', 'textarea'].includes(n.type)) { |
| | | if (n && ['text', 'number', 'textarea', 'select'].includes(n.type)) { |
| | | item.subFields.push({ |
| | | uuid: n.uuid, |
| | | field: m |
| | |
| | | item.subFields = [] |
| | | item.linkSubField.forEach(m => { |
| | | let n = fieldMap.get(m) |
| | | if (n && ['text', 'number', 'textarea'].includes(n.type)) { |
| | | if (n && ['text', 'number', 'textarea', 'select'].includes(n.type)) { |
| | | item.subFields.push({ |
| | | uuid: n.uuid, |
| | | field: m |
| | |
| | | item.subFields = [] |
| | | item.linkSubField.forEach(m => { |
| | | let n = fieldMap.get(m) |
| | | if (n && ['text', 'number', 'textarea'].includes(n.type)) { |
| | | if (n && ['text', 'number', 'textarea', 'select'].includes(n.type)) { |
| | | item.subFields.push({ |
| | | uuid: n.uuid, |
| | | field: m |
| | |
| | | item.supInitVal = '' |
| | | |
| | | if (fieldMap.has(item.linkField)) { |
| | | item.supInitVal = fieldMap.get(item.linkField).initval || '' |
| | | let supitem = fieldMap.get(item.linkField) |
| | | item.supInitVal = supitem.initval || '' |
| | | if (supitem.$first) { |
| | | item.$resetSup = true |
| | | } |
| | | } else if (data.hasOwnProperty(item.linkField.toLowerCase())) { |
| | | item.supInitVal = data[item.linkField.toLowerCase()] |
| | | } |
| | |
| | | focusItem = fieldMap.get(action.setting.focus) |
| | | } |
| | | |
| | | this.setState({ formlist, ID, focusId: focusItem ? focusItem.uuid : '' }, () => { |
| | | let reFocusItem = null |
| | | if (action.setting.refocus && fieldMap.has(action.setting.refocus)) { |
| | | reFocusItem = fieldMap.get(action.setting.refocus) |
| | | } |
| | | |
| | | this.setState({ |
| | | formlist, |
| | | ID, |
| | | focusId: focusItem ? focusItem.uuid : '', |
| | | reFocusId: reFocusItem ? reFocusItem.uuid : '' |
| | | }, () => { |
| | | if (unload) return |
| | | |
| | | if (focusItem) { |
| | | if (focusItem.type === 'text' || focusItem.type === 'number') { |
| | | setTimeout(() => { |
| | | MKEmitter.emit('mkFC', 'focus', focusItem.uuid) |
| | | }, 50) |
| | | }, 20) |
| | | } else { |
| | | setTimeout(() => { |
| | | MKEmitter.emit('mkFC', 'focus', focusItem.uuid) |
| | |
| | | if (action.subButton && action.subButton.resetForms) { |
| | | MKEmitter.addListener('resetForms', this.resetForms) |
| | | } |
| | | MKEmitter.addListener('resetFocus', this.resetFocus) |
| | | } |
| | | |
| | | componentWillUnmount () { |
| | |
| | | return |
| | | } |
| | | MKEmitter.removeListener('resetForms', this.resetForms) |
| | | MKEmitter.removeListener('resetFocus', this.resetFocus) |
| | | } |
| | | |
| | | resetForms = (id) => { |
| | | resetFocus = (id, field) => { |
| | | const { action } = this.props |
| | | const { focusId } = this.state |
| | | |
| | | if (id !== action.uuid) return |
| | | |
| | | let focusId = '' |
| | | |
| | | this.state.formlist.forEach(item => { |
| | | if (item.field === field) { |
| | | focusId = item.uuid |
| | | } |
| | | }) |
| | | |
| | | if (!focusId) return |
| | | |
| | | setTimeout(() => { |
| | | MKEmitter.emit('mkFC', 'focus', focusId) |
| | | }, 20) |
| | | } |
| | | |
| | | resetForms = (id, data) => { |
| | | const { action } = this.props |
| | | const { focusId, reFocusId } = this.state |
| | | |
| | | if (id !== action.uuid) return |
| | | |
| | |
| | | if (item.type !== 'text' && item.type !== 'number') return item |
| | | |
| | | if (resetForms.includes(item.field)) { |
| | | item.initval = item.orgval |
| | | this.record[item.field] = item.orgval |
| | | let key = item.field.toLowerCase() |
| | | if (typeof(data[key]) !== 'undefined') { |
| | | item.initval = data[key] |
| | | this.record[item.field] = data[key] |
| | | } else { |
| | | item.initval = item.orgval |
| | | this.record[item.field] = item.orgval |
| | | } |
| | | } |
| | | |
| | | return item |
| | |
| | | }) |
| | | }) |
| | | |
| | | if (focusId || this.submitId) { |
| | | if (reFocusId || focusId || this.submitId) { |
| | | setTimeout(() => { |
| | | MKEmitter.emit('mkFC', 'focus', this.submitId || focusId) |
| | | }, 50) |
| | | MKEmitter.emit('mkFC', 'focus', this.submitId || reFocusId || focusId) |
| | | }, 20) |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | if (param.LText) { |
| | | param.LText = Utils.formatOptions(param.LText) |
| | | if (window.GLOB.execType === 'x') { |
| | | param.exec_type = 'x' |
| | | } |
| | | |
| | | param.LText = Utils.formatOptions(param.LText, param.exec_type) |
| | | param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') |
| | | param.secretkey = Utils.encrypt(param.LText, param.timestamp) |
| | | param.secretkey = Utils.encrypt(window.GLOB.execType === 'x' ? '' : param.LText, param.timestamp) |
| | | |
| | | if (window.GLOB.mkHS) { // 云端数据验证 |
| | | param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp) |
| | |
| | | } |
| | | |
| | | if (mainparam.LText) { |
| | | mainparam.LText = Utils.formatOptions(mainparam.LText) |
| | | if (window.GLOB.execType === 'x') { |
| | | mainparam.exec_type = 'x' |
| | | } |
| | | |
| | | mainparam.LText = Utils.formatOptions(mainparam.LText, mainparam.exec_type) |
| | | mainparam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') |
| | | mainparam.secretkey = Utils.encrypt(mainparam.LText, mainparam.timestamp) |
| | | mainparam.secretkey = Utils.encrypt(window.GLOB.execType === 'x' ? '' : mainparam.LText, mainparam.timestamp) |
| | | |
| | | if (window.GLOB.mainSystemApi) { |
| | | mainparam.rduri = window.GLOB.mainSystemApi |
| | |
| | | if (window.GLOB.debugger) { |
| | | console.info(param.LText) |
| | | } |
| | | |
| | | if (window.GLOB.execType === 'x') { |
| | | param.exec_type = 'x' |
| | | } |
| | | |
| | | param.LText = Utils.formatOptions(param.LText) |
| | | param.LText = Utils.formatOptions(param.LText, param.exec_type) |
| | | param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') |
| | | param.secretkey = Utils.encrypt(param.LText, param.timestamp) |
| | | param.secretkey = Utils.encrypt(window.GLOB.execType === 'x' ? '' : param.LText, param.timestamp) |
| | | |
| | | if (form.database === 'sso' && window.GLOB.mainSystemApi) { |
| | | param.rduri = window.GLOB.mainSystemApi |
| | |
| | | |
| | | // if (item.type === 'link') { |
| | | if (item.linkField) { |
| | | item.options = item.oriOptions.filter(option => option.ParentID === item.supInitVal || option.value === '') |
| | | let supInitVal = item.supInitVal |
| | | if (item.$resetSup) { |
| | | supInitVal = this.record[item.linkField] |
| | | } |
| | | item.options = item.oriOptions.filter(option => option.ParentID === supInitVal || option.value === '') |
| | | // } else if (['select', 'radio', 'checkbox', 'checkcard', 'multiselect'].includes(item.type)) { |
| | | } else { |
| | | item.options = item.oriOptions |
| | |
| | | if (item.hidden) return |
| | | |
| | | if (item.type === 'split') { |
| | | fields.push( |
| | | <Col span={24} key={index}> |
| | | <p className="mk-form-split-line" style={item.style}>{item.label}</p> |
| | | </Col> |
| | | ) |
| | | if (item.opacity === 'false') { |
| | | fields.push( |
| | | <div key={index}></div> |
| | | ) |
| | | } else { |
| | | fields.push( |
| | | <Col span={24} key={index}> |
| | | <p className="mk-form-split-line" style={item.style}>{item.label}</p> |
| | | </Col> |
| | | ) |
| | | } |
| | | } else if (item.type === 'hint') { |
| | | fields.push( |
| | | <Col span={item.span || 24} key={index}> |
| | |
| | | className = 'checkcard' |
| | | content = (<MKCheckCard config={item} onChange={(val, other) => this.recordChange({[item.field]: val, ...other}, item)}/>) |
| | | } else if (item.type === 'switch') { |
| | | content = (<MKSwitch config={item} onChange={(val, other) => this.recordChange({[item.field]: val, ...other}, item)}/>) |
| | | content = (<MKSwitch config={item} onChange={(val, other) => this.recordChange({[item.field]: val, ...other}, item)} onSubmit={this.props.inputSubmit}/>) |
| | | } else if (item.type === 'check') { |
| | | content = (<MKCheck config={item} onChange={(val) => this.recordChange({[item.field]: val}, item)}/>) |
| | | content = (<MKCheck config={item} onChange={(val) => this.recordChange({[item.field]: val}, item)} onSubmit={this.props.inputSubmit}/>) |
| | | } else if (item.type === 'checkbox') { |
| | | content = (<MKCheckbox config={item} onChange={(val) => this.recordChange({[item.field]: val})}/>) |
| | | } else if (item.type === 'radio') { |
| | | content = (<MKRadio config={item} onChange={(val, other) => this.recordChange({[item.field]: val, ...other}, item)}/>) |
| | | } else if (item.type === 'date' || item.type === 'datemonth') { |
| | | content = (<MKDatePicker config={item} onChange={(val) => this.recordChange({[item.field]: val})} />) |
| | | content = (<MKDatePicker config={item} onChange={(val) => this.recordChange({[item.field]: val})} onSubmit={this.props.inputSubmit}/>) |
| | | } else if (item.type === 'fileupload') { |
| | | className = item.readonly ? 'readonly' : '' |
| | | className += item.fileType === 'picture-card' ? ' file-upload' : '' |
| | | content = (<MKFileUpload config={item} onChange={(val, other = {}) => this.recordChange({[item.field]: val, ...other})} />) |
| | | content = (<MKFileUpload config={item} data={this.record} onChange={(val, other = {}) => this.recordChange({[item.field]: val, ...other})} />) |
| | | } else if (item.type === 'textarea') { |
| | | content = (<MKTextArea config={item} onChange={(val, defer) => !defer && this.recordChange({[item.field]: val})}/>) |
| | | } else if (item.type === 'rate') { |
| | |
| | | let record = {...this.record, ...values} |
| | | |
| | | formlist.forEach(item => { |
| | | if (!item.field) return |
| | | if (!item.field || ['hint', 'split', 'formula'].includes(item.type)) return |
| | | |
| | | let _item = { |
| | | type: item.type, |
| | |
| | | console.warn(e) |
| | | _item.value = '' |
| | | } |
| | | } else if (item.interception === 'charTure') { |
| | | let str = _item.value.replace(/(^\s*|\s*$)/g, '') |
| | | let result = '' |
| | | for (let i = 0 ; i < str.length; i++) { |
| | | let code = str.charCodeAt(i) |
| | | if (code >= 65281 && code <= 65373) { |
| | | result += String.fromCharCode(str.charCodeAt(i) - 65248) |
| | | } else if (code === 12288) { |
| | | result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32) |
| | | } else { |
| | | result += str.charAt(i) |
| | | } |
| | | } |
| | | _item.value = result |
| | | } else { |
| | | _item.value = _item.value.replace(/(^\s*|\s*$)/g, '') |
| | | } |