UNPKG

es-grid-template

Version:

es-grid-template

398 lines (383 loc) 13.2 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import { Modal } from 'antd'; import { faker } from '@faker-js/faker'; 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 React, { Fragment } from 'react'; import TableContainer from "../TableContainer"; import { OperatorFeature } from "../features/operator"; import { convertFilters, convertToObjTrue, filterByIds, filterDataByColumns, getAllRowKey, isObjEqual } from "../hook/utils"; import TableContainerEdit from "../TableContainerEdit"; import classNames from 'classnames'; import { GridStyle } from "../style"; const Grid = props => { const { theme, t, id, prefix, dataSource, originData, columns, propsColumns, setColumns, pagination, expanded, setExpanded, columnHidden, columnPinning, selectionSettings, rowSelected, sortMultiple, triggerSorter, triggerFilter, setMergedFilterKeys, onSorter, onFilter, allowFiltering, allowSortering, groupColumns, // height= 700, height, minHeight, editAble, triggerChangeColumns, infiniteScroll, mergedSelectedKeys, allowResizing, windowSize, fullScreenTitle, className: tableClassNames, setIsExpandClick, ...rest } = props; 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<RowSelectionState>({}) // const [rowSelection, setRowSelection] = React.useState<RowSelectionState>(convertToObjTrue(selectionSettings?.selectedRowKeys ?? [])) const [rowSelection, setRowSelection] = React.useState({}); // const [rowsSelected, setRowsSelected] = React.useState<RecordType[]>([]) const [grouping, setGrouping] = React.useState([]); const [columnSizing, setColumnSizing] = React.useState({}); const [columnSizingInfo, setColumnSizingInfo] = React.useState({}); // const [manualUpdate, setManualUpdate] = React.useState(false) // const [manualResize, setManualResize] = React.useState(false) 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: {}, rowsData: [] }); const [sorterChange, setSorterChange] = React.useState(false); const [filterChange, setFilterChange] = React.useState(false); const [isFullScreen, setIsFullScreen] = React.useState(false); const table = useReactTable({ _features: [OperatorFeature], data: dataSource, columns: columns, state: { rowSelection, expanded, columnPinning, columnVisibility: columnHidden, pagination: pagination && !infiniteScroll ? 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, enableRowSelection: row => { if (selectionSettings?.getCheckboxProps) { return !selectionSettings?.getCheckboxProps(row.original)?.disabled; } return true; }, initialState: { rowSelection: {} }, onRowSelectionChange: setRowSelection, // RowSelection // ColumnSizing enableColumnResizing: allowResizing !== false, columnResizeMode, columnResizeDirection, onColumnSizingChange: setColumnSizing, onColumnSizingInfoChange: setColumnSizingInfo, // ColumnSizing // ColumnSorting // getSortedRowModel: getSortedRowModel(), onSortingChange: setSorting, enableMultiSort: sortMultiple !== false, isMultiSortEvent: () => sortMultiple === false ? false : true, enableSorting: allowSortering !== false, // ColumnSorting enableFilters: allowFiltering !== false, onColumnFiltersChange: setColumnFilters, onColumnOperatorChange: setOperator, // getFilteredRowModel: getFilteredRowModel(), onColumnOrderChange: setColumnOrder, onGroupingChange: setGrouping, getGroupedRowModel: getGroupedRowModel(), // onExpandedChange: setExpanded, getRowCanExpand: row => { return Array.isArray(row.original.children); }, getExpandedRowModel: getExpandedRowModel(), getPaginationRowModel: pagination && !infiniteScroll ? getPaginationRowModel() : undefined, onPaginationChange: setPagination // onColumnVisibilityChange: setColumnVisibility, // onColumnPinningChange, // debugTable: true }); React.useEffect(() => { if (columnHidden) { const abb = table.getVisibleLeafColumns()?.[0]; if (abb && Object.keys(columnSizingInfo).length === 0) { setColumnSizing({ [abb.id]: abb.getSize() }); } } }, [columnHidden, columnSizingInfo]); React.useEffect(() => { const isEqual = isObjEqual(convertToObjTrue(mergedSelectedKeys), rowSelection); if (!isEqual) { setRowSelection(convertToObjTrue(mergedSelectedKeys)); } }, [mergedSelectedKeys]); React.useEffect(() => { if (isSelectionChange.isChange) { const aa = table.getState().rowSelection; const ids = Object.keys(aa); // const ssss = dataTable.filter(it => ids.includes(it.id)) // lấy rowsData của trang hiện tại const ssss = filterByIds(ids, isSelectionChange.rowsData ?? []); // lấy rowsData của trang hiện tại const rs = ssss.map(it => it.original); rowSelected?.({ type: isSelectionChange.type, rowData: isSelectionChange.rowData, selected: rs }); } }, [isSelectionChange, rowSelection, table.getState().rowSelection]); 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); } } }, [sorterChange, sorting, table]); 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]); // 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 ContainerComponent = editAble ? TableContainerEdit : TableContainer; return /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(GridStyle, { $prefix: prefix, $theme: { theme: theme?.theme, ...theme }, className: classNames(`${prefix}-grid ${tableClassNames}`, { [`${prefix}-grid-light`]: !theme || theme.theme === 'light', [`${prefix}-grid-dark`]: theme?.theme === 'dark', [`${prefix}-grid-editable`]: editAble }), style: { minHeight: minHeight ?? undefined, maxHeight: height ?? undefined, backgroundColor: theme?.backgroundColor ?? undefined } }, /*#__PURE__*/React.createElement(DndContext, { collisionDetection: closestCenter, modifiers: [restrictToHorizontalAxis], onDragEnd: handleDragEnd, sensors: sensors }, /*#__PURE__*/React.createElement(ContainerComponent, _extends({}, rest, { id: id, t: t, windowSize: windowSize, table: table, editAble: editAble, dataSource: dataSource, originData: originData, prefix: prefix, selectionSettings: selectionSettings, isSelectionChange: isSelectionChange, setIsSelectionChange: setIsSelectionChange, setSorterChange: setSorterChange, setFilterChange: setFilterChange, height: height ?? minHeight ?? 700, minHeight: minHeight, pagination: pagination, columns: columns, propsColumns: propsColumns, triggerChangeColumns: triggerChangeColumns, columnHidden: columnHidden, setExpanded: setExpanded, expanded: expanded, infiniteScroll: infiniteScroll, setMergedFilterKeys: setMergedFilterKeys, setColumnSizing: setColumnSizing, setColumns: setColumns, columnSizing: columnSizing, columnSizingInfo: columnSizingInfo, isFullScreen: isFullScreen, setIsFullScreen: setIsFullScreen, setIsExpandClick: setIsExpandClick })))), /*#__PURE__*/React.createElement(Modal, { open: isFullScreen, footer: null, centered: true, closable: true, width: '100%', style: { maxWidth: '100%', height: '100%' }, onCancel: () => setIsFullScreen(false) // destroyOnClose , styles: { content: { height: '100vh', borderRadius: 0, padding: '15px 10px' }, wrapper: { zIndex: 1050 } }, title: /*#__PURE__*/React.createElement("div", { style: { minHeight: 24 } }, " ", typeof fullScreenTitle === 'function' ? fullScreenTitle?.() : fullScreenTitle, " "), destroyOnClose: true }, /*#__PURE__*/React.createElement("div", { style: {} }, /*#__PURE__*/React.createElement(GridStyle, { $prefix: prefix, $theme: { theme: theme?.theme, ...theme }, className: classNames(`${prefix}-grid ${tableClassNames}`, { [`${prefix}-grid-light`]: !theme || theme.theme === 'light', [`${prefix}-grid-dark`]: theme?.theme === 'dark' }), style: { // minHeight: minHeight ?? undefined, maxHeight: windowSize.innerHeight - 70 } }, /*#__PURE__*/React.createElement(DndContext, { collisionDetection: closestCenter, modifiers: [restrictToHorizontalAxis], onDragEnd: handleDragEnd, sensors: sensors }, /*#__PURE__*/React.createElement(ContainerComponent, _extends({}, rest, { id: faker.string.alpha(20), t: t, table: table, editAble: editAble, dataSource: dataSource, originData: originData, prefix: prefix, selectionSettings: selectionSettings, isSelectionChange: isSelectionChange, setIsSelectionChange: setIsSelectionChange, setSorterChange: setSorterChange, setFilterChange: setFilterChange, height: windowSize.innerHeight - 70, minHeight: minHeight, pagination: pagination, columns: columns, windowSize: windowSize, propsColumns: propsColumns, triggerChangeColumns: triggerChangeColumns, columnHidden: columnHidden, setExpanded: setExpanded, expanded: expanded, infiniteScroll: infiniteScroll, setMergedFilterKeys: setMergedFilterKeys, setColumnSizing: setColumnSizing, setColumns: setColumns, columnSizing: columnSizing, columnSizingInfo: columnSizingInfo, isFullScreen: isFullScreen, setIsFullScreen: setIsFullScreen, setIsExpandClick: setIsExpandClick }))))))); }; export default Grid;