UNPKG

@lobehub/ui

Version:

Lobe UI is an open-source UI component library for building AIGC web apps

99 lines (98 loc) • 3.28 kB
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