2025-09-12 00:36:02 +02:00
|
|
|
import { CalendarEvent } from '../types/CalendarTypes';
|
|
|
|
|
import { SwpAllDayEventElement } from '../elements/SwpEventElement';
|
2025-09-27 15:01:22 +02:00
|
|
|
import { EventLayout } from '../utils/AllDayLayoutEngine';
|
2025-10-01 21:27:13 +02:00
|
|
|
import { ColumnBounds } from '../utils/ColumnDetectionUtils';
|
|
|
|
|
import { EventManager } from '../managers/EventManager';
|
2025-10-02 23:11:26 +02:00
|
|
|
import { DragStartEventPayload } from '../types/EventTypes';
|
|
|
|
|
import { EventRendererStrategy } from './EventRenderer';
|
|
|
|
|
|
2025-09-12 00:36:02 +02:00
|
|
|
export class AllDayEventRenderer {
|
2025-10-02 23:11:26 +02:00
|
|
|
|
2025-09-13 00:39:56 +02:00
|
|
|
private container: HTMLElement | null = null;
|
2025-10-02 23:11:26 +02:00
|
|
|
private originalEvent: HTMLElement | null = null;
|
|
|
|
|
private draggedClone: HTMLElement | null = null;
|
2025-09-13 00:39:56 +02:00
|
|
|
|
|
|
|
|
constructor() {
|
|
|
|
|
this.getContainer();
|
|
|
|
|
}
|
|
|
|
|
|
2025-10-02 23:11:26 +02:00
|
|
|
|
2025-09-13 00:39:56 +02:00
|
|
|
private getContainer(): HTMLElement | null {
|
2025-09-27 15:01:22 +02:00
|
|
|
|
|
|
|
|
const header = document.querySelector('swp-calendar-header');
|
|
|
|
|
if (header) {
|
|
|
|
|
this.container = header.querySelector('swp-allday-container');
|
|
|
|
|
|
|
|
|
|
if (!this.container) {
|
|
|
|
|
this.container = document.createElement('swp-allday-container');
|
|
|
|
|
header.appendChild(this.container);
|
2025-09-13 00:39:56 +02:00
|
|
|
}
|
2025-09-27 15:01:22 +02:00
|
|
|
}
|
|
|
|
|
return this.container;
|
2025-10-02 23:11:26 +02:00
|
|
|
}
|
2025-09-27 15:01:22 +02:00
|
|
|
|
2025-10-02 23:11:26 +02:00
|
|
|
|
|
|
|
|
private getAllDayContainer(): HTMLElement | null {
|
|
|
|
|
return document.querySelector('swp-calendar-header swp-allday-container');
|
2025-09-13 00:39:56 +02:00
|
|
|
}
|
2025-10-02 23:11:26 +02:00
|
|
|
/**
|
|
|
|
|
* Handle drag start for all-day events
|
|
|
|
|
*/
|
|
|
|
|
public handleDragStart(payload: DragStartEventPayload): void {
|
|
|
|
|
|
|
|
|
|
this.originalEvent = payload.draggedElement;;
|
|
|
|
|
this.draggedClone = payload.draggedClone;
|
|
|
|
|
|
|
|
|
|
if (this.draggedClone) {
|
|
|
|
|
|
|
|
|
|
const container = this.getAllDayContainer();
|
|
|
|
|
if (!container) return;
|
|
|
|
|
|
|
|
|
|
this.draggedClone.style.gridColumn = this.originalEvent.style.gridColumn;
|
|
|
|
|
this.draggedClone.style.gridRow = this.originalEvent.style.gridRow;
|
|
|
|
|
console.log('handleDragStart:this.draggedClone', this.draggedClone);
|
|
|
|
|
container.appendChild(this.draggedClone);
|
|
|
|
|
|
|
|
|
|
// Add dragging style
|
|
|
|
|
this.draggedClone.classList.add('dragging');
|
|
|
|
|
this.draggedClone.style.zIndex = '1000';
|
|
|
|
|
this.draggedClone.style.cursor = 'grabbing';
|
|
|
|
|
|
|
|
|
|
// Make original semi-transparent
|
|
|
|
|
this.originalEvent.style.opacity = '0.3';
|
|
|
|
|
this.originalEvent.style.userSelect = 'none';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-13 00:39:56 +02:00
|
|
|
|
2025-09-17 22:08:27 +02:00
|
|
|
|
2025-09-13 00:39:56 +02:00
|
|
|
/**
|
2025-09-25 23:38:17 +02:00
|
|
|
* Render an all-day event with pre-calculated layout
|
2025-09-13 00:39:56 +02:00
|
|
|
*/
|
2025-10-01 21:27:13 +02:00
|
|
|
private renderAllDayEventWithLayout(
|
2025-09-25 23:38:17 +02:00
|
|
|
event: CalendarEvent,
|
2025-09-27 15:01:22 +02:00
|
|
|
layout: EventLayout
|
|
|
|
|
) {
|
2025-09-13 00:39:56 +02:00
|
|
|
const container = this.getContainer();
|
|
|
|
|
if (!container) return null;
|
|
|
|
|
|
2025-10-04 15:35:09 +02:00
|
|
|
const dayEvent = SwpAllDayEventElement.fromCalendarEvent(event);
|
|
|
|
|
dayEvent.applyGridPositioning(layout.row, layout.startColumn, layout.endColumn);
|
2025-09-27 15:01:22 +02:00
|
|
|
|
2025-10-04 15:35:09 +02:00
|
|
|
container.appendChild(dayEvent);
|
2025-09-13 00:39:56 +02:00
|
|
|
}
|
|
|
|
|
|
2025-09-25 23:38:17 +02:00
|
|
|
|
2025-09-13 00:39:56 +02:00
|
|
|
/**
|
|
|
|
|
* Remove an all-day event by ID
|
|
|
|
|
*/
|
|
|
|
|
public removeAllDayEvent(eventId: string): void {
|
|
|
|
|
const container = this.getContainer();
|
|
|
|
|
if (!container) return;
|
|
|
|
|
|
2025-09-21 16:03:34 +02:00
|
|
|
const eventElement = container.querySelector(`swp-event[data-event-id="${eventId}"]`);
|
2025-09-13 00:39:56 +02:00
|
|
|
if (eventElement) {
|
|
|
|
|
eventElement.remove();
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-09-12 00:36:02 +02:00
|
|
|
|
2025-09-13 00:39:56 +02:00
|
|
|
/**
|
|
|
|
|
* Clear cache when DOM changes
|
|
|
|
|
*/
|
|
|
|
|
public clearCache(): void {
|
|
|
|
|
this.container = null;
|
|
|
|
|
}
|
2025-10-01 21:27:13 +02:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Render all-day events for specific period using AllDayEventRenderer
|
|
|
|
|
*/
|
|
|
|
|
public renderAllDayEventsForPeriod(eventLayouts: EventLayout[]): void {
|
|
|
|
|
this.clearAllDayEvents();
|
|
|
|
|
|
|
|
|
|
eventLayouts.forEach(layout => {
|
|
|
|
|
this.renderAllDayEventWithLayout(layout.calenderEvent, layout);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
}
|
2025-10-02 23:11:26 +02:00
|
|
|
|
2025-10-01 21:27:13 +02:00
|
|
|
private clearAllDayEvents(): void {
|
|
|
|
|
const allDayContainer = document.querySelector('swp-allday-container');
|
|
|
|
|
if (allDayContainer) {
|
|
|
|
|
allDayContainer.querySelectorAll('swp-event').forEach(event => event.remove());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public handleViewChanged(event: CustomEvent): void {
|
|
|
|
|
this.clearAllDayEvents();
|
|
|
|
|
}
|
2025-09-12 00:36:02 +02:00
|
|
|
}
|