Refactors all-day event layout calculation

Simplifies all-day event rendering by streamlining the layout
calculation and event placement process, using the AllDayLayoutEngine
to determine the grid positions. This removes deprecated methods
and improves overall code clarity.
This commit is contained in:
Janus C. H. Knudsen 2025-09-27 15:01:22 +02:00
parent 9dfd4574d8
commit 4141bffca4
7 changed files with 76 additions and 321 deletions

View file

@ -132,7 +132,10 @@ export class DragDropManager {
}
private handleMouseDown(event: MouseEvent): void {
this.isDragStarted = false;
// Clean up drag state first
this.cleanupDragState();
this.lastMousePosition = { x: event.clientX, y: event.clientY };
this.lastLoggedPosition = { x: event.clientX, y: event.clientY };
this.initialMousePosition = { x: event.clientX, y: event.clientY };
@ -274,11 +277,10 @@ export class DragDropManager {
if (this.draggedElement) {
// Store variables locally before cleanup
const draggedElement = this.draggedElement;
//const draggedElement = this.draggedElement;
const isDragStarted = this.isDragStarted;
// Clean up drag state first
this.cleanupDragState();
// Only emit drag:end if drag was actually started
@ -292,7 +294,7 @@ export class DragDropManager {
const dropTarget = this.detectDropTarget(mousePosition);
console.log('🎯 DragDropManager: Emitting drag:end', {
draggedElement: draggedElement.dataset.eventId,
draggedElement: this.draggedElement.dataset.eventId,
finalColumn: positionData.column,
finalY: positionData.snappedY,
dropTarget: dropTarget,
@ -300,19 +302,20 @@ export class DragDropManager {
});
const dragEndPayload: DragEndEventPayload = {
draggedElement: draggedElement,
draggedElement: this.draggedElement,
draggedClone : this.draggedClone,
mousePosition,
finalPosition: positionData,
target: dropTarget
};
this.eventBus.emit('drag:end', dragEndPayload);
draggedElement.remove();
this.draggedElement.remove(); // 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.
} else {
// This was just a click - emit click event instead
this.eventBus.emit('event:click', {
draggedElement: draggedElement,
draggedElement: this.draggedElement,
mousePosition: { x: event.clientX, y: event.clientY }
});
}
@ -540,13 +543,11 @@ export class DragDropManager {
* Detect drop target - whether dropped in swp-day-column or swp-day-header
*/
private detectDropTarget(position: Position): 'swp-day-column' | 'swp-day-header' | null {
const elementAtPosition = document.elementFromPoint(position.x, position.y);
if (!elementAtPosition) return null;
// Traverse up the DOM tree to find the target container
let currentElement = elementAtPosition as HTMLElement;
let currentElement = this.draggedClone;
while (currentElement && currentElement !== document.body) {
if (currentElement.tagName === 'SWP-DAY-HEADER') {
if (currentElement.tagName === 'SWP-ALLDAY-CONTAINER') {
return 'swp-day-header';
}
if (currentElement.tagName === 'SWP-DAY-COLUMN') {