2025-08-20 19:52:18 +02:00
|
|
|
/**
|
|
|
|
|
* WeekViewStrategy - Strategy for week/day view rendering
|
|
|
|
|
* Extracts the time-based grid logic from GridManager
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
import { ViewStrategy, ViewContext, ViewLayoutConfig } from './ViewStrategy';
|
2025-10-03 20:50:40 +02:00
|
|
|
import { DateService } from '../utils/DateService';
|
2025-08-20 19:52:18 +02:00
|
|
|
import { calendarConfig } from '../core/CalendarConfig';
|
|
|
|
|
import { GridRenderer } from '../renderers/GridRenderer';
|
|
|
|
|
import { GridStyleManager } from '../renderers/GridStyleManager';
|
|
|
|
|
|
|
|
|
|
export class WeekViewStrategy implements ViewStrategy {
|
2025-10-03 20:50:40 +02:00
|
|
|
private dateService: DateService;
|
2025-08-20 19:52:18 +02:00
|
|
|
private gridRenderer: GridRenderer;
|
|
|
|
|
private styleManager: GridStyleManager;
|
|
|
|
|
|
|
|
|
|
constructor() {
|
2025-10-04 00:32:26 +02:00
|
|
|
const timezone = calendarConfig.getTimezone?.();
|
2025-10-03 20:50:40 +02:00
|
|
|
this.dateService = new DateService(timezone);
|
2025-09-03 20:04:47 +02:00
|
|
|
this.gridRenderer = new GridRenderer();
|
|
|
|
|
this.styleManager = new GridStyleManager();
|
2025-08-20 19:52:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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,
|
2025-08-24 00:13:07 +02:00
|
|
|
context.resourceData
|
2025-08-20 19:52:18 +02:00
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getNextPeriod(currentDate: Date): Date {
|
2025-10-03 20:50:40 +02:00
|
|
|
return this.dateService.addWeeks(currentDate, 1);
|
2025-08-20 19:52:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getPreviousPeriod(currentDate: Date): Date {
|
2025-10-03 20:50:40 +02:00
|
|
|
return this.dateService.addWeeks(currentDate, -1);
|
2025-08-20 19:52:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getPeriodLabel(date: Date): string {
|
2025-10-03 20:50:40 +02:00
|
|
|
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);
|
2025-08-20 19:52:18 +02:00
|
|
|
|
2025-10-03 20:50:40 +02:00
|
|
|
return `Week ${weekNumber}: ${this.dateService.formatDateRange(weekStart, weekEnd)}`;
|
2025-08-20 19:52:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getDisplayDates(baseDate: Date): Date[] {
|
2025-10-03 20:50:40 +02:00
|
|
|
const workWeekSettings = calendarConfig.getWorkWeekSettings();
|
|
|
|
|
return this.dateService.getWorkWeekDates(baseDate, workWeekSettings.workDays);
|
2025-08-20 19:52:18 +02:00
|
|
|
}
|
|
|
|
|
|
2025-08-20 21:51:49 +02:00
|
|
|
getPeriodRange(baseDate: Date): { startDate: Date; endDate: Date } {
|
2025-10-03 20:50:40 +02:00
|
|
|
const weekBounds = this.dateService.getWeekBounds(baseDate);
|
|
|
|
|
const weekStart = this.dateService.startOfDay(weekBounds.start);
|
|
|
|
|
const weekEnd = this.dateService.addDays(weekStart, 6);
|
2025-08-20 21:51:49 +02:00
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
startDate: weekStart,
|
|
|
|
|
endDate: weekEnd
|
|
|
|
|
};
|
|
|
|
|
}
|
2025-08-20 19:52:18 +02:00
|
|
|
}
|