es-grid-template
Version:
es-grid-template
333 lines (325 loc) • 9.76 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import { features, useTablePipeline } from "./pipeline";
import * as fusion from '@alifd/next';
import { useLocale } from "rc-master-ui/es/locale";
import { faker } from "@faker-js/faker";
import React from "react";
import "./base-table/styles.scss";
import { addRowIdArray, filterDataByColumns, flatColumns2,
// getInvisibleColumns,
getVisibleFields, groupArrayByColumns, isTreeArray, revertConvertFilters, sortByType, sumFields } from "../table-component/hook/utils";
import { CustomProvider, ConfigProvider } from 'rc-master-ui';
import { Modal } from 'antd';
import { getLocale, getLocales } from "../locale/useLocale";
import { TableContext } from "./useContext";
import Grid from "./Grid";
import { getParentKeysLarge, getRowsByKeysKeepTreeOrder } from "./utils/selected";
const InternalTable = props => {
const {
t,
columns: propColumns,
dataSource,
allowFiltering,
allowSortering,
allowResizing,
groupAble,
groupColumns,
groupSetting,
lang,
pagination,
locale,
fullScreenTitle,
wrapSettings,
ignoreAccents,
rowSelected,
selectionSettings,
expandable,
sortMultiple,
onFilter,
defaultFilter,
onSorter,
defaultSorter,
footerDataSource,
summary,
useVirtual,
...rest
} = props;
const prefix = 'ui-rc';
const rowKey = 'rowId';
const childrenKey = 'children';
const [tableLocal] = useLocale('Table');
const id = React.useMemo(() => {
return faker.string.alpha(20);
}, []);
const language = React.useMemo(() => {
return getLocale(lang);
}, [lang]);
const languages = React.useMemo(() => {
return getLocales(lang);
}, [lang]);
const getWindowSize = () => {
const {
innerWidth,
innerHeight
} = window;
return {
innerWidth,
innerHeight
};
};
const [windowSize, setWindowSize] = React.useState(getWindowSize());
React.useEffect(() => {
const handleWindowResize = () => {
setWindowSize(getWindowSize());
};
document.addEventListener('resize', handleWindowResize);
return () => {
document.removeEventListener('resize', handleWindowResize);
};
}, []);
const [visibleKeys, setVisibleKeys] = React.useState(undefined);
const [filterState, setFilterState] = React.useState(undefined);
const [sortState, setSortState] = React.useState(undefined);
const columns = React.useMemo(() => {
return sortByType(propColumns);
}, [propColumns]);
const convertData = React.useMemo(() => {
if (groupAble && groupSetting && groupSetting.client !== false) {
return groupArrayByColumns(dataSource, groupColumns);
}
return addRowIdArray(dataSource);
}, [dataSource, groupAble, groupColumns, groupSetting]);
const isDataTree = React.useMemo(() => {
return isTreeArray(convertData);
}, [convertData]);
const mergedData = React.useMemo(() => {
const shouldSkip = onFilter && onSorter;
if (shouldSkip) {
return convertData;
}
return filterDataByColumns(convertData, onFilter ? undefined : filterState ?? defaultFilter, onSorter ? undefined : sortState ?? defaultSorter, [], ignoreAccents);
}, [convertData, filterState, ignoreAccents, sortState, onFilter, onSorter, defaultFilter, defaultSorter]);
const footerData = React.useMemo(() => {
if (!summary) {
return undefined;
}
if (footerDataSource) {
return footerDataSource;
}
const flatColumns = flatColumns2(columns);
const a = sumFields(flatColumns, dataSource, childrenKey);
return [a];
}, [columns, dataSource, footerDataSource, summary]);
const expandAllKeys = React.useMemo(() => {
if (expandable?.defaultExpandAllRows && isDataTree) {
return getParentKeysLarge(convertData, rowKey, childrenKey);
}
return undefined;
}, [expandable?.defaultExpandAllRows, convertData, isDataTree]);
const [isFullScreen, setIsFullScreen] = React.useState(false);
const defaultFilterConvert = React.useMemo(() => {
if (defaultFilter) {
return revertConvertFilters(defaultFilter);
}
return undefined;
}, [defaultFilter]);
// const columnInVisibility = React.useMemo(() => {
// return getInvisibleColumns(columns)
// }, [columns])
const columnVisibility = React.useMemo(() => {
return getVisibleFields(columns);
}, [columns]);
const pipeline = useTablePipeline({
components: fusion
}).input({
dataSource: mergedData,
columns
}).primaryKey(rowKey)
// .mapDataSource((dta) => collectNodes(dta, 'pre'))
// .snapshot('flat')
.use(features.hiddenColumns({
columns,
visibleKeys: visibleKeys ?? columnVisibility
// visibleKeys: ['name']
// visibleKeys
})).use(features.treeSelect({
tree: mergedData,
value: selectionSettings?.selectedRowKeys,
defaultValue: selectionSettings?.defaultSelectedRowKeys,
// rootKey: selectionSettings?.hideSelectAll,
rootKey: selectionSettings?.hideSelectAll || selectionSettings?.type === 'single' ? undefined : 'root',
// rootKey: 'root',
checkStrictly: selectionSettings?.checkStrictly,
// checkStrictly: true,
checkedStrategy: isDataTree ? selectionSettings?.checkedStrategy : 'all',
// checkedStrategy: 'parent',
mode: selectionSettings?.mode,
type: selectionSettings?.type,
highlightRowWhenSelected: true,
isDisabled(row) {
return !!selectionSettings?.getCheckboxProps?.(row)?.disabled;
},
checkboxColumn: {
lock: true
},
clickArea: selectionSettings?.checkboxOnly ? 'checkbox' : 'row',
// clickArea: 'row',
onChange: (nextValue, rowData, type) => {
const rs = getRowsByKeysKeepTreeOrder(nextValue, mergedData ?? [], rowKey);
rowSelected?.({
type,
rowData,
selected: rs
});
}
// clickArea: 'checkbox'
})).use(features.treeMode({
clickArea: 'icon',
stopClickEventPropagation: true,
expandIconColumnIndex: expandable?.expandIconColumnIndex,
defaultOpenKeys: expandAllKeys ?? expandable?.defaultExpandedRowKeys,
isTreeArray: !!isDataTree
})).use(features.columnCustom({
id,
t,
columns,
mode: sortMultiple !== false ? 'multiple' : 'single',
dataSource: mergedData,
columnResizeMode: 'onChange',
disableUserSelectWhenResizing: true,
allowFiltering,
allowSortering,
allowResizing,
tableLocal,
locale,
prefix,
wrapSettings,
ignoreAccents,
currentPage: pagination ? pagination?.currentPage : undefined,
pageSize: pagination ? pagination?.pageSize : undefined,
isDataTree,
defaultFilter: defaultFilterConvert,
defaultSorter,
onFilter(val) {
// const rs =
if (onFilter) {
onFilter(val);
} else {
setFilterState(val);
}
},
onSorter(val) {
if (onSorter) {
onSorter(val);
} else {
setSortState(val);
}
}
})).use(features.paginationFeature({
pagination
}));
// const onResizeEnd = (args: any[]) => {
// }
return /*#__PURE__*/React.createElement(ConfigProvider, {
locale: language,
theme: {
token: {
// colorPrimary: '#eb4619',
// colorLink: '#eb4619',
},
components: {
Dropdown: {
zIndexPopup: 1158
},
Popover: {
zIndexPopup: 1158
}
}
}
}, /*#__PURE__*/React.createElement(CustomProvider, {
locale: languages
}, /*#__PURE__*/React.createElement(TableContext.Provider, {
value: {
prefix,
id,
rowKey,
dataSource: mergedData,
originData: convertData,
windowSize,
lang,
locale
}
}, /*#__PURE__*/React.createElement(Grid, _extends({}, rest, {
id: id,
useVirtual: {
header: false,
horizontal: useVirtual?.horizontal ?? true,
vertical: useVirtual?.vertical ?? true
},
isFullScreen: isFullScreen,
pagination: pagination,
setIsFullScreen: setIsFullScreen,
pipeline: pipeline
}, pipeline.getProps(), {
originData: convertData,
originColumns: columns,
groupColumns: groupColumns,
setVisibleKeys: setVisibleKeys,
footerDataSource: footerData,
onFilter: onFilter,
onSorter: onSorter,
defaultFilter: defaultFilter,
defaultSorter: defaultSorter
})), /*#__PURE__*/React.createElement(Modal, {
open: isFullScreen,
footer: null,
centered: true,
closable: true,
width: '100%',
style: {
maxWidth: '100%',
height: '100%'
},
onCancel: () => setIsFullScreen(false),
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(Grid, _extends({}, rest, {
id: id,
useVirtual: {
header: false,
horizontal: useVirtual?.horizontal ?? true,
vertical: useVirtual?.vertical ?? true
},
isFullScreen: isFullScreen,
setIsFullScreen: setIsFullScreen,
pipeline: pipeline,
pagination: pagination
}, pipeline.getProps(), {
originData: convertData,
originColumns: columns,
groupColumns: groupColumns,
setVisibleKeys: setVisibleKeys,
footerDataSource: footerData,
onFilter: onFilter,
onSorter: onSorter,
defaultFilter: defaultFilter,
defaultSorter: defaultSorter
})))))));
};
export default InternalTable;