import React from "react"; import {Button, Form, Select, Space, Card, Modal, Table} from "antd"; // import IceDataGroupModal from "./IceDataGroupModal"; import IceFormModal from "./IceFormModal"; import ReactDOM from "react-dom"; const { Option } = Select; class IceDataGroup extends React.Component { state = {}; constructor(props) { super(props); this.onChange = props.onChange; this.formReference = React.createRef(); } render() { const { field, adapter } = this.props; let { value } = this.props; value = this.parseValue(value); value = value.map(item => ({ ...item, key:item.id } )); const columns = JSON.parse(JSON.stringify(field[1].columns)); if (!this.props.readOnly) { columns.push({ title: 'Action', key: 'action', render: (text, record) => ( this.getDefaultButtons(record.id) ), }); } return ( <> {!this.props.readOnly && } ); } createForm(field, adapter, object) { this.formContainer = React.createRef(); const formFields = field[1].form; formFields.unshift(['id', { label: 'ID', type: 'hidden' }]); ReactDOM.render( , document.getElementById('dataGroup'), ); this.formContainer.current.show(object); } unmountForm() { ReactDOM.unmountComponentAtNode(document.getElementById('dataGroup')); } show(data) { if (!data) { this.setState({ visible: true }); this.updateFields(data); } else { this.setState({ visible: true }); if (this.formReference.current) { this.updateFields(data); } else { this.waitForIt( () => this.formReference.current != null, () => { this.updateFields(data); }, 100, ); } } } parseValue(value) { try { value = JSON.parse(value); } catch (e) { value = []; } if (value == null) { value = []; } return value; } save(params, errorCallback, closeCallback) { const {field, value } = this.props; if (field[1]['custom-validate-function'] != null) { let tempParams = field[1]['custom-validate-function'].apply(this, [params]); if (tempParams.valid) { params = tempParams.params; } else { errorCallback(tempParams.message); return false; } } const data = this.parseValue(value); let newData = []; if (!params.id) { params.id = `${field[0]}_${this.dataGroupGetNextAutoIncrementId(data)}`; data.push(params); newData = data; } else { for (let i = 0; i < data.length; i++) { const item = data[i]; if (item.id !== params.id) { newData.push(item); } else { newData.push(params); } } } if (field[1]['sort-function'] != null) { newData.sort(field[1]['sort-function']); } const val = JSON.stringify(newData); this.onChange(val); this.unmountForm(); } createCard(item) { const { field } = this.props; if (field[1]['pre-format-function'] != null) { item = field[1]['pre-format-function'].apply(this, [item]); } const template = field[1].html; let t = template.replace('#_delete_#', ''); t = t.replace('#_edit_#', ''); t = t.replace(/#_id_#/g, item.id); for (const key in item) { let itemVal = item[key]; if (itemVal !== undefined && itemVal != null && typeof itemVal === 'string') { itemVal = itemVal.replace(/(?:\r\n|\r|\n)/g, '
'); } t = t.replace(`#_${key}_#`, itemVal); } if (field[1].render !== undefined && field[1].render != null) { t = t.replace('#_renderFunction_#', field[1].render(item)); } return (
); } getDefaultButtons(id) { return ( {this.editDataGroupItem(id)}}>
  • {this.deleteDataGroupItem(id)}}>
  • ); } deleteDataGroupItem(id) { const {value} = this.props; const data = this.parseValue(value); const newVal = []; for (let i = 0; i < data.length; i++) { const item = data[i]; if (item.id !== id) { newVal.push(item); } } const val = JSON.stringify(newVal); this.onChange(val); } editDataGroupItem(id) { const { field, adapter, value } = this.props; const data = this.parseValue(value); let editVal = {}; for (let i = 0; i < data.length; i++) { const item = data[i]; if (item.id === id) { editVal = item; } } this.createForm(field, adapter, editVal); } resetDataGroup() { this.onChange('[]'); } dataGroupGetNextAutoIncrementId(data) { let autoId = 1; let id; for (let i = 0; i < data.length; i++) { const item = data[i]; if (item.id === undefined || item.id == null) { item.id = 1; } id = item.id.substring(item.id.lastIndexOf('_') + 1, item.id.length); if (id >= autoId) { autoId = parseInt(id, 10) + 1; } } return autoId; } } export default IceDataGroup;