import { MenuOutlined } from '@ant-design/icons'; import { css } from '@emotion/css'; import { ArrayField } from '@formily/core'; import { observer, RecursionField, Schema, useField, useFieldSchema } from '@formily/react'; import { Table as AntdTable, TableColumnProps } from 'antd'; import { default as classNames, default as cls } from 'classnames'; import React from 'react'; import ReactDragListView from 'react-drag-listview'; import { useTranslation } from 'react-i18next'; import { DndContext } from '../..'; import { RecordIndexProvider, RecordProvider, useSchemaInitializer } from '../../../'; const isColumnComponent = (schema: Schema) => { return schema['x-component']?.endsWith('.Column') > -1; }; const useTableColumns = () => { const start = Date.now(); const field = useField(); const schema = useFieldSchema(); const { exists, render } = useSchemaInitializer(schema['x-initializer']); const columns = schema .reduceProperties((buf, s) => { if (isColumnComponent(s)) { return buf.concat([s]); } }, []) .map((s: Schema) => { return { title: , dataIndex: s.name, key: s.name, // width: 300, render: (v, record) => { const index = field.value?.indexOf(record); console.log((Date.now() - start) / 1000); return ( ); }, } as TableColumnProps; }); if (!exists) { return columns; } return columns.concat({ title: render(), dataIndex: 'TABLE_COLUMN_INITIALIZER', key: 'TABLE_COLUMN_INITIALIZER', }); }; export const components = { header: { wrapper: (props) => { return ( ); }, cell: (props) => { return ( ); }, }, body: { wrapper: (props) => { return ( ); }, row: (props) => { return ; }, cell: (props) => ( ), }, }; const SortHandle = () => { return ; }; const TableIndex = (props) => { const { index } = props; return (
{index + 1}
); }; const usePaginationProps = (pagination1, pagination2) => { const { t } = useTranslation(); if (pagination2 === false) { return false; } if (!pagination2 && pagination1 === false) { return false; } return { showTotal: (total) => t('Total {{count}} items', { count: total }), showSizeChanger: true, ...pagination1, ...pagination2, }; }; export const Table: any = observer((props: any) => { const field = useField(); const columns = useTableColumns(); const { pagination: pagination1, useProps, onChange, ...others1 } = props; const { pagination: pagination2, ...others2 } = useProps?.() || {}; const { dragSort = false, showIndex = true, onRowDragEnd, onRowSelectionChange, onChange: onTableChange, rowSelection, ...others } = { ...others1, ...others2 } as any; const paginationProps = usePaginationProps(pagination1, pagination2); const restProps = { rowSelection: rowSelection ? { type: 'checkbox', selectedRowKeys: field?.data?.selectedRowKeys || [], onChange(selectedRowKeys: any[], selectedRows: any[]) { field.data = field.data || {}; field.data.selectedRowKeys = selectedRowKeys; onRowSelectionChange?.(selectedRowKeys, selectedRows); }, renderCell: (checked, record, index, originNode) => { if (!dragSort && !showIndex) { return originNode; } const current = props?.pagination?.current; const pageSize = props?.pagination?.pageSize || 20; if (current) { index = index + (current - 1) * pageSize; } return (
{dragSort && } {showIndex && }
{originNode}
); }, ...rowSelection, } : undefined, }; const defaultRowKey = (record: any) => { return field.value?.indexOf?.(record); }; return (
{ const from = field.value[fromIndex]; const to = field.value[toIndex]; field.move(fromIndex, toIndex); onRowDragEnd({ fromIndex, toIndex, from, to }); }} lineClassName={css` border-bottom: 2px solid rgba(241, 139, 98, 0.6) !important; `} > { onTableChange?.(pagination, filters, sorter, extra); }} // tableLayout={'auto'} // scroll={{ x: 12 * 300 + 80 }} columns={columns} dataSource={field?.value?.slice?.()} />
); });