2025-08-07 00:15:44 +02:00
|
|
|
// Column rendering strategy interface and implementations
|
|
|
|
|
|
|
|
|
|
import { CalendarConfig } from '../core/CalendarConfig';
|
|
|
|
|
import { ResourceCalendarData } from '../types/CalendarTypes';
|
2025-08-18 23:42:03 +02:00
|
|
|
import { DateCalculator } from '../utils/DateCalculator';
|
2025-08-07 00:15:44 +02:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Interface for column rendering strategies
|
|
|
|
|
*/
|
|
|
|
|
export interface ColumnRenderer {
|
2025-08-07 00:26:33 +02:00
|
|
|
render(columnContainer: HTMLElement, context: ColumnRenderContext): void;
|
2025-08-07 00:15:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Context for column rendering
|
|
|
|
|
*/
|
|
|
|
|
export interface ColumnRenderContext {
|
|
|
|
|
currentWeek: Date;
|
|
|
|
|
config: CalendarConfig;
|
|
|
|
|
resourceData?: ResourceCalendarData | null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Date-based column renderer (original functionality)
|
|
|
|
|
*/
|
|
|
|
|
export class DateColumnRenderer implements ColumnRenderer {
|
2025-08-20 21:38:54 +02:00
|
|
|
private dateCalculator!: DateCalculator;
|
2025-08-18 23:42:03 +02:00
|
|
|
|
2025-08-07 00:26:33 +02:00
|
|
|
render(columnContainer: HTMLElement, context: ColumnRenderContext): void {
|
2025-08-07 00:15:44 +02:00
|
|
|
const { currentWeek, config } = context;
|
|
|
|
|
|
2025-08-18 23:42:03 +02:00
|
|
|
// Initialize date calculator
|
|
|
|
|
this.dateCalculator = new DateCalculator(config);
|
|
|
|
|
|
|
|
|
|
const dates = this.dateCalculator.getWorkWeekDates(currentWeek);
|
2025-08-09 01:16:04 +02:00
|
|
|
const dateSettings = config.getDateViewSettings();
|
|
|
|
|
const daysToShow = dates.slice(0, dateSettings.weekDays);
|
2025-08-07 00:15:44 +02:00
|
|
|
|
|
|
|
|
console.log('DateColumnRenderer: About to render', daysToShow.length, 'date columns');
|
|
|
|
|
|
|
|
|
|
daysToShow.forEach((date) => {
|
|
|
|
|
const column = document.createElement('swp-day-column');
|
2025-08-18 23:42:03 +02:00
|
|
|
(column as any).dataset.date = this.dateCalculator.formatISODate(date);
|
2025-08-07 00:15:44 +02:00
|
|
|
|
|
|
|
|
const eventsLayer = document.createElement('swp-events-layer');
|
|
|
|
|
column.appendChild(eventsLayer);
|
|
|
|
|
|
2025-08-07 00:26:33 +02:00
|
|
|
columnContainer.appendChild(column);
|
2025-08-07 00:15:44 +02:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Resource-based column renderer
|
|
|
|
|
*/
|
|
|
|
|
export class ResourceColumnRenderer implements ColumnRenderer {
|
2025-08-07 00:26:33 +02:00
|
|
|
render(columnContainer: HTMLElement, context: ColumnRenderContext): void {
|
2025-08-07 00:15:44 +02:00
|
|
|
const { resourceData } = context;
|
|
|
|
|
|
|
|
|
|
if (!resourceData) {
|
|
|
|
|
console.warn('ResourceColumnRenderer: No resource data available for resource columns');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
console.log('ResourceColumnRenderer: About to render', resourceData.resources.length, 'resource columns');
|
|
|
|
|
|
|
|
|
|
resourceData.resources.forEach((resource) => {
|
|
|
|
|
const column = document.createElement('swp-resource-column');
|
|
|
|
|
(column as any).dataset.resource = resource.name;
|
|
|
|
|
(column as any).dataset.employeeId = resource.employeeId;
|
|
|
|
|
(column as any).dataset.date = resourceData.date;
|
|
|
|
|
|
|
|
|
|
const eventsLayer = document.createElement('swp-events-layer');
|
|
|
|
|
column.appendChild(eventsLayer);
|
|
|
|
|
|
2025-08-07 00:26:33 +02:00
|
|
|
columnContainer.appendChild(column);
|
2025-08-07 00:15:44 +02:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|