Merge branch 'master' into positec
| | |
| | | /** |
| | | * @description 获取系统配置,优先从缓存中取值,增加appkey |
| | | * @param {Object} param 请求参数 |
| | | * @param {Boolean} SSO 是否为单点登录地址 |
| | | * @param {Boolean} cache 是否使用缓存 |
| | | */ |
| | | getSystemCacheConfig (param, cache = true) { |
| | | param.userid = param.userid || sessionStorage.getItem('UserID') || '' |
| | |
| | | appkey: window.GLOB.appkey || '' |
| | | } |
| | | |
| | | let id = Utils.getuuid() |
| | | sql = sql.replace(/@time_id@/ig, `'${id}'`) |
| | | if (window.GLOB.externalDatabase !== null) { |
| | | sql = sql.replace(/@db@/ig, window.GLOB.externalDatabase) |
| | | } |
| | |
| | | * @description 获取显示列表单配置信息 |
| | | * @param {object} card // 搜索条件对象 |
| | | */ |
| | | export function getColumnForm (card, fields = [], columns = []) { |
| | | export function getColumnForm (card, fields = [], columns = [], wrap) { |
| | | let roleList = sessionStorage.getItem('sysRoles') |
| | | if (roleList) { |
| | | try { |
| | |
| | | }] |
| | | |
| | | let editCols = [ |
| | | // { |
| | | // field: '$sub', |
| | | // label: '提交' |
| | | // }, |
| | | { |
| | | field: '$sub', |
| | | label: '提交' |
| | | field: '$noAct', |
| | | label: '无动作' |
| | | }, |
| | | { |
| | | field: '$next', |
| | | label: '下一行' |
| | | }, |
| | | { |
| | | field: '$noAct', |
| | | label: '无动作' |
| | | } |
| | | ] |
| | | |
| | | if (card.enter === '$sub') { |
| | | card.enter = '$noAct' |
| | | } |
| | | if (wrap.commit === 'change') { |
| | | editCols[0].label = '失去焦点' |
| | | } |
| | | |
| | | let cols = [] |
| | | let getcols = (columns, suplabel = '') => { |
| | |
| | | }, |
| | | { |
| | | type: 'select', |
| | | key: 'showField', |
| | | label: '显示字段', |
| | | initVal: card.showField || '', |
| | | tooltip: '用于控制选择框中的显示内容。', |
| | | required: true, |
| | | options: 'columns' |
| | | }, |
| | | { |
| | | type: 'select', |
| | | key: 'controlField', |
| | | label: '禁用字段', |
| | | initVal: card.controlField || '', |
| | |
| | | }, { |
| | | value: 'false', |
| | | text: '不加载' |
| | | }] |
| | | }, |
| | | { |
| | | type: 'radio', |
| | | key: 'cache', |
| | | label: '选项查询', |
| | | initVal: card.cache || 'true', |
| | | tooltip: '数据查询是否使用缓存。', |
| | | required: false, |
| | | options: [{ |
| | | value: 'true', |
| | | text: '缓存' |
| | | }, { |
| | | value: 'false', |
| | | text: '实时' |
| | | }] |
| | | }, |
| | | { |
| | |
| | | key: 'enter', |
| | | label: '回车切换', |
| | | initVal: card.enter || '$noAct', |
| | | tooltip: '包括文本或数值回车事件、下拉菜单选中事件、开关切换事件。', |
| | | tooltip: '包括文本或数值回车事件、下拉菜单、选择器、时间变化事件、开关切换事件。', |
| | | options: editCols |
| | | }, |
| | | { |
| | |
| | | options: fields |
| | | }, |
| | | { |
| | | type: 'select', |
| | | key: 'clearField', |
| | | label: '清空字段', |
| | | initVal: card.clearField || '', |
| | | tooltip: '当前字段编辑时需要清空的字段。', |
| | | allowClear: true, |
| | | required: false, |
| | | options: fields |
| | | }, |
| | | { |
| | | type: 'text', |
| | | key: 'ctrlValue', |
| | | label: '禁止值', |
| | |
| | | class EdiTableColumn extends Component { |
| | | static propTpyes = { |
| | | column: PropTypes.object, |
| | | wrap: PropTypes.object, |
| | | columns: PropTypes.array, |
| | | fields: PropTypes.array, |
| | | submitCol: PropTypes.func, // 提交事件 |
| | |
| | | } else if (this.record.editType === 'date') { |
| | | _options.push('required', 'precision', 'enter', 'declareType') |
| | | } else if (this.record.editType === 'popSelect') { |
| | | _options.push('required', 'enter', 'linkSubField', 'columns', 'dataSource', 'primaryKey', 'order', 'showField', 'controlField', 'searchKey', 'popWidth', 'laypage', 'onload') |
| | | _options.push('required', 'enter', 'linkSubField', 'columns', 'dataSource', 'primaryKey', 'order', 'controlField', 'searchKey', 'popWidth', 'laypage', 'cache', 'onload') |
| | | } else if (this.record.editType === 'select') { |
| | | _options.push('required', 'enter', 'resourceType', 'linkSubField', 'dropdown') |
| | | |
| | |
| | | _options.push('required', 'enter') |
| | | } |
| | | } else if (this.record.type === 'number') { |
| | | _options.push('max', 'min', 'enter') |
| | | _options.push('max', 'min', 'enter', 'clearField') |
| | | } |
| | | } |
| | | if (this.record.type === 'formula' && this.record.eval === 'true') { |
| | |
| | | return item |
| | | }) |
| | | |
| | | let formlist = getColumnForm(column, fields, this.props.columns) |
| | | let formlist = getColumnForm(column, fields, this.props.columns, this.props.wrap) |
| | | this.record = {} |
| | | |
| | | formlist.forEach(item => { |
| | |
| | | submitCol = (col) => { |
| | | const { card } = this.state |
| | | |
| | | if (!card) return |
| | | |
| | | col.uuid = card.uuid |
| | | col.isSub = card.isSub === true |
| | | col.marks = card.marks || [] |
| | |
| | | }} |
| | | /> |
| | | </DndProvider> |
| | | <EditColumn column={card} columns={this.state.columns} fields={fields} submitCol={this.submitCol} cancelCol={this.cancelCol}/> |
| | | <EditColumn column={card} wrap={config.wrap} columns={this.state.columns} fields={fields} submitCol={this.submitCol} cancelCol={this.cancelCol}/> |
| | | <Modal |
| | | wrapClassName="mk-pop-modal" |
| | | visible={visible} |
| | |
| | | fields.push('jskey') |
| | | |
| | | let sheet = btn.sheet.replace(/(.*)\.(.*)\.|@db@/ig, '') |
| | | let _sql = `create table #${sheet} (${usefulfields.map(item => item.field + ' ' + item.type).join(',')},jskey nvarchar(50),data_type nvarchar(50),BID nvarchar(50)) |
| | | let _sql = `create table #${sheet} (${usefulfields.map(item => item.field + ' ' + item.datatype).join(',')},jskey nvarchar(50),data_type nvarchar(50),BID nvarchar(50)) |
| | | Declare @UserName nvarchar(50),@FullName nvarchar(50),@RoleID nvarchar(512),@mk_departmentcode nvarchar(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20),@mk_nation nvarchar(50),@mk_province nvarchar(50),@mk_city nvarchar(50),@mk_district nvarchar(50),@mk_address nvarchar(100),@ErrorCode nvarchar(50), @retmsg nvarchar(4000),@tbid Nvarchar(512) |
| | | Select @ErrorCode='', @retmsg='' |
| | | ` |
| | |
| | | |
| | | this.updateComponent(_card) |
| | | } else { |
| | | let _card = fromJS(card).toJS() |
| | | |
| | | if (_card.mergeCol) { |
| | | let col = _card.cols[_card.mergeCol[0]] |
| | | _card.cols.splice(_card.mergeCol[0], 1, ...col.pops) |
| | | } |
| | | |
| | | if (_card.wrap.commit === 'simple') { |
| | | _card.wrap.commit = 'change' |
| | | } |
| | | |
| | | this.setState({ |
| | | card: fromJS(card).toJS() |
| | | card: _card |
| | | }) |
| | | } |
| | | } |
| | |
| | | card: card |
| | | }) |
| | | |
| | | let _card = card.isNew ? fromJS(card).toJS() : card |
| | | let _card = card |
| | | if (_card.isNew) { |
| | | _card = fromJS(card).toJS() |
| | | _card.cols = _card.cols.filter(a => !a.origin) |
| | | |
| | | delete _card.isNew |
| | | delete _card.mergeCol |
| | | } else if (_card.mergeCol) { |
| | | _card = fromJS(card).toJS() |
| | | let col = {..._card.cols[_card.mergeCol[0]]} |
| | | col.initval = '' |
| | | col.pops = [] |
| | | |
| | | _card.mergeCol.forEach(index => { |
| | | col.pops.push(_card.cols[index]) |
| | | }) |
| | | |
| | | _card.cols = _card.cols.filter((col, index) => !_card.mergeCol.includes(index)) |
| | | _card.cols.splice(_card.mergeCol[0], 0, col) |
| | | } |
| | | |
| | | |
| | | this.props.updateConfig(_card) |
| | | } |
| | | |
| | |
| | | |
| | | updatecolumn = (config) => { |
| | | config.absFields = [] |
| | | config.cols.forEach(col => { |
| | | config.mergeCol = false |
| | | |
| | | config.cols.forEach((col, index) => { |
| | | delete col.pops |
| | | |
| | | if (col.type === 'number') { |
| | | if (col.format === 'abs') { |
| | | config.absFields.push(col.field) |
| | |
| | | } |
| | | } |
| | | }) |
| | | } else if (col.type === 'text') { |
| | | if (col.editable === 'true' && col.editType === 'popSelect' && /^tab:/.test(col.initval)) { |
| | | config.mergeCol = config.mergeCol || [] |
| | | config.mergeCol.push(index) |
| | | } |
| | | } |
| | | }) |
| | | |
| | |
| | | precision: 0, |
| | | required: false |
| | | }, |
| | | // { |
| | | // type: 'radio', |
| | | // field: 'editable', |
| | | // label: '初始化', |
| | | // initval: wrap.editable || 'false', |
| | | // required: false, |
| | | // options: [ |
| | | // {value: 'true', label: '可编辑'}, |
| | | // {value: 'false', label: '不可编辑'}, |
| | | // ], |
| | | // controlFields: [ |
| | | // {field: 'switchable', values: ['true']}, |
| | | // ] |
| | | // }, |
| | | // { |
| | | // type: 'radio', |
| | | // field: 'submittal', |
| | | // label: '提交后', |
| | | // initval: wrap.submittal || 'false', |
| | | // required: false, |
| | | // options: [ |
| | | // {value: 'true', label: '可编辑'}, |
| | | // {value: 'false', label: '不可编辑'}, |
| | | // ] |
| | | // }, |
| | | // { |
| | | // type: 'radio', |
| | | // field: 'addable', |
| | | // label: '可新增', |
| | | // initval: wrap.addable || 'false', |
| | | // required: false, |
| | | // options: [ |
| | | // {value: 'true', label: '是'}, |
| | | // {value: 'false', label: '否'}, |
| | | // ] |
| | | // }, |
| | | // { |
| | | // type: 'radio', |
| | | // field: 'delable', |
| | | // label: '可删除', |
| | | // initval: wrap.delable || 'false', |
| | | // required: false, |
| | | // options: [ |
| | | // {value: 'true', label: '是'}, |
| | | // {value: 'false', label: '否'}, |
| | | // ] |
| | | // }, |
| | | { |
| | | type: 'radio', |
| | | field: 'commit', |
| | | label: '数据提交', |
| | | initval: wrap.commit || 'all', |
| | | tooltip: '单项提交指在表单中回车或删除行时,设置为单项时如点击提交按钮,会提交修改项。失去焦点提交时会验证数据是否修改,未修改的数据不会提交。', |
| | | tooltip: '设置为修改项时,在失去焦点且不存在必填项为空时触发提交。设置为修改项(全)时,在点击提交按钮时触发提交。', |
| | | required: false, |
| | | options: [ |
| | | {value: 'all', label: '全部'}, |
| | | {value: 'change', label: '修改项'}, |
| | | {value: 'simple', label: '单项'}, |
| | | {value: 'blur', label: '失去焦点'}, |
| | | ], |
| | | controlFields: [ |
| | | {field: 'standard', values: ['change', 'simple']}, |
| | | {value: 'amend', label: '修改项(全)'}, |
| | | ] |
| | | }, |
| | | // { |
| | | // type: 'radio', |
| | | // field: 'operType', |
| | | // label: '编辑按钮', |
| | | // initval: wrap.operType || 'btnMode', |
| | | // tooltip: '编辑时的添加、删除按钮显示位置,注:使用浮标时表格横向滚动失效,表格设置高度时浮标无效。', |
| | | // required: false, |
| | | // options: [ |
| | | // {value: 'btnMode', label: '按钮式'}, |
| | | // {value: 'buoyMode', label: '浮标式'}, |
| | | // ] |
| | | // }, |
| | | { |
| | | type: 'radio', |
| | | field: 'editType', |
| | |
| | | options: [ |
| | | {value: 'simple', label: '单项'}, |
| | | {value: 'multi', label: '整体'}, |
| | | ] |
| | | }, |
| | | { |
| | | type: 'radio', |
| | | field: 'standard', |
| | | label: '修改标准', |
| | | initval: wrap.standard || 'init', |
| | | tooltip: '如何判断行信息是否应该提交。', |
| | | required: false, |
| | | options: [ |
| | | {value: 'init', label: '与初始值不同'}, |
| | | {value: 'change', label: '存在编辑痕迹'}, |
| | | ] |
| | | }, |
| | | { |
| | |
| | | {value: 'ghost', label: '透明'}, |
| | | ] |
| | | }, |
| | | // { |
| | | // type: 'radio', |
| | | // field: 'show', |
| | | // label: '搜索按钮', |
| | | // initval: wrap.show || 'true', |
| | | // tooltip: '搜索条件存在时,可选择是否显示搜索按钮。', |
| | | // required: false, |
| | | // options: [ |
| | | // {value: 'true', label: '显示'}, |
| | | // {value: 'false', label: '隐藏'}, |
| | | // ] |
| | | // }, |
| | | { |
| | | type: 'color', |
| | | field: 'borderColor', |
| | |
| | | {value: 'bottom', label: '向下'}, |
| | | ] |
| | | }, |
| | | // { |
| | | // type: 'color', |
| | | // field: 'color', |
| | | // label: '字体颜色', |
| | | // initval: wrap.color || 'rgba(0, 0, 0, 0.65)', |
| | | // tooltip: '默认值 rgba(0, 0, 0, 0.65)。', |
| | | // required: false |
| | | // }, |
| | | // { |
| | | // type: 'number', |
| | | // field: 'fontSize', |
| | | // label: '字体大小', |
| | | // initval: wrap.fontSize || 14, |
| | | // min: 12, |
| | | // max: 30, |
| | | // precision: 0, |
| | | // required: false |
| | | // }, |
| | | // { |
| | | // type: 'number', |
| | | // field: 'advanceWidth', |
| | | // label: '高级搜索', |
| | | // initval: wrap.advanceWidth || 1000, |
| | | // tooltip: '高级搜索弹窗的宽度,注:当宽度值小于100时表示占窗口的百分比,大于100时表示宽度的绝对值。', |
| | | // min: 10, |
| | | // max: 3000, |
| | | // precision: 0, |
| | | // required: false |
| | | // }, |
| | | { |
| | | type: 'radio', |
| | | field: 'permission', |
| | |
| | | ], |
| | | forbid: sessionStorage.getItem('editMenuType') === 'popview' |
| | | }, |
| | | // { |
| | | // type: 'radio', |
| | | // field: 'switchable', |
| | | // label: '状态切换', |
| | | // initval: wrap.switchable || 'true', |
| | | // tooltip: '是否可以在编辑和默认table状态间切换。', |
| | | // required: false, |
| | | // options: [ |
| | | // {value: 'true', label: '启用'}, |
| | | // {value: 'false', label: '禁用'}, |
| | | // ] |
| | | // }, |
| | | { |
| | | type: 'radio', |
| | | field: 'empty', |
| | |
| | | |
| | | let _debugId = md5(r.sql) |
| | | |
| | | if (r.custompage && _columns.findIndex(col => col.field === 'mk_total') === -1) { |
| | | if (r.custompage && setting.laypage === 'true' && _columns.findIndex(col => col.field === 'mk_total') === -1) { |
| | | Modal.warning({ |
| | | title: `数据源或自定义脚本中使用自定义分页排序时,请在字段集中添加 mk_total。`, |
| | | okText: '知道了', |
| | |
| | | ${_tailScript} |
| | | aaa: |
| | | if @ErrorCode!='' |
| | | insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select '1949-10-01 15:00:00',@ErrorCode, @retmsg,'1949-10-01 15:00:00' |
| | | insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,'1949-10-01 15:00:00' |
| | | ` |
| | | } else if (_tailScript) { |
| | | sql = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000),@UserName nvarchar(50),@FullName nvarchar(50),@RoleID nvarchar(512),@mk_departmentcode nvarchar(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20),@mk_nation nvarchar(50),@mk_province nvarchar(50),@mk_city nvarchar(50),@mk_district nvarchar(50),@mk_address nvarchar(100) select @ErrorCode='',@retmsg ='' |
| | |
| | | ${_tailScript} |
| | | aaa: |
| | | if @ErrorCode!='' |
| | | insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select '1949-10-01 15:00:00',@ErrorCode, @retmsg,'1949-10-01 15:00:00' |
| | | insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,'1949-10-01 15:00:00' |
| | | ` |
| | | } else { |
| | | sql = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000),@UserName nvarchar(50),@FullName nvarchar(50),@RoleID nvarchar(512),@mk_departmentcode nvarchar(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20),@mk_nation nvarchar(50),@mk_province nvarchar(50),@mk_city nvarchar(50),@mk_district nvarchar(50),@mk_address nvarchar(100) select @ErrorCode='',@retmsg ='' |
| | |
| | | ${_tailScript} |
| | | aaa: |
| | | if @ErrorCode!='' |
| | | insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select '1949-10-01 15:00:00',@ErrorCode, @retmsg,'1949-10-01 15:00:00' |
| | | insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,'1949-10-01 15:00:00' |
| | | ` |
| | | } else if (_tailScript) { |
| | | sql = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000),@UserName nvarchar(50),@FullName nvarchar(50),@RoleID nvarchar(512),@mk_departmentcode nvarchar(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20),@mk_nation nvarchar(50),@mk_province nvarchar(50),@mk_city nvarchar(50),@mk_district nvarchar(50),@mk_address nvarchar(100) select @ErrorCode='',@retmsg ='' |
| | |
| | | ${_tailScript} |
| | | aaa: |
| | | if @ErrorCode!='' |
| | | insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select '1949-10-01 15:00:00',@ErrorCode, @retmsg,'1949-10-01 15:00:00' |
| | | insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,'1949-10-01 15:00:00' |
| | | ` |
| | | } else { |
| | | sql = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000),@UserName nvarchar(50),@FullName nvarchar(50),@RoleID nvarchar(512),@mk_departmentcode nvarchar(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20),@mk_nation nvarchar(50),@mk_province nvarchar(50),@mk_city nvarchar(50),@mk_district nvarchar(50),@mk_address nvarchar(100) select @ErrorCode='',@retmsg ='' |
| | |
| | | if (res.copyType !== 'style') { |
| | | message.warning('配置信息格式错误!', 5) |
| | | return |
| | | } else if (JSON.stringify(res.options) !== JSON.stringify(options)) { |
| | | message.warning('样式选项不一致,不可粘贴!', 5) |
| | | return |
| | | } |
| | | |
| | | let style = res.data || {} |
| | | |
| | | if (JSON.stringify(res.options) !== JSON.stringify(options)) { |
| | | res.options.forEach(n => { |
| | | if (options.includes(n)) return |
| | | |
| | | if (n === 'width') { |
| | | delete style.width |
| | | } else if (n === 'height') { |
| | | delete style.height |
| | | } else if (n === 'font') { |
| | | if (options.includes('font1')) { |
| | | ['lineHeight', 'letterSpacing', 'fontStyle', 'textAlign', 'textDecoration'].forEach(m => { |
| | | delete style[m] |
| | | }) |
| | | } else if (options.includes('font2')) { |
| | | |
| | | } else { |
| | | ['fontSize', 'fontWeight', 'lineHeight', 'letterSpacing', 'color', 'fontStyle', 'textAlign', 'textDecoration'].forEach(m => { |
| | | delete style[m] |
| | | }) |
| | | } |
| | | } else if (n === 'font1') { |
| | | if (options.includes('font') || options.includes('font2')) { |
| | | |
| | | } else { |
| | | ['fontSize', 'fontWeight', 'color'].forEach(m => { |
| | | delete style[m] |
| | | }) |
| | | } |
| | | } else if (n === 'font2') { |
| | | if (options.includes('font')) { |
| | | ['textIndent', 'wordBreak'].forEach(m => { |
| | | delete style[m] |
| | | }) |
| | | } else if (options.includes('font1')) { |
| | | ['lineHeight', 'letterSpacing', 'fontStyle', 'textAlign', 'textDecoration', 'textIndent', 'wordBreak'].forEach(m => { |
| | | delete style[m] |
| | | }) |
| | | } else { |
| | | ['fontSize', 'fontWeight', 'lineHeight', 'letterSpacing', 'color', 'fontStyle', 'textAlign', 'textDecoration', 'textIndent', 'wordBreak'].forEach(m => { |
| | | delete style[m] |
| | | }) |
| | | } |
| | | } else if (n === 'background') { |
| | | if (!options.includes('backgroundColor')) { |
| | | delete style.backgroundColor |
| | | } |
| | | delete style.backgroundImage |
| | | delete style.backgroundSize |
| | | delete style.backgroundRepeat |
| | | delete style.backgroundPosition |
| | | } else if (n === 'backgroundColor') { |
| | | if (!options.includes('background')) { |
| | | delete style.backgroundColor |
| | | } |
| | | } else if (n === 'border') { |
| | | Object.keys(style).forEach(key => { |
| | | if (!/border/.test(key)) return |
| | | delete style[key] |
| | | }) |
| | | } else if (n === 'shadow') { |
| | | delete style.boxShadow |
| | | delete style.hShadow |
| | | delete style.vShadow |
| | | delete style.shadowBlur |
| | | delete style.shadowColor |
| | | } else if (n === 'margin') { |
| | | delete style.marginTop |
| | | delete style.marginBottom |
| | | delete style.marginLeft |
| | | delete style.marginRight |
| | | } else if (n === 'padding') { |
| | | delete style.paddingTop |
| | | delete style.paddingBottom |
| | | delete style.paddingLeft |
| | | delete style.paddingRight |
| | | } else if (n === 'float') { |
| | | delete style.float |
| | | } else if (n === 'minHeight') { |
| | | delete style.minHeight |
| | | } else if (n === 'clear') { |
| | | delete style.clear |
| | | } else if (n === 'display') { |
| | | delete style.display |
| | | } else if (n === 'position') { |
| | | delete style.position |
| | | delete style.top |
| | | delete style.bottom |
| | | delete style.left |
| | | delete style.right |
| | | } else if (n === 'transform') { |
| | | delete style.transform |
| | | } |
| | | }) |
| | | } |
| | | |
| | | let backgroundImage = '' |
| | | if (style.backgroundImage && /^url/ig.test(style.backgroundImage)) { |
| | | backgroundImage = style.backgroundImage.replace(/^url\(/ig, '').replace(/\)$/ig, '') |
| | |
| | | |
| | | setTimeout(() => { |
| | | if (col.field === 'debit' && (line.debit || line.debit === 0)) { |
| | | MKEmitter.emit('nextLine', col, record) |
| | | MKEmitter.emit('nextVoucher', col, record) |
| | | } else if (col.field === 'credit') { |
| | | MKEmitter.emit('nextLine', col, record) |
| | | MKEmitter.emit('nextVoucher', col, record) |
| | | } else { |
| | | let cl = {subject_voucher_text: 'subject_code', subject_code: 'debit', debit: 'credit'} |
| | | MKEmitter.emit('tdFocus', cl[col.uuid] + record.uuid) |
| | |
| | | MKEmitter.emit('plusLine', col.tableId, record) |
| | | } |
| | | |
| | | delRecord = () => { |
| | | delVoucher = () => { |
| | | const { col, record } = this.props |
| | | |
| | | MKEmitter.emit('delRecord', col.tableId, record) |
| | | MKEmitter.emit('delVoucher', col.tableId, record) |
| | | } |
| | | |
| | | onSelectBlur = () => { |
| | |
| | | </div> |
| | | } |
| | | } else if (col.field === 'credit') { |
| | | extra = <CloseOutlined onClick={this.delRecord}/> |
| | | extra = <CloseOutlined onClick={this.delVoucher}/> |
| | | |
| | | if (editing) { |
| | | children = <InputNumber id={col.uuid + record.uuid} precision={2} defaultValue={record.credit} onChange={(val) => this.onChange(val)} onPressEnter={this.enterPress} onBlur={this.onBlur}/> |
| | |
| | | } |
| | | |
| | | componentDidMount () { |
| | | MKEmitter.addListener('nextLine', this.nextLine) |
| | | MKEmitter.addListener('plusLine', this.plusLine) |
| | | MKEmitter.addListener('delRecord', this.delRecord) |
| | | MKEmitter.addListener('delVoucher', this.delVoucher) |
| | | MKEmitter.addListener('cleartable', this.cleartable) |
| | | MKEmitter.addListener('nextVoucher', this.nextVoucher) |
| | | MKEmitter.addListener('changeRecord', this.changeRecord) |
| | | } |
| | | |
| | |
| | | this.setState = () => { |
| | | return |
| | | } |
| | | MKEmitter.removeListener('nextLine', this.nextLine) |
| | | MKEmitter.removeListener('plusLine', this.plusLine) |
| | | MKEmitter.removeListener('delRecord', this.delRecord) |
| | | MKEmitter.removeListener('delVoucher', this.delVoucher) |
| | | MKEmitter.removeListener('cleartable', this.cleartable) |
| | | MKEmitter.removeListener('nextVoucher', this.nextVoucher) |
| | | MKEmitter.removeListener('changeRecord', this.changeRecord) |
| | | } |
| | | |
| | |
| | | return ChineseStr |
| | | } |
| | | |
| | | nextLine = (col, record) => { |
| | | nextVoucher = (col, record) => { |
| | | const { edData, tableId } = this.state |
| | | |
| | | if (col.tableId !== tableId) return |
| | |
| | | this.props.onChange(_data) |
| | | } |
| | | |
| | | delRecord = (id, record) => { |
| | | delVoucher = (id, record) => { |
| | | const { tableId, edData } = this.state |
| | | |
| | | if (id !== tableId) return |
| | |
| | | rowspans, |
| | | tableId, |
| | | orderfields |
| | | }, () => { |
| | | const element = document.getElementById(tableId) |
| | | element && element.style.setProperty('--mk-table-border-color', setting.borderColor || '#e8e8e8') |
| | | element && element.style.setProperty('--mk-table-color', setting.color || 'rgba(0, 0, 0, 0.65)') |
| | | element && element.style.setProperty('--mk-table-font-size', setting.fontSize || '14px') |
| | | element && element.style.setProperty('--mk-table-font-weight', setting.fontWeight || 'normal') |
| | | }) |
| | | } |
| | | |
| | |
| | | |
| | | render() { |
| | | const { setting, statFValue, lineMarks, data } = this.props |
| | | const { selectedRowKeys, activeIndex, pickup, tableId, pageOptions, columns, reseting } = this.state |
| | | const { selectedRowKeys, activeIndex, pickup, pageOptions, columns, reseting } = this.state |
| | | |
| | | if (reseting) return null |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | let style = { |
| | | '--mk-table-border-color': setting.borderColor || '#e8e8e8', |
| | | '--mk-table-color': setting.color || 'rgba(0, 0, 0, 0.65)', |
| | | '--mk-table-font-size': setting.fontSize || '14px', |
| | | '--mk-table-font-weight': setting.fontWeight || 'normal' |
| | | } |
| | | |
| | | return ( |
| | | <div className={`normal-custom-table ${setting.tableHeader || ''} ${height ? 'fixed-height' : ''} ${setting.mode || ''} table-vertical-${setting.vertical || 'middle'} table-col-${columns.length} ${fixed}`} id={tableId}> |
| | | <div className={`normal-custom-table ${setting.tableHeader || ''} ${height ? 'fixed-height' : ''} ${setting.mode || ''} table-vertical-${setting.vertical || 'middle'} table-col-${columns.length} ${fixed}`} style={style}> |
| | | {(setting.tableType === 'radio' || setting.tableType === 'checkbox') && data && data.length > 0 ? |
| | | <Switch title="收起" className="main-pickup" checkedChildren="开" unCheckedChildren="关" checked={pickup} onChange={this.pickupChange} /> : null |
| | | } |
| | |
| | | UNSAFE_componentWillMount () { |
| | | let _config = fromJS(this.props.config).toJS() |
| | | let setting = {..._config.setting, ..._config.wrap} |
| | | setting.tableId = Utils.getuuid() |
| | | |
| | | let BID = '' |
| | | let BData = '' |
| | | |
| | | setting.tableId = Utils.getuuid().substr(-6).toUpperCase() |
| | | |
| | | if (_config.setting.supModule) { |
| | | BData = window.GLOB.CacheData.get(_config.setting.supModule) |
| | |
| | | }) |
| | | |
| | | let _columns = [] |
| | | setting.initId = '' |
| | | let triMap = new Map() |
| | | let initId = '' |
| | | |
| | | setting.hasSubmit = false |
| | | if (setting.commit === 'change' || setting.commit === 'simple') { |
| | | setting.commit = 'change' |
| | | } |
| | | |
| | | let getColumns = (cols) => { |
| | | return cols.filter(item => { |
| | |
| | | } |
| | | |
| | | if (item.editable === 'true') { |
| | | setting.hasSubmit = true |
| | | if (!setting.initId) { |
| | | setting.initId = item.uuid |
| | | setting.hasSubmit = setting.commit !== 'change' |
| | | item.$ctrl = setting.commit === 'change' |
| | | |
| | | if (!initId) { |
| | | initId = item.uuid |
| | | } |
| | | if (item.type === 'text' && (item.editType === 'switch' || item.editType === 'select')) { |
| | | triMap.set(item.uuid, item.editType) |
| | | if (item.enter === '$sub') { |
| | | item.enter = '$noAct' |
| | | } else if (item.enter === '$next') { |
| | | item.enter = '$next_' + initId |
| | | } |
| | | if (item.type === 'text' && item.editType === 'select') { |
| | | |
| | | if (item.linkSubField && item.linkSubField.length === 0) { |
| | | item.linkSubField = null |
| | | } |
| | | |
| | | if (item.type === 'number') { |
| | | |
| | | } else if (item.editType === 'select') { |
| | | item.options = item.options || [] |
| | | item.options = item.options.filter(cell => { |
| | | cell.value = cell.Value |
| | |
| | | |
| | | return !cell.Hide |
| | | }) |
| | | } else if (item.editType === 'popSelect') { |
| | | if (item.pops) { |
| | | item.pops.forEach(cell => { |
| | | cell.linkSubField = item.linkSubField |
| | | this.resetPop(cell) |
| | | cell.tabName = cell.initval.replace(/^tab:/, '') |
| | | }) |
| | | } else { |
| | | this.resetPop(item) |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | _columns = getColumns(_config.cols) |
| | | |
| | | if (triMap.size > 0) { |
| | | let setColumns = (cols) => { |
| | | return cols.map(item => { |
| | | if (item.type === 'colspan') { |
| | | item.subcols = setColumns(item.subcols) |
| | | } else if (item.editable === 'true' && triMap.has(item.enter)) { |
| | | item.triType = 'click' |
| | | } |
| | | |
| | | return item |
| | | }) |
| | | } |
| | | |
| | | _columns = setColumns(_columns) |
| | | |
| | | if (setting.initId && triMap.has(setting.initId)) { |
| | | setting.triType = 'click' |
| | | } |
| | | } |
| | | setting.initId = initId |
| | | |
| | | if (!_config.lineMarks || _config.lineMarks.length === 0) { |
| | | _config.lineMarks = null |
| | |
| | | } |
| | | } else { |
| | | _config.colsCtrls = null |
| | | } |
| | | |
| | | if (setting.commit === 'blur') { |
| | | setting.hasSubmit = false |
| | | } |
| | | |
| | | this.setState({ |
| | |
| | | }, _config.setting.delay || 0) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | resetPop = (config) => { |
| | | let arrfield = config.columns.map(f => f.field) |
| | | |
| | | if (config.linkSubField && config.linkSubField.length > 0) { |
| | | config.linkSubField.forEach(n => { |
| | | if (!arrfield.includes(n)) { |
| | | arrfield.push(n) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | if (sessionStorage.getItem('dataM') === 'true') { // 数据权限 |
| | | config.dataSource = config.dataSource.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'') |
| | | } else { |
| | | config.dataSource = config.dataSource.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'') |
| | | } |
| | | |
| | | config.dataSource = config.dataSource.replace(/@LoginUID@/ig, `'${sessionStorage.getItem('LoginUID') || ''}'`) |
| | | config.dataSource = config.dataSource.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`) |
| | | config.dataSource = config.dataSource.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`) |
| | | config.dataSource = config.dataSource.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`) |
| | | |
| | | if (/\s/.test(config.dataSource)) { // 拼接别名 |
| | | config.dataSource = '(' + config.dataSource + ') tb' |
| | | } |
| | | |
| | | let labels = {} |
| | | config.cols = [] |
| | | config.columns.forEach(col => { |
| | | labels[col.field] = col.label |
| | | |
| | | if (col.Hide === 'true') return |
| | | |
| | | config.cols.push({ |
| | | dataIndex: col.field, |
| | | title: col.label, |
| | | sorter: col.IsSort === 'true', |
| | | width: col.Width || 120 |
| | | }) |
| | | }) |
| | | |
| | | let placeholder = '' |
| | | if (!config.searchKey) { |
| | | config.onload = 'true' |
| | | } else { |
| | | placeholder = [] |
| | | config.searchKey.split(',').forEach(key => { |
| | | if (!labels[key]) { |
| | | placeholder = '' |
| | | } else if (placeholder) { |
| | | placeholder.push(labels[key]) |
| | | } |
| | | }) |
| | | |
| | | placeholder = placeholder ? placeholder.join('、') : '' |
| | | } |
| | | |
| | | config.placeholder = placeholder |
| | | config.arr_field = arrfield.join(',') |
| | | } |
| | | |
| | | /** |
| | |
| | | loading: false |
| | | }) |
| | | |
| | | MKEmitter.emit('transferData', config.uuid, data) |
| | | MKEmitter.emit('transferData' + setting.tableId, data) |
| | | |
| | | if (result.message) { |
| | | if (result.ErrCode === 'Y') { |
| | |
| | | return item |
| | | }) |
| | | |
| | | MKEmitter.emit('transferData', config.uuid, _data, 'line') |
| | | MKEmitter.emit('transferData' + setting.tableId, _data, 'line') |
| | | MKEmitter.emit('resetSelectLine', config.uuid, _data.$$uuid, _data) |
| | | |
| | | this.setState({ |
| | |
| | | const MKPopSelect = asyncComponent(() => import('./mkPopSelect')) |
| | | const CardCellComponent = asyncComponent(() => import('@/tabviews/custom/components/card/cardcellList')) |
| | | |
| | | class CusSwitch extends Component { |
| | | class MkSwitch extends Component { |
| | | static propTpyes = { |
| | | autoFocus: PropTypes.bool, |
| | | defaultValue: PropTypes.any, |
| | | autoFocus: PropTypes.any, |
| | | config: PropTypes.object, |
| | | onChange: PropTypes.func |
| | | } |
| | |
| | | state = { |
| | | status: false |
| | | } |
| | | |
| | | node = null |
| | | |
| | | UNSAFE_componentWillMount () { |
| | | const { defaultValue, config } = this.props |
| | |
| | | } |
| | | |
| | | changeStatus = (val) => { |
| | | const { config } = this.props |
| | | this.setState({ status: val }, () => { |
| | | let _val = val ? config.openVal : config.closeVal |
| | | let _text = val ? config.openText : config.closeText |
| | | this.props.onChange(_val, _text) |
| | | }) |
| | | const { config, lineId } = this.props |
| | | |
| | | this.setState({ status: val }) |
| | | |
| | | let values = {[config.field]: val ? config.openVal : config.closeVal} |
| | | |
| | | this.props.onChange(values, '') |
| | | |
| | | this.node.blur() |
| | | |
| | | if (config.enter === '$noAct') return |
| | | |
| | | if (/\$next/.test(config.enter)) { |
| | | MKEmitter.emit('nextLine' + config.tableId, lineId, config.enter.replace('$next_', '')) |
| | | } else { |
| | | MKEmitter.emit('setFocus' + config.tableId, lineId, config.enter) |
| | | } |
| | | } |
| | | |
| | | onFocus = () => { |
| | | const { config, lineId } = this.props |
| | | |
| | | if (!config.$ctrl) return |
| | | |
| | | MKEmitter.emit('colFocus' + config.tableId, lineId, config.uuid) |
| | | } |
| | | |
| | | onBlur = () => { |
| | | const { config, lineId } = this.props |
| | | |
| | | if (config.$ctrl) { |
| | | MKEmitter.emit('colBlur' + config.tableId, lineId, config.uuid) |
| | | } |
| | | |
| | | this.props.onBlur && this.props.onBlur() |
| | | } |
| | | |
| | | render() { |
| | | const { config, autoFocus } = this.props |
| | | const { status } = this.state |
| | | |
| | | return ( |
| | | <Switch checkedChildren={config.openText} autoFocus={autoFocus} onBlur={this.props.onBlur} unCheckedChildren={config.closeText} checked={status} onChange={this.changeStatus} /> |
| | | <Switch |
| | | ref={ref => this.node = ref} |
| | | checkedChildren={config.openText} |
| | | checked={status} |
| | | autoFocus={autoFocus} |
| | | onFocus={this.onFocus} |
| | | onBlur={this.onBlur} |
| | | unCheckedChildren={config.closeText} |
| | | onChange={this.changeStatus} |
| | | /> |
| | | ) |
| | | } |
| | | } |
| | | |
| | | class CusDatePicker extends Component { |
| | | class MkDatePicker extends Component { |
| | | static propTpyes = { |
| | | defaultValue: PropTypes.any, |
| | | config: PropTypes.object, |
| | | onChange: PropTypes.func, |
| | | blur: PropTypes.func |
| | | onChange: PropTypes.func |
| | | } |
| | | |
| | | state = { |
| | |
| | | } |
| | | |
| | | UNSAFE_componentWillMount () { |
| | | const { value, open } = this.props |
| | | const { defaultValue } = this.props |
| | | |
| | | let _value = value || null |
| | | let _value = defaultValue || null |
| | | if (_value) { |
| | | _value = moment(_value, 'YYYY-MM-DD HH:mm:ss') |
| | | } |
| | | |
| | | this.setState({value: _value, open: open === true}) |
| | | this.setState({value: _value}) |
| | | } |
| | | |
| | | componentDidMount() { |
| | | const { config, autoFocus, lineId } = this.props |
| | | |
| | | if (autoFocus === true) { |
| | | this.setState({open: true}) |
| | | |
| | | if (config.$ctrl) { |
| | | MKEmitter.emit('colFocus' + config.tableId, lineId, config.uuid) |
| | | } |
| | | } |
| | | |
| | | MKEmitter.addListener('setFocus' + config.tableId, this.setFocus) |
| | | } |
| | | |
| | | componentWillUnmount () { |
| | | this.setState = () => { |
| | | return |
| | | } |
| | | |
| | | MKEmitter.removeListener('setFocus' + this.props.config.tableId, this.setFocus) |
| | | } |
| | | |
| | | setFocus = (lId, colId) => { |
| | | const { config, lineId } = this.props |
| | | |
| | | if (lId !== lineId || config.uuid !== colId) return |
| | | |
| | | this.setState({open: true}) |
| | | |
| | | if (config.$ctrl) { |
| | | MKEmitter.emit('colFocus' + config.tableId, lineId, config.uuid) |
| | | } |
| | | } |
| | | |
| | | onOpenChange = (open) => { |
| | | const { config, lineId } = this.props |
| | | |
| | | this.setState({open}) |
| | | |
| | | if (open === false) { |
| | | this.props.blur() |
| | | if (!open) { |
| | | this.props.onBlur && this.props.onBlur() |
| | | } |
| | | |
| | | if (!config.$ctrl) return |
| | | |
| | | if (open) { |
| | | MKEmitter.emit('colFocus' + config.tableId, lineId, config.uuid) |
| | | } else { |
| | | MKEmitter.emit('colBlur' + config.tableId, lineId, config.uuid) |
| | | } |
| | | } |
| | | |
| | | onChange = (val) => { |
| | | const { config, lineId } = this.props |
| | | |
| | | let _val = val ? moment(val).format(config.format) : '' |
| | | |
| | | if (config.precision === 'hour') { |
| | | _val = _val + ':00:00' |
| | | } else if (config.precision === 'minute') { |
| | | _val = _val + ':00' |
| | | } |
| | | |
| | | let values = {[config.field]: _val} |
| | | |
| | | this.props.onChange(values) |
| | | |
| | | if (config.enter === '$noAct') return |
| | | |
| | | if (/\$next/.test(config.enter)) { |
| | | MKEmitter.emit('nextLine' + config.tableId, lineId, config.enter.replace('$next_', '')) |
| | | } else { |
| | | MKEmitter.emit('setFocus' + config.tableId, lineId, config.enter) |
| | | } |
| | | } |
| | | |
| | |
| | | const { value, open } = this.state |
| | | |
| | | return ( |
| | | <DatePicker dropdownClassName={'mk-date-picker ' + config.precision} showTime={config.format !== 'YYYY-MM-DD'} format={config.format} open={open} defaultValue={value} onChange={this.props.onChange} onOpenChange={this.onOpenChange}/> |
| | | <DatePicker dropdownClassName={'mk-date-picker ' + config.precision} showTime={config.format !== 'YYYY-MM-DD'} format={config.format} open={open} defaultValue={value} onChange={this.onChange} onOpenChange={this.onOpenChange}/> |
| | | ) |
| | | } |
| | | } |
| | | |
| | | class MkSelect extends Component { |
| | | static propTpyes = { |
| | | defaultValue: PropTypes.any, |
| | | lineId: PropTypes.string, |
| | | config: PropTypes.object, |
| | | onChange: PropTypes.func, |
| | | } |
| | | |
| | | state = { |
| | | value: '' |
| | | } |
| | | |
| | | node = null |
| | | |
| | | UNSAFE_componentWillMount() { |
| | | const { defaultValue } = this.props |
| | | |
| | | this.setState({value: defaultValue}) |
| | | } |
| | | |
| | | componentDidMount() { |
| | | const { config, autoFocus, lineId } = this.props |
| | | |
| | | if (autoFocus) { |
| | | let node = document.getElementById(config.uuid + lineId) |
| | | node && node.click() |
| | | } |
| | | MKEmitter.addListener('setFocus' + config.tableId, this.setFocus) |
| | | } |
| | | |
| | | UNSAFE_componentWillReceiveProps(nextProps) { |
| | | if (nextProps.defaultValue !== this.props.defaultValue) { |
| | | this.setState({value: nextProps.defaultValue}) |
| | | } |
| | | } |
| | | |
| | | componentWillUnmount () { |
| | | this.setState = () => { |
| | | return |
| | | } |
| | | |
| | | MKEmitter.removeListener('setFocus' + this.props.config.tableId, this.setFocus) |
| | | } |
| | | |
| | | setFocus = (lId, colId) => { |
| | | const { config, lineId } = this.props |
| | | |
| | | if (lId !== lineId || config.uuid !== colId) return |
| | | |
| | | let node = document.getElementById(config.uuid + lineId) |
| | | node && node.click() |
| | | } |
| | | |
| | | onSelectChange = (val, option) => { |
| | | const { config, lineId } = this.props |
| | | |
| | | let values = {} |
| | | let _option = config.options.filter(m => m.key === option.key)[0] |
| | | |
| | | if (_option) { |
| | | if (config.linkSubField) { |
| | | config.linkSubField.forEach((m, i) => { |
| | | values[m] = _option[m] !== undefined ? _option[m] : '' |
| | | }) |
| | | } |
| | | |
| | | values[config.field] = val |
| | | } |
| | | |
| | | this.setState({value: val}) |
| | | |
| | | this.props.onChange(values, val) |
| | | |
| | | this.node.blur() |
| | | |
| | | if (config.enter === '$noAct') return |
| | | |
| | | setTimeout(() => { |
| | | if (/\$next/.test(config.enter)) { |
| | | MKEmitter.emit('nextLine' + config.tableId, lineId, config.enter.replace('$next_', '')) |
| | | } else { |
| | | MKEmitter.emit('setFocus' + config.tableId, lineId, config.enter) |
| | | } |
| | | }, 100) |
| | | } |
| | | |
| | | onFocus = () => { |
| | | const { config, lineId } = this.props |
| | | |
| | | if (!config.$ctrl) return |
| | | |
| | | MKEmitter.emit('colFocus' + config.tableId, lineId, config.uuid) |
| | | } |
| | | |
| | | onBlur = () => { |
| | | const { config, lineId } = this.props |
| | | |
| | | if (config.$ctrl) { |
| | | MKEmitter.emit('colBlur' + config.tableId, lineId, config.uuid) |
| | | } |
| | | |
| | | setTimeout(() => { |
| | | this.props.onBlur && this.props.onBlur() |
| | | }, 10) |
| | | } |
| | | |
| | | render() { |
| | | const { config, lineId } = this.props |
| | | const { value } = this.state |
| | | |
| | | return ( |
| | | <Select |
| | | showSearch |
| | | dropdownClassName="edit-table-dropdown" |
| | | dropdownMatchSelectWidth={config.dropdown === 'fixed'} |
| | | value={value} |
| | | id={config.uuid + lineId} |
| | | ref={ref => this.node = ref} |
| | | onFocus={this.onFocus} |
| | | onBlur={this.onBlur} |
| | | filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} |
| | | onSelect={this.onSelectChange} |
| | | > |
| | | {config.options.map(item => (<Select.Option key={item.key} disabled={item.$disabled} value={item.value}>{item.label}</Select.Option>))} |
| | | </Select> |
| | | ) |
| | | } |
| | | } |
| | | |
| | | class MkInput extends Component { |
| | | static propTpyes = { |
| | | defaultValue: PropTypes.any, |
| | | lineId: PropTypes.string, |
| | | config: PropTypes.object, |
| | | onChange: PropTypes.func |
| | | } |
| | | |
| | | state = { |
| | | value: null, |
| | | err: null |
| | | } |
| | | |
| | | node = null |
| | | |
| | | UNSAFE_componentWillMount() { |
| | | const { defaultValue } = this.props |
| | | |
| | | this.setState({value: defaultValue}) |
| | | } |
| | | |
| | | componentDidMount() { |
| | | const { config, autoFocus } = this.props |
| | | |
| | | if (autoFocus) { |
| | | this.node.select() |
| | | } |
| | | MKEmitter.addListener('setFocus' + config.tableId, this.setFocus) |
| | | } |
| | | |
| | | UNSAFE_componentWillReceiveProps(nextProps) { |
| | | if (nextProps.defaultValue !== this.props.defaultValue) { |
| | | this.setState({value: nextProps.defaultValue}) |
| | | } |
| | | } |
| | | |
| | | componentWillUnmount () { |
| | | this.setState = () => { |
| | | return |
| | | } |
| | | |
| | | MKEmitter.removeListener('setFocus' + this.props.config.tableId, this.setFocus) |
| | | } |
| | | |
| | | setFocus = (lId, colId) => { |
| | | const { config, lineId } = this.props |
| | | |
| | | if (lId !== lineId || config.uuid !== colId) return |
| | | |
| | | this.node.select() |
| | | } |
| | | |
| | | onChange = (val) => { |
| | | this.setState({value: val}) |
| | | } |
| | | |
| | | onFocus = () => { |
| | | const { config, lineId } = this.props |
| | | |
| | | if (!config.$ctrl) return |
| | | |
| | | MKEmitter.emit('colFocus' + config.tableId, lineId, config.uuid) |
| | | } |
| | | |
| | | enterPress = () => { |
| | | const { config, lineId } = this.props |
| | | |
| | | this.node.blur() |
| | | |
| | | if (config.enter === '$noAct') return |
| | | |
| | | if (/\$next/.test(config.enter)) { |
| | | MKEmitter.emit('nextLine' + config.tableId, lineId, config.enter.replace('$next_', '')) |
| | | } else { |
| | | MKEmitter.emit('setFocus' + config.tableId, lineId, config.enter) |
| | | } |
| | | } |
| | | |
| | | onBlur = () => { |
| | | const { config, lineId } = this.props |
| | | const { value } = this.state |
| | | |
| | | let err = null |
| | | |
| | | if (config.required === 'true' && !value) { |
| | | err = '请填写' + config.label |
| | | } |
| | | |
| | | this.setState({err}) |
| | | |
| | | this.props.onChange({[config.field]: value}) |
| | | |
| | | if (config.$ctrl) { |
| | | MKEmitter.emit('colBlur' + config.tableId, lineId, config.uuid) |
| | | } |
| | | |
| | | this.props.onBlur && this.props.onBlur() |
| | | } |
| | | |
| | | render() { |
| | | const { value, err } = this.state |
| | | |
| | | return ( |
| | | <Input |
| | | title={err} |
| | | className={err ? 'has-error' : ''} |
| | | ref={ref => this.node = ref} |
| | | value={value} |
| | | onChange={(e) => this.onChange(e.target.value)} |
| | | onPressEnter={this.enterPress} |
| | | onFocus={this.onFocus} |
| | | onBlur={this.onBlur} |
| | | /> |
| | | ) |
| | | } |
| | | } |
| | | |
| | | class MkInputNumber extends Component { |
| | | static propTpyes = { |
| | | defaultValue: PropTypes.any, |
| | | lineId: PropTypes.string, |
| | | config: PropTypes.object, |
| | | onChange: PropTypes.func |
| | | } |
| | | |
| | | state = { |
| | | value: null, |
| | | err: null, |
| | | clear: false |
| | | } |
| | | |
| | | node = null |
| | | |
| | | UNSAFE_componentWillMount() { |
| | | const { defaultValue } = this.props |
| | | |
| | | this.setState({value: defaultValue}) |
| | | } |
| | | |
| | | componentDidMount() { |
| | | const { config, autoFocus } = this.props |
| | | |
| | | if (autoFocus) { |
| | | this.node.focus() |
| | | } |
| | | MKEmitter.addListener('setFocus' + config.tableId, this.setFocus) |
| | | } |
| | | |
| | | UNSAFE_componentWillReceiveProps(nextProps) { |
| | | if (nextProps.defaultValue !== this.props.defaultValue) { |
| | | this.setState({value: nextProps.defaultValue}) |
| | | } |
| | | } |
| | | |
| | | componentWillUnmount () { |
| | | this.setState = () => { |
| | | return |
| | | } |
| | | |
| | | MKEmitter.removeListener('setFocus' + this.props.config.tableId, this.setFocus) |
| | | } |
| | | |
| | | setFocus = (lId, colId) => { |
| | | const { config, lineId } = this.props |
| | | |
| | | if (lId !== lineId || config.uuid !== colId) return |
| | | |
| | | this.node.focus() |
| | | } |
| | | |
| | | onChange = (val) => { |
| | | const { config } = this.props |
| | | |
| | | this.setState({value: val}) |
| | | |
| | | if (config.clearField && val && !this.state.clear) { |
| | | this.setState({clear: true}) |
| | | |
| | | this.props.onChange({[config.clearField]: ''}) |
| | | } |
| | | } |
| | | |
| | | onFocus = () => { |
| | | const { config, lineId } = this.props |
| | | |
| | | this.setState({clear: false}) |
| | | |
| | | if (!config.$ctrl) return |
| | | |
| | | MKEmitter.emit('colFocus' + config.tableId, lineId, config.uuid) |
| | | } |
| | | |
| | | enterPress = () => { |
| | | const { config, lineId } = this.props |
| | | |
| | | this.node.blur() |
| | | |
| | | if (config.enter === '$noAct') return |
| | | |
| | | setTimeout(() => { |
| | | if (/\$next/.test(config.enter)) { |
| | | MKEmitter.emit('nextLine' + config.tableId, lineId, config.enter.replace('$next_', '')) |
| | | } else { |
| | | MKEmitter.emit('setFocus' + config.tableId, lineId, config.enter) |
| | | } |
| | | }, 10) |
| | | } |
| | | |
| | | onBlur = () => { |
| | | const { config, lineId } = this.props |
| | | |
| | | if (config.$ctrl) { |
| | | MKEmitter.emit('colBlur' + config.tableId, lineId, config.uuid) |
| | | } |
| | | |
| | | setTimeout(() => { |
| | | let err = null |
| | | let value = this.state.value |
| | | |
| | | if (config.noValue === 'hide' && !value) { |
| | | value = 0 |
| | | } else { |
| | | if (typeof(config.max) === 'number' && value > config.max) { |
| | | err = config.label + '最大为' + config.max |
| | | } else if (typeof(config.min) === 'number' && value < config.min) { |
| | | err = config.label + '最小为' + config.min |
| | | } |
| | | } |
| | | |
| | | this.setState({err}) |
| | | |
| | | this.props.onChange({[config.field]: value}) |
| | | |
| | | this.props.onBlur && this.props.onBlur() |
| | | }, 5) |
| | | } |
| | | |
| | | render() { |
| | | const { config } = this.props |
| | | const { value, err } = this.state |
| | | |
| | | return ( |
| | | <InputNumber |
| | | title={err} |
| | | className={err ? 'has-error' : ''} |
| | | ref={ref => this.node = ref} |
| | | precision={config.decimal || 0} |
| | | value={value} |
| | | onChange={(value) => this.onChange(value)} |
| | | onPressEnter={this.enterPress} |
| | | onFocus={this.onFocus} |
| | | onBlur={this.onBlur} |
| | | /> |
| | | ) |
| | | } |
| | | } |
| | |
| | | |
| | | class BodyCell extends React.Component { |
| | | state = { |
| | | editing: false, |
| | | err: null, |
| | | value: '' |
| | | editing: false |
| | | } |
| | | |
| | | componentDidMount() { |
| | | const { col } = this.props |
| | | |
| | | if (col && col.editable === 'true') { |
| | | MKEmitter.addListener('setFocus' + col.tableId, this.setFocus) |
| | | } |
| | | } |
| | | |
| | | shouldComponentUpdate (nextProps, nextState) { |
| | |
| | | this.setState = () => { |
| | | return |
| | | } |
| | | if (this.props.col) { |
| | | MKEmitter.removeListener('setFocus' + this.props.col.tableId, this.setFocus) |
| | | } |
| | | } |
| | | |
| | | enterPress = () => { |
| | | setFocus = (lId, colId) => { |
| | | const { col, record } = this.props |
| | | const { value } = this.state |
| | | |
| | | this.setState({editing: false}) |
| | | setTimeout(() => { |
| | | if (/\$next/.test(col.enter)) { |
| | | MKEmitter.emit('nextLine', col, record.$$uuid) |
| | | } else if (col.enter === '$sub') { |
| | | MKEmitter.emit('subLine', col, record) |
| | | } else if (col.enter !== '$noAct') { |
| | | let node = document.getElementById(col.enter + record.$$uuid) |
| | | node && node.click() |
| | | } |
| | | }, 50) |
| | | if (lId !== record.$$uuid || col.uuid !== colId) return |
| | | if (col.ctrlField && col.ctrlValue.includes(record[col.ctrlField] + '')) return |
| | | |
| | | if (value !== record[col.field]) { |
| | | MKEmitter.emit('changeRecord', col.tableId, {...record, [col.field]: value}) |
| | | } |
| | | this.setState({editing: true}) |
| | | } |
| | | |
| | | focus = () => { |
| | | const { col, record } = this.props |
| | | |
| | | if (col.ctrlField && col.ctrlValue.includes(record[col.ctrlField])) return |
| | | if (col.ctrlField && col.ctrlValue.includes(record[col.ctrlField] + '')) return |
| | | |
| | | if (col.editType === 'switch' || col.editType === 'select') { |
| | | this.setState({editing: true}, () => { |
| | | let node = document.getElementById(col.uuid + record.$$uuid) |
| | | node && node.click() |
| | | }) |
| | | } else { |
| | | let err = null |
| | | let val = record[col.field] !== undefined ? record[col.field] : '' |
| | | |
| | | if (col.type === 'number') { |
| | | val = +val |
| | | if (isNaN(val)) { |
| | | val = 0 |
| | | } |
| | | if (typeof(col.max) === 'number' && val > col.max) { |
| | | err = col.label + '最大为' + col.max |
| | | } else if (typeof(col.min) === 'number' && val < col.min) { |
| | | err = col.label + '最小为' + col.min |
| | | } |
| | | } else if (col.required === 'true' && !val) { |
| | | err = '请填写' + col.label |
| | | } |
| | | |
| | | this.setState({editing: true, value: val, err}, () => { |
| | | let node = document.getElementById(col.uuid + record.$$uuid) |
| | | node && node.select() |
| | | }) |
| | | } |
| | | this.setState({editing: true}) |
| | | } |
| | | |
| | | onBlur = () => { |
| | | const { col, record } = this.props |
| | | const { value } = this.state |
| | | |
| | | this.setState({editing: false}) |
| | | |
| | | if (value !== record[col.field]) { |
| | | MKEmitter.emit('changeRecord', col.tableId, {...record, [col.field]: value}) |
| | | } |
| | | } |
| | | |
| | | onChange = (val) => { |
| | | const { col } = this.props |
| | | |
| | | let err = null |
| | | |
| | | if (col.type === 'number') { |
| | | val = +val |
| | | if (isNaN(val)) { |
| | | val = 0 |
| | | } |
| | | if (typeof(col.max) === 'number' && val > col.max) { |
| | | err = col.label + '最大为' + col.max |
| | | } else if (typeof(col.min) === 'number' && val < col.min) { |
| | | err = col.label + '最小为' + col.min |
| | | } |
| | | } else if (col.required === 'true' && !val) { |
| | | err = '请填写' + col.label |
| | | } |
| | | |
| | | this.setState({value: val, err}) |
| | | } |
| | | |
| | | onSwitchChange = (val, label) => { |
| | | onColChange = (values) => { |
| | | const { col, record } = this.props |
| | | |
| | | this.setState({editing: false}) |
| | | |
| | | setTimeout(() => { |
| | | if (/\$next/.test(col.enter)) { |
| | | MKEmitter.emit('nextLine', col, record.$$uuid) |
| | | } else if (col.enter === '$sub') { |
| | | MKEmitter.emit('subLine', col, record) |
| | | } else if (col.enter !== '$noAct') { |
| | | let node = document.getElementById(col.enter + record.$$uuid) |
| | | node && node.click() |
| | | } |
| | | }, 50) |
| | | |
| | | MKEmitter.emit('changeRecord', col.tableId, {...record, [col.field]: val}) |
| | | } |
| | | |
| | | onSelectChange = (val, option) => { |
| | | const { col, record } = this.props |
| | | |
| | | let values = {} |
| | | let _option = col.options.filter(m => m.key === option.key)[0] |
| | | |
| | | if (_option) { |
| | | if (col.linkSubField) { |
| | | col.linkSubField.forEach(m => { |
| | | values[m] = _option[m] !== undefined ? _option[m] : '' |
| | | }) |
| | | } |
| | | |
| | | values[col.field] = val |
| | | } |
| | | |
| | | this.setState({editing: false}) |
| | | |
| | | setTimeout(() => { |
| | | if (/\$next/.test(col.enter)) { |
| | | MKEmitter.emit('nextLine', col, record.$$uuid) |
| | | } else if (col.enter === '$sub') { |
| | | MKEmitter.emit('subLine', col, record) |
| | | } else if (col.enter !== '$noAct') { |
| | | let node = document.getElementById(col.enter + record.$$uuid) |
| | | node && node.click() |
| | | } |
| | | }, 50) |
| | | |
| | | MKEmitter.emit('changeRecord', col.tableId, {...record, ...values}) |
| | | } |
| | | |
| | | onDateChange = (val) => { |
| | | const { col, record } = this.props |
| | | |
| | | let _val = val ? moment(val).format(col.format) : '' |
| | | |
| | | if (col.precision === 'hour') { |
| | | _val = _val + ':00:00' |
| | | } else if (col.precision === 'minute') { |
| | | _val = _val + ':00' |
| | | } |
| | | |
| | | this.setState({editing: false}) |
| | | |
| | | setTimeout(() => { |
| | | if (/\$next/.test(col.enter)) { |
| | | MKEmitter.emit('nextLine', col, record.$$uuid) |
| | | } else if (col.enter === '$sub') { |
| | | MKEmitter.emit('subLine', col, record) |
| | | } else if (col.enter !== '$noAct') { |
| | | let node = document.getElementById(col.enter + record.$$uuid) |
| | | node && node.click() |
| | | } |
| | | }, 50) |
| | | |
| | | MKEmitter.emit('changeRecord', col.tableId, {...record, [col.field]: _val}) |
| | | } |
| | | |
| | | switchBlur = () => { |
| | | setTimeout(() => { |
| | | this.setState({editing: false}) |
| | | }, 10) |
| | | } |
| | | |
| | | onPopChange = (values) => { |
| | | const { col, record } = this.props |
| | | |
| | | this.setState({editing: false}) |
| | | |
| | | setTimeout(() => { |
| | | if (/\$next/.test(col.enter)) { |
| | | MKEmitter.emit('nextLine', col, record.$$uuid) |
| | | } else if (col.enter === '$sub') { |
| | | MKEmitter.emit('subLine', col, record) |
| | | } else if (col.enter !== '$noAct') { |
| | | let node = document.getElementById(col.enter + record.$$uuid) |
| | | node && node.click() |
| | | } |
| | | }, 50) |
| | | |
| | | MKEmitter.emit('changeRecord', col.tableId, {...record, ...values}) |
| | | MKEmitter.emit('changeRecord' + col.tableId, {...record, ...values}) |
| | | } |
| | | |
| | | render() { |
| | | let { col, config, record, style, className, ...resProps } = this.props |
| | | const { editing, value, err } = this.state |
| | | const { editing } = this.state |
| | | |
| | | if (!col) return (<td {...resProps} className={className} style={style}/>) |
| | | |
| | | let disabled = false |
| | | if (col.ctrlField) { |
| | | disabled = col.ctrlValue.includes(record[col.ctrlField]) |
| | | disabled = col.ctrlValue.includes(record[col.ctrlField] + '') |
| | | } |
| | | |
| | | let children = null |
| | |
| | | |
| | | if (col.editType === 'select' && col.options.length > 0) { |
| | | content = col.map.get(content) || content |
| | | } else if (col.editType === 'switch') { |
| | | if (content === config.openVal) { |
| | | content = config.openText |
| | | } else if (content === config.closeVal) { |
| | | content = config.closeText |
| | | } |
| | | } |
| | | |
| | | if (content !== '') { |
| | |
| | | |
| | | if (col.editable === 'true' && !disabled) { |
| | | if (editing) { |
| | | let _value = record[col.field] !== undefined ? record[col.field] : '' |
| | | |
| | | if (!col.editType || col.editType === 'text') { |
| | | return (<td onClick={(e) => e.stopPropagation()} className="editing_table_cell"> |
| | | <Input className={err ? 'has-error' : ''} title={err} id={col.uuid + record.$$uuid} defaultValue={value} onChange={(e) => this.onChange(e.target.value)} onPressEnter={this.enterPress} onBlur={this.onBlur}/> |
| | | <MkInput config={col} lineId={record.$$uuid} defaultValue={_value} autoFocus={true} onChange={this.onColChange} onBlur={() => this.setState({editing: false})}/> |
| | | </td>) |
| | | } else if (col.editType === 'switch') { |
| | | return (<td onClick={(e) => e.stopPropagation()} className="editing_table_cell"> |
| | | <MkSwitch config={col} lineId={record.$$uuid} defaultValue={_value} autoFocus={true} onChange={this.onColChange} onBlur={() => this.setState({editing: false})}/> |
| | | </td>) |
| | | } else if (col.editType === 'date') { |
| | | return (<td onClick={(e) => e.stopPropagation()} className="editing_table_cell"> |
| | | <CusDatePicker config={col} value={record[col.field] || null} open={true} onChange={this.onDateChange} blur={() => this.setState({editing: false})}/> |
| | | </td>) |
| | | } else if (col.editType === 'switch') { |
| | | let _value = record[col.field] !== undefined ? record[col.field] : '' |
| | | |
| | | return (<td onClick={(e) => e.stopPropagation()} className="editing_table_cell"> |
| | | <CusSwitch config={col} defaultValue={_value} autoFocus={true} onChange={this.onSwitchChange} onBlur={this.switchBlur}/> |
| | | <MkDatePicker config={col} lineId={record.$$uuid} defaultValue={_value || null} autoFocus={true} onChange={this.onColChange} onBlur={() => this.setState({editing: false})}/> |
| | | </td>) |
| | | } else if (col.editType === 'popSelect') { |
| | | let _value = record[col.field] !== undefined ? record[col.field] : '' |
| | | |
| | | return (<td onClick={(e) => e.stopPropagation()} className="editing_table_cell"> |
| | | <MKPopSelect mask={true} defaultValue={_value} config={col} BID={record.$$BID} ID={record.$$uuid} onChange={this.onPopChange} blur={() => this.setState({editing: false})}/> |
| | | <MKPopSelect config={col} lineId={record.$$uuid} defaultValue={_value} BID={record.$$BID} autoFocus={true} onChange={this.onColChange} onBlur={() => this.setState({editing: false})}/> |
| | | </td>) |
| | | } else { |
| | | let _value = record[col.field] !== undefined ? record[col.field] : '' |
| | | |
| | | return (<td onClick={(e) => e.stopPropagation()} className="editing_table_cell"> |
| | | <Select |
| | | showSearch |
| | | defaultValue={_value} |
| | | dropdownClassName="edit-table-dropdown" |
| | | dropdownMatchSelectWidth={col.dropdown === 'fixed'} |
| | | id={col.uuid + record.$$uuid} |
| | | onBlur={() => this.setState({editing: false})} |
| | | filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} |
| | | onSelect={this.onSelectChange} |
| | | > |
| | | {col.options.map((item, i) => (<Select.Option key={item.key} disabled={item.$disabled} value={item.value}>{item.label}</Select.Option>))} |
| | | </Select> |
| | | <MkSelect config={col} lineId={record.$$uuid} defaultValue={_value} autoFocus={true} onChange={this.onColChange} onBlur={() => this.setState({editing: false})}/> |
| | | </td>) |
| | | } |
| | | } else { |
| | |
| | | |
| | | if (col.editable === 'true' && !disabled) { |
| | | if (editing) { |
| | | let val = value |
| | | if (col.noValue === 'hide' && value === 0) { |
| | | let val = record[col.field] !== undefined ? record[col.field] : '' |
| | | if (col.noValue === 'hide' && val === 0) { |
| | | val = '' |
| | | } |
| | | return (<td onClick={(e) => e.stopPropagation()} className="editing_table_cell"> |
| | | <InputNumber className={err ? 'has-error' : ''} precision={col.decimal || 0} title={err} id={col.uuid + record.$$uuid} defaultValue={val} onChange={(val) => this.onChange(val)} onPressEnter={this.enterPress} onBlur={this.onBlur}/> |
| | | <MkInputNumber config={col} lineId={record.$$uuid} defaultValue={val} autoFocus={true} onChange={this.onColChange} onBlur={() => this.setState({editing: false})}/> |
| | | </td>) |
| | | } else { |
| | | return (<td onClick={(e) => e.stopPropagation()} className={className + ' pointer'} style={style}> |
| | |
| | | } |
| | | |
| | | class BodyAllCell extends React.Component { |
| | | state = { |
| | | err: null, |
| | | value: '' |
| | | } |
| | | state = {} |
| | | |
| | | shouldComponentUpdate (nextProps, nextState) { |
| | | return !is(fromJS(this.props.record), fromJS(nextProps.record)) || !is(fromJS(this.state), fromJS(nextState)) |
| | | } |
| | | |
| | | UNSAFE_componentWillMount() { |
| | | const { col } = this.props |
| | | |
| | | if (col && col.editable === 'true') { |
| | | this.setState({value: this.props.record[col.field]}) |
| | | } |
| | | } |
| | | |
| | | UNSAFE_componentWillReceiveProps(nextProps) { |
| | | const { col } = this.props |
| | | const { value } = this.state |
| | | |
| | | if (col && col.editable === 'true' && nextProps.record[col.field] !== value) { |
| | | this.setState({value: nextProps.record[col.field]}) |
| | | } |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | } |
| | | |
| | | enterPress = () => { |
| | | onColChange = (values) => { |
| | | const { col, record } = this.props |
| | | |
| | | this.onBlur() |
| | | |
| | | setTimeout(() => { |
| | | if (/\$next/.test(col.enter)) { |
| | | MKEmitter.emit('nextLine', col, record.$$uuid) |
| | | } else if (col.enter === '$sub') { |
| | | MKEmitter.emit('subLine', col, record) |
| | | } else if (col.enter !== '$noAct') { |
| | | let node = document.getElementById(col.enter + record.$$uuid) |
| | | |
| | | if (node) { |
| | | if (col.triType === 'click') { |
| | | node.click() |
| | | } else { |
| | | node.select && node.select() |
| | | } |
| | | } |
| | | } |
| | | }, 50) |
| | | } |
| | | |
| | | onChange = (val) => { |
| | | const { col } = this.props |
| | | |
| | | if (col.noValue === 'hide' && val === null) { |
| | | this.setState({value: 0}) |
| | | } else { |
| | | this.setState({value: val}) |
| | | } |
| | | } |
| | | |
| | | onBlur = () => { |
| | | const { col, record } = this.props |
| | | const { value } = this.state |
| | | |
| | | let err = null |
| | | let val = value |
| | | |
| | | if (col.type === 'number') { |
| | | val = +val |
| | | if (isNaN(val)) { |
| | | val = 0 |
| | | } |
| | | if (typeof(col.max) === 'number' && val > col.max) { |
| | | err = col.label + '最大为' + col.max |
| | | } else if (typeof(col.min) === 'number' && val < col.min) { |
| | | err = col.label + '最小为' + col.min |
| | | } |
| | | } else if (col.required === 'true' && !val) { |
| | | err = '请填写' + col.label |
| | | } |
| | | |
| | | this.setState({err}) |
| | | |
| | | if (value !== record[col.field]) { |
| | | MKEmitter.emit('changeRecord', col.tableId, {...record, [col.field]: val}) |
| | | } |
| | | } |
| | | |
| | | onSwitchChange = (val, label) => { |
| | | const { col, record } = this.props |
| | | |
| | | setTimeout(() => { |
| | | if (/\$next/.test(col.enter)) { |
| | | MKEmitter.emit('nextLine', col, record.$$uuid) |
| | | } else if (col.enter === '$sub') { |
| | | MKEmitter.emit('subLine', col, record) |
| | | } else if (col.enter !== '$noAct') { |
| | | let node = document.getElementById(col.enter + record.$$uuid) |
| | | if (node) { |
| | | if (col.triType === 'click') { |
| | | node.click() |
| | | } else { |
| | | node.select && node.select() |
| | | } |
| | | } |
| | | } |
| | | }, 50) |
| | | |
| | | MKEmitter.emit('changeRecord', col.tableId, {...record, [col.field]: val}) |
| | | } |
| | | |
| | | onSelectChange = (val, option) => { |
| | | const { col, record } = this.props |
| | | |
| | | let values = {} |
| | | let _option = col.options.filter(m => m.key === option.key)[0] |
| | | |
| | | if (_option) { |
| | | if (col.linkSubField) { |
| | | col.linkSubField.forEach(m => { |
| | | values[m] = _option[m] !== undefined ? _option[m] : '' |
| | | }) |
| | | } |
| | | |
| | | values[col.field] = val |
| | | } |
| | | |
| | | setTimeout(() => { |
| | | if (/\$next/.test(col.enter)) { |
| | | MKEmitter.emit('nextLine', col, record.$$uuid) |
| | | } else if (col.enter === '$sub') { |
| | | MKEmitter.emit('subLine', col, record) |
| | | } else if (col.enter !== '$noAct') { |
| | | let node = document.getElementById(col.enter + record.$$uuid) |
| | | if (node) { |
| | | if (col.triType === 'click') { |
| | | node.click() |
| | | } else { |
| | | node.select && node.select() |
| | | } |
| | | } |
| | | } |
| | | }, 50) |
| | | |
| | | MKEmitter.emit('changeRecord', col.tableId, {...record, ...values}) |
| | | } |
| | | |
| | | onDateChange = (val) => { |
| | | const { col, record } = this.props |
| | | |
| | | let _val = val ? moment(val).format(col.format) : '' |
| | | |
| | | if (col.precision === 'hour') { |
| | | _val = _val + ':00:00' |
| | | } else if (col.precision === 'minute') { |
| | | _val = _val + ':00' |
| | | } |
| | | |
| | | setTimeout(() => { |
| | | if (/\$next/.test(col.enter)) { |
| | | MKEmitter.emit('nextLine', col, record.$$uuid) |
| | | } else if (col.enter === '$sub') { |
| | | MKEmitter.emit('subLine', col, record) |
| | | } else if (col.enter !== '$noAct') { |
| | | let node = document.getElementById(col.enter + record.$$uuid) |
| | | node && node.click() |
| | | } |
| | | }, 50) |
| | | |
| | | MKEmitter.emit('changeRecord', col.tableId, {...record, [col.field]: _val}) |
| | | } |
| | | |
| | | onPopChange = (values) => { |
| | | const { col, record } = this.props |
| | | |
| | | setTimeout(() => { |
| | | if (/\$next/.test(col.enter)) { |
| | | MKEmitter.emit('nextLine', col, record.$$uuid) |
| | | } else if (col.enter === '$sub') { |
| | | MKEmitter.emit('subLine', col, record) |
| | | } else if (col.enter !== '$noAct') { |
| | | let node = document.getElementById(col.enter + record.$$uuid) |
| | | node && node.click() |
| | | } |
| | | }, 50) |
| | | |
| | | MKEmitter.emit('changeRecord', col.tableId, {...record, ...values}) |
| | | MKEmitter.emit('changeRecord' + col.tableId, {...record, ...values}) |
| | | } |
| | | |
| | | render() { |
| | | let { col, config, record, style, className, ...resProps } = this.props |
| | | const { err } = this.state |
| | | |
| | | if (!col) return (<td {...resProps} className={className} style={style}/>) |
| | | |
| | | let disabled = false |
| | | let editable = false |
| | | if (col.ctrlField) { |
| | | disabled = col.ctrlValue.includes(record[col.ctrlField]) |
| | | disabled = col.ctrlValue.includes(record[col.ctrlField] + '') |
| | | } |
| | | |
| | | let children = null |
| | |
| | | let _value = record[col.field] !== undefined ? record[col.field] : '' |
| | | |
| | | if (!col.editType || col.editType === 'text') { |
| | | children = (<> |
| | | <Input className={err ? 'has-error' : ''} title={err} id={col.uuid + record.$$uuid} defaultValue={_value} onChange={(e) => this.onChange(e.target.value)} onPressEnter={this.enterPress} onBlur={this.onBlur}/> |
| | | </>) |
| | | children = ( |
| | | <MkInput config={col} lineId={record.$$uuid} defaultValue={_value} autoFocus={false} onChange={this.onColChange}/> |
| | | ) |
| | | } else if (col.editType === 'switch') { |
| | | children = ( |
| | | <CusSwitch config={col} autoFocus={false} defaultValue={_value} onChange={this.onSwitchChange} onBlur={() => {}}/> |
| | | <MkSwitch config={col} lineId={record.$$uuid} defaultValue={_value} autoFocus={false} onChange={this.onColChange}/> |
| | | ) |
| | | } else if (col.editType === 'date') { |
| | | children = ( |
| | | <CusDatePicker config={col} value={record[col.field] || null} onChange={this.onDateChange} blur={() => {}}/> |
| | | <MkDatePicker config={col} lineId={record.$$uuid} defaultValue={_value || null} autoFocus={false} onChange={this.onColChange}/> |
| | | ) |
| | | } else if (col.editType === 'popSelect') { |
| | | children = ( |
| | | <MKPopSelect config={col} defaultValue={record[col.field] || ''} BID={record.$$BID} ID={record.$$uuid} onChange={this.onPopChange}/> |
| | | <MKPopSelect config={col} lineId={record.$$uuid} defaultValue={_value} BID={record.$$BID} autoFocus={false} onChange={this.onColChange}/> |
| | | ) |
| | | } else { |
| | | children = (<> |
| | | <Select |
| | | showSearch |
| | | dropdownClassName="edit-table-dropdown" |
| | | dropdownMatchSelectWidth={col.dropdown === 'fixed'} |
| | | defaultValue={_value} |
| | | id={col.uuid + record.$$uuid} |
| | | filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} |
| | | onSelect={this.onSelectChange} |
| | | > |
| | | {col.options.map((item, i) => (<Select.Option key={item.key} disabled={item.$disabled} value={item.value}>{item.label}</Select.Option>))} |
| | | </Select> |
| | | </>) |
| | | children = ( |
| | | <MkSelect config={col} lineId={record.$$uuid} defaultValue={_value} autoFocus={false} onChange={this.onColChange} /> |
| | | ) |
| | | } |
| | | } else { |
| | | let content = '' |
| | |
| | | |
| | | if (col.editType === 'select' && col.options.length > 0) { |
| | | content = col.map.get(content) || content |
| | | } else if (col.editType === 'switch') { |
| | | if (content === config.openVal) { |
| | | content = config.openText |
| | | } else if (content === config.closeVal) { |
| | | content = config.closeText |
| | | } |
| | | } |
| | | |
| | | if (content !== '') { |
| | |
| | | _value = '' |
| | | } |
| | | |
| | | children = (<> |
| | | <InputNumber className={err ? 'has-error' : ''} title={err} precision={col.decimal || 0} id={col.uuid + record.$$uuid} defaultValue={_value} onChange={(val) => this.onChange(val)} onPressEnter={this.enterPress} onBlur={this.onBlur}/> |
| | | </>) |
| | | children = ( |
| | | <MkInputNumber config={col} lineId={record.$$uuid} defaultValue={_value} autoFocus={false} onChange={this.onColChange}/> |
| | | ) |
| | | } else { |
| | | let content = '' |
| | | try { |
| | |
| | | pageSize: 10, // 每页数据条数 |
| | | columns: null, // 显示列 |
| | | forms: [], |
| | | signForms: [], |
| | | orderfields: {}, // 排序id与field转换 |
| | | loading: false, |
| | | pageOptions: [], |
| | |
| | | visible: false, |
| | | midData: null, |
| | | allColumns: null, |
| | | checkForms: [], |
| | | allForms: [], |
| | | reseting: false |
| | | } |
| | | |
| | | timer = null |
| | | focusId = '' |
| | | blurId = '' |
| | | |
| | | UNSAFE_componentWillMount () { |
| | | const { setting, fields, columns, BID, colsCtrls } = this.props |
| | |
| | | let deForms = [] |
| | | let _forms = {} |
| | | let hasBid = false |
| | | let signForms = [] |
| | | let index = 0 |
| | | let checkForms = [] |
| | | let allForms = [] |
| | | |
| | | let getColumns = (cols) => { |
| | | let getColumns = (cols, sk) => { |
| | | return cols.map(item => { |
| | | let cell = null |
| | | |
| | | if (item.type === 'colspan') { |
| | | cell = { title: item.label, align: item.Align, $key: item.uuid } |
| | | cell.children = getColumns(item.subcols) |
| | | cell.children = getColumns(item.subcols, sk || item.uuid) |
| | | } else { |
| | | if (item.editable === 'true') { |
| | | item.$sort = index |
| | | index++ |
| | | _forms[item.field] = item |
| | | |
| | | signForms.push(item.field) |
| | | allForms.push({uuid: sk || item.uuid, field: item.field}) |
| | | checkForms.push(item.field) |
| | | |
| | | if (item.ctrlField) { |
| | | item.ctrlValue = item.ctrlValue.split(',') |
| | | } |
| | | |
| | | if (item.type === 'text' && item.editType === 'select') { |
| | | if (item.type === 'number' && item.clearField) { |
| | | fields.forEach(cell => { |
| | | if (cell.field === item.clearField) { |
| | | item.clearName = cell.label |
| | | } |
| | | }) |
| | | } else if (item.type === 'text' && item.editType === 'select') { |
| | | item.map = new Map() |
| | | if (item.resourceType === '1') { |
| | | let _option = Utils.getSelectQueryOptions(item) |
| | |
| | | title: item.editable === 'true' ? <span>{item.label}<EditOutlined className="system-color mk-edit-sign"/></span> : item.label, |
| | | sorter: (item.field || item.sortField) && item.IsSort === 'true', |
| | | width: item.Width || 120, |
| | | // $type: item.type, |
| | | $key: item.uuid, |
| | | onCell: record => ({ |
| | | record, |
| | |
| | | } else { |
| | | _item.datatype = item.datatype |
| | | } |
| | | |
| | | forms.push(_item) |
| | | } else { |
| | | forms.push(item) |
| | | forms.push({...item, $sort: 999}) |
| | | } |
| | | }) |
| | | |
| | | forms.sort((a, b) => a.$sort - b.$sort) |
| | | |
| | | let size = (setting.pageSize || 10) + '' |
| | | let pageOptions = ['10', '25', '50', '100', '500', '1000'] |
| | |
| | | let allColumns = null |
| | | if (colsCtrls) { |
| | | allColumns = [..._columns] |
| | | _columns = this.getCurColumns(_columns, this.props.allSearch) |
| | | checkForms = [] |
| | | _columns = this.getCurColumns(_columns, this.props.allSearch, allForms, checkForms) |
| | | } else { |
| | | allForms = null |
| | | } |
| | | |
| | | checkForms = Array.from(new Set(checkForms)) |
| | | |
| | | this.setState({ |
| | | forms, |
| | | signForms, |
| | | allForms, |
| | | allColumns, |
| | | checkForms, |
| | | pageSize: setting.pageSize || 10, |
| | | pageOptions, |
| | | columns: _columns, |
| | |
| | | this.improveActionForm(deForms, BID) |
| | | } |
| | | } |
| | | |
| | | const element = document.getElementById(setting.tableId) |
| | | element && element.style.setProperty('--mk-table-border-color', setting.borderColor || '#e8e8e8') |
| | | element && element.style.setProperty('--mk-table-color', setting.color || 'rgba(0, 0, 0, 0.65)') |
| | | element && element.style.setProperty('--mk-table-font-size', setting.fontSize || '14px') |
| | | element && element.style.setProperty('--mk-table-font-weight', setting.fontWeight || 'normal') |
| | | }) |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | componentDidMount () { |
| | | MKEmitter.addListener('subLine', this.subLine) |
| | | MKEmitter.addListener('nextLine', this.nextLine) |
| | | MKEmitter.addListener('addRecord', this.addRecord) |
| | | MKEmitter.addListener('delRecord', this.delRecord) |
| | | const { setting } = this.props |
| | | const { tableId } = this.state |
| | | |
| | | if (setting.commit === 'change') { |
| | | MKEmitter.addListener('colBlur' + tableId, this.colBlur) |
| | | MKEmitter.addListener('colFocus' + tableId, this.colFocus) |
| | | } |
| | | |
| | | MKEmitter.addListener('resetTable', this.resetTable) |
| | | MKEmitter.addListener('transferData', this.transferData) |
| | | MKEmitter.addListener('changeRecord', this.changeRecord) |
| | | MKEmitter.addListener('nextLine' + tableId, this.nextLine) |
| | | MKEmitter.addListener('addRecord' + tableId, this.plusLine) |
| | | MKEmitter.addListener('delRecord' + tableId, this.delRecord) |
| | | MKEmitter.addListener('transferData' + tableId, this.transferData) |
| | | MKEmitter.addListener('changeRecord' + tableId, this.changeRecord) |
| | | } |
| | | |
| | | /** |
| | | * @description 组件销毁,清除state更新 |
| | | */ |
| | | componentWillUnmount () { |
| | | const { tableId } = this.state |
| | | |
| | | this.setState = () => { |
| | | return |
| | | } |
| | | MKEmitter.removeListener('subLine', this.subLine) |
| | | MKEmitter.removeListener('nextLine', this.nextLine) |
| | | MKEmitter.removeListener('addRecord', this.addRecord) |
| | | MKEmitter.removeListener('delRecord', this.delRecord) |
| | | |
| | | MKEmitter.removeListener('resetTable', this.resetTable) |
| | | MKEmitter.removeListener('transferData', this.transferData) |
| | | MKEmitter.removeListener('changeRecord', this.changeRecord) |
| | | MKEmitter.removeListener('colBlur' + tableId, this.colBlur) |
| | | MKEmitter.removeListener('colFocus' + tableId, this.colFocus) |
| | | MKEmitter.removeListener('nextLine' + tableId, this.nextLine) |
| | | MKEmitter.removeListener('addRecord' + tableId, this.plusLine) |
| | | MKEmitter.removeListener('delRecord' + tableId, this.delRecord) |
| | | MKEmitter.removeListener('transferData' + tableId, this.transferData) |
| | | MKEmitter.removeListener('changeRecord' + tableId, this.changeRecord) |
| | | } |
| | | |
| | | getCurColumns = (columns, allSearch) => { |
| | | colBlur = (lineId) => { |
| | | this.blurId = lineId |
| | | this.focusId = '' |
| | | |
| | | this.timer && clearTimeout(this.timer) |
| | | |
| | | this.timer = setTimeout(() => { |
| | | if (!this.focusId || this.focusId !== this.blurId) { |
| | | this.checkLine() |
| | | } |
| | | }, 150) |
| | | } |
| | | |
| | | colFocus = (lineId) => { |
| | | this.focusId = lineId |
| | | } |
| | | |
| | | checkLine = () => { |
| | | const { edData, forms, checkForms } = this.state |
| | | |
| | | let data = edData.filter(item => item.$$uuid === this.blurId)[0] |
| | | |
| | | if (!data) return |
| | | |
| | | let record = fromJS(data).toJS() |
| | | |
| | | let value = '' |
| | | Object.keys(record).sort().forEach(key => { |
| | | if (/^\$/.test(key)) return |
| | | value += record[key] |
| | | }) |
| | | |
| | | if (record.$sign === md5(value)) return |
| | | |
| | | let err = '' |
| | | forms.forEach(col => { |
| | | let check = true |
| | | if (col.editable !== 'true' || !checkForms.includes(col.field)) { |
| | | check = false |
| | | } |
| | | if (col.ctrlField && col.ctrlValue.includes(record[col.ctrlField] + '')) { |
| | | check = false |
| | | } |
| | | |
| | | if (!check) { |
| | | if (col.type === 'number') { |
| | | record[col.field] = +record[col.field] |
| | | if (isNaN(record[col.field])) { |
| | | record[col.field] = 0 |
| | | } |
| | | } else { |
| | | record[col.field] = record[col.field] !== undefined ? (record[col.field] + '') : '' |
| | | } |
| | | return |
| | | } |
| | | |
| | | if (err) return |
| | | |
| | | if (col.type === 'text') { |
| | | let val = record[col.field] !== undefined ? (record[col.field] + '') : '' |
| | | if (col.required === 'true' && !val) { |
| | | err = `${col.label}不可为空` |
| | | } else if (col.datatype === 'datetime' && !val) { |
| | | val = '1949-10-01' |
| | | } |
| | | record[col.field] = val |
| | | } else if (col.type === 'number') { |
| | | let val = record[col.field] |
| | | |
| | | if (col.noValue === 'hide' && !val) { |
| | | if (col.clearField && checkForms.includes(col.clearField) && !record[col.clearField]) { |
| | | err = `请填写 ${col.label} 或 ${col.clearName}` |
| | | } |
| | | val = 0 |
| | | } else if (!val && val !== 0) { |
| | | err = `${col.label}不可为空` |
| | | } else { |
| | | val = +val |
| | | if (isNaN(val)) { |
| | | err = `${col.label}数据格式错误` |
| | | return |
| | | } |
| | | |
| | | val = +val.toFixed(col.decimal || 0) |
| | | |
| | | if (typeof(col.max) === 'number' && val > col.max) { |
| | | err = `${col.label}不可大于${col.max}` |
| | | } else if (typeof(col.min) === 'number' && val < col.min) { |
| | | err = `${col.label}不可小于${col.min}` |
| | | } |
| | | } |
| | | |
| | | record[col.field] = val |
| | | } |
| | | }) |
| | | |
| | | if (err) { |
| | | message.warning(err) |
| | | return |
| | | } |
| | | |
| | | this.submit(record) |
| | | } |
| | | |
| | | getCurColumns = (columns, allSearch, allForms, checkForms) => { |
| | | const { colsCtrls } = this.props |
| | | |
| | | let values = {} |
| | |
| | | }) |
| | | |
| | | if (cols) { |
| | | allForms.forEach(item => { |
| | | if (cols.includes(item.uuid)) { |
| | | checkForms.push(item.field) |
| | | } |
| | | }) |
| | | |
| | | return columns.filter(col => cols.includes(col.$key)) |
| | | } |
| | | |
| | | allForms.forEach(item => { |
| | | checkForms.push(item.field) |
| | | }) |
| | | |
| | | return columns |
| | | } |
| | | |
| | | transferData = (menuid, data, type) => { |
| | | const { MenuID, setting } = this.props |
| | | const { edData, signForms } = this.state |
| | | transferData = (data, type) => { |
| | | const { edData } = this.state |
| | | |
| | | if (menuid !== MenuID) return |
| | | |
| | | if (setting.commit !== 'all' && setting.commit !== 'blur' && setting.standard !== 'change') { |
| | | if (type !== 'line') { |
| | | data.forEach(item => { |
| | | let value = '' |
| | | signForms.forEach(field => { |
| | | value += item[field] |
| | | }) |
| | | item.$sign = md5(value) |
| | | }) |
| | | } else { |
| | | if (type === 'line') { |
| | | let value = '' |
| | | Object.keys(data).sort().forEach(key => { |
| | | if (/^\$/.test(key)) return |
| | | value += data[key] |
| | | }) |
| | | data.$sign = md5(value) |
| | | } else { |
| | | data.forEach(item => { |
| | | let value = '' |
| | | signForms.forEach(field => { |
| | | value += data[field] |
| | | Object.keys(item).sort().forEach(key => { |
| | | if (/^\$/.test(key)) return |
| | | value += item[key] |
| | | }) |
| | | data.$sign = md5(value) |
| | | } |
| | | item.$sign = md5(value) |
| | | }) |
| | | } |
| | | |
| | | if (type !== 'line') { |
| | |
| | | } |
| | | }) |
| | | |
| | | this.setState({edData: _edData}) |
| | | this.setState({edData: _edData, reseting: true}, () => { |
| | | this.setState({reseting: false}) |
| | | }) |
| | | } |
| | | } |
| | | |
| | | updateMutil = (data) => { |
| | | const { setting, colsCtrls, allSearch } = this.props |
| | | const { allColumns } = this.state |
| | | const { allColumns, allForms } = this.state |
| | | |
| | | if (colsCtrls) { |
| | | let checkForms = [] |
| | | let columns = this.getCurColumns(allColumns, allSearch, allForms, checkForms) |
| | | |
| | | checkForms = Array.from(new Set(checkForms)) |
| | | |
| | | this.setState({ |
| | | columns: this.getCurColumns(allColumns, allSearch), |
| | | checkForms, |
| | | columns: columns, |
| | | reseting: true, |
| | | edData: data, |
| | | visible: false, |
| | |
| | | } |
| | | |
| | | if (setting.editType === 'multi' && data.length > 0) { |
| | | this.setState({edData: []}, () => { |
| | | this.setState({edData: data, visible: false, midData: null}) |
| | | this.setState({edData: data, visible: false, midData: null, reseting: true}, () => { |
| | | this.setState({reseting: false}) |
| | | }) |
| | | } else { |
| | | this.setState({edData: data, visible: false, midData: null}) |
| | |
| | | |
| | | if (setting.addable && data.length === 0) { |
| | | setTimeout(() => { |
| | | this.plusLine(true) |
| | | this.plusLine() |
| | | }, 10) |
| | | } |
| | | } |
| | |
| | | }) |
| | | } |
| | | |
| | | nextLine = (col, uuid) => { |
| | | nextLine = (lineId, colId) => { |
| | | const { setting } = this.props |
| | | const { edData, tableId } = this.state |
| | | |
| | | if (col.tableId !== tableId) return |
| | | |
| | | let index = edData.findIndex(item => item.$$uuid === uuid) |
| | | let index = edData.findIndex(item => item.$$uuid === lineId) |
| | | let next = edData[index + 1] || null |
| | | |
| | | if (next) { |
| | | let nextId = setting.initId + next.$$uuid |
| | | if (/^\$next_/.test(col.enter)) { |
| | | nextId = col.enter.split('_')[1] + next.$$uuid |
| | | } |
| | | |
| | | let node = document.getElementById(nextId) |
| | | if (node) { |
| | | if (setting.editType === 'multi') { |
| | | if (setting.triType === 'click') { |
| | | node.click() |
| | | } else { |
| | | node.select && node.select() |
| | | } |
| | | } else { |
| | | node.click() |
| | | } |
| | | } |
| | | MKEmitter.emit('setFocus' + tableId, next.$$uuid, colId) |
| | | } else if (setting.addable) { |
| | | setTimeout(() => { |
| | | this.plusLine() |
| | | this.plusLine(colId) |
| | | }, 10) |
| | | } else if (edData[index]) { |
| | | } else if (edData[index] && setting.commit !== 'change') { |
| | | setTimeout(() => { |
| | | this.subLine(col, edData[index]) |
| | | this.submit() |
| | | }, 10) |
| | | } |
| | | } |
| | | |
| | | subLine = (col, record) => { |
| | | const { tableId, edData } = this.state |
| | | |
| | | if (col && col.tableId !== tableId) return |
| | | |
| | | let _data = edData.map(item => { |
| | | if (item.$$uuid === record.$$uuid) { |
| | | item.$origin = false |
| | | } |
| | | return item |
| | | }) |
| | | |
| | | this.setState({edData: _data}, () => { |
| | | this.submit() |
| | | }) |
| | | } |
| | | |
| | | plusLine = (auto) => { |
| | | const { setting } = this.props |
| | | const { edData, forms } = this.state |
| | | |
| | | let item = edData.length > 0 ? {...edData[edData.length - 1]} : {} |
| | | |
| | | item.$$uuid = Utils.getguid() |
| | | item.$type = 'add' |
| | | item.$forbid = true |
| | | item.$Index = '' |
| | | |
| | | forms.forEach(col => { |
| | | if (col.initval !== '$copy') { |
| | | item[col.field] = col.initval |
| | | } |
| | | if (col.type === 'number') { |
| | | item[col.field] = +item[col.field] |
| | | if (isNaN(item[col.field])) { |
| | | item[col.field] = 0 |
| | | } |
| | | } |
| | | if (item[col.field] === undefined) { |
| | | item[col.field] = '' |
| | | } |
| | | }) |
| | | |
| | | this.setState({edData: [...edData, item]}, () => { |
| | | let node = document.getElementById(setting.initId + item.$$uuid) |
| | | if (node && !auto) { |
| | | if (setting.editType === 'multi') { |
| | | if (setting.triType === 'click') { |
| | | node.click() |
| | | } else { |
| | | node.select && node.select() |
| | | } |
| | | } else { |
| | | node.click() |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | |
| | | delRecord = (id, record) => { |
| | | const { setting } = this.props |
| | | const { tableId, edData } = this.state |
| | | |
| | | if (id !== tableId) return |
| | | |
| | | if (record.$type === 'add') { |
| | | let _data = edData.filter(item => item.$$uuid !== record.$$uuid) |
| | | this.setState({edData: _data}) |
| | | } else { |
| | | let _data = fromJS(edData).toJS().map(item => { |
| | | if (item.$$uuid === record.$$uuid) { |
| | | item.$deleted = true |
| | | item.$origin = false |
| | | item.$type = 'del' |
| | | } |
| | | |
| | | return item |
| | | }) |
| | | |
| | | this.setState({edData: _data}, () => { |
| | | if (setting.commit === 'simple') { |
| | | this.submit() |
| | | } else if (setting.commit === 'blur') { |
| | | this.submit(record) |
| | | } |
| | | }) |
| | | } |
| | | } |
| | | |
| | | changeRecord = (id, record) => { |
| | | const { setting } = this.props |
| | | const { tableId, signForms } = this.state |
| | | |
| | | if (id !== tableId) return |
| | | |
| | | if (setting.commit === 'blur') { |
| | | |
| | | } else if (!record.$sign) { |
| | | record.$origin = false |
| | | record.$lock = true |
| | | delete record.$forbid |
| | | } else { |
| | | let value = '' |
| | | signForms.forEach(field => { |
| | | value += record[field] |
| | | }) |
| | | |
| | | if (record.$sign !== md5(value)) { |
| | | record.$origin = false |
| | | record.$lock = true |
| | | } else { |
| | | record.$origin = true |
| | | record.$lock = false |
| | | } |
| | | } |
| | | |
| | | let _data = this.state.edData.map(item => { |
| | | if (item.$$uuid === record.$$uuid) { |
| | | return record |
| | | } else { |
| | | return item |
| | | } |
| | | }) |
| | | |
| | | this.setState({edData: _data}, () => { |
| | | if (setting.tableType && setting.hasAction && this.state.selectedRowKeys.includes(record.$$uuid)) { |
| | | this.selectdata(this.state.selectedRowKeys) |
| | | } |
| | | if (setting.commit === 'blur') { |
| | | this.submit(record) |
| | | } |
| | | }) |
| | | |
| | | } |
| | | |
| | | addRecord = (id, record) => { |
| | | plusLine = (colId, lineId) => { |
| | | const { BID } = this.props |
| | | const { edData, forms, tableId } = this.state |
| | | const { forms, tableId } = this.state |
| | | |
| | | if (id !== tableId) return |
| | | |
| | | let _edData = fromJS(edData).toJS() |
| | | let item = {} |
| | | let edData = fromJS(this.state.edData).toJS() |
| | | let item = edData.length > 0 ? {...edData[edData.length - 1]} : {} |
| | | let index = null |
| | | let copy = edData.length > 0 ? {...edData[edData.length - 1]} : null |
| | | |
| | | if (record) { |
| | | index = _edData.findIndex(item => record.$$uuid === item.$$uuid) |
| | | |
| | | if (lineId) { |
| | | index = edData.findIndex(item => lineId === item.$$uuid) |
| | | index = index === -1 ? null : index |
| | | |
| | | copy = {...record} |
| | | |
| | | if (index !== null) { |
| | | item = {...edData[index]} |
| | | } |
| | | } |
| | | |
| | | if (copy) { |
| | | item = {...copy} |
| | | } |
| | | |
| | | item.key = edData.length |
| | | item.$$uuid = Utils.getguid() |
| | | item.$type = 'add' |
| | | item.$Index = '' |
| | | item.$forbid = true |
| | | item.$Index = '' |
| | | item.$$BID = BID || '' |
| | | |
| | | forms.forEach(col => { |
| | |
| | | item[col.field] = 0 |
| | | } |
| | | } |
| | | |
| | | if (item[col.field] === undefined) { |
| | | item[col.field] = '' |
| | | } |
| | | }) |
| | | |
| | | let value = '' |
| | | Object.keys(item).sort().forEach(key => { |
| | | if (/^\$/.test(key)) return |
| | | value += item[key] |
| | | }) |
| | | item.$sign = md5(value) |
| | | |
| | | if (index === null) { |
| | | _edData.push(item) |
| | | edData.push(item) |
| | | } else { |
| | | _edData.splice(index, 0, item) |
| | | edData.splice(index, 0, item) |
| | | } |
| | | |
| | | this.setState({edData: _edData}) |
| | | this.setState({edData: edData}, () => { |
| | | if (colId) { |
| | | MKEmitter.emit('setFocus' + tableId, item.$$uuid, colId) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | delRecord = (record) => { |
| | | const { setting } = this.props |
| | | const { edData } = this.state |
| | | |
| | | if (record.$type === 'add') { |
| | | let _data = edData.filter(item => item.$$uuid !== record.$$uuid) |
| | | this.setState({edData: _data}) |
| | | } else { |
| | | let _data = fromJS(edData).toJS().map(item => { |
| | | if (item.$$uuid === record.$$uuid) { |
| | | item.$deleted = true |
| | | item.$origin = false |
| | | item.$type = 'del' |
| | | |
| | | record.$deleted = true |
| | | record.$origin = false |
| | | record.$type = 'del' |
| | | } |
| | | |
| | | return item |
| | | }) |
| | | |
| | | this.setState({edData: _data}, () => { |
| | | if (setting.commit === 'change') { |
| | | this.submit(record) |
| | | } |
| | | }) |
| | | } |
| | | } |
| | | |
| | | changeRecord = (record) => { |
| | | const { setting } = this.props |
| | | const { edData } = this.state |
| | | |
| | | let data = edData.filter(item => item.$$uuid === record.$$uuid)[0] |
| | | |
| | | if (!data) return |
| | | |
| | | if (is(fromJS(data), fromJS(record))) return |
| | | |
| | | delete record.$forbid |
| | | |
| | | let value = '' |
| | | Object.keys(record).sort().forEach(key => { |
| | | if (/^\$/.test(key)) return |
| | | value += record[key] |
| | | }) |
| | | |
| | | let sign = md5(value) |
| | | |
| | | if (record.$sign === sign) { |
| | | record.$origin = true |
| | | record.$lock = false |
| | | } else { |
| | | record.$origin = false |
| | | record.$lock = true |
| | | } |
| | | |
| | | let _data = edData.map(item => { |
| | | if (item.$$uuid === record.$$uuid) { |
| | | return record |
| | | } else { |
| | | return item |
| | | } |
| | | }) |
| | | |
| | | this.setState({edData: _data}, () => { |
| | | if (setting.tableType && setting.hasAction && this.state.selectedRowKeys.includes(record.$$uuid)) { |
| | | this.selectdata(this.state.selectedRowKeys) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | checkData = () => { |
| | | const { setting } = this.props |
| | | const { edData, forms } = this.state |
| | | |
| | | if (edData.length === 0) { |
| | | notification.warning({ |
| | | top: 92, |
| | | message: '提交数据不可为空!', |
| | | duration: 5 |
| | | }) |
| | | return null |
| | | } |
| | | const { edData, forms, checkForms } = this.state |
| | | |
| | | let data = fromJS(edData).toJS() |
| | | |
| | | data = data.filter(item => !item.$forbid) |
| | | if (setting.commit === 'change' || setting.commit === 'simple') { |
| | | |
| | | if (setting.commit === 'amend') { |
| | | data = data.filter(item => !item.$origin) |
| | | } |
| | | |
| | |
| | | data = data.map(item => { |
| | | let line = [] |
| | | forms.forEach(col => { |
| | | if (col.editable !== 'true' || item.$deleted) { |
| | | let check = true |
| | | if (col.editable !== 'true' || item.$deleted || !checkForms.includes(col.field)) { |
| | | check = false |
| | | } |
| | | if (col.ctrlField && col.ctrlValue.includes(item[col.ctrlField] + '')) { |
| | | check = false |
| | | } |
| | | |
| | | if (!check) { |
| | | if (col.type === 'number') { |
| | | item[col.field] = +item[col.field] |
| | | if (isNaN(item[col.field])) { |
| | |
| | | } |
| | | return |
| | | } |
| | | |
| | | if (col.type === 'text') { |
| | | let val = item[col.field] !== undefined ? (item[col.field] + '') : '' |
| | | if (col.required === 'true' && !val) { |
| | |
| | | } else if (col.type === 'number') { |
| | | let val = item[col.field] |
| | | if (col.noValue === 'hide' && !val) { |
| | | if (col.clearField && checkForms.includes(col.clearField) && !item[col.clearField]) { |
| | | let msg = `请填写 ${col.label} 或 ${col.clearName}` |
| | | if (!line.includes(msg)) { |
| | | line.push(msg) |
| | | } |
| | | } |
| | | val = 0 |
| | | } else if (!val && val !== 0) { |
| | | line.push(`${col.label}不可为空`) |
| | | return |
| | | } |
| | | val = +val |
| | | if (isNaN(val)) { |
| | | line.push(`${col.label}数据格式错误`) |
| | | return |
| | | } |
| | | |
| | | val = +val.toFixed(col.decimal || 0) |
| | | |
| | | if (typeof(col.max) === 'number' && val > col.max) { |
| | | line.push(`${col.label}不可大于${col.max}`) |
| | | } else if (typeof(col.min) === 'number' && val < col.min) { |
| | | line.push(`${col.label}不可小于${col.min}`) |
| | | } else { |
| | | val = +val |
| | | if (isNaN(val)) { |
| | | line.push(`${col.label}数据格式错误`) |
| | | return |
| | | } |
| | | |
| | | val = +val.toFixed(col.decimal || 0) |
| | | |
| | | if (typeof(col.max) === 'number' && val > col.max) { |
| | | line.push(`${col.label}不可大于${col.max}`) |
| | | } else if (typeof(col.min) === 'number' && val < col.min) { |
| | | line.push(`${col.label}不可小于${col.min}`) |
| | | } |
| | | } |
| | | |
| | | item[col.field] = val |
| | |
| | | return data |
| | | } |
| | | |
| | | checkLineData = (item) => { |
| | | const { forms } = this.state |
| | | |
| | | let record = fromJS(item).toJS() |
| | | let err = '' |
| | | forms.forEach(col => { |
| | | if (col.editable !== 'true' || record.$deleted) { |
| | | if (col.type === 'number') { |
| | | record[col.field] = +record[col.field] |
| | | if (isNaN(record[col.field])) { |
| | | record[col.field] = 0 |
| | | } |
| | | } else { |
| | | record[col.field] = record[col.field] !== undefined ? (record[col.field] + '') : '' |
| | | } |
| | | return |
| | | } |
| | | if (col.type === 'text') { |
| | | let val = record[col.field] !== undefined ? (record[col.field] + '') : '' |
| | | if (col.required === 'true' && !val) { |
| | | err = `${col.label}不可为空` |
| | | } else if (col.datatype === 'datetime' && !val) { |
| | | val = '1949-10-01' |
| | | } |
| | | record[col.field] = val |
| | | } else if (col.type === 'number') { |
| | | let val = record[col.field] |
| | | if (col.noValue === 'hide' && !val) { |
| | | val = 0 |
| | | } else if (!val && val !== 0) { |
| | | err = `${col.label}不可为空` |
| | | return |
| | | } |
| | | val = +val |
| | | if (isNaN(val)) { |
| | | err = `${col.label}数据格式错误` |
| | | return |
| | | } |
| | | |
| | | val = +val.toFixed(col.decimal || 0) |
| | | |
| | | if (typeof(col.max) === 'number' && val > col.max) { |
| | | err = `${col.label}不可大于${col.max}` |
| | | } else if (typeof(col.min) === 'number' && val < col.min) { |
| | | err = `${col.label}不可小于${col.min}` |
| | | } |
| | | |
| | | record[col.field] = val |
| | | } |
| | | }) |
| | | |
| | | if (err) { |
| | | message.warning(err) |
| | | |
| | | return null |
| | | } |
| | | |
| | | return [record] |
| | | } |
| | | |
| | | submit = (record) => { |
| | | const { submit, BID, setting } = this.props |
| | | const { forms } = this.state |
| | |
| | | return |
| | | } |
| | | |
| | | if (setting.commit === 'blur' && !record) return |
| | | |
| | | let data = null |
| | | if (setting.commit === 'blur') { |
| | | data = this.checkLineData(record) |
| | | if (record) { |
| | | data = [record] |
| | | } else { |
| | | data = this.checkData() |
| | | } |
| | |
| | | |
| | | let _edData = fromJS(edData).toJS() |
| | | |
| | | _edData = _edData.map(item => { |
| | | _edData = _edData.filter(item => { |
| | | if (item.$deleted) return false |
| | | |
| | | if (!item.$forbid) { |
| | | item.$type = 'upt' |
| | | item.$origin = true |
| | | item.$lock = false |
| | | } |
| | | return item |
| | | |
| | | let value = '' |
| | | Object.keys(item).sort().forEach(key => { |
| | | if (/^\$/.test(key)) return |
| | | value += item[key] |
| | | }) |
| | | |
| | | item.$sign = md5(value) |
| | | |
| | | return true |
| | | }) |
| | | |
| | | this.setState({ |
| | |
| | | |
| | | render() { |
| | | const { setting, lineMarks, submit } = this.props |
| | | const { tableId, edData, columns, loading, pageOptions, selectedRowKeys, visible, midData, reseting } = this.state |
| | | const { edData, columns, loading, pageOptions, selectedRowKeys, visible, midData, reseting } = this.state |
| | | |
| | | if (reseting) return null |
| | | |
| | |
| | | height = height + 'vh' |
| | | } |
| | | |
| | | let style = { |
| | | '--mk-table-border-color': setting.borderColor || '#e8e8e8', |
| | | '--mk-table-color': setting.color || 'rgba(0, 0, 0, 0.65)', |
| | | '--mk-table-font-size': setting.fontSize || '14px', |
| | | '--mk-table-font-weight': setting.fontWeight || 'normal' |
| | | } |
| | | |
| | | return ( |
| | | <> |
| | | {setting.hasSubmit ? <div className="edit-custom-table-btn-wrap" style={submit.wrapStyle}> |
| | | {setting.hasSubmit && edData.length > 0 ? <div className="edit-custom-table-btn-wrap" style={submit.wrapStyle}> |
| | | <Button style={submit.style} onClick={() => setTimeout(() => {this.submit()}, 10)} loading={loading} className="submit-table" type="link">提交</Button> |
| | | </div> : null} |
| | | <div className={`edit-custom-table ${setting.tableHeader || ''} ${height ? 'fixed-height' : ''} ${setting.mode || ''} table-vertical-${setting.vertical || ''} mk-edit-${setting.editType || 'simple'}`} id={tableId}> |
| | | <div className={`edit-custom-table ${setting.tableHeader || ''} ${height ? 'fixed-height' : ''} ${setting.mode || ''} table-vertical-${setting.vertical || ''} mk-edit-${setting.editType || 'simple'}`} style={style}> |
| | | <Table |
| | | rowKey="$$uuid" |
| | | components={components} |
| | |
| | | import React, {Component} from 'react' |
| | | import { is, fromJS } from 'immutable' |
| | | import { notification, Modal, Table, Input } from 'antd' |
| | | import { notification, Modal, Table, Input, Tabs } from 'antd' |
| | | import moment from 'moment' |
| | | import { TableOutlined, CloseCircleFilled } from '@ant-design/icons' |
| | | |
| | | import Api from '@/api' |
| | | import Utils from '@/utils/utils.js' |
| | | import MKEmitter from '@/utils/events.js' |
| | | import './index.scss' |
| | | |
| | | const { Search } = Input |
| | | const { TabPane } = Tabs |
| | | |
| | | class MKPopSelect extends Component { |
| | | constructor(props) { |
| | | super(props) |
| | | |
| | | let config = fromJS(props.config).toJS() |
| | | let value = props.defaultValue |
| | | |
| | | let arrfield = config.columns.map(f => f.field) |
| | | |
| | | if (config.subFields && config.subFields.length > 0) { |
| | | config.subFields.forEach(n => { |
| | | if (!arrfield.includes(n.field)) { |
| | | arrfield.push(n.field) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | if (sessionStorage.getItem('dataM') === 'true') { // 数据权限 |
| | | config.dataSource = config.dataSource.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'') |
| | | } else { |
| | | config.dataSource = config.dataSource.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'') |
| | | } |
| | | |
| | | config.dataSource = config.dataSource.replace(/@LoginUID@/ig, `'${sessionStorage.getItem('LoginUID') || ''}'`) |
| | | config.dataSource = config.dataSource.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`) |
| | | config.dataSource = config.dataSource.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`) |
| | | config.dataSource = config.dataSource.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`) |
| | | |
| | | if (/\s/.test(config.dataSource)) { // 拼接别名 |
| | | config.dataSource = '(' + config.dataSource + ') tb' |
| | | } |
| | | |
| | | let columns = [] |
| | | let labels = {} |
| | | config.columns.forEach(col => { |
| | | labels[col.field] = col.label |
| | | |
| | | if (col.Hide === 'true') return |
| | | |
| | | columns.push({ |
| | | dataIndex: col.field, |
| | | title: col.label, |
| | | sorter: col.IsSort === 'true', |
| | | width: col.Width || 120 |
| | | }) |
| | | }) |
| | | |
| | | let placeholder = '' |
| | | if (!config.searchKey) { |
| | | config.onload = 'true' |
| | | } else { |
| | | placeholder = [] |
| | | config.searchKey.split(',').forEach(key => { |
| | | if (!labels[key]) { |
| | | placeholder = '' |
| | | } else if (placeholder) { |
| | | placeholder.push(labels[key]) |
| | | } |
| | | }) |
| | | |
| | | placeholder = placeholder ? placeholder.join('、') : '' |
| | | } |
| | | |
| | | this.state = { |
| | | config: config, |
| | | options: [], |
| | | columns, |
| | | value, |
| | | placeholder, |
| | | arr_field: arrfield.join(','), |
| | | searchKey: '', |
| | | pageIndex: 1, |
| | | pageSize: 10, |
| | | orderBy: '', |
| | | visible: false, |
| | | loading: false |
| | | } |
| | | |
| | | this.timer = null |
| | | class PopTable extends Component { |
| | | state = { |
| | | options: [], |
| | | searchKey: '', |
| | | pageIndex: 1, |
| | | pageSize: 10, |
| | | orderBy: '', |
| | | loading: false |
| | | } |
| | | |
| | | timer = null |
| | | |
| | | componentDidMount () { |
| | | const { mask } = this.props |
| | | const { config } = this.props |
| | | const { options } = this.state |
| | | |
| | | if (mask) { |
| | | this.trigger() |
| | | } |
| | | } |
| | | |
| | | shouldComponentUpdate (nextProps, nextState) { |
| | | return !is(fromJS(this.state), fromJS(nextState)) |
| | | } |
| | | |
| | | componentWillUnmount () { |
| | | this.setState = () => { |
| | | return |
| | | if (config.onload === 'true' && options.length === 0) { |
| | | this.loadData() |
| | | } |
| | | } |
| | | |
| | | loadData () { |
| | | const { BID, ID } = this.props |
| | | const { config, pageIndex, pageSize, arr_field, searchKey, orderBy } = this.state |
| | | const { BID, ID, config } = this.props |
| | | const { pageIndex, pageSize, searchKey, orderBy } = this.state |
| | | |
| | | this.setState({ |
| | | loading: true |
| | |
| | | func: 'sPC_Get_TableData', |
| | | obj_name: 'data', |
| | | exec_type: 'y', |
| | | arr_field: arr_field, |
| | | arr_field: config.arr_field, |
| | | default_sql: 'true', |
| | | custom_script: '', |
| | | menuname: config.label |
| | |
| | | _datasource = _datasource.replace(/@ID@/ig, `'${ID || ''}'`) |
| | | |
| | | if (config.laypage === 'true') { |
| | | sql = `/*system_query*/select top ${pageSize} ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${_orderBy}) as rows from ${_datasource} ${_search}) tmptable where rows > ${pageSize * (pageIndex - 1)} order by tmptable.rows ` |
| | | sql = `/*system_query*/select top ${pageSize} ${config.arr_field} from (select ${config.arr_field} ,ROW_NUMBER() over(order by ${_orderBy}) as rows from ${_datasource} ${_search}) tmptable where rows > ${pageSize * (pageIndex - 1)} order by tmptable.rows ` |
| | | DateCount = `/*system_query*/select count(1) as total from ${_datasource} ${_search}` |
| | | } else if (_orderBy) { |
| | | sql = `/*system_query*/select ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${_orderBy}) as rows from ${_datasource} ${_search}) tmptable order by tmptable.rows ` |
| | | sql = `/*system_query*/select ${config.arr_field} from (select ${config.arr_field} ,ROW_NUMBER() over(order by ${_orderBy}) as rows from ${_datasource} ${_search}) tmptable order by tmptable.rows ` |
| | | } else { |
| | | sql = `/*system_query*/select ${arr_field} from ${_datasource} ${_search} ` |
| | | sql = `/*system_query*/select ${config.arr_field} from ${_datasource} ${_search} ` |
| | | } |
| | | |
| | | let departmentcode = sessionStorage.getItem('departmentcode') || '' |
| | |
| | | param.username = sessionStorage.getItem('User_Name') || '' |
| | | param.fullname = sessionStorage.getItem('Full_Name') || '' |
| | | |
| | | Api.genericInterface(param).then(result => { |
| | | Api.getSystemCacheConfig(param, config.cache === 'true').then(result => { |
| | | if (result.status) { |
| | | let options = result.data.map((item, index) => { |
| | | item.key = index |
| | | item.$$uuid = item[config.primaryKey] || '' |
| | | item.$label = item[config.showField] |
| | | |
| | | if (config.controlField && item[config.controlField] === 'true') { |
| | | item.$disabled = true |
| | |
| | | }, 500) |
| | | } |
| | | |
| | | selectChange = (val, record) => { |
| | | const { config } = this.state |
| | | |
| | | let values = {[config.field]: val} |
| | | |
| | | if (config.linkSubField) { |
| | | config.linkSubField.forEach(m => { |
| | | values[m] = record[m] === undefined ? '' : record[m] |
| | | }) |
| | | } |
| | | |
| | | this.props.onChange(values) |
| | | this.setState({value: val}) |
| | | } |
| | | |
| | | trigger = (e) => { |
| | | const { config, options } = this.state |
| | | |
| | | e && e.stopPropagation() |
| | | |
| | | this.setState({visible: true}, () => { |
| | | if (config.onload === 'true' && options.length === 0) { |
| | | this.loadData() |
| | | } |
| | | }) |
| | | } |
| | | |
| | | changeRow = (record) => { |
| | | |
| | | if (record.$disabled) return |
| | | |
| | | this.selectChange(record.$$uuid, record) |
| | | this.setState({visible: false}) |
| | | } |
| | | |
| | | clear = (e) => { |
| | | const { config } = this.state |
| | | |
| | | e.stopPropagation() |
| | | |
| | | let values = {[config.field]: ''} |
| | | |
| | | if (config.linkSubField) { |
| | | config.linkSubField.forEach(m => { |
| | | values[m] = '' |
| | | }) |
| | | } |
| | | |
| | | this.props.onChange(values) |
| | | this.setState({value: ''}) |
| | | this.props.onChange(record) |
| | | } |
| | | |
| | | changeTable = (pagination, filters, sorter) => { |
| | |
| | | }) |
| | | } |
| | | |
| | | cancel = () => { |
| | | const { mask } = this.props |
| | | render() { |
| | | const { config, value } = this.props |
| | | const { options, loading, total, pageIndex, pageSize } = this.state |
| | | |
| | | return <> |
| | | {config.searchKey ? <Search placeholder={config.placeholder} onSearch={this.searchOption} enterButton /> : null} |
| | | <Table |
| | | rowKey="$$uuid" |
| | | bordered={true} |
| | | rowSelection={null} |
| | | columns={config.cols} |
| | | dataSource={options} |
| | | loading={loading} |
| | | onRow={(record) => { |
| | | let className = '' |
| | | |
| | | this.setState({visible: false}) |
| | | if (record.$disabled) { |
| | | className = ' mk-disable-line ' |
| | | } else if (value === record.$$uuid) { |
| | | className = ' ant-table-row-selected ' |
| | | } |
| | | |
| | | return { |
| | | className: className, |
| | | onClick: () => {this.changeRow(record)}, |
| | | } |
| | | }} |
| | | onChange={this.changeTable} |
| | | pagination={config.laypage === 'true' ? { |
| | | current: pageIndex, |
| | | pageSize: pageSize, |
| | | showSizeChanger: true, |
| | | total: total || 0, |
| | | showTotal: (total, range) => `${range[0]}-${range[1]} 共 ${total} 条` |
| | | } : false} |
| | | /> |
| | | </> |
| | | } |
| | | } |
| | | |
| | | if (mask) { |
| | | this.props.blur() |
| | | class MKPopSelect extends Component { |
| | | constructor(props) { |
| | | super(props) |
| | | |
| | | this.state = { |
| | | value: props.defaultValue, |
| | | visible: false |
| | | } |
| | | } |
| | | |
| | | componentDidMount() { |
| | | const { autoFocus, config } = this.props |
| | | |
| | | MKEmitter.addListener('setFocus' + config.tableId, this.setFocus) |
| | | |
| | | if (autoFocus) { |
| | | this.trigger() |
| | | } |
| | | } |
| | | |
| | | shouldComponentUpdate (nextProps, nextState) { |
| | | return !is(fromJS(this.state), fromJS(nextState)) |
| | | } |
| | | |
| | | componentWillUnmount () { |
| | | this.setState = () => { |
| | | return |
| | | } |
| | | MKEmitter.removeListener('setFocus' + this.props.config.tableId, this.setFocus) |
| | | } |
| | | |
| | | setFocus = (lId, colId) => { |
| | | const { config, lineId } = this.props |
| | | |
| | | if (lId !== lineId || config.uuid !== colId) return |
| | | |
| | | if (config.$ctrl) { |
| | | MKEmitter.emit('colFocus' + config.tableId, lineId, config.uuid) |
| | | } |
| | | |
| | | this.setState({visible: true}) |
| | | } |
| | | |
| | | selectChange = (record) => { |
| | | const { config, lineId } = this.props |
| | | |
| | | let values = {[config.field]: record.$$uuid} |
| | | |
| | | if (config.linkSubField) { |
| | | config.linkSubField.forEach((m, i) => { |
| | | values[m] = record[m] !== undefined ? record[m] : '' |
| | | }) |
| | | } |
| | | |
| | | this.props.onChange(values, record.$$uuid) |
| | | |
| | | this.setState({visible: false}) |
| | | |
| | | if (config.$ctrl) { |
| | | MKEmitter.emit('colBlur' + config.tableId, lineId, config.uuid) |
| | | } |
| | | |
| | | this.props.onBlur && this.props.onBlur() |
| | | |
| | | if (config.enter === '$noAct') return |
| | | |
| | | if (/\$next/.test(config.enter)) { |
| | | MKEmitter.emit('nextLine' + config.tableId, lineId, config.enter.replace('$next_', '')) |
| | | } else { |
| | | MKEmitter.emit('setFocus' + config.tableId, lineId, config.enter) |
| | | } |
| | | } |
| | | |
| | | trigger = (e) => { |
| | | const { config, lineId } = this.props |
| | | |
| | | e && e.stopPropagation() |
| | | |
| | | if (config.$ctrl) { |
| | | MKEmitter.emit('colFocus' + config.tableId, lineId, config.uuid) |
| | | } |
| | | |
| | | this.setState({visible: true}) |
| | | } |
| | | |
| | | clear = (e) => { |
| | | const { config, lineId } = this.props |
| | | |
| | | e.stopPropagation() |
| | | |
| | | let values = {[config.field]: ''} |
| | | |
| | | if (config.linkSubField) { |
| | | config.linkSubField.forEach((m, i) => { |
| | | values[m] = '' |
| | | }) |
| | | } |
| | | |
| | | this.props.onChange(values, '') |
| | | this.setState({value: ''}) |
| | | |
| | | if (config.$ctrl) { |
| | | MKEmitter.emit('colBlur' + config.tableId, lineId, config.uuid) |
| | | } |
| | | } |
| | | |
| | | cancel = () => { |
| | | const { config, lineId } = this.props |
| | | |
| | | this.setState({visible: false}) |
| | | |
| | | if (config.$ctrl) { |
| | | MKEmitter.emit('colBlur' + config.tableId, lineId, config.uuid) |
| | | } |
| | | |
| | | this.props.onBlur && this.props.onBlur() |
| | | } |
| | | |
| | | render() { |
| | | const { mask } = this.props |
| | | const { value, config, options, visible, loading, total, pageIndex, pageSize, columns, placeholder } = this.state |
| | | const { autoFocus, BID, lineId, config } = this.props |
| | | const { value, visible } = this.state |
| | | |
| | | return <> |
| | | {mask ? <div className="mk-pop-select-mask" onClick={this.trigger}></div> : null} |
| | | {autoFocus ? <div className="mk-pop-select-mask" onClick={this.trigger}></div> : null} |
| | | <div className="mk-pop-select-wrap" onClick={this.trigger}> |
| | | {value} |
| | | {value && !mask ? <CloseCircleFilled onClick={this.clear} /> : null} |
| | | {value && !autoFocus ? <CloseCircleFilled onClick={this.clear} /> : null} |
| | | <TableOutlined onClick={this.trigger}/> |
| | | </div> |
| | | <Modal |
| | | wrapClassName='mk-pop-select-modal' |
| | | wrapClassName='mk-table-pop-select-modal' |
| | | title={config.label} |
| | | visible={visible} |
| | | closable={true} |
| | |
| | | onCancel={this.cancel} |
| | | destroyOnClose |
| | | > |
| | | {config.searchKey ? <Search placeholder={placeholder} onSearch={this.searchOption} enterButton /> : null} |
| | | <Table |
| | | rowKey="$$uuid" |
| | | bordered={true} |
| | | rowSelection={null} |
| | | columns={columns} |
| | | dataSource={options} |
| | | loading={loading} |
| | | onRow={(record) => { |
| | | let className = '' |
| | | |
| | | if (record.$disabled) { |
| | | className = ' mk-disable-line ' |
| | | } else if (value === record.$$uuid) { |
| | | className = ' ant-table-row-selected ' |
| | | } |
| | | |
| | | return { |
| | | className: className, |
| | | onClick: () => {this.changeRow(record)}, |
| | | } |
| | | }} |
| | | onChange={this.changeTable} |
| | | pagination={config.laypage === 'true' ? { |
| | | current: pageIndex, |
| | | pageSize: pageSize, |
| | | showSizeChanger: true, |
| | | total: total || 0, |
| | | showTotal: (total, range) => `${range[0]}-${range[1]} 共 ${total} 条` |
| | | } : false} |
| | | /> |
| | | {config.pops ? <Tabs> |
| | | {config.pops.map(tab => ( |
| | | <TabPane tab={tab.tabName} key={tab.uuid}> |
| | | <PopTable config={tab} BID={BID} ID={lineId} value={value} onChange={this.selectChange}/> |
| | | </TabPane> |
| | | ))} |
| | | </Tabs> : |
| | | <PopTable config={config} BID={BID} ID={lineId} value={value} onChange={this.selectChange}/>} |
| | | </Modal> |
| | | </> |
| | | } |
| | |
| | | white-space: nowrap; |
| | | text-overflow: ellipsis; |
| | | line-height: 30px; |
| | | vertical-align: top; |
| | | |
| | | .anticon-table { |
| | | padding: 7px; |
| | |
| | | box-shadow: none!important; |
| | | padding-left: 0px; |
| | | } |
| | | .mk-pop-select-modal { |
| | | .mk-table-pop-select-modal { |
| | | .ant-modal-body { |
| | | min-height: 200px; |
| | | max-height: calc(100vh - 210px); |
| | |
| | | max-width: 300px; |
| | | margin-bottom: 20px; |
| | | } |
| | | .ant-tabs { |
| | | margin-top: -20px; |
| | | } |
| | | table { |
| | | td { |
| | | padding: 12px 16px; |
| | |
| | | delete item.style.shadowColor |
| | | } |
| | | |
| | | item.$menuname = (Tab.label || '') + '-' + (item.name || '') |
| | | item.$menuname = (Tab.logLabel || Tab.label || '') + '-' + (item.name || '') |
| | | |
| | | if (item.type === 'tabs') { |
| | | if ( |
| | |
| | | let data = selectedData || [] |
| | | |
| | | if (btn.funcType === 'addline') { |
| | | MKEmitter.emit('addRecord', btn.$tableId, data[0] || null) |
| | | MKEmitter.emit('addRecord' + btn.$tableId, '', data[0] ? data[0].$$uuid : null) |
| | | } else { |
| | | MKEmitter.emit('delRecord', btn.$tableId, data[0] || null) |
| | | MKEmitter.emit('delRecord' + btn.$tableId, data[0] || null) |
| | | } |
| | | } |
| | | |
| | |
| | | } else { |
| | | let iserror = false |
| | | btnColumns.forEach(op => { |
| | | if (iserror) return |
| | | |
| | | let _name = typeof(header[op.Column]) === 'string' ? header[op.Column].replace(/(^\s*|\s*$)/g, '') : header[op.Column] |
| | | let _text = op.Text ? op.Text.replace(/(^\s*|\s*$)/g, '') : op.Text |
| | | |
| | | if (!_name && !iserror) { |
| | | if (!_name) { |
| | | iserror = true |
| | | errors = 'headerError' |
| | | errDetail = `Excel中不存在(${_text})列!` |
| | | } else if (_name !== _text && !iserror) { |
| | | } else if (_name !== _text) { |
| | | iserror = true |
| | | errors = 'headerError' |
| | | errDetail = `Excel中(${_name})与按钮列信息(${_text})不一致!` |
| | |
| | | changeColumns = (columns) => { |
| | | const { verify } = this.state |
| | | |
| | | let reset = false |
| | | columns = columns.map(col => { |
| | | col.type = col.type || 'Nvarchar(50)' |
| | | if (col.type === 'text' || col.type === 'image') { |
| | |
| | | col.type = 'Decimal(18,2)' |
| | | } |
| | | |
| | | if (col.import === 'init') { |
| | | col.required = 'false' |
| | | col.min = '' |
| | | col.max = '' |
| | | } |
| | | |
| | | if (/^Nvarchar/ig.test(col.type)) { |
| | | col.limit = col.type.match(/\d+/) ? col.type.match(/\d+/)[0] : '20000' |
| | | } else if (/^Decimal/ig.test(col.type)) { |
| | | col.limit = col.type.match(/\d+/ig)[1] |
| | | if (col.required === 'false') { |
| | | reset = true |
| | | } |
| | | col.required = 'true' |
| | | } else if (/^int/ig.test(col.type)) { |
| | | if (col.required === 'false') { |
| | | reset = true |
| | | } |
| | | col.required = 'true' |
| | | |
| | | } else { |
| | | col.limit = '' |
| | | } |
| | |
| | | |
| | | return col |
| | | }) |
| | | |
| | | if (reset) { |
| | | message.warning('数值类型均为必填。') |
| | | } |
| | | |
| | | this.setState({verify: {...verify, columns}}, () => { |
| | | this.resetUniqueColumns() |
| | |
| | | ${_tailScript} |
| | | aaa: |
| | | if @ErrorCode!='' |
| | | insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select '1949-10-01 15:00:00',@ErrorCode, @retmsg,'1949-10-01 15:00:00' |
| | | insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,'1949-10-01 15:00:00' |
| | | ` |
| | | } else if (_tailScript) { |
| | | sql = `${declare} |
| | |
| | | ${_tailScript} |
| | | aaa: |
| | | if @ErrorCode!='' |
| | | insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select '1949-10-01 15:00:00',@ErrorCode, @retmsg,'1949-10-01 15:00:00' |
| | | insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,'1949-10-01 15:00:00' |
| | | ` |
| | | } else { |
| | | sql = `${declare} |
| | |
| | | ${_tailScript} |
| | | aaa: |
| | | if @ErrorCode!='' |
| | | insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select '1949-10-01 15:00:00',@ErrorCode, @retmsg,'1949-10-01 15:00:00' |
| | | insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,'1949-10-01 15:00:00' |
| | | ` |
| | | } else if (_tailScript) { |
| | | sql = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000),@UserName nvarchar(50),@FullName nvarchar(50),@RoleID nvarchar(512),@mk_departmentcode nvarchar(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20),@mk_nation nvarchar(50),@mk_province nvarchar(50),@mk_city nvarchar(50),@mk_district nvarchar(50),@mk_address nvarchar(100) select @ErrorCode='',@retmsg ='' |
| | |
| | | ${_tailScript} |
| | | aaa: |
| | | if @ErrorCode!='' |
| | | insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select '1949-10-01 15:00:00',@ErrorCode, @retmsg,'1949-10-01 15:00:00' |
| | | insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,'1949-10-01 15:00:00' |
| | | ` |
| | | } else { |
| | | sql = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000),@UserName nvarchar(50),@FullName nvarchar(50),@RoleID nvarchar(512),@mk_departmentcode nvarchar(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20),@mk_nation nvarchar(50),@mk_province nvarchar(50),@mk_city nvarchar(50),@mk_district nvarchar(50),@mk_address nvarchar(100) select @ErrorCode='',@retmsg ='' |
| | |
| | | ${_dataresource} |
| | | aaa: |
| | | if @ErrorCode!='' |
| | | insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select '1949-10-01 15:00:00',@ErrorCode, @retmsg,'1949-10-01 15:00:00' |
| | | insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,'1949-10-01 15:00:00' |
| | | ` |
| | | } else { |
| | | sql = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000),@UserName nvarchar(50),@FullName nvarchar(50),@RoleID nvarchar(512),@mk_departmentcode nvarchar(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20),@mk_nation nvarchar(50),@mk_province nvarchar(50),@mk_city nvarchar(50),@mk_district nvarchar(50),@mk_address nvarchar(100) select @ErrorCode='',@retmsg ='' |
| | |
| | | ${_dataresource} |
| | | aaa: |
| | | if @ErrorCode!='' |
| | | insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select '1949-10-01 15:00:00',@ErrorCode, @retmsg,'1949-10-01 15:00:00' |
| | | insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,'1949-10-01 15:00:00' |
| | | ` |
| | | } else { |
| | | sql = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000),@UserName nvarchar(50),@FullName nvarchar(50),@RoleID nvarchar(512),@mk_departmentcode nvarchar(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20),@mk_nation nvarchar(50),@mk_province nvarchar(50),@mk_city nvarchar(50),@mk_district nvarchar(50),@mk_address nvarchar(100) select @ErrorCode='',@retmsg ='' |
| | |
| | | }) |
| | | } |
| | | } else if (/^Decimal/ig.test(col.type) || /^int/ig.test(col.type)) { |
| | | if (!val && val !== 0) { |
| | | if (col.required === 'false') { |
| | | if (!val || isNaN(val)) { |
| | | val = 0 |
| | | } |
| | | } else if (!val && val !== 0) { |
| | | errors.push(_position + '内容不可为空') |
| | | } else if (isNaN(val)) { // 检验是否为数值 |
| | | errors.push(_position + '内容应为数值') |
| | |
| | | _sql = _sql.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`) |
| | | _sql = _sql.replace(/@typename@/ig, `'admin'`) |
| | | |
| | | if (window.GLOB.externalDatabase !== null) { |
| | | _sql = _sql.replace(/@db@/ig, window.GLOB.externalDatabase) |
| | | } |
| | | |
| | | if (sessionStorage.getItem('dataM') === 'true') { // 数据权限 |
| | | _sql = _sql.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, `'Y'`) |
| | | } else { |
| | |
| | | * @description 获取标记信息 |
| | | */ |
| | | export function getMark (marks, record, style) { |
| | | let res = {} |
| | | let res = {signType: ''} |
| | | |
| | | marks.some(mark => { |
| | | let originVal = record[mark.field[0]] |