Refactors drag and drop to use the original element as the source and introduces edge scrolling. This change aims to enhance the user experience during drag and drop operations by ensuring the correct element is used as the source, fixing issues, and by automatically scrolling the view when the dragged element reaches the edge of the scrollable area.
100 lines
No EOL
2.5 KiB
TypeScript
100 lines
No EOL
2.5 KiB
TypeScript
/**
|
|
* Type definitions for calendar events and drag operations
|
|
*/
|
|
|
|
import { ColumnBounds } from "../utils/ColumnDetectionUtils";
|
|
import { CalendarEvent } from "./CalendarTypes";
|
|
|
|
/**
|
|
* Drag Event Payload Interfaces
|
|
* Type-safe interfaces for drag and drop events
|
|
*/
|
|
|
|
// Common position interface
|
|
export interface MousePosition {
|
|
x: number;
|
|
y: number;
|
|
}
|
|
|
|
// Drag start event payload
|
|
export interface DragStartEventPayload {
|
|
originalElement: HTMLElement;
|
|
draggedClone: HTMLElement | null;
|
|
mousePosition: MousePosition;
|
|
mouseOffset: MousePosition;
|
|
columnBounds: ColumnBounds | null;
|
|
}
|
|
|
|
// Drag move event payload
|
|
export interface DragMoveEventPayload {
|
|
originalElement: HTMLElement;
|
|
draggedClone: HTMLElement;
|
|
mousePosition: MousePosition;
|
|
mouseOffset: MousePosition;
|
|
columnBounds: ColumnBounds | null;
|
|
snappedY: number;
|
|
}
|
|
|
|
// Drag end event payload
|
|
export interface DragEndEventPayload {
|
|
originalElement: HTMLElement;
|
|
draggedClone: HTMLElement | null;
|
|
mousePosition: MousePosition;
|
|
sourceColumn: ColumnBounds;
|
|
finalPosition: {
|
|
column: ColumnBounds | null; // Where drag ended
|
|
snappedY: number;
|
|
};
|
|
target: 'swp-day-column' | 'swp-day-header' | null;
|
|
}
|
|
|
|
// Drag mouse enter header event payload
|
|
export interface DragMouseEnterHeaderEventPayload {
|
|
targetColumn: ColumnBounds;
|
|
mousePosition: MousePosition;
|
|
originalElement: HTMLElement | null;
|
|
draggedClone: HTMLElement;
|
|
calendarEvent: CalendarEvent;
|
|
replaceClone: (newClone: HTMLElement) => void;
|
|
}
|
|
|
|
// Drag mouse leave header event payload
|
|
export interface DragMouseLeaveHeaderEventPayload {
|
|
targetDate: string | null;
|
|
mousePosition: MousePosition;
|
|
originalElement: HTMLElement| null;
|
|
draggedClone: HTMLElement| null;
|
|
}
|
|
|
|
// Drag mouse enter column event payload
|
|
export interface DragMouseEnterColumnEventPayload {
|
|
targetColumn: ColumnBounds;
|
|
mousePosition: MousePosition;
|
|
snappedY: number;
|
|
originalElement: HTMLElement | null;
|
|
draggedClone: HTMLElement;
|
|
calendarEvent: CalendarEvent;
|
|
replaceClone: (newClone: HTMLElement) => void;
|
|
}
|
|
|
|
// Drag column change event payload
|
|
export interface DragColumnChangeEventPayload {
|
|
originalElement: HTMLElement;
|
|
draggedClone: HTMLElement;
|
|
previousColumn: ColumnBounds | null;
|
|
newColumn: ColumnBounds;
|
|
mousePosition: MousePosition;
|
|
}
|
|
|
|
// Header ready event payload
|
|
export interface HeaderReadyEventPayload {
|
|
headerElements: ColumnBounds[];
|
|
|
|
}
|
|
|
|
// Resize end event payload
|
|
export interface ResizeEndEventPayload {
|
|
eventId: string;
|
|
element: HTMLElement;
|
|
finalHeight: number;
|
|
} |