Enables all-day event conversion via drag and drop
Allows users to drag timed events to the header area to convert them to all-day events. This also enables dragging all-day events to different days by updating the grid column position. A header mouseover detection is set up to emit the 'header:mouseover' event, handling both the timed event to all-day conversion and the all-day event movement to different days.
This commit is contained in:
parent
2c934a7a1a
commit
383eab7524
1 changed files with 128 additions and 0 deletions
|
|
@ -63,6 +63,84 @@ export abstract class BaseEventRenderer implements EventRendererStrategy {
|
||||||
const { eventId, targetDate, headerRenderer } = (event as CustomEvent).detail;
|
const { eventId, targetDate, headerRenderer } = (event as CustomEvent).detail;
|
||||||
this.handleConvertToAllDay(eventId, targetDate, headerRenderer);
|
this.handleConvertToAllDay(eventId, targetDate, headerRenderer);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Listen for header mouseover events (like original ColumnDetector)
|
||||||
|
eventBus.on('header:mouseover', (event) => {
|
||||||
|
const { element, targetDate, headerRenderer } = (event as CustomEvent).detail;
|
||||||
|
|
||||||
|
if (this.draggedClone && targetDate) {
|
||||||
|
// Scenario 1: Timed event being dragged to header - convert to all-day
|
||||||
|
if (this.draggedClone.tagName === 'SWP-EVENT') {
|
||||||
|
console.log('EventRenderer: Converting timed event to all-day for date:', targetDate);
|
||||||
|
headerRenderer.addToAllDay(element);
|
||||||
|
this.convertToAllDayPreview(targetDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scenario 2: All-day event being moved to different day
|
||||||
|
else if (this.draggedClone.tagName === 'SWP-ALLDAY-EVENT') {
|
||||||
|
const currentDate = this.draggedClone.parentElement?.getAttribute('data-date');
|
||||||
|
if (currentDate !== targetDate) {
|
||||||
|
console.log('EventRenderer: Moving all-day event from', currentDate, 'to', targetDate);
|
||||||
|
this.moveAllDayToNewDate(targetDate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Setup header mouseover detection for all-day conversion
|
||||||
|
this.setupHeaderMouseoverDetection();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup header mouseover detection during drag
|
||||||
|
*/
|
||||||
|
private setupHeaderMouseoverDetection(): void {
|
||||||
|
document.addEventListener('mouseover', (event) => {
|
||||||
|
if (!this.draggedClone) return; // Only during active drag
|
||||||
|
|
||||||
|
const target = event.target as HTMLElement;
|
||||||
|
|
||||||
|
// Check if mouse is over a day header
|
||||||
|
let dayHeader = target.closest('swp-day-header') as HTMLElement;
|
||||||
|
if (dayHeader) {
|
||||||
|
const targetDate = dayHeader.dataset.date;
|
||||||
|
if (targetDate && this.draggedClone.tagName === 'SWP-EVENT') {
|
||||||
|
console.log(`EventRenderer: Mouse over day header for date ${targetDate}`);
|
||||||
|
|
||||||
|
// Find the header renderer from the calendar header
|
||||||
|
const calendarHeader = dayHeader.closest('swp-calendar-header');
|
||||||
|
if (calendarHeader) {
|
||||||
|
// Emit header mouseover event like the original ColumnDetector did
|
||||||
|
eventBus.emit('header:mouseover', {
|
||||||
|
element: dayHeader,
|
||||||
|
targetDate: targetDate,
|
||||||
|
headerRenderer: this.getHeaderRenderer()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the header renderer instance for triggering addToAllDay
|
||||||
|
*/
|
||||||
|
private getHeaderRenderer(): any {
|
||||||
|
// For now, we'll create a simple object with the addToAllDay method
|
||||||
|
// This mimics what ColumnDetector had access to
|
||||||
|
return {
|
||||||
|
addToAllDay: (element: HTMLElement) => {
|
||||||
|
// Find the calendar header and call the HeaderRenderer's addToAllDay method
|
||||||
|
const calendarHeader = element.closest('swp-calendar-header') as HTMLElement;
|
||||||
|
if (calendarHeader) {
|
||||||
|
// Import and use HeaderRenderer directly
|
||||||
|
import('./HeaderRenderer').then(({ BaseHeaderRenderer }) => {
|
||||||
|
const headerRenderer = new BaseHeaderRenderer();
|
||||||
|
headerRenderer.addToAllDay(element);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -348,6 +426,56 @@ export abstract class BaseEventRenderer implements EventRendererStrategy {
|
||||||
element.remove();
|
element.remove();
|
||||||
}, 300);
|
}, 300);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert dragged clone to all-day event preview
|
||||||
|
*/
|
||||||
|
private convertToAllDayPreview(targetDate: string): void {
|
||||||
|
if (!this.draggedClone) return;
|
||||||
|
|
||||||
|
// Only convert once
|
||||||
|
if (this.draggedClone.tagName === 'SWP-ALLDAY-EVENT') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transform clone to all-day format
|
||||||
|
this.transformCloneToAllDay(this.draggedClone, targetDate);
|
||||||
|
|
||||||
|
console.log(`EventRenderer: Converted clone to all-day preview for ${targetDate}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Move all-day event to a new date container
|
||||||
|
*/
|
||||||
|
private moveAllDayToNewDate(targetDate: string): void {
|
||||||
|
if (!this.draggedClone) return;
|
||||||
|
|
||||||
|
const calendarHeader = document.querySelector('swp-calendar-header');
|
||||||
|
if (!calendarHeader) return;
|
||||||
|
|
||||||
|
// Find the all-day container
|
||||||
|
const allDayContainer = calendarHeader.querySelector('swp-allday-container');
|
||||||
|
if (!allDayContainer) return;
|
||||||
|
|
||||||
|
// Calculate new column index
|
||||||
|
const dayHeaders = document.querySelectorAll('swp-day-header');
|
||||||
|
let columnIndex = 1;
|
||||||
|
dayHeaders.forEach((header, index) => {
|
||||||
|
if ((header as HTMLElement).dataset.date === targetDate) {
|
||||||
|
columnIndex = index + 1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Update grid column position
|
||||||
|
(this.draggedClone as HTMLElement).style.gridColumn = columnIndex.toString();
|
||||||
|
|
||||||
|
// Move to all-day container if not already there
|
||||||
|
if (this.draggedClone.parentElement !== allDayContainer) {
|
||||||
|
allDayContainer.appendChild(this.draggedClone);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`EventRenderer: Moved all-day event to date ${targetDate}, column ${columnIndex}`);
|
||||||
|
}
|
||||||
renderEvents(events: CalendarEvent[], container: HTMLElement, config: CalendarConfig): void {
|
renderEvents(events: CalendarEvent[], container: HTMLElement, config: CalendarConfig): void {
|
||||||
console.log('BaseEventRenderer: renderEvents called with', events.length, 'events');
|
console.log('BaseEventRenderer: renderEvents called with', events.length, 'events');
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue