From f18eef383f288e453b7b6d0a34237ddf6e6620e8 Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期二, 13 五月 2025 20:50:41 +0800 Subject: [PATCH] Merge branch 'develop' --- src/tabviews/zshare/settingcomponent/editTable/index.jsx | 344 +++++++++++++++++++++++++++++---------------------------- 1 files changed, 175 insertions(+), 169 deletions(-) diff --git a/src/tabviews/zshare/settingcomponent/editTable/index.jsx b/src/tabviews/zshare/settingcomponent/editTable/index.jsx index c5c9f2c..2dad740 100644 --- a/src/tabviews/zshare/settingcomponent/editTable/index.jsx +++ b/src/tabviews/zshare/settingcomponent/editTable/index.jsx @@ -1,48 +1,47 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import { fromJS } from 'immutable' -import { Table, Form, Icon, Select, Cascader, notification, message } from 'antd' +import { Table, Form, Select, Cascader } from 'antd' +import { EditOutlined } from '@ant-design/icons' -import zhCN from '@/locales/zh-CN/model.js' -import enUS from '@/locales/en-US/model.js' import './index.scss' -let eTDict = localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS const EditableContext = React.createContext() +const shortkeycode = { + 65: 'A', 66: 'B', 67: 'C', 68: 'D', 69: 'E', 70: 'F', 71: 'G', 72: 'H', 73: 'I', 74: 'J', 75: 'K', 76: 'L', 77: 'M', + 78: 'N', 79: 'O', 80: 'P', 81: 'Q', 82: 'R', 83: 'S', 84: 'T', 85: 'U', 86: 'V', 87: 'W', 88: 'X', 89: 'Y', 90: 'Z' +} -class EditableCell extends Component { +class CustomEditableCell extends Component { getInput = () => { - const { inputType, options } = this.props + const { inputType, options, record } = this.props if (inputType === 'select') { + let _options = [] + if (record.$port) { + _options = window.GLOB.UserCacheMap.get(record.$port) || [] + } return ( - <Select> - {options.map((item, i) => (<Select.Option key={i} value={item.value}> {item.text} </Select.Option>))} + <Select allowClear> + {_options.map((item, i) => (<Select.Option key={i} title={item.value} value={item.value}> {item.text} </Select.Option>))} </Select> ) } else if (inputType === 'cascader') { return ( - <Cascader options={options} placeholder=""/> + <Cascader allowClear options={options} placeholder=""/> ) } } renderCell = (form) => { const { getFieldDecorator } = form - const { editing, dataIndex, title, record, children, className, required, inputType } = this.props + const { editing, editable, dataIndex, record, children, className } = this.props return ( <td className={className}> - {editing ? ( + {editing && editable ? ( <Form.Item style={{ margin: 0 }}> {getFieldDecorator(dataIndex, { - rules: [ - { - required: required, - message: ['number', 'text', 'input'].includes(inputType) ? `${eTDict['form.required.input']} ${title}!` : `${eTDict['form.required.select']} ${title}!`, - } - ], - initialValue: record[dataIndex], + initialValue: record[dataIndex] || '', })(this.getInput())} </Form.Item> ) : ( @@ -57,10 +56,9 @@ } } -class EditTable extends Component { +class CustomEditTable extends Component { static propTpyes = { data: PropTypes.any, // 鏁版嵁鍒楄〃 - columns: PropTypes.array, // 鏄剧ず鍒� onChange: PropTypes.func // 鏁版嵁鍙樺寲 } @@ -68,18 +66,33 @@ data: [], editingKey: '', visible: false, - columns: [] - } - - UNSAFE_componentWillMount () { - const { data } = this.props - let columns = fromJS(this.props.columns).toJS() - - columns.push({ - title: '鎿嶄綔', + columns: [{ + title: window.GLOB.dict['name'] || '鍚嶇О', + dataIndex: 'label', + width: '25%' + }, { + title: window.GLOB.dict['shortcut'] || '蹇嵎閿�', + dataIndex: 'shortcut', + inputType: 'cascader', + editable: true, + options: [], + width: '25%', + render: (text) => { + if (!text) return '' + return text[0] + '+' + shortkeycode[text[1]] + } + }, { + title: window.GLOB.dict['printer'] || '鎵撳嵃鏈�', + dataIndex: 'printer', + inputType: 'select', + editable: true, + options: [], + width: '25%' + }, { + title: window.GLOB.dict['operation'] || '鎿嶄綔', dataIndex: 'operation', width: '140px', - render: (text, record) => { + render: (_, record) => { const { editingKey } = this.state const editable = this.isEditing(record) return editable ? ( @@ -87,23 +100,93 @@ <EditableContext.Consumer> {form => ( <span onClick={() => this.save(form, record.uuid)} style={{ marginRight: 8 , color: '#1890ff', cursor: 'pointer'}}> - {eTDict['model.save']} + {window.GLOB.dict['save'] || '淇濆瓨'} </span> )} </EditableContext.Consumer> - <span style={{ color: '#1890ff', cursor: 'pointer'}} onClick={() => this.cancel(record.uuid)}>{eTDict['model.cancel']}</span> + <span style={{ color: '#1890ff', cursor: 'pointer'}} onClick={() => this.cancel(record.uuid)}>{window.GLOB.dict['cancel'] || '鍙栨秷'}</span> </div> ) : ( <div className={'edit-operation-btn' + (editingKey !== '' ? ' disabled' : '')} style={{minWidth: '110px'}}> - <span className="primary" onClick={() => {editingKey === '' && this.edit(record.uuid)}}><Icon type="edit" /></span> + <span className="primary" onClick={() => {editingKey === '' && this.edit(record.uuid)}}><EditOutlined /></span> </div> ) } + }], + printTypeColumns: [ + { + title: window.GLOB.dict['print_type'] || '鎵撳嵃绫诲瀷', + dataIndex: 'Text', + width: '26.1%' + }, + { + title: window.GLOB.dict['printer'] || '鎵撳嵃鏈�', + dataIndex: 'printer', + inputType: 'select', + editable: true, + options: [], + }, + { + title: window.GLOB.dict['operation'] || '鎿嶄綔', + dataIndex: 'operation', + width: '153px', + render: (_, record) => { + const { editingKey } = this.state + const editable = this.isEditing(record) + return editable ? ( + <div style={{textAlign: 'center', minWidth: '110px'}}> + <EditableContext.Consumer> + {form => ( + <span onClick={() => this.save(form, record.uuid, record.parentId)} style={{ marginRight: 8 , color: '#1890ff', cursor: 'pointer'}}> + {window.GLOB.dict['save'] || '淇濆瓨'} + </span> + )} + </EditableContext.Consumer> + <span style={{ color: '#1890ff', cursor: 'pointer'}} onClick={() => this.cancel(record.uuid)}>{window.GLOB.dict['cancel'] || '鍙栨秷'}</span> + </div> + ) : ( + <div className={'edit-operation-btn' + (editingKey !== '' ? ' disabled' : '')} style={{minWidth: '110px'}}> + <span className="primary" onClick={() => {editingKey === '' && this.edit(record.uuid)}}><EditOutlined /></span> + </div> + ) + } + } + ] + } + + UNSAFE_componentWillMount () { + const { data } = this.props + + let keys = ['shift', 'ctrl', 'alt'] + let _options = [] + + keys.forEach(item => { + let _op = { + value: item, + label: item, + children: [] + } + Object.keys(shortkeycode).forEach(key => { + if (item === 'ctrl' && ['65', '67', '68', '69', '70', '71', '72', '74', '75', '76', '78', '79', '80', '82', '83', '84', '85', '86', '87', '88', '90'].includes(key)) return + if (item === 'alt' && ['65', '68', '69', '70'].includes(key)) return + + _op.children.push({ + value: +key, + label: shortkeycode[key] + }) + }) + + _options.push(_op) }) this.setState({ - data: data || [], - columns + data: data, + columns: this.state.columns.map(item => { + if (item.dataIndex === 'shortcut') { + item.options = _options + } + return item + }) }) } @@ -111,81 +194,6 @@ cancel = () => { this.setState({ editingKey: '' }) - } - - copy = (item) => { - const { type } = this.props - const { data } = this.state - - if (!data || data.length === 0) { - message.warning('鏈幏鍙栧埌閰嶇疆淇℃伅') - return - } - - let msg = { key: type } - - if (item) { - msg.type = 'line' - msg.data = item - } else { - msg.type = 'array' - msg.data = data - } - - try { - msg = window.btoa(window.encodeURIComponent(JSON.stringify(msg))) - } catch { - console.warn('Stringify Failure') - msg = '' - } - - if (msg) { - let oInput = document.createElement('input') - oInput.value = msg - document.body.appendChild(oInput) - oInput.select() - document.execCommand('Copy') - document.body.removeChild(oInput) - message.success('澶嶅埗鎴愬姛銆�') - } - } - - onSave = (record) => { - const { columns } = this.state - const newData = [...this.state.data] - const index = newData.findIndex(item => record.uuid === item.uuid) - - if (index === -1) { - notification.warning({ - top: 92, - message: '鏁版嵁閿欒锛屾棤娉曟壘鍒拌ID锛�', - duration: 5 - }) - return - } - - let unique = true - columns.forEach(col => { - if (col.unique !== true || !unique) return - - let _index = newData.findIndex(item => record.uuid !== item.uuid && record[col.dataIndex] === item[col.dataIndex]) - - if (_index > -1) { - notification.warning({ - top: 92, - message: col.title + '涓嶅彲閲嶅锛�', - duration: 5 - }) - unique = false - } - }) - - if (!unique) return - - newData.splice(index, 1, record) - this.setState({ data: newData, editingKey: '' }, () => { - this.props.onChange(newData) - }) } handleDelete = (uuid) => { @@ -199,48 +207,38 @@ }) } - save(form, uuid) { - const { columns } = this.state + save(form, uuid, parentId) { form.validateFields((error, row) => { if (error) { return; } - const newData = [...this.state.data] - const index = newData.findIndex(item => uuid === item.uuid) - let unique = true - columns.forEach(col => { - if (col.unique !== true || !unique) return + let newData = null - let _index = newData.findIndex(item => uuid !== item.uuid && row[col.dataIndex] === item[col.dataIndex]) - - if (_index > -1) { - notification.warning({ - top: 92, - message: col.title + '涓嶅彲閲嶅锛�', - duration: 5 - }) - unique = false - } - }) - - if (!unique) return - - if (index > -1) { - const item = newData[index] - newData.splice(index, 1, { - ...item, - ...row, - }) - this.setState({ data: newData, editingKey: '' }, () => { - this.props.onChange(newData) + if (parentId) { + newData = this.state.data.map(item => { + if (parentId === item.uuid) { + item.verify.printerTypeList = item.verify.printerTypeList.map(cell => { + if (uuid === cell.uuid) { + cell = {...cell, ...row} + } + return cell + }) + } + return item }) } else { - newData.push(row); - this.setState({ data: newData, editingKey: '' }, () => { - this.props.onChange(newData) + newData = this.state.data.map(item => { + if (uuid === item.uuid) { + item = {...item, ...row} + } + return item }) } + + this.setState({ data: newData, editingKey: '' }, () => { + this.props.onChange(newData) + }) }) } @@ -248,25 +246,10 @@ this.setState({ editingKey: uuid }) } - moveRow = (dragIndex, hoverIndex) => { - const { editingKey } = this.state - let _data = fromJS(this.state.data).toJS() - - if (editingKey) return - - _data.splice(hoverIndex, 0, ..._data.splice(dragIndex, 1)) - - this.setState({ - data: _data - }, () => { - this.props.onChange(_data) - }) - } - render() { let components = { body: { - cell: EditableCell + cell: CustomEditableCell } } @@ -279,30 +262,53 @@ inputType: col.inputType, dataIndex: col.dataIndex, options: col.options || [], - required: col.required !== false ? true : false, title: col.title, + editable: col.dataIndex === 'shortcut' || record.funcType === 'print', editing: this.isEditing(record), - onSave: this.onSave, + }), + } + }) + + const printTypeColumns = this.state.printTypeColumns.map(col => { + if (!col.editable) return col + return { + ...col, + onCell: record => ({ + record, + inputType: col.inputType, + dataIndex: col.dataIndex, + options: [], + title: col.title, + editable: true, + editing: this.isEditing(record), }), } }) return ( <EditableContext.Provider value={this.props.form}> - <div className="modal-edit-table"> + <div className="modal-custom-edit-table"> <Table bordered rowKey="uuid" components={components} dataSource={this.state.data} columns={columns} - rowClassName="editable-row" + rowClassName={(record) => 'editable-row' + (record.$expanded ? ' print' : '')} pagination={false} - onRow={(record, index) => ({ - index, - moveAble: !this.state.editingKey, - moveRow: this.moveRow, - })} + expandedRowRender={record => ( + record.$expanded ? + <Table + bordered + rowKey="key" + size="small" + components={components} + rowClassName="editable-row" + dataSource={record.verify.printerTypeList} + columns={printTypeColumns} + pagination={false} + /> : null + )} /> </div> </EditableContext.Provider> @@ -310,4 +316,4 @@ } } -export default Form.create()(EditTable) \ No newline at end of file +export default Form.create()(CustomEditTable) \ No newline at end of file -- Gitblit v1.8.0