/** * ColumnDetectionUtils - Shared utility for column detection and caching * Used by both DragDropManager and AllDayManager for consistent column detection */ import { MousePosition } from "../types/DragDropTypes"; export interface ColumnBounds { date: string; left: number; right: number; boundingClientRect: DOMRect, element : HTMLElement, index: number } export class ColumnDetectionUtils { private static columnBoundsCache: ColumnBounds[] = []; /** * Update column bounds cache for coordinate-based column detection */ public static updateColumnBoundsCache(): void { // Reset cache this.columnBoundsCache = []; // Find alle kolonner const columns = document.querySelectorAll('swp-day-column'); let index = 0; // Cache hver kolonnes x-grænser columns.forEach(column => { const rect = column.getBoundingClientRect(); const date = (column as HTMLElement).dataset.date; if (date) { this.columnBoundsCache.push({ boundingClientRect : rect, element: column as HTMLElement, date, left: rect.left, right: rect.right, index: index++ }); } }); // Sorter efter x-position (fra venstre til højre) this.columnBoundsCache.sort((a, b) => a.left - b.left); } /** * Get column date from X coordinate using cached bounds */ public static getColumnBounds(position: MousePosition): ColumnBounds | null{ if (this.columnBoundsCache.length === 0) { this.updateColumnBoundsCache(); } // Find den kolonne hvor x-koordinaten er indenfor grænserne let column = this.columnBoundsCache.find(col => position.x >= col.left && position.x <= col.right ); if (column) return column; return null; } /** * Clear cache (useful for testing or when DOM structure changes) */ public static clearCache(): void { this.columnBoundsCache = []; } /** * Get current cache for debugging */ public static getCache(): ColumnBounds[] { return [...this.columnBoundsCache]; } }