mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-10-03 17:53:14 +00:00
69 lines
1.8 KiB
TypeScript
69 lines
1.8 KiB
TypeScript
|
|
import { addDaysIso, mondayOf, todayIso } from "@/domain/work-orders/utils/wizard-date-utils";
|
|||
|
|
|
|||
|
|
export interface WorkWeek {
|
|||
|
|
mondayIso: string;
|
|||
|
|
label: string;
|
|||
|
|
live: boolean;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export function currentWeekMonday(): string {
|
|||
|
|
return mondayOf(todayIso());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export function weekRange(mondayIso: string): [string, string] {
|
|||
|
|
return [mondayIso, addDaysIso(mondayIso, 4)];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export function compactWeekLabel(mondayIso: string): string {
|
|||
|
|
if (!/^\d{4}-\d{2}-\d{2}$/.test(mondayIso)) {
|
|||
|
|
return "";
|
|||
|
|
}
|
|||
|
|
const fridayIso = addDaysIso(mondayIso, 4);
|
|||
|
|
const [, sm, sd] = mondayIso.split("-").map(Number);
|
|||
|
|
const [, em, ed] = fridayIso.split("-").map(Number);
|
|||
|
|
return `${sm}/${sd}–${em}/${ed}`;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export function isLiveWeek(mondayIso: string): boolean {
|
|||
|
|
return mondayIso === currentWeekMonday();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export function isFutureWeek(mondayIso: string): boolean {
|
|||
|
|
return mondayIso > currentWeekMonday();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export function nextWeekMonday(): string {
|
|||
|
|
return addDaysIso(currentWeekMonday(), 7);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function toWorkWeek(mondayIso: string): WorkWeek {
|
|||
|
|
return {
|
|||
|
|
mondayIso,
|
|||
|
|
label: compactWeekLabel(mondayIso),
|
|||
|
|
live: isLiveWeek(mondayIso),
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export function buildWeekWindow(anchorMonday: string, before = 4, after = 4): WorkWeek[] {
|
|||
|
|
const weeks: WorkWeek[] = [];
|
|||
|
|
const liveMonday = currentWeekMonday();
|
|||
|
|
const upcomingMonday = nextWeekMonday();
|
|||
|
|
|
|||
|
|
for (let i = -before; i <= after; i += 1) {
|
|||
|
|
const mondayIso = addDaysIso(anchorMonday, i * 7);
|
|||
|
|
if (isFutureWeek(mondayIso) && mondayIso !== upcomingMonday) {
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
weeks.push(toWorkWeek(mondayIso));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (const requiredMonday of [liveMonday, upcomingMonday]) {
|
|||
|
|
if (!weeks.some((week) => week.mondayIso === requiredMonday)) {
|
|||
|
|
weeks.push(toWorkWeek(requiredMonday));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
weeks.sort((a, b) => a.mondayIso.localeCompare(b.mondayIso));
|
|||
|
|
return weeks;
|
|||
|
|
}
|