UNPKG

es-grid-template

Version:

es-grid-template

282 lines (268 loc) 9.35 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import { getCoreRowModel, getExpandedRowModel, // getFilteredRowModel, getGroupedRowModel, getPaginationRowModel, // getSortedRowModel, useReactTable } from '@tanstack/react-table'; // import { makeData } from "../default/makeData"; import { DndContext, KeyboardSensor, MouseSensor, TouchSensor, closestCenter, useSensor, useSensors } from '@dnd-kit/core'; import { restrictToHorizontalAxis } from '@dnd-kit/modifiers'; import { arrayMove } from '@dnd-kit/sortable'; // import { flattenArray, getFixedFields, getInvisibleColumns, unFlattenData, updateOrInsert } from './hook/utils' // import { faker } from '@faker-js/faker' import React from 'react'; import { OperatorFeature } from "../features/operator"; import { convertFilters, filterDataByColumns, flattenArray, getAllRowKey, unFlattenData, updateOrInsert } from "../hook/utils"; import TableContainerEdit from "../TableContainerEdit"; const GridEdit = props => { const { t, id, prefix, dataSource, originData, columns, propsColumns, pagination, expanded, columnVisibility, columnPinning, selectionSettings, rowSelected, sortMultiple, triggerSorter, triggerFilter, setMergedFilterKeys, onSorter, onFilter, // showToolbar, // isFullScreen, // fullScreen, // toolbarItems, actionTemplate, // showColumnChoose, groupColumns, height, onDataChange, onCellPaste, ...rest } = props; const ref = React.useRef(null); // const bottomToolbarRef = React.useRef<HTMLDivElement>(null) // const topToolbarRef: any = React.useRef<HTMLDivElement>(null) const [columnResizeMode] = React.useState('onChange'); const [columnResizeDirection] = React.useState('ltr'); const [paginationState, setPagination] = React.useState({ pageIndex: pagination && pagination.currentPage ? pagination.currentPage - 1 : 0, pageSize: pagination && pagination.pageSize ? pagination.pageSize : 20 }); const [rowSelection, setRowSelection] = React.useState({}); const [grouping, setGrouping] = React.useState([]); const [columnSizing, setColumnSizing] = React.useState({}); const [columnFilters, setColumnFilters] = React.useState([]); const [operator, setOperator] = React.useState([]); const [sorting, setSorting] = React.useState([]); const [columnOrder, setColumnOrder] = React.useState(() => columns.map(c => c.id)); const [isSelectionChange, setIsSelectionChange] = React.useState({ isChange: false, type: '', rowData: {} }); const [sorterChange, setSorterChange] = React.useState(false); const [filterChange, setFilterChange] = React.useState(false); const table = useReactTable({ _features: [OperatorFeature], data: dataSource, columns: columns, state: { rowSelection, expanded, columnPinning, columnVisibility, pagination: pagination ? paginationState : undefined, grouping, columnSizing, columnOrder, columnFilters, operator, sorting }, getCoreRowModel: getCoreRowModel(), getRowId(originalRow) { return originalRow.rowId; }, getSubRows: row => row.children, // RowSelection enableSubRowSelection: selectionSettings && selectionSettings.mode === 'checkbox' && selectionSettings.type !== 'single', enableMultiRowSelection: selectionSettings && selectionSettings.mode === 'checkbox' && selectionSettings.type !== 'single', enableRowSelection: true, onRowSelectionChange: setRowSelection, // RowSelection // ColumnSizing columnResizeMode, columnResizeDirection, onColumnSizingChange: setColumnSizing, // ColumnSizing // ColumnSorting // getSortedRowModel: getSortedRowModel(), onSortingChange: setSorting, enableMultiSort: sortMultiple, isMultiSortEvent: () => sortMultiple ? true : false, // ColumnSorting onColumnFiltersChange: setColumnFilters, onColumnOperatorChange: setOperator, // getFilteredRowModel: getFilteredRowModel(), onColumnOrderChange: setColumnOrder, onGroupingChange: setGrouping, getGroupedRowModel: getGroupedRowModel(), // onExpandedChange: setExpanded, getExpandedRowModel: getExpandedRowModel(), getPaginationRowModel: pagination ? getPaginationRowModel() : undefined, onPaginationChange: setPagination, // onColumnVisibilityChange: setColumnVisibility, // onColumnPinningChange, debugTable: true }); React.useEffect(() => { if (isSelectionChange.isChange) { const aa = table.getState().rowSelection; const dataTable = table.getRowModel().flatRows; const ids = Object.keys(aa); const ssss = dataTable.filter(it => ids.includes(it.id)); const rs = ssss.map(it => it.original); rowSelected?.({ type: isSelectionChange.type, rowData: isSelectionChange.rowData, selected: rs }); } }, [isSelectionChange, rowSelected, rowSelection, table]); React.useEffect(() => { if (sorterChange) { const aa = table.getState().sorting; const rs = aa.map(it => { return { columnKey: it.id, field: it.id, order: it.desc ? 'descend' : 'ascend' }; }); if (onSorter) { onSorter?.(rs); } else { triggerSorter(rs); } } }, [onSorter, sorterChange, sorting, table, triggerSorter]); React.useEffect(() => { if (filterChange) { // const filterState = table.getState().columnFilters const operatorState = table.getState().operator; const merged = columnFilters.map(filter => { const match = operatorState.find(op => op.id === filter.id); const col = table.getVisibleFlatColumns().find(it => it.id === filter.id)?.columnDef.meta; return { field: filter.id, key: filter.id, column: col, filteredKeys: filter.value, operator: match ? match.operator : undefined // ...(match && { operator: match.operator }) }; }); if (onFilter) { onFilter?.(convertFilters(merged)); } else { triggerFilter(convertFilters(merged)); const b = filterDataByColumns(originData, convertFilters(merged), [], []); setMergedFilterKeys(getAllRowKey(b)); } } }, [filterChange, onFilter, originData, setMergedFilterKeys, table, triggerFilter, columnFilters]); // React.useEffect(() => { // const totalHeight = height // if (totalHeight && topToolbarRef.current && bottomToolbarRef.current) { // settableHeight(totalHeight - topToolbarRef.current.offsetHeight - bottomToolbarRef.current.offsetHeight) // } // }, [id, columns, height]) // reorder columns after drag & drop function handleDragEnd(event) { const { active, over } = event; if (active && over && active.id !== over.id) { setColumnOrder(cols => { const oldIndex = cols.indexOf(active.id); const newIndex = cols.indexOf(over.id); return arrayMove(cols, oldIndex, newIndex); //this is just a splice util }); } } const sensors = useSensors(useSensor(MouseSensor, {}), useSensor(TouchSensor, {}), useSensor(KeyboardSensor, {})); const triggerChangeData = newData => { onDataChange?.(newData); }; const triggerPaste = (pastedRows, pastedColumnsArray, newData, copyRows) => { const handlePasteCallback = callbackData => { const rsFilterData = updateOrInsert(flattenArray([...dataSource]), callbackData); const rs = unFlattenData(rsFilterData); triggerChangeData(rs); }; if (onCellPaste && onCellPaste.onPasted) { if (onCellPaste.onPasted.length > 1) { // có callback onCellPaste.onPasted({ pasteData: pastedRows, copyRows, type: 'onPaste', data: dataSource, pastedColumns: pastedColumnsArray }, handlePasteCallback); } else { // không có callback onCellPaste.onPasted({ pasteData: pastedRows, type: 'onPaste', copyRows, data: dataSource, pastedColumns: pastedColumnsArray }, handlePasteCallback); triggerChangeData(newData); } } else { triggerChangeData(newData); } }; return /*#__PURE__*/React.createElement("div", { className: `${prefix}-grid`, style: { height: height ?? undefined }, ref: ref }, /*#__PURE__*/React.createElement(DndContext, { collisionDetection: closestCenter, modifiers: [restrictToHorizontalAxis], onDragEnd: handleDragEnd, sensors: sensors }, /*#__PURE__*/React.createElement(TableContainerEdit, _extends({}, rest, { id: id, table: table, editAble: true, dataSource: dataSource, originData: originData, prefix: prefix, selectionSettings: selectionSettings, setIsSelectionChange: setIsSelectionChange, setSorterChange: setSorterChange, setFilterChange: setFilterChange, height: height, expanded: expanded, pagination: pagination, setExpanded: () => {}, setMergedFilterKeys: setMergedFilterKeys, triggerChangeData: triggerChangeData, triggerPaste: triggerPaste })))); }; export default GridEdit;