wip
This commit is contained in:
parent
88702e574a
commit
89e8a3f7b2
6 changed files with 137 additions and 198 deletions
|
|
@ -26,25 +26,32 @@ export interface EventRendererStrategy {
|
|||
handleColumnChange?(payload: DragColumnChangeEventPayload): void;
|
||||
handleNavigationCompleted?(): void;
|
||||
}
|
||||
// Abstract methods that subclasses must implement
|
||||
// private getColumns(container: HTMLElement): HTMLElement[];
|
||||
// private getEventsForColumn(column: HTMLElement, events: CalendarEvent[]): CalendarEvent[];
|
||||
|
||||
|
||||
/**
|
||||
* Base class for event renderers with common functionality
|
||||
* Date-based event renderer
|
||||
*/
|
||||
export abstract class BaseEventRenderer implements EventRendererStrategy {
|
||||
protected dateCalculator: DateCalculator;
|
||||
export class DateEventRenderer implements EventRendererStrategy {
|
||||
|
||||
// Drag and drop state
|
||||
private draggedClone: HTMLElement | null = null;
|
||||
private originalEvent: HTMLElement | null = null;
|
||||
|
||||
// Resize manager
|
||||
|
||||
constructor(dateCalculator?: DateCalculator) {
|
||||
|
||||
if (!dateCalculator) {
|
||||
DateCalculator.initialize(calendarConfig);
|
||||
}
|
||||
this.dateCalculator = dateCalculator || new DateCalculator();
|
||||
|
||||
|
||||
this.setupDragEventListeners();
|
||||
}
|
||||
private dateCalculator: DateCalculator;
|
||||
|
||||
private draggedClone: HTMLElement | null = null;
|
||||
private originalEvent: HTMLElement | null = null;
|
||||
|
||||
|
||||
// ============================================
|
||||
// NEW OVERLAP DETECTION SYSTEM
|
||||
|
|
@ -96,10 +103,7 @@ export abstract class BaseEventRenderer implements EventRendererStrategy {
|
|||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Apply common drag styling to an element
|
||||
*/
|
||||
|
||||
private applyDragStyling(element: HTMLElement): void {
|
||||
element.classList.add('dragging');
|
||||
}
|
||||
|
|
@ -127,8 +131,8 @@ export abstract class BaseEventRenderer implements EventRendererStrategy {
|
|||
// Snap to interval
|
||||
const snappedStartMinutes = Math.round(actualStartMinutes / snapInterval) * snapInterval;
|
||||
|
||||
|
||||
if(!clone.dataset.originalDuration)
|
||||
|
||||
if (!clone.dataset.originalDuration)
|
||||
throw new DOMException("missing clone.dataset.originalDuration")
|
||||
|
||||
const endTotalMinutes = snappedStartMinutes + parseInt(clone.dataset.originalDuration);
|
||||
|
|
@ -153,7 +157,7 @@ export abstract class BaseEventRenderer implements EventRendererStrategy {
|
|||
this.draggedClone = payload.draggedClone;
|
||||
|
||||
if (this.draggedClone) {
|
||||
// Apply drag styling
|
||||
// Apply drag styling
|
||||
this.applyDragStyling(this.draggedClone);
|
||||
|
||||
// Add to current column's events layer (not directly to column)
|
||||
|
|
@ -296,7 +300,7 @@ export abstract class BaseEventRenderer implements EventRendererStrategy {
|
|||
|
||||
// Fade out original
|
||||
// TODO: this should be changed into a subscriber which only after a succesful placement is fired, not just mouseup as this can remove elements that are not placed.
|
||||
this.fadeOutAndRemove(originalElement);
|
||||
this.fadeOutAndRemove(originalElement);
|
||||
|
||||
// Remove clone prefix and normalize clone to be a regular event
|
||||
const cloneId = draggedClone.dataset.eventId;
|
||||
|
|
@ -452,17 +456,14 @@ export abstract class BaseEventRenderer implements EventRendererStrategy {
|
|||
});
|
||||
}
|
||||
|
||||
// Abstract methods that subclasses must implement
|
||||
protected abstract getColumns(container: HTMLElement): HTMLElement[];
|
||||
protected abstract getEventsForColumn(column: HTMLElement, events: CalendarEvent[]): CalendarEvent[];
|
||||
|
||||
|
||||
protected renderEvent(event: CalendarEvent): HTMLElement {
|
||||
private renderEvent(event: CalendarEvent): HTMLElement {
|
||||
const swpEvent = SwpEventElement.fromCalendarEvent(event);
|
||||
const eventElement = swpEvent.getElement();
|
||||
|
||||
// Setup resize handles on first mouseover only
|
||||
eventElement.addEventListener('mouseover', () => {
|
||||
eventElement.addEventListener('mouseover', () => { // TODO: This is not the correct way... we should not add eventlistener on every event
|
||||
if (eventElement.dataset.hasResizeHandlers !== 'true') {
|
||||
eventElement.dataset.hasResizeHandlers = 'true';
|
||||
}
|
||||
|
|
@ -544,16 +545,7 @@ export abstract class BaseEventRenderer implements EventRendererStrategy {
|
|||
element.style.minWidth = '50px';
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Date-based event renderer
|
||||
*/
|
||||
export class DateEventRenderer extends BaseEventRenderer {
|
||||
constructor(dateCalculator?: DateCalculator) {
|
||||
super(dateCalculator);
|
||||
this.setupDragEventListeners();
|
||||
}
|
||||
|
||||
/**
|
||||
* Setup drag event listeners - placeholder method
|
||||
|
|
@ -585,32 +577,3 @@ export class DateEventRenderer extends BaseEventRenderer {
|
|||
return columnEvents;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Resource-based event renderer
|
||||
*/
|
||||
export class ResourceEventRenderer extends BaseEventRenderer {
|
||||
protected getColumns(container: HTMLElement): HTMLElement[] {
|
||||
const columns = container.querySelectorAll('swp-resource-column');
|
||||
return Array.from(columns) as HTMLElement[];
|
||||
}
|
||||
|
||||
protected getEventsForColumn(column: HTMLElement, events: CalendarEvent[]): CalendarEvent[] {
|
||||
const resourceName = column.dataset.resource;
|
||||
if (!resourceName) return [];
|
||||
|
||||
const columnEvents = events.filter(event => {
|
||||
return event.resource?.name === resourceName;
|
||||
});
|
||||
|
||||
return columnEvents;
|
||||
}
|
||||
|
||||
// ============================================
|
||||
// NEW OVERLAP DETECTION SYSTEM
|
||||
// All new functions prefixed with new_
|
||||
// ============================================
|
||||
|
||||
protected overlapDetector = new OverlapDetector();
|
||||
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue