import { ReactVisualEditorTableProp } from './../ReactVisualEditor.props'; import { Button, Input, Modal, Table, Tag } from 'antd'; import { PlusSquareOutlined } from '@ant-design/icons'; import ReactDOM from 'react-dom'; import { defer } from './../../utils/defer'; import React,{ useState } from 'react'; import deepcopy from 'deepcopy'; const nextKey = (() => { let start = Date.now(); return () => start++; })(); export const TablePropEditor: React.FC<{ value?: any[]; config: ReactVisualEditorTableProp; onChange?: (val?: any[]) => void; }> = (props) => { const methods = { openEdit: async () => { const newVal = await TablePropEditService({ config: props.config, value: props.value, }); !!props.onChange && props.onChange(newVal); }, }; let render: any; if (!props.value || props.value.length === 0) { render = ( ); } else { render = props.value.map((item, index) => { return ( {item.value} ); }); } return
{render}
; }; interface TablePropEditServiceOption { config: ReactVisualEditorTableProp; value?: any[]; onConfirm?: (val?: any[]) => void; } const TablePropEditModal: React.FC<{ option: TablePropEditServiceOption; onRef: (ins: { show: (opt: TablePropEditServiceOption) => void }) => void; }> = (props) => { const [option, setOption] = useState(props.option); const [showFlag, setShowFlag] = useState(false); const [editData, $setEditData] = useState([] as any[]); const setEditData = (val: any[]) => { $setEditData( val.map((d) => { !d.key && (d.key = nextKey()); return d; }), ); }; const methods = { show: (opt: TablePropEditServiceOption) => { setOption(opt); setEditData(deepcopy(opt.value || [])); setShowFlag(true); }, close: () => { setShowFlag(false); }, save: () => { !!option.onConfirm && option.onConfirm(editData); methods.close(); }, add: () => { setEditData([ ...editData,{}]); }, reset: () => { setEditData(option.value || []); }, }; props.onRef(methods); return ( } onCancel={methods.close} width="800px" >
{ return index + 1; }} /> {(option.config.columns || []).map((col, index) => ( { return ( { row = { ...row, [col.field]: e.target.value }; editData[index] = row; setEditData([...editData]); }} /> ); }} /> ))} { return ( ); }} />
); }; export const TablePropEditService = (() => { let ins: any; return (option: Omit): Promise => { const dfd = defer(); option = { ...option, onConfirm: dfd.resolve, } as TablePropEditServiceOption; if (!ins) { const el = document.createElement('div'); document.body.appendChild(el); ReactDOM.render( (ins = i)} />, el); } ins.show(option); return dfd.promise; }; })();