- Remove non-null assertions on bYear/bMonth in useDashboard fetchData by making parameters required - Extract shared computeDateRange and buildMonthOptions into src/utils/dateRange.ts to eliminate duplication across useDashboard, useReports, DashboardPage and ReportsPage Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
66 lines
2.1 KiB
TypeScript
66 lines
2.1 KiB
TypeScript
import type { DashboardPeriod } from "../shared/types";
|
|
|
|
/**
|
|
* Compute a date range (dateFrom / dateTo) based on the selected period.
|
|
* Shared between useDashboard, useReports, DashboardPage and ReportsPage.
|
|
*/
|
|
export function computeDateRange(
|
|
period: DashboardPeriod,
|
|
customDateFrom?: string,
|
|
customDateTo?: string,
|
|
): { dateFrom?: string; dateTo?: string } {
|
|
if (period === "all") return {};
|
|
if (period === "custom" && customDateFrom && customDateTo) {
|
|
return { dateFrom: customDateFrom, dateTo: customDateTo };
|
|
}
|
|
|
|
const now = new Date();
|
|
const year = now.getFullYear();
|
|
const month = now.getMonth();
|
|
const day = now.getDate();
|
|
|
|
const dateTo = `${year}-${String(month + 1).padStart(2, "0")}-${String(day).padStart(2, "0")}`;
|
|
|
|
let from: Date;
|
|
switch (period) {
|
|
case "month":
|
|
from = new Date(year, month, 1);
|
|
break;
|
|
case "3months":
|
|
from = new Date(year, month - 2, 1);
|
|
break;
|
|
case "6months":
|
|
from = new Date(year, month - 5, 1);
|
|
break;
|
|
case "year":
|
|
from = new Date(year, 0, 1);
|
|
break;
|
|
case "12months":
|
|
from = new Date(year, month - 11, 1);
|
|
break;
|
|
default:
|
|
from = new Date(year, month, 1);
|
|
break;
|
|
}
|
|
|
|
const dateFrom = `${from.getFullYear()}-${String(from.getMonth() + 1).padStart(2, "0")}-${String(from.getDate()).padStart(2, "0")}`;
|
|
|
|
return { dateFrom, dateTo };
|
|
}
|
|
|
|
/**
|
|
* Build an array of month options for the budget month dropdown.
|
|
* Returns the last 24 months with localized labels.
|
|
*/
|
|
export function buildMonthOptions(language: string): Array<{ key: string; value: string; label: string }> {
|
|
const now = new Date();
|
|
const currentMonth = now.getMonth();
|
|
const currentYear = now.getFullYear();
|
|
return Array.from({ length: 24 }, (_, i) => {
|
|
const d = new Date(currentYear, currentMonth - i, 1);
|
|
const y = d.getFullYear();
|
|
const m = d.getMonth() + 1;
|
|
const label = new Intl.DateTimeFormat(language, { month: "long", year: "numeric" }).format(d);
|
|
return { key: `${y}-${m}`, value: `${y}-${m}`, label: label.charAt(0).toUpperCase() + label.slice(1) };
|
|
});
|
|
}
|