fix: align analysis defaults to latest completed month
This commit is contained in:
@@ -153,9 +153,9 @@ const seatMapState = {
|
||||
|
||||
let currentView = "project";
|
||||
const globalDateState = {
|
||||
loaded: true,
|
||||
startDate: "2026-01-01",
|
||||
endDate: "2026-01-31",
|
||||
loaded: false,
|
||||
startDate: "",
|
||||
endDate: "",
|
||||
};
|
||||
|
||||
const organizationHistoryState = {
|
||||
@@ -194,6 +194,58 @@ function getTodayDate() {
|
||||
return `${now.getFullYear()}-${padDatePart(now.getMonth() + 1)}-${padDatePart(now.getDate())}`;
|
||||
}
|
||||
|
||||
function parseDateOnly(value) {
|
||||
const raw = String(value || "").trim();
|
||||
if (!raw) return null;
|
||||
const match = raw.match(/^(\d{4})-(\d{2})-(\d{2})$/);
|
||||
if (!match) return null;
|
||||
const year = Number(match[1]);
|
||||
const monthIndex = Number(match[2]) - 1;
|
||||
const day = Number(match[3]);
|
||||
const parsed = new Date(year, monthIndex, day);
|
||||
if (
|
||||
Number.isNaN(parsed.getTime())
|
||||
|| parsed.getFullYear() !== year
|
||||
|| parsed.getMonth() !== monthIndex
|
||||
|| parsed.getDate() !== day
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
return parsed;
|
||||
}
|
||||
|
||||
function formatDateOnly(date) {
|
||||
if (!(date instanceof Date) || Number.isNaN(date.getTime())) return "";
|
||||
return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(date.getDate())}`;
|
||||
}
|
||||
|
||||
function getMonthRangeForDate(date) {
|
||||
if (!(date instanceof Date) || Number.isNaN(date.getTime())) {
|
||||
return { startDate: "", endDate: "" };
|
||||
}
|
||||
const start = new Date(date.getFullYear(), date.getMonth(), 1);
|
||||
const end = new Date(date.getFullYear(), date.getMonth() + 1, 0);
|
||||
return {
|
||||
startDate: formatDateOnly(start),
|
||||
endDate: formatDateOnly(end),
|
||||
};
|
||||
}
|
||||
|
||||
function getPreviousMonthRange(baseDate = new Date()) {
|
||||
return getMonthRangeForDate(new Date(baseDate.getFullYear(), baseDate.getMonth() - 1, 1));
|
||||
}
|
||||
|
||||
function resolveLatestCompletedMonthRange(maxDateText) {
|
||||
const fallbackRange = getPreviousMonthRange();
|
||||
const latestAvailableDate = parseDateOnly(String(maxDateText || "").slice(0, 10));
|
||||
if (!latestAvailableDate) return fallbackRange;
|
||||
const fallbackStart = parseDateOnly(fallbackRange.startDate);
|
||||
if (fallbackStart && latestAvailableDate >= fallbackStart) {
|
||||
return fallbackRange;
|
||||
}
|
||||
return getMonthRangeForDate(latestAvailableDate);
|
||||
}
|
||||
|
||||
function syncOrganizationHistoryControls() {
|
||||
if (!organizationHistoryControls) return;
|
||||
const visible = currentView === "organization";
|
||||
@@ -324,10 +376,10 @@ async function ensureGlobalDateRangeLoaded() {
|
||||
const payload = await fetchJson("/api/integration/summary");
|
||||
const work = payload?.date_ranges?.work || {};
|
||||
const voucher = payload?.date_ranges?.voucher || {};
|
||||
const starts = [work.min_work_date, voucher.min_voucher_date].filter(Boolean).sort();
|
||||
const ends = [work.max_work_date, voucher.max_voucher_date].filter(Boolean).sort();
|
||||
globalDateState.startDate = starts[0] ? String(starts[0]).slice(0, 10) : "";
|
||||
globalDateState.endDate = ends.length ? String(ends[ends.length - 1]).slice(0, 10) : "";
|
||||
const defaultRange = resolveLatestCompletedMonthRange(ends.length ? ends[ends.length - 1] : "");
|
||||
globalDateState.startDate = defaultRange.startDate;
|
||||
globalDateState.endDate = defaultRange.endDate;
|
||||
globalDateState.loaded = true;
|
||||
syncGlobalDateControlInputs();
|
||||
postGlobalDateRangeToFrame(projectFrame);
|
||||
|
||||
Reference in New Issue
Block a user