import React from 'react' import { Table, TableProps } from 'antd' import { TreeNode, createBehavior, createResource } from '@designable/core' import { useTreeNode, TreeNodeWidget, DroppableWidget, useNodeIdProps, DnFC } from '@designable/react' import { ArrayBase } from '@formily/antd' import { observer } from '@formily/react' import { LoadTemplate } from '../../common/LoadTemplate' import cls from 'classnames' import { queryNodesByComponentPath, hasNodeByComponentPath, findNodeByComponentPath, createEnsureTypeItemsNode } from '../../shared' import { useDropTemplate } from '../../hooks' import { createArrayBehavior } from '../ArrayBase' import './styles.less' import { createVoidFieldSchema } from '../Field' import { AllSchemas } from '../../schemas' import { AllLocales } from '../../locales' const ensureObjectItemsNode = createEnsureTypeItemsNode('object') const HeaderCell: React.FC = (props: any) => { return ( {props.children} ) } const BodyCell: React.FC = (props: any) => { return ( {props.children} ) } export const ArrayTable: DnFC> = observer(props => { const node = useTreeNode() const nodeId = useNodeIdProps() useDropTemplate('ArrayTable', source => { const sortHandleNode = new TreeNode({ componentName: 'Field', props: { type: 'void', 'x-component': 'ArrayTable.Column', 'x-component-props': { title: `Title` } }, children: [ { componentName: 'Field', props: { type: 'void', 'x-component': 'ArrayTable.SortHandle' } } ] }) const indexNode = new TreeNode({ componentName: 'Field', props: { type: 'void', 'x-component': 'ArrayTable.Column', 'x-component-props': { title: `Title` } }, children: [ { componentName: 'Field', props: { type: 'void', 'x-component': 'ArrayTable.Index' } } ] }) const columnNode = new TreeNode({ componentName: 'Field', props: { type: 'void', 'x-component': 'ArrayTable.Column', 'x-component-props': { title: `Title` } }, children: source.map(node => { node.props.title = undefined return node }) }) const operationNode = new TreeNode({ componentName: 'Field', props: { type: 'void', 'x-component': 'ArrayTable.Column', 'x-component-props': { title: `Title` } }, children: [ { componentName: 'Field', props: { type: 'void', 'x-component': 'ArrayTable.Remove' } }, { componentName: 'Field', props: { type: 'void', 'x-component': 'ArrayTable.MoveDown' } }, { componentName: 'Field', props: { type: 'void', 'x-component': 'ArrayTable.MoveUp' } } ] }) const objectNode = new TreeNode({ componentName: 'Field', props: { type: 'object' }, children: [sortHandleNode, indexNode, columnNode, operationNode] }) const additionNode = new TreeNode({ componentName: 'Field', props: { type: 'void', title: 'Addition', 'x-component': 'ArrayTable.Addition' } }) return [objectNode, additionNode] }) const columns = queryNodesByComponentPath(node, ['ArrayTable', '*', 'ArrayTable.Column']) const additions = queryNodesByComponentPath(node, ['ArrayTable', 'ArrayTable.Addition']) const defaultRowKey = () => { return node.id } const renderTable = () => { if (node.children.length === 0) return return ( {columns.map(node => { const children = node.children.map(child => { return }) const props = node.props['x-component-props'] return ( {props.title}} dataIndex={node.id} className={`data-id:${node.id}`} key={node.id} render={(value, record, key) => { return ( {children.length > 0 ? children : 'Droppable'} ) }} /> ) })} {columns.length === 0 && } />}
{additions.map(child => { return })}
) } useDropTemplate('ArrayTable.Column', source => { return source.map(node => { node.props.title = undefined return node }) }) return (
{renderTable()} { if ( hasNodeByComponentPath(node, [ 'ArrayTable', '*', 'ArrayTable.Column', 'ArrayTable.SortHandle' ]) ) return const tableColumn = new TreeNode({ componentName: 'Field', props: { type: 'void', 'x-component': 'ArrayTable.Column', 'x-component-props': { title: `Title` } }, children: [ { componentName: 'Field', props: { type: 'void', 'x-component': 'ArrayTable.SortHandle' } } ] }) ensureObjectItemsNode(node).prepend(tableColumn) } }, { title: node.getMessage('addIndex'), icon: 'AddIndex', onClick: () => { if ( hasNodeByComponentPath(node, [ 'ArrayTable', '*', 'ArrayTable.Column', 'ArrayTable.Index' ]) ) return const tableColumn = new TreeNode({ componentName: 'Field', props: { type: 'void', 'x-component': 'ArrayTable.Column', 'x-component-props': { title: `Title` } }, children: [ { componentName: 'Field', props: { type: 'void', 'x-component': 'ArrayTable.Index' } } ] }) const sortNode = findNodeByComponentPath(node, [ 'ArrayTable', '*', 'ArrayTable.Column', 'ArrayTable.SortHandle' ]) if (sortNode) { sortNode.parent.insertAfter(tableColumn) } else { ensureObjectItemsNode(node).prepend(tableColumn) } } }, { title: node.getMessage('addColumn'), icon: 'AddColumn', onClick: () => { const operationNode = findNodeByComponentPath(node, [ 'ArrayTable', '*', 'ArrayTable.Column', name => { return ( name === 'ArrayTable.Remove' || name === 'ArrayTable.MoveDown' || name === 'ArrayTable.MoveUp' ) } ]) const tableColumn = new TreeNode({ componentName: 'Field', props: { type: 'void', 'x-component': 'ArrayTable.Column', 'x-component-props': { title: `Title` } } }) if (operationNode) { operationNode.parent.insertBefore(tableColumn) } else { ensureObjectItemsNode(node).append(tableColumn) } } }, { title: node.getMessage('addOperation'), icon: 'AddOperation', onClick: () => { const oldOperationNode = findNodeByComponentPath(node, [ 'ArrayTable', '*', 'ArrayTable.Column', name => { return ( name === 'ArrayTable.Remove' || name === 'ArrayTable.MoveDown' || name === 'ArrayTable.MoveUp' ) } ]) const oldAdditionNode = findNodeByComponentPath(node, [ 'ArrayTable', 'ArrayTable.Addition' ]) if (!oldOperationNode) { const operationNode = new TreeNode({ componentName: 'Field', props: { type: 'void', 'x-component': 'ArrayTable.Column', 'x-component-props': { title: `Title` } }, children: [ { componentName: 'Field', props: { type: 'void', 'x-component': 'ArrayTable.Remove' } }, { componentName: 'Field', props: { type: 'void', 'x-component': 'ArrayTable.MoveDown' } }, { componentName: 'Field', props: { type: 'void', 'x-component': 'ArrayTable.MoveUp' } } ] }) ensureObjectItemsNode(node).append(operationNode) } if (!oldAdditionNode) { const additionNode = new TreeNode({ componentName: 'Field', props: { type: 'void', title: 'Addition', 'x-component': 'ArrayTable.Addition' } }) ensureObjectItemsNode(node).insertAfter(additionNode) } } } ]} />
) }) ArrayBase.mixin(ArrayTable) ArrayTable.Behavior = createBehavior(createArrayBehavior('ArrayTable'), { name: 'ArrayTable.Column', extends: ['Field'], selector: node => node.props['x-component'] === 'ArrayTable.Column', designerProps: { droppable: true, allowDrop: node => node.props['type'] === 'object' && node.parent?.props?.['x-component'] === 'ArrayTable', propsSchema: createVoidFieldSchema(AllSchemas.ArrayTable.Column) }, designerLocales: AllLocales.ArrayTableColumn }) ArrayTable.Resource = createResource({ icon: 'ArrayTableSource', elements: [ { componentName: 'Field', props: { type: 'array', 'x-decorator': 'FormItem', 'x-component': 'ArrayTable' } } ] })