import React from 'react'; import { Button, message, Table, Tag } from 'antd'; import FormList from './formList/index'; import { connect } from 'dva'; import { getModal } from '@/webPublic/one_stop_public/utils/utils'; import TableSelectNormal from '@/webPublic/one_stop_public/libs/Split/TableSelectNormal'; import styles from './Split/styles.less'; const Modal = getModal(); @connect(({ DataColumn, SqlManageEntity, loading }) => ({ DataColumn, SqlManageEntity, loading: loading.models.DataColumn || loading.models.SqlManageEntity, })) export default class TableSelect extends React.Component { constructor(props) { super(props); const value = props.value || {}; this.otherProps = {}; if (props.json.otherProps && props.json.otherProps.length) { try { this.otherProps = new Function(props.json.otherProps)(); } catch (e) { console.log('TableSelect组件 otherProps 获取失败'); } } this.state = { selects: value.selects || {}, visiable: value.visiable, isAll: value.isAll != null ? value.isAll : false, querys: value.querys || [], sql: value.sql, }; } triggerChange = (changedValue) => { // Should provide an event to pass value to Form. const onChange = this.props.onChange; if (onChange) { // console.log('changedValue', changedValue); onChange(Object.assign({}, this.state, changedValue)); } }; componentWillReceiveProps(nextProps) { // Should be a controlled component. if ('value' in nextProps) { const value = nextProps.value; if (value != null && value instanceof Object) { this.setState(value); } // } } remove = (rowKey) => { const { selects } = this.state; delete selects[rowKey]; if (!('value' in this.props)) { this.setState({ selects }); } this.triggerChange({ selects }); }; select = (obj) => { var { selects } = this.state; const { json: { isMultiple, optionType }, } = this.props; let valueName = this.props.json.valueName; if (optionType == 'reference' && this.props.dataColumn.referenceObjId) { valueName = this.props.dataColumn.referenceCodeName; } const kk = obj[valueName]; if (kk == null) { message.error('指定的取值字段不存在或者值为空'); return; } if (!isMultiple) { selects = { [kk]: { ...obj, selectKey: kk } }; } else { selects[kk] = obj; selects[kk].selectKey = kk; } if (!('value' in this.props)) { this.setState({ selects }); } this.triggerChange({ selects }); }; selectAll = () => { let { selects } = this.state; const { dataSource, json } = this.props; let { valueName, optionType } = json; const { list } = dataSource; if (optionType == 'reference' && this.props.dataColumn.referenceObjId) { valueName = this.props.dataColumn.referenceCodeName; } if (list && Array.isArray(list)) { for (let item of list) { let kk = item[valueName]; selects[kk] = item; selects[kk].selectKey = kk; } } if (!('value' in this.props)) { this.setState({ selects }); } this.triggerChange({ selects }); }; cancelAll = () => { let selects = {}; if (!('value' in this.props)) { this.setState({ selects }); } this.triggerChange({ selects }); }; close = (i) => { var { values, labels } = this.state; values.splice(i, 1); labels.splice(i, 1); if (!('value' in this.props)) { this.setState({ values, labels }); } this.triggerChange({ values, labels }); }; open = () => { if (!('value' in this.props)) { this.setState({ visiable: true }); } this.triggerChange({ visiable: true }); }; closeModal = () => { if (!('value' in this.props)) { this.setState({ visiable: false }); } const { resetSearchText } = this.props; resetSearchText && resetSearchText(); this.triggerChange({ visiable: false }); }; cancelOne = (record) => { var { selects } = this.state; const { json: { isMultiple, optionType }, } = this.props; let valueName = this.props.json.valueName; if (optionType == 'reference' && this.props.dataColumn.referenceObjId) { valueName = this.props.dataColumn.referenceCodeName; } const kk = record[valueName]; if (kk == null) { message.error('指定的取值字段不存在或者值为空'); return; } if (selects[kk]) { delete selects[kk]; } if (!('value' in this.props)) { this.setState({ selects }); } this.triggerChange({ selects }); }; render() { const { json: { isMultiple, sql, optionType, showTable, isShowQuanXuan }, dataColumn: { referenceObjId }, sqlModel, columns, dataSource, } = this.props; let disabled = this.props.disabled || this.props.json.disabled; // 禅道 28713 const { cardSelectModalProps = {} } = this.otherProps; let { valueName, labelName } = this.props.json; if (optionType == 'reference' && referenceObjId) { valueName = this.props.dataColumn.referenceCodeName; labelName = this.props.dataColumn.referenceNameName; } if (valueName == null || valueName == '') { return <>请指定取值的列名</>; } const { selects, visiable, labels } = this.state; const keys = []; for (let i in selects) { keys.push(selects[i][valueName]); } const columns2 = [ ...columns, ]; if (!disabled) { columns2.push({ title: '操作', render: (val, record) => <a onClick={this.remove.bind(this, record.selectKey)}>移除</a>, },); } const columns3 = [ ...columns, ]; if (!disabled) { columns3.push( { title: '操作', render: (val, record) => keys.includes(record[valueName]) ? ( <a onClick={() => { this.cancelOne(record); }}> 已选择 </a> ) : ( <a onClick={this.select.bind(this, record)}>选择</a> ), },); } const custom = { isAll: this.state.isAll, querys: this.state.querys, sql: this.state.sql, }; let allWidth = 0; if (columns3) { columns3.map((item, index) => { if (index === columns3.length - 1) { item.fixed = 'right'; item.width = 90; allWidth += 90; return item; } if (index === columns3.length - 2) { allWidth += 150; } else { if (item.width) { allWidth += item.width; } else { item.width = 180; allWidth += 180; } } return item; }); } return ( <div> {Object.keys(selects).length > 0 ? ( // 是否显示表格 showTable ? ( <Table rowKey={valueName} size="small" dataSource={Object.values(selects)} columns={columns2} pagination={false} /> ) : ( Object.keys(selects) .map((k) => ( <Tag key={k} closable={!disabled} onClose={this.remove.bind(this, k)}> {selects[k][labelName]} </Tag> )) ) ) : ( '' )} {!disabled && ( <Button type="primary" onClick={this.open}> 选择 </Button> )} {visiable && ( <Modal className={styles.ModalDiy} width={this.props.get === 'mobile' ? '100%' : '60%'} maskClosable={false} title={`请选择`} visible={true} bodyStyle={{ maxHeight: '60vh', overflowY: 'auto', }} // footer={[ // <Button key="back" // onClick={this.closeModal} // type={'primary'} // > // 确定 // </Button>, // ]} onOk={this.closeModal} onCancel={this.closeModal} {...cardSelectModalProps} > {optionType === 'reference' ? ( referenceObjId ? ( <FormList rights={this.props.rights || []} notShowBack={true} value={custom} objId={referenceObjId} isFormCom={true} isSelect={true} selects={keys} valueName={valueName} callback={this.select} sql={sql} /> ) : ( '未关联数据对象' ) ) : sqlModel.dataObjId ? ( <FormList rights={this.props.rights || []} notShowBack={true} value={custom} objId={sqlModel.dataObjId} isFormCom={true} isSelect={true} selects={keys} valueName={valueName} callback={this.select} sql={sql} /> ) : ( <TableSelectNormal isMultiple={isMultiple} allWidth={allWidth} cancelAll={this.cancelAll} selectAll={this.selectAll} isShowQuanXuan={isShowQuanXuan} valueName={valueName} dataSource={dataSource} columns3={columns3} otherProps={this.otherProps} get={this.props.get} selects={this.state.selects} callback={this.select} /> )} </Modal> )} </div> ); } }