/** * WeekViewStrategy - Strategy for week/day view rendering * Extracts the time-based grid logic from GridManager */ import { ViewStrategy, ViewContext, ViewLayoutConfig } from './ViewStrategy'; import { DateCalculator } from '../utils/DateCalculator'; import { calendarConfig } from '../core/CalendarConfig'; import { GridRenderer } from '../renderers/GridRenderer'; import { GridStyleManager } from '../renderers/GridStyleManager'; export class WeekViewStrategy implements ViewStrategy { private dateCalculator: DateCalculator; private gridRenderer: GridRenderer; private styleManager: GridStyleManager; constructor() { DateCalculator.initialize(calendarConfig); this.dateCalculator = new DateCalculator(); this.gridRenderer = new GridRenderer(); this.styleManager = new GridStyleManager(); } getLayoutConfig(): ViewLayoutConfig { return { needsTimeAxis: true, columnCount: calendarConfig.getWorkWeekSettings().totalDays, scrollable: true, eventPositioning: 'time-based' }; } renderGrid(context: ViewContext): void { // Update grid styles this.styleManager.updateGridStyles(context.resourceData); // Render the grid structure (time axis + day columns) this.gridRenderer.renderGrid( context.container, context.currentDate, context.resourceData ); } getNextPeriod(currentDate: Date): Date { return DateCalculator.addWeeks(currentDate, 1); } getPreviousPeriod(currentDate: Date): Date { return DateCalculator.addWeeks(currentDate, -1); } getPeriodLabel(date: Date): string { const weekStart = DateCalculator.getISOWeekStart(date); const weekEnd = DateCalculator.addDays(weekStart, 6); const weekNumber = DateCalculator.getWeekNumber(date); return `Week ${weekNumber}: ${DateCalculator.formatDateRange(weekStart, weekEnd)}`; } getDisplayDates(baseDate: Date): Date[] { return DateCalculator.getWorkWeekDates(baseDate); } getPeriodRange(baseDate: Date): { startDate: Date; endDate: Date } { const weekStart = DateCalculator.getISOWeekStart(baseDate); const weekEnd = DateCalculator.addDays(weekStart, 6); return { startDate: weekStart, endDate: weekEnd }; } }