es-grid-template
Version:
es-grid-template
310 lines (301 loc) • 10.8 kB
JavaScript
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;