mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-10-06 08:52:04 +00:00
61 lines
1.8 KiB
TypeScript
61 lines
1.8 KiB
TypeScript
|
|
import type { WorkOrderDayGroup } from "@/domain/work-orders/types/work-order-table-row";
|
||
|
|
|
||
|
|
export const DAY_PAGE_SIZE_OPTIONS = [25, 50, 100, 200] as const;
|
||
|
|
export const DEFAULT_DAY_PAGE_SIZE = 50;
|
||
|
|
|
||
|
|
export type DayPageSize = (typeof DAY_PAGE_SIZE_OPTIONS)[number];
|
||
|
|
|
||
|
|
export type PaginatedSlice<T> = {
|
||
|
|
visible: T[];
|
||
|
|
pageCount: number;
|
||
|
|
pageIndex: number;
|
||
|
|
};
|
||
|
|
|
||
|
|
export function paginateItems<T>(
|
||
|
|
items: readonly T[],
|
||
|
|
pageIndex: number,
|
||
|
|
pageSize: number,
|
||
|
|
): PaginatedSlice<T> {
|
||
|
|
const size = pageSize > 0 ? pageSize : DEFAULT_DAY_PAGE_SIZE;
|
||
|
|
const pageCount = Math.max(1, Math.ceil(items.length / size) || 1);
|
||
|
|
const page = Math.min(Math.max(0, pageIndex), pageCount - 1);
|
||
|
|
const start = page * size;
|
||
|
|
return {
|
||
|
|
visible: items.slice(start, start + size),
|
||
|
|
pageCount,
|
||
|
|
pageIndex: page,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
export function shouldShowDayPagination(input: {
|
||
|
|
flatListMode: boolean;
|
||
|
|
isLoading: boolean;
|
||
|
|
noSearchResults: boolean;
|
||
|
|
}): boolean {
|
||
|
|
return !input.flatListMode && !input.isLoading && !input.noSearchResults;
|
||
|
|
}
|
||
|
|
|
||
|
|
export function formatDayPaginationSummary(dayLabel: string, itemCount: number): string {
|
||
|
|
const label = dayLabel.trim().toUpperCase();
|
||
|
|
const noun = itemCount === 1 ? "item" : "items";
|
||
|
|
return `${label} · ${itemCount} ${noun}`;
|
||
|
|
}
|
||
|
|
|
||
|
|
export function pageSelectedDayGroups(
|
||
|
|
dayGroups: WorkOrderDayGroup[],
|
||
|
|
pageIndex: number,
|
||
|
|
pageSize: number,
|
||
|
|
): { groups: WorkOrderDayGroup[]; pageIndex: number; pageCount: number; totalCount: number } {
|
||
|
|
const group = dayGroups[0];
|
||
|
|
if (!group) {
|
||
|
|
return { groups: dayGroups, pageIndex: 0, pageCount: 1, totalCount: 0 };
|
||
|
|
}
|
||
|
|
const slice = paginateItems(group.items, pageIndex, pageSize);
|
||
|
|
return {
|
||
|
|
groups: [{ ...group, items: slice.visible, totalCount: group.items.length }],
|
||
|
|
pageIndex: slice.pageIndex,
|
||
|
|
pageCount: slice.pageCount,
|
||
|
|
totalCount: group.items.length,
|
||
|
|
};
|
||
|
|
}
|