split out item list table functionality

This commit is contained in:
jeffvli
2026-01-16 14:05:32 -08:00
parent a5fa022eb6
commit e2b20eb89b
12 changed files with 1622 additions and 1237 deletions
@@ -0,0 +1,55 @@
import { useMemo } from 'react';
import { TableGroupHeader } from '/@/renderer/components/item-list/item-table-list/item-table-list';
export const useTableRowModel = ({
data,
enableHeader,
groups,
}: {
data: unknown[];
enableHeader: boolean;
groups?: TableGroupHeader[];
}) => {
const dataWithGroups = useMemo(() => {
const result: (null | unknown)[] = enableHeader ? [null] : [];
if (!groups || groups.length === 0) {
result.push(...data);
return result;
}
// Build the expanded row model: [header?] + (groupHeader + groupItems)* + any remaining items.
let dataIndex = 0;
for (const group of groups) {
// Group header row
result.push(null);
// Group items
const end = Math.min(data.length, dataIndex + group.itemCount);
for (; dataIndex < end; dataIndex++) {
result.push(data[dataIndex]);
}
}
// If groups don't account for all items, append the remainder.
for (; dataIndex < data.length; dataIndex++) {
result.push(data[dataIndex]);
}
return result;
}, [data, enableHeader, groups]);
const groupHeaderRowCount = useMemo(() => {
if (!groups || groups.length === 0) return 0;
return groups.length;
}, [groups]);
return useMemo(
() => ({
dataWithGroups,
groupHeaderRowCount,
}),
[dataWithGroups, groupHeaderRowCount],
);
};