diff --git a/src/managers/GridManager.ts b/src/managers/GridManager.ts index 6aceac4..358e09d 100644 --- a/src/managers/GridManager.ts +++ b/src/managers/GridManager.ts @@ -5,6 +5,7 @@ import { calendarConfig } from '../core/CalendarConfig'; import { EventTypes } from '../constants/EventTypes'; import { StateEvents } from '../types/CalendarState'; import { DateUtils } from '../utils/DateUtils'; +import { DateCalculator } from '../utils/DateCalculator'; import { ResourceCalendarData } from '../types/CalendarTypes'; import { GridRenderer } from '../renderers/GridRenderer'; import { GridStyleManager } from '../renderers/GridStyleManager'; @@ -29,11 +30,13 @@ export class GridManager { private resourceData: ResourceCalendarData | null = null; // Store resource data for resource calendar private gridRenderer: GridRenderer; private styleManager: GridStyleManager; + private dateCalculator: DateCalculator; constructor() { console.log('🏗️ GridManager: Constructor called'); this.gridRenderer = new GridRenderer(calendarConfig); this.styleManager = new GridStyleManager(calendarConfig); + this.dateCalculator = new DateCalculator(calendarConfig); this.init(); } @@ -43,7 +46,7 @@ export class GridManager { // Set initial current week to today if not set if (!this.currentWeek) { - this.currentWeek = this.getWeekStart(new Date()); + this.currentWeek = this.dateCalculator.getISOWeekStart(new Date()); console.log('GridManager: Set initial currentWeek to', this.currentWeek); // Don't render immediately - wait for proper initialization event console.log('GridManager: Waiting for initialization complete before rendering'); @@ -51,8 +54,8 @@ export class GridManager { } private getWeekStart(date: Date): Date { - // Use DateUtils for consistent week calculation (Sunday = 0) - return DateUtils.getWeekStart(date, 0); + // Use DateCalculator for ISO week (Monday = start) + return this.dateCalculator.getISOWeekStart(date); } private findElements(): void { @@ -84,14 +87,21 @@ export class GridManager { // Re-render on period change eventBus.on(EventTypes.PERIOD_CHANGE, (e: Event) => { const detail = (e as CustomEvent).detail; - this.currentWeek = detail.week; + this.currentWeek = this.dateCalculator.getISOWeekStart(detail.week); this.render(); }); // Handle week changes from NavigationManager eventBus.on(EventTypes.WEEK_CHANGED, (e: Event) => { const detail = (e as CustomEvent).detail; - this.currentWeek = detail.weekStart; + this.currentWeek = this.dateCalculator.getISOWeekStart(detail.weekStart); + this.render(); + }); + + // Handle date changes from CalendarManager + eventBus.on(EventTypes.DATE_CHANGED, (e: Event) => { + const detail = (e as CustomEvent).detail; + this.currentWeek = this.dateCalculator.getISOWeekStart(detail.currentDate); this.render(); }); diff --git a/src/utils/DateCalculator.ts b/src/utils/DateCalculator.ts index 3ca32f5..be1574d 100644 --- a/src/utils/DateCalculator.ts +++ b/src/utils/DateCalculator.ts @@ -13,29 +13,27 @@ export class DateCalculator { } /** - * Get dates for work week based on week start and work days configuration - * @param weekStart - The start date of the week (could be Sunday or Monday) + * Get dates for work week based on ISO week (starts Monday) + * @param weekStart - Any date in the week * @returns Array of dates for the configured work days */ getWorkWeekDates(weekStart: Date): Date[] { const dates: Date[] = []; const workWeekSettings = this.config.getWorkWeekSettings(); - const dateSettings = this.config.getDateViewSettings(); - const firstDayOfWeek = dateSettings.firstDayOfWeek; // 0=Sunday, 1=Monday - // Get the actual start of the week based on configuration - const actualWeekStart = this.getWeekStart(weekStart, firstDayOfWeek); + // Get Monday of the ISO week + const monday = this.getISOWeekStart(weekStart); // Calculate dates for each work day workWeekSettings.workDays.forEach(dayOfWeek => { - const date = new Date(actualWeekStart); + const date = new Date(monday); - if (firstDayOfWeek === 1 && dayOfWeek === 0) { - // For Monday-based weeks, Sunday is at the end (day 7) - date.setDate(actualWeekStart.getDate() + 7); + if (dayOfWeek === 0) { + // Sunday is 6 days after Monday + date.setDate(monday.getDate() + 6); } else { - // Normal calculation - date.setDate(actualWeekStart.getDate() + dayOfWeek); + // Monday=1 becomes 0 days after, Tuesday=2 becomes 1 day after, etc. + date.setDate(monday.getDate() + dayOfWeek - 1); } dates.push(date); @@ -45,26 +43,27 @@ export class DateCalculator { } /** - * Get the start of the week for a given date + * Get the start of the ISO week (Monday) for a given date + * @param date - Any date in the week + * @returns The Monday of the ISO week + */ + getISOWeekStart(date: Date): Date { + const monday = new Date(date); + const currentDay = monday.getDay(); + const daysToSubtract = currentDay === 0 ? 6 : currentDay - 1; + monday.setDate(monday.getDate() - daysToSubtract); + monday.setHours(0, 0, 0, 0); + return monday; + } + + /** + * Get the start of the week for a given date (legacy method) * @param date - Any date in the week * @param firstDayOfWeek - 0 for Sunday, 1 for Monday * @returns The start date of the week */ getWeekStart(date: Date, firstDayOfWeek: number = 1): Date { - const weekStart = new Date(date); - const currentDay = weekStart.getDay(); - - if (firstDayOfWeek === 1) { - // Monday as first day - const daysToSubtract = currentDay === 0 ? 6 : currentDay - 1; - weekStart.setDate(weekStart.getDate() - daysToSubtract); - } else { - // Sunday as first day - weekStart.setDate(weekStart.getDate() - currentDay); - } - - weekStart.setHours(0, 0, 0, 0); - return weekStart; + return this.getISOWeekStart(date); } /**