diff --git a/src/managers/NavigationButtonsManager.ts b/src/components/NavigationButtons.ts similarity index 98% rename from src/managers/NavigationButtonsManager.ts rename to src/components/NavigationButtons.ts index a5bed98..9901000 100644 --- a/src/managers/NavigationButtonsManager.ts +++ b/src/components/NavigationButtons.ts @@ -23,7 +23,7 @@ import { CoreEvents } from '../constants/CoreEvents'; * ============ * - NavigationManager: Performs actual navigation logic (animations, grid updates, week calculations) */ -export class NavigationButtonsManager { +export class NavigationButtons { private eventBus: IEventBus; private buttonListeners: Map = new Map(); diff --git a/src/managers/ViewSelectorManager.ts b/src/components/ViewSelector.ts similarity index 99% rename from src/managers/ViewSelectorManager.ts rename to src/components/ViewSelector.ts index 77b2340..a82f912 100644 --- a/src/managers/ViewSelectorManager.ts +++ b/src/components/ViewSelector.ts @@ -32,7 +32,7 @@ import { Configuration } from '../configurations/CalendarConfig'; * - GridRenderer: Uses view parameter (currently only supports 'week') * - Future: DayRenderer, MonthRenderer when implemented */ -export class ViewSelectorManager { +export class ViewSelector { private eventBus: IEventBus; private config: Configuration; private buttonListeners: Map = new Map(); diff --git a/src/managers/WorkweekPresetsManager.ts b/src/components/WorkweekPresets.ts similarity index 98% rename from src/managers/WorkweekPresetsManager.ts rename to src/components/WorkweekPresets.ts index 7d82d61..1a1a99c 100644 --- a/src/managers/WorkweekPresetsManager.ts +++ b/src/components/WorkweekPresets.ts @@ -30,7 +30,7 @@ import { WORK_WEEK_PRESETS, Configuration } from '../configurations/CalendarConf * - CalendarManager: Relays to header update (via workweek:header-update) * - HeaderManager: Updates date headers */ -export class WorkweekPresetsManager { +export class WorkweekPresets { private eventBus: IEventBus; private config: Configuration; private buttonListeners: Map = new Map(); diff --git a/src/index.ts b/src/index.ts index 08eda9d..8d88d2b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,15 +12,15 @@ import { EventRenderingService } from './renderers/EventRendererManager'; import { GridManager } from './managers/GridManager'; import { ScrollManager } from './managers/ScrollManager'; import { NavigationManager } from './managers/NavigationManager'; -import { NavigationButtonsManager } from './managers/NavigationButtonsManager'; -import { ViewSelectorManager } from './managers/ViewSelectorManager'; +import { NavigationButtons } from './components/NavigationButtons'; +import { ViewSelector } from './components/ViewSelector'; import { CalendarManager } from './managers/CalendarManager'; import { DragDropManager } from './managers/DragDropManager'; import { AllDayManager } from './managers/AllDayManager'; import { ResizeHandleManager } from './managers/ResizeHandleManager'; import { EdgeScrollManager } from './managers/EdgeScrollManager'; import { HeaderManager } from './managers/HeaderManager'; -import { WorkweekPresetsManager } from './managers/WorkweekPresetsManager'; +import { WorkweekPresets } from './components/WorkweekPresets'; // Import repositories and storage import { IEventRepository } from './repositories/IEventRepository'; @@ -125,15 +125,15 @@ async function initializeCalendar(): Promise { builder.registerType(GridManager).as(); builder.registerType(ScrollManager).as(); builder.registerType(NavigationManager).as(); - builder.registerType(NavigationButtonsManager).as(); - builder.registerType(ViewSelectorManager).as(); + builder.registerType(NavigationButtons).as(); + builder.registerType(ViewSelector).as(); builder.registerType(DragDropManager).as(); builder.registerType(AllDayManager).as(); builder.registerType(ResizeHandleManager).as(); builder.registerType(EdgeScrollManager).as(); builder.registerType(HeaderManager).as(); builder.registerType(CalendarManager).as(); - builder.registerType(WorkweekPresetsManager).as(); + builder.registerType(WorkweekPresets).as(); builder.registerType(ConfigManager).as(); builder.registerType(EventManager).as(); @@ -148,13 +148,13 @@ async function initializeCalendar(): Promise { const resizeHandleManager = app.resolveType(); const headerManager = app.resolveType(); const dragDropManager = app.resolveType(); - const viewSelectorManager = app.resolveType(); + const viewSelectorManager = app.resolveType(); const navigationManager = app.resolveType(); - const navigationButtonsManager = app.resolveType(); + const navigationButtonsManager = app.resolveType(); const edgeScrollManager = app.resolveType(); const allDayManager = app.resolveType(); const urlManager = app.resolveType(); - const workweekPresetsManager = app.resolveType(); + const workweekPresetsManager = app.resolveType(); const configManager = app.resolveType(); // Initialize managers diff --git a/src/managers/AllDayManager.ts b/src/managers/AllDayManager.ts index 632190c..e796d19 100644 --- a/src/managers/AllDayManager.ts +++ b/src/managers/AllDayManager.ts @@ -9,6 +9,7 @@ import { ICalendarEvent } from '../types/CalendarTypes'; import { SwpAllDayEventElement } from '../elements/SwpEventElement'; import { IDragMouseEnterHeaderEventPayload, + IDragMouseEnterColumnEventPayload, IDragStartEventPayload, IDragMoveEventPayload, IDragEndEventPayload, @@ -107,12 +108,45 @@ export class AllDayManager { }); eventBus.on('drag:end', (event) => { - let draggedElement: IDragEndEventPayload = (event as CustomEvent).detail; + let dragEndPayload: IDragEndEventPayload = (event as CustomEvent).detail; - if (draggedElement.target != 'swp-day-header') // we are not inside the swp-day-header, so just ignore. + console.log('🎯 AllDayManager: drag:end received', { + target: dragEndPayload.target, + originalElementTag: dragEndPayload.originalElement?.tagName, + hasAllDayAttribute: dragEndPayload.originalElement?.hasAttribute('data-allday'), + eventId: dragEndPayload.originalElement?.dataset.eventId + }); + + // Handle all-day → all-day drops (within header) + if (dragEndPayload.target === 'swp-day-header') { + console.log('✅ AllDayManager: Handling all-day → all-day drop'); + this.handleDragEnd(dragEndPayload); return; + } - this.handleDragEnd(draggedElement); + // Handle all-day → timed conversion (dropped in column) + if (dragEndPayload.target === 'swp-day-column' && dragEndPayload.originalElement?.hasAttribute('data-allday')) { + const eventId = dragEndPayload.originalElement.dataset.eventId; + + console.log('🔄 AllDayManager: All-day → timed conversion', { + eventId, + currentLayoutsCount: this.currentLayouts.length, + layoutsBeforeFilter: this.currentLayouts.map(l => l.calenderEvent.id) + }); + + // Remove event from currentLayouts since it's now a timed event + this.currentLayouts = this.currentLayouts.filter( + layout => layout.calenderEvent.id !== eventId + ); + + console.log('📊 AllDayManager: After filter', { + currentLayoutsCount: this.currentLayouts.length, + layoutsAfterFilter: this.currentLayouts.map(l => l.calenderEvent.id) + }); + + // Recalculate and animate header height + this.checkAndAnimateAllDayHeight(); + } }); // Listen for drag cancellation to recalculate height @@ -189,6 +223,15 @@ export class AllDayManager { * Check current all-day events and animate to correct height */ public checkAndAnimateAllDayHeight(): void { + console.log('📏 AllDayManager: checkAndAnimateAllDayHeight called', { + currentLayoutsCount: this.currentLayouts.length, + layouts: this.currentLayouts.map(l => ({ + id: l.calenderEvent.id, + row: l.row, + title: l.calenderEvent.title + })) + }); + // Calculate required rows - 0 if no events (will collapse) let maxRows = 0; @@ -205,6 +248,12 @@ export class AllDayManager { } + console.log('📊 AllDayManager: Height calculation', { + maxRows, + currentLayoutsLength: this.currentLayouts.length, + isExpanded: this.isExpanded + }); + // Store actual row count this.actualRowCount = maxRows; @@ -233,6 +282,12 @@ export class AllDayManager { this.clearOverflowIndicators(); } + console.log('🎬 AllDayManager: Will animate to', { + displayRows, + maxRows, + willAnimate: displayRows !== this.actualRowCount + }); + // Animate to required rows (0 = collapse, >0 = expand) this.animateToRows(displayRows); } @@ -339,6 +394,9 @@ export class AllDayManager { ColumnDetectionUtils.updateColumnBoundsCache(); + // Recalculate height after adding all-day event + this.checkAndAnimateAllDayHeight(); + }