UNPKG

es-grid-template

Version:

es-grid-template

310 lines (301 loc) 10.8 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 Pagination from 'rc-master-ui/es/pagination'; import { Maximize, Minimize } from 'becoxy-icons'; import classNames from 'classnames'; import { Toolbar } from 'rc-master-ui'; import React from 'react'; import { ColumnsChoose } from "../ColumnsChoose"; import TableContainer from "../TableContainer"; import { OperatorFeature } from "../features/operator"; import { convertFilters, filterDataByColumns, getAllRowKey } from "../hook/utils"; const Grid = 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, ...rest } = props; const bottomToolbarRef = React.useRef(null); const topToolbarRef = React.useRef(null); const [tableHeight, settableHeight] = React.useState(0); 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, {})); return /*#__PURE__*/React.createElement("div", { className: `${prefix}-grid`, style: { height: height ?? undefined } }, (showToolbar !== false || fullScreen !== false) && /*#__PURE__*/React.createElement("div", { ref: topToolbarRef, className: classNames(`${prefix}-grid-top-toolbar`, {}) }, /*#__PURE__*/React.createElement("div", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', gap: '.75rem' } }, toolbarItems && toolbarItems?.length > 0 && /*#__PURE__*/React.createElement("div", { style: { flex: 1, overflow: 'hidden' } }, /*#__PURE__*/React.createElement(Toolbar, { items: (toolbarItems ?? []).filter(it => it.position !== 'Bottom'), mode: 'scroll' })), fullScreen !== false && (isFullScreen ? /*#__PURE__*/React.createElement(Minimize, { fontSize: 16 // onClick={() => handleFullScreen?.()} , "data-tooltip-id": "tooltip-icon", "data-tooltip-content": t ? t('Minimized') : 'Minimized' }) : /*#__PURE__*/React.createElement(Maximize, { fontSize: 16 // onClick={() => handleFullScreen?.()} , "data-tooltip-id": "tooltip-icon", "data-tooltip-content": t ? t('Full screen') : 'Full screen' })), /*#__PURE__*/React.createElement("div", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', gap: '.75rem' } }, pagination && pagination.onChange && pagination?.position && pagination?.position[0] === 'topRight' && /*#__PURE__*/React.createElement(Pagination, _extends({ showSizeChanger: true, responsive: true, size: 'small', rootClassName: 'top-pagination', showTotal: (total, range) => // @ts-ignore `${range[0]}-${range[1]} / ${total} ${t ? t(pagination?.locale?.items ?? 'items') : 'items'}` }, pagination)), typeof actionTemplate === 'function' ? actionTemplate() : actionTemplate, showColumnChoose && /*#__PURE__*/React.createElement(ColumnsChoose, { columns: propsColumns, t: t, columnsGroup: groupColumns // triggerChangeColumns={triggerChangeColumns} })))), /*#__PURE__*/React.createElement(DndContext, { collisionDetection: closestCenter, modifiers: [restrictToHorizontalAxis], onDragEnd: handleDragEnd, sensors: sensors }, /*#__PURE__*/React.createElement(TableContainer, _extends({}, rest, { id: id, table: table, editAble: false, dataSource: dataSource, originData: originData, prefix: prefix, selectionSettings: selectionSettings, setIsSelectionChange: setIsSelectionChange, setSorterChange: setSorterChange, setFilterChange: setFilterChange, tableHeight: tableHeight // setMergedFilterKeys={setMergedFilterKeys} }))), /*#__PURE__*/React.createElement("div", { ref: bottomToolbarRef }, pagination && /*#__PURE__*/React.createElement(Pagination // style={{padding: '0.75rem 1rem'}} , { rootClassName: 'pagination-template', showSizeChanger: true, responsive: true, size: 'small', total: pagination.total, pageSize: paginationState.pageSize, pageSizeOptions: [20, 50, 100, 1000, 10000], onChange: (page, pageSize) => { if (pagination.onChange) { pagination.onChange(page, pageSize); } else { table.setPageIndex(page - 1); table.setPageSize(pageSize); } } }))); }; export default Grid;