| | |
| | | import { is, fromJS } from 'immutable' |
| | | import { DndProvider, DragSource, DropTarget } from 'react-dnd' |
| | | import { Table, Input, InputNumber, Popconfirm, Switch, Form, Select, Radio, Cascader, notification, message, Modal, Typography } from 'antd' |
| | | import { CopyOutlined, EditOutlined, DeleteOutlined, SwapOutlined, PlusOutlined } from '@ant-design/icons' |
| | | import { CopyOutlined, EditOutlined, DeleteOutlined, SwapOutlined, PlusOutlined, ConsoleSqlOutlined } from '@ant-design/icons' |
| | | |
| | | import Utils from '@/utils/utils.js' |
| | | import ColorSketch from '@/mob/colorsketch' |
| | |
| | | |
| | | class EditableCell extends Component { |
| | | getInput = (form) => { |
| | | const { inputType, options, min, max, unlimit, allowClear } = this.props |
| | | const { inputType, options, min, max, unlimit, allowClear, typeChange } = this.props |
| | | |
| | | if (inputType === 'number' && unlimit) { |
| | | return <InputNumber onPressEnter={() => this.getValue(form)} /> |
| | |
| | | return <CusSwitch /> |
| | | } else if (inputType === 'select') { |
| | | return ( |
| | | <Select> |
| | | <Select onChange={typeChange}> |
| | | {options.map((item, i) => (<Select.Option key={i} value={item.field || item.value}> {item.label || item.text} </Select.Option>))} |
| | | </Select> |
| | | ) |
| | |
| | | |
| | | renderCell = (form) => { |
| | | const { getFieldDecorator } = form |
| | | const { editing, dataIndex, title, record, children, className, required, inputType, rules } = this.props |
| | | const { editing, pass, dataIndex, title, record, children, className, required, inputType, rules } = this.props |
| | | |
| | | if (!editing) { |
| | | return ( |
| | | <td className={className}> |
| | | {children} |
| | | </td> |
| | | ) |
| | | } |
| | | return ( |
| | | <td className={className}> |
| | | {editing ? ( |
| | | {pass ? ( |
| | | <Form.Item style={{ margin: 0 }}> |
| | | {getFieldDecorator(dataIndex, { |
| | | rules: [ |
| | |
| | | })(this.getInput(form))} |
| | | </Form.Item> |
| | | ) : ( |
| | | children |
| | | null |
| | | )} |
| | | </td> |
| | | ) |
| | |
| | | data: [], |
| | | editingKey: '', |
| | | editLineId: '', |
| | | columns: [] |
| | | columns: [], |
| | | keyCol: null, |
| | | keyVal: '' |
| | | } |
| | | |
| | | UNSAFE_componentWillMount () { |
| | |
| | | let columns = fromJS(this.props.columns).toJS() |
| | | let operation = null |
| | | let extra = null |
| | | let keyCol = null |
| | | |
| | | if (actions) { |
| | | actions.forEach(item => { |
| | |
| | | |
| | | if (actions && (actions.includes('edit') || actions.includes('copy') || actions.includes('del'))) { |
| | | let _operation = null |
| | | let render = null |
| | | columns = columns.filter(item => { |
| | | if (item.dataIndex === 'operation') { |
| | | _operation = item |
| | | } |
| | | if (item.keyCol) { |
| | | keyCol = item.dataIndex |
| | | } |
| | | if (item.dataIndex === 'sqlRender') { |
| | | render = item.render |
| | | return false |
| | | } |
| | | return item.dataIndex !== 'operation' |
| | | }) |
| | |
| | | </div> |
| | | ) : ( |
| | | <div className={'edit-operation-btn' + (editingKey !== '' ? ' disabled' : '')} style={{minWidth: '110px', whiteSpace: 'nowrap'}}> |
| | | {actions.includes('edit') ? <span className="primary" title="编辑" onClick={() => {editingKey === '' && this.edit(record.uuid)}}><EditOutlined /></span> : null} |
| | | {actions.includes('edit') ? <span className="primary" title="编辑" onClick={() => {editingKey === '' && this.edit(record)}}><EditOutlined /></span> : null} |
| | | {extra ? <span className="status" title={extra[2]} onClick={() => {editingKey === '' && this.handleStatus(record, extra[1])}}><SwapOutlined /></span> : null} |
| | | {actions.includes('status') ? <span className="status" title="是否启用" onClick={() => {editingKey === '' && this.handleStatus(record, 'status')}}><SwapOutlined /></span> : null} |
| | | {actions.includes('copy') ? <span className="copy" title="复制" onClick={() => {editingKey === '' && this.copy(record)}}><CopyOutlined /></span> : null} |
| | |
| | | overlayClassName="popover-confirm" |
| | | title="确定删除吗?" |
| | | onConfirm={() => this.handleDelete(record.uuid) |
| | | }> |
| | | }> |
| | | <span className="danger"><DeleteOutlined /></span> |
| | | </Popconfirm> : null} |
| | | {actions.includes('del') && editingKey !== '' ? <span className="danger"><DeleteOutlined /></span> : null} |
| | | {actions.includes('sql') ? <span className="primary" title="SQL" onClick={() => {editingKey === '' && this.showSql(record, render)}}><ConsoleSqlOutlined /></span> : null} |
| | | </div> |
| | | ) |
| | | } |
| | |
| | | this.setState({ |
| | | data: data || [], |
| | | operation, |
| | | columns |
| | | columns, |
| | | keyCol |
| | | }) |
| | | } |
| | | |
| | |
| | | return |
| | | } |
| | | MKEmitter.removeListener('editLineId', this.getEditLineId) |
| | | } |
| | | |
| | | showSql = (record, render) => { |
| | | let list = render(record) |
| | | |
| | | if (list) { |
| | | Modal.info({ |
| | | title: '', |
| | | width: 700, |
| | | className: 'sql-example', |
| | | icon: null, |
| | | content: list.map((n, index) => <div key={index} dangerouslySetInnerHTML={{ __html: n }}></div>) |
| | | }) |
| | | } |
| | | } |
| | | |
| | | getEditLineId = (id) => { |
| | |
| | | }) |
| | | } |
| | | |
| | | edit(uuid) { |
| | | this.setState({ editingKey: uuid }) |
| | | edit(record) { |
| | | const { keyCol } = this.state |
| | | |
| | | this.setState({ editingKey: record.uuid, keyVal: keyCol ? record[keyCol] : '' }) |
| | | } |
| | | |
| | | typeChange = (val) => { |
| | | this.setState({ keyVal: val }) |
| | | } |
| | | |
| | | moveRow = (dragIndex, hoverIndex) => { |
| | |
| | | |
| | | render() { |
| | | const { actions, indexShow, searchKey } = this.props |
| | | const { editLineId } = this.state |
| | | const { editLineId, keyVal } = this.state |
| | | |
| | | let components = { |
| | | body: { |
| | |
| | | if (col.copy) { |
| | | col.render = (text) => (<Paragraph copyable>{text}</Paragraph>) |
| | | } |
| | | |
| | | if (!col.editable) return col |
| | | |
| | | return { |
| | | ...col, |
| | | onCell: record => ({ |
| | |
| | | unlimit: col.unlimit, |
| | | required: col.required !== false ? true : false, |
| | | allowClear: col.allowClear === true, |
| | | keyCol: col.keyCol === true, |
| | | title: col.title, |
| | | editing: this.isEditing(record), |
| | | pass: col.keyVals ? col.keyVals.includes(keyVal) : true, |
| | | onSave: this.onSave, |
| | | typeChange: this.typeChange, |
| | | }), |
| | | } |
| | | }) |
| | |
| | | return item |
| | | }) |
| | | |
| | | let reg = searchKey ? new RegExp(searchKey, 'i') : null |
| | | let reg = null |
| | | let regs = [] |
| | | |
| | | if (searchKey) { |
| | | reg = new RegExp(searchKey, 'i') |
| | | this.state.columns.forEach(col => { |
| | | if (col.searchable) { |
| | | regs.push(col.dataIndex) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | return ( |
| | | <EditableContext.Provider value={this.props.form}> |
| | |
| | | className += ' active' |
| | | } |
| | | if (searchKey) { |
| | | if (!reg.test(record.field) && !reg.test(record.label)) { |
| | | if (regs.findIndex(f => reg.test(record[f])) === -1) { |
| | | className += ' hidden' |
| | | } |
| | | } |