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'; 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.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, disabled, } = this.props; // console.log(JSON.stringify(columns?.map((g) => g.width) )); 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, { title: '操作', render: (val, record) => <a onClick={this.remove.bind(this, record.selectKey)}>移除</a>, }, ]; const columns3 = [ ...columns, { 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; }); } // console.log(this.props); // console.log(this.state); // console.log('-0000 TableSelect000'); 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 width={this.props.get === 'mobile' ? '100%' : '60%'} maskClosable={false} title={`请选择`} visible={visiable} onOk={this.closeModal} onCancel={this.closeModal}> {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} /> ) : ( <> {isMultiple && isShowQuanXuan !== false && ( <> {' '} <Button id={'quanXuanButton'} type={'primary'} style={{ margin: '0 10px 10px 0' }} onClick={this.selectAll}> 全选 </Button> <Button id={'quXiaoQuanXuanButton'} type={'primary'} style={{ marginBottom: '10px' }} onClick={this.cancelAll}> 取消全选 </Button> </> )} <Table rowKey={valueName} size="small" dataSource={dataSource.list} columns={columns3} scroll={{ x: this.props.get === 'mobile' ? 'max-content' : allWidth }} /> </> )} </Modal> )} </div> ); } }