@etsoo/materialui
Version:
TypeScript Material-UI Implementation
68 lines (67 loc) • 3.01 kB
JavaScript
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { useCombinedRefs, useDimensions, useSearchParamsWithCache } from "@etsoo/react";
import React from "react";
import { MUGlobal } from "../MUGlobal";
import { SearchBar } from "../SearchBar";
import { TableEx, TableExMinWidth } from "../TableEx";
import { CommonPage } from "./CommonPage";
import { GridUtils } from "../GridUtils";
import Stack from "@mui/material/Stack";
import Box from "@mui/material/Box";
/**
* Table page
* @param props Props
* @returns Component
*/
export function TablePage(props) {
// Destruct
const { columns, fields, fieldTemplate, loadData, mRef, sizeReadyMiliseconds = 0, pageProps = {}, cacheKey, cacheMinutes = 15, searchBarTop, ...rest } = props;
pageProps.paddings ??= MUGlobal.pagePaddings;
// States
const [states] = React.useState({});
const refs = useCombinedRefs(mRef, (ref) => {
if (ref == null)
return;
const first = states.ref == null;
states.ref = ref;
if (first)
reset();
});
const reset = () => {
if (states.data == null || states.ref == null)
return;
states.ref.reset({ data: states.data });
};
// On submit callback
const onSubmit = (data, _reset) => {
states.data = data;
reset();
};
const localLoadData = (props, lastItem) => {
return loadData(GridUtils.createLoader(props, fieldTemplate, cacheKey, false), lastItem);
};
// Search data
const searchData = useSearchParamsWithCache(cacheKey);
// Total width
const totalWidth = React.useMemo(() => columns.reduce((previousValue, { width, minWidth }) => {
return previousValue + (width ?? minWidth ?? TableExMinWidth);
}, 0), [columns]);
// Watch container
const { dimensions } = useDimensions(1, undefined, sizeReadyMiliseconds);
const rect = dimensions[0][2];
const list = React.useMemo(() => {
if (rect != null && rect.height > 50 && rect.width >= totalWidth) {
let maxHeight = document.documentElement.clientHeight - (rect.top + rect.height + 1);
const style = window.getComputedStyle(dimensions[0][1]);
const paddingBottom = parseFloat(style.paddingBottom);
if (!isNaN(paddingBottom))
maxHeight -= paddingBottom;
return (_jsx(TableEx, { autoLoad: false, columns: columns, loadData: localLoadData, maxHeight: maxHeight, mRef: refs, ...rest }));
}
}, [rect]);
const f = typeof fields == "function" ? fields(searchData ?? {}) : fields;
// Layout
return (_jsx(CommonPage, { ...pageProps, scrollContainer: globalThis, children: _jsxs(Stack, { children: [_jsx(Box, { ref: dimensions[0][0], sx: {
paddingBottom: pageProps.paddings
}, children: rect && rect.width > 100 && (_jsx(SearchBar, { fields: f, onSubmit: onSubmit, top: searchBarTop, width: rect.width })) }), list] }) }));
}