@lobehub/ui
Version:
Lobe UI is an open-source UI component library for building AIGC web apps
99 lines (98 loc) • 3.28 kB
JavaScript
import { getColumnId } from "./toColumnDefs.mjs";
import { useState } from "react";
//#region src/base-ui/Table/useTableState.ts
const resolve = (updater, previous) => typeof updater === "function" ? updater(previous) : updater;
const initialSorting = (columns) => {
const index = columns.findIndex((column) => column.defaultSortOrder);
if (index === -1) return [];
return [{
desc: columns[index].defaultSortOrder === "descend",
id: getColumnId(columns[index], index)
}];
};
const useTableState = ({ columns, onChange, pagination }) => {
const config = pagination === false ? void 0 : pagination ?? {};
const columnIds = columns.map((column, index) => getColumnId(column, index));
const [sorting, setSorting] = useState(() => initialSorting(columns));
const [columnFilters, setColumnFilters] = useState([]);
const [innerPage, setInnerPage] = useState({
pageIndex: (config?.defaultCurrent ?? 1) - 1,
pageSize: config?.defaultPageSize ?? 10
});
const page = {
pageIndex: config?.current === void 0 ? innerPage.pageIndex : config.current - 1,
pageSize: config?.pageSize ?? innerPage.pageSize
};
const toFilters = (state) => Object.fromEntries(columns.map((column, index) => [column, columnIds[index]]).filter(([column]) => column.filters?.length).map(([, id]) => [id, state.find((filter) => filter.id === id)?.value ?? null]));
const toSorter = (state) => {
const [active] = state;
if (!active) return {};
return {
column: columns[columnIds.indexOf(active.id)],
columnKey: active.id,
order: active.desc ? "descend" : "ascend"
};
};
const toPaginationArg = (next) => config ? {
...config,
current: next.pageIndex + 1,
pageSize: next.pageSize
} : {};
const report = (nextPage, nextFilters, nextSorting) => onChange?.(toPaginationArg(nextPage), toFilters(nextFilters), toSorter(nextSorting));
const changePage = (next) => {
setInnerPage(next);
const sizeChanged = next.pageSize !== page.pageSize;
if (sizeChanged) config?.onShowSizeChange?.(next.pageIndex + 1, next.pageSize);
if (sizeChanged || next.pageIndex !== page.pageIndex) config?.onChange?.(next.pageIndex + 1, next.pageSize);
};
const clampPage = (pageIndex) => {
if (config?.current === void 0) {
setInnerPage((previous) => ({
...previous,
pageIndex
}));
return;
}
config.onChange?.(pageIndex + 1, page.pageSize);
};
const onSortingChange = (updater) => {
const next = resolve(updater, sorting);
const firstPage = {
...page,
pageIndex: 0
};
setSorting(next);
changePage(firstPage);
report(firstPage, columnFilters, next);
};
const onColumnFiltersChange = (updater) => {
const next = resolve(updater, columnFilters);
const firstPage = {
...page,
pageIndex: 0
};
setColumnFilters(next);
changePage(firstPage);
report(firstPage, next, sorting);
};
const onPaginationChange = (updater) => {
const next = resolve(updater, page);
changePage(next);
report(next, columnFilters, sorting);
};
return {
clampPage,
columnFilters,
columnIds,
config,
manualSorting: columns.some((column) => column.sorter === true),
onColumnFiltersChange,
onPaginationChange,
onSortingChange,
page,
sorting
};
};
//#endregion
export { useTableState };
//# sourceMappingURL=useTableState.mjs.map