/** * WeekViewStrategy - Strategy for week/day view rendering * Extracts the time-based grid logic from GridManager */ import { ViewStrategy, ViewContext, ViewLayoutConfig } from './ViewStrategy'; import { DateService } from '../utils/DateService'; import { calendarConfig } from '../core/CalendarConfig'; import { GridRenderer } from '../renderers/GridRenderer'; import { GridStyleManager } from '../renderers/GridStyleManager'; export class WeekViewStrategy implements ViewStrategy { private dateService: DateService; private gridRenderer: GridRenderer; private styleManager: GridStyleManager; constructor() { const timezone = calendarConfig.getTimezone?.(); this.dateService = new DateService(timezone); 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 this.dateService.addWeeks(currentDate, 1); } getPreviousPeriod(currentDate: Date): Date { return this.dateService.addWeeks(currentDate, -1); } getPeriodLabel(date: Date): string { const weekBounds = this.dateService.getWeekBounds(date); const weekStart = this.dateService.startOfDay(weekBounds.start); const weekEnd = this.dateService.addDays(weekStart, 6); const weekNumber = this.dateService.getWeekNumber(date); return `Week ${weekNumber}: ${this.dateService.formatDateRange(weekStart, weekEnd)}`; } getDisplayDates(baseDate: Date): Date[] { const workWeekSettings = calendarConfig.getWorkWeekSettings(); return this.dateService.getWorkWeekDates(baseDate, workWeekSettings.workDays); } getPeriodRange(baseDate: Date): { startDate: Date; endDate: Date } { const weekBounds = this.dateService.getWeekBounds(baseDate); const weekStart = this.dateService.startOfDay(weekBounds.start); const weekEnd = this.dateService.addDays(weekStart, 6); return { startDate: weekStart, endDate: weekEnd }; } }