| | |
| | | import React, {Component} from 'react' |
| | | import PropTypes from 'prop-types' |
| | | import { fromJS } from 'immutable' |
| | | import { Modal, Col } from 'antd' |
| | | import { Modal, Col, notification } from 'antd' |
| | | import { AntDesignOutlined } from '@ant-design/icons' |
| | | |
| | | import Utils from '@/utils/utils.js' |
| | |
| | | dataIndex: 'field', |
| | | width: '16%', |
| | | editable: true, |
| | | unique: true, |
| | | uniqueFunc: (data, item) => { |
| | | let index = data.findIndex(mark => mark.uuid !== item.uuid && mark.contrastValue === item.contrastValue && mark.match === item.match && mark.field.join('') === item.field.join('')) |
| | | |
| | | if (index > -1) { |
| | | notification.warning({ |
| | | top: 92, |
| | | message: '此标记已存在!', |
| | | duration: 5 |
| | | }) |
| | | return false |
| | | } |
| | | return true |
| | | }, |
| | | inputType: 'cascader', |
| | | options: [], |
| | | rules: [{ |
| | |
| | | options: [], |
| | | render: text => { |
| | | let sign = { |
| | | 'font': '文字', |
| | | 'font': '字体颜色', |
| | | 'background': '背景', |
| | | 'underline': '下划线', |
| | | 'line-through': '中划线', |
| | | 'icon': '图标', |
| | | 'iconfront': '图标', |
| | | 'iconback': '图标', |
| | | 'iconback': '图标' |
| | | } |
| | | |
| | | if (text[0] === 'indent') { |
| | | return ( |
| | | <div>缩进/{text[1]}个字符</div> |
| | | ) |
| | | } else if (text[0] === 'pointfront') { |
| | | return ( |
| | | <div><span style={{display: 'inline-block', width: '8px', height: '8px', borderRadius: '14px', background: 'black', verticalAlign: 'middle'}}></span> 点(前)</div> |
| | | ) |
| | | } else if (text[0] === 'pointback') { |
| | | return ( |
| | | <div>点(后) <span style={{display: 'inline-block', width: '8px', height: '8px', borderRadius: '14px', background: 'black', verticalAlign: 'middle'}}></span></div> |
| | | ) |
| | | } |
| | | |
| | | return ( |
| | |
| | | markChange = (values) => { |
| | | let _marks = fromJS(this.state.marks).toJS() |
| | | |
| | | if (values.uuid) { |
| | | _marks = _marks.map(item => { |
| | | if (item.uuid === values.uuid) { |
| | | return values |
| | | } else { |
| | | return item |
| | | } |
| | | let has = false |
| | | _marks.forEach(mark => { |
| | | if (mark.contrastValue === values.contrastValue && mark.match === values.match && mark.field.join('') === values.field.join('')) { |
| | | has = true |
| | | } |
| | | }) |
| | | |
| | | if (has) { |
| | | notification.warning({ |
| | | top: 92, |
| | | message: '此标记已存在!', |
| | | duration: 5 |
| | | }) |
| | | } else { |
| | | values.uuid = Utils.getuuid() |
| | | _marks.push(values) |
| | | return |
| | | } |
| | | |
| | | values.uuid = Utils.getuuid() |
| | | _marks.push(values) |
| | | |
| | | this.setState({ |
| | | marks: _marks |
| | |
| | | }) |
| | | } |
| | | ] |
| | | |
| | | let signs = [ |
| | | { |
| | | value: 'font', |
| | | label: '文字' |
| | | label: '字体颜色' |
| | | }, |
| | | { |
| | | value: 'background', |
| | |
| | | label: '中划线' |
| | | }, |
| | | { |
| | | value: 'pointfront', |
| | | label: '点(前)' |
| | | }, |
| | | { |
| | | value: 'pointback', |
| | | label: '点(后)' |
| | | }, |
| | | { |
| | | value: 'iconfront', |
| | | label: '图标(前)', |
| | | children: icons |
| | |
| | | value: 'iconback', |
| | | label: '图标(后)', |
| | | children: icons |
| | | }, |
| | | { |
| | | value: 'indent', |
| | | label: '缩进', |
| | | children: [{ |
| | | value: 2, |
| | | label: '2个字符' |
| | | }, { |
| | | value: 4, |
| | | label: '4个字符' |
| | | }, { |
| | | value: 6, |
| | | label: '6个字符' |
| | | }, { |
| | | value: 8, |
| | | label: '8个字符' |
| | | }] |
| | | } |
| | | ] |
| | | |
| | | if (type === 'line' || type === 'sequence') { |
| | | signs.pop() |
| | | signs.pop() |
| | | signs.pop() |
| | | signs.pop() |
| | | signs.pop() |
| | | } else if (type === 'icon') { |
| | | signs = [{ |
| | | value: 'font', |
| | | label: '字体颜色' |
| | | }] |
| | | } else if (type === 'slider') { |
| | | markColumns = markColumns.filter(col => { |
| | | col.width = '20%' |
| | |
| | | item.fontColor = '' |
| | | } |
| | | } |
| | | |
| | | if (item.contrastValue) { |
| | | item.contrastValue = item.contrastValue.replace(/\t+|\v+|\s+/g, '') |
| | | } |
| | | |
| | | if (val && item.contrastValue === val) { |
| | | save = true |
| | | } |
| | |
| | | }) |
| | | this.props.onSubmit(marks) |
| | | } else { |
| | | const _this = this |
| | | const that = this |
| | | confirm({ |
| | | title: '存在未保存标记,确定忽略吗?', |
| | | onOk() { |
| | | _this.setState({ visible: false }) |
| | | _this.props.onSubmit(marks) |
| | | that.setState({ visible: false }) |
| | | that.props.onSubmit(marks) |
| | | }, |
| | | onCancel() {} |
| | | }) |
| | |
| | | render() { |
| | | const { marks, markColumns, visible, options, signs } = this.state |
| | | |
| | | let className = '' |
| | | if (this.props.type === 'line' && this.props.marks.length) { |
| | | className = 'mk-line-marks' |
| | | } |
| | | |
| | | return ( |
| | | <div style={{display: 'inline-block'}}> |
| | | <div style={{display: 'inline-block'}} className={className}> |
| | | <AntDesignOutlined className="profile" title="标记" onClick={this.resetMark} /> |
| | | <Modal |
| | | wrapClassName="model-table-column-mark-modal" |
| | | wrapClassName="mark-modal-wrap" |
| | | title="标记设置" |
| | | visible={visible} |
| | | width={'75vw'} |
| | |
| | | > |
| | | <MarkForm field={this.props.field} signs={signs} columns={options} markChange={this.markChange}/> |
| | | <Col style={{fontSize: '12px', color: '#757575', paddingLeft: '10px'}} span={24}>注:从上到下,匹配第一个符合条件的标记。</Col> |
| | | <EditTable actions={['edit', 'move', 'del']} data={marks} columns={markColumns} onChange={(marks) => this.setState({marks})}/> |
| | | <EditTable actions={['edit', 'move', 'del', 'copy']} type="marks" data={marks} columns={markColumns} onChange={(marks) => this.setState({marks})}/> |
| | | </Modal> |
| | | </div> |
| | | ) |