Skip to content

Commit 1a93a64

Browse files
authored
chore: add Draggable init() and add more TS types in interactions (#920)
1 parent b672d96 commit 1a93a64

File tree

4 files changed

+56
-37
lines changed

4 files changed

+56
-37
lines changed

src/models/drag.interface.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
import type { SlickGrid } from '../slick.grid';
22

3+
export interface DragItem {
4+
dragSource: HTMLElement | Document | null;
5+
dragHandle: HTMLElement | null;
6+
deltaX: number;
7+
deltaY: number;
8+
range: DragRange;
9+
target: HTMLElement;
10+
startX: number;
11+
startY: number;
12+
}
13+
314
export interface DragPosition {
415
startX: number;
516
startY: number;

src/models/interactions.interface.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// --
22
// slick.interactions.ts
33

4+
import { DragPosition } from './drag.interface';
5+
46
export interface InteractionBase {
57
destroy: () => void;
68
}
@@ -15,24 +17,24 @@ export interface DraggableOption {
1517
allowDragFromClosest?: string;
1618

1719
/** drag initialized callback */
18-
onDragInit?: Function;
20+
onDragInit?: (e: DragEvent, dd: DragPosition) => boolean | void;
1921

2022
/** drag started callback */
21-
onDragStart?: Function;
23+
onDragStart?: (e: DragEvent, dd: DragPosition) => boolean | void;
2224

2325
/** drag callback */
24-
onDrag?: Function;
26+
onDrag?: (e: DragEvent, dd: DragPosition) => boolean | void;
2527

2628
/** drag ended callback */
27-
onDragEnd?: Function;
29+
onDragEnd?: (e: DragEvent, dd: DragPosition) => boolean | void;
2830
}
2931

3032
export interface MouseWheelOption {
3133
/** optional DOM element to attach mousewheel values, if undefined we'll attach it to the "window" object */
3234
element: HTMLElement | Document;
3335

3436
/** mousewheel callback */
35-
onMouseWheel?: Function;
37+
onMouseWheel?: (e: MouseEvent, delta: number, deltaX: number, deltaY: number) => boolean | void;
3638
}
3739

3840
export interface ResizableOption {
@@ -43,11 +45,11 @@ export interface ResizableOption {
4345
resizeableHandleElement: HTMLElement;
4446

4547
/** resize start callback */
46-
onResizeStart?: Function;
48+
onResizeStart?: (e: MouseEvent | Touch | TouchEvent, resizeElms: { resizeableElement: HTMLElement; }) => boolean | void;
4749

4850
/** resizing callback */
49-
onResize?: Function;
51+
onResize?: (e: MouseEvent | Touch | TouchEvent, resizeElms: { resizeableElement: HTMLElement; resizeableHandleElement: HTMLElement; }) => boolean | void;
5052

5153
/** resize ended callback */
52-
onResizeEnd?: Function;
54+
onResizeEnd?: (e: MouseEvent | Touch | TouchEvent, resizeElms: { resizeableElement: HTMLElement; }) => boolean | void;
5355
}

src/slick.grid.ts

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import type {
1010
CSSStyleDeclarationWritable,
1111
CustomDataView,
1212
DOMEvent,
13-
DOMMouseOrTouchEvent,
1413
DragPosition,
1514
DragRowMove,
1615
Editor,
@@ -1919,12 +1918,12 @@ export class SlickGrid<TData = any, C extends Column<TData> = Column<TData>, O e
19191918
Resizable({
19201919
resizeableElement: colElm as HTMLElement,
19211920
resizeableHandleElement: resizeableHandle,
1922-
onResizeStart: (e: DOMMouseOrTouchEvent<HTMLDivElement>, resizeElms: { resizeableElement: HTMLElement; }): boolean | void => {
1923-
const targetEvent = e.touches ? e.touches[0] : e;
1921+
onResizeStart: (e, resizeElms): boolean | void => {
1922+
const targetEvent = (e as TouchEvent).touches ? (e as TouchEvent).changedTouches[0] : e;
19241923
if (!this.getEditorLock()?.commitCurrentEdit()) {
19251924
return false;
19261925
}
1927-
pageX = targetEvent.pageX;
1926+
pageX = (targetEvent as MouseEvent).pageX;
19281927
frozenLeftColMaxWidth = 0;
19291928
resizeElms.resizeableElement.classList.add('slick-header-column-active');
19301929
let shrinkLeewayOnRight: number | null = null;
@@ -1985,11 +1984,11 @@ export class SlickGrid<TData = any, C extends Column<TData> = Column<TData>, O e
19851984
maxPageX = pageX + Math.min(shrinkLeewayOnRight, stretchLeewayOnLeft);
19861985
minPageX = pageX - Math.min(shrinkLeewayOnLeft, stretchLeewayOnRight);
19871986
},
1988-
onResize: (e: DOMMouseOrTouchEvent<HTMLDivElement>, resizeElms: { resizeableElement: HTMLElement; resizeableHandleElement: HTMLElement; }) => {
1989-
const targetEvent = e.touches ? e.touches[0] : e;
1987+
onResize: (e, resizeElms) => {
1988+
const targetEvent = (e as TouchEvent).touches ? (e as TouchEvent).changedTouches[0] : e;
19901989
this.columnResizeDragging = true;
19911990
let actualMinWidth;
1992-
const d = Math.min(maxPageX, Math.max(minPageX, targetEvent.pageX)) - pageX;
1991+
const d = Math.min(maxPageX, Math.max(minPageX, (targetEvent as MouseEvent).pageX)) - pageX;
19931992
let x;
19941993
let newCanvasWidthL = 0;
19951994
let newCanvasWidthR = 0;
@@ -2166,7 +2165,7 @@ export class SlickGrid<TData = any, C extends Column<TData> = Column<TData>, O e
21662165
resizeHandle: resizeElms.resizeableHandleElement
21672166
});
21682167
},
2169-
onResizeEnd: (_e: Event, resizeElms: { resizeableElement: HTMLElement; }) => {
2168+
onResizeEnd: (_e, resizeElms) => {
21702169
resizeElms.resizeableElement.classList.remove('slick-header-column-active');
21712170

21722171
const triggeredByColumn = resizeElms.resizeableElement.id.replace(this.uid, '');
@@ -4566,12 +4565,12 @@ export class SlickGrid<TData = any, C extends Column<TData> = Column<TData>, O e
45664565
this.cleanUpCells(range, row);
45674566
// Render missing cells.
45684567
cellsAdded = 0;
4569-
4568+
45704569
let metadata = (this.data as CustomDataView<TData>)?.getItemMetadata?.(row) ?? {} as ItemMetadata;
45714570
metadata = metadata?.columns as ItemMetadata;
4572-
4571+
45734572
const d = this.getDataItem(row);
4574-
4573+
45754574
// TODO: shorten this loop (index? heuristics? binary search?)
45764575
for (let i = 0, ii = this.columns.length; i < ii; i++) {
45774576
if (!this.columns[i] || this.columns[i].hidden) { continue; }
@@ -4643,7 +4642,7 @@ export class SlickGrid<TData = any, C extends Column<TData> = Column<TData>, O e
46434642
const rows: number[] = [];
46444643
let needToReselectCell = false;
46454644
const dataLength = this.getDataLength();
4646-
4645+
46474646
for (let i = range.top as number, ii = range.bottom as number; i <= ii; i++) {
46484647
if (this.rowsCache[i] || (this.hasFrozenRows && this._options.frozenBottom && i === this.getDataLength())) {
46494648
continue;
@@ -4680,7 +4679,7 @@ export class SlickGrid<TData = any, C extends Column<TData> = Column<TData>, O e
46804679

46814680
const x = document.createElement('div');
46824681
const xRight = document.createElement('div');
4683-
4682+
46844683
divArrayL.forEach(elm => x.appendChild(elm as HTMLElement));
46854684
divArrayR.forEach(elm => xRight.appendChild(elm as HTMLElement));
46864685

src/slick.interactions.ts

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { DraggableOption, MouseWheelOption, ResizableOption } from './models/index';
1+
import type { DragItem, DragPosition, DraggableOption, MouseWheelOption, ResizableOption } from './models/index';
22
import { Utils as Utils_ } from './slick.core';
33

44
// for (iife) load Slick methods from global Slick object, or use imports for (esm)
@@ -31,28 +31,32 @@ const Utils = IIFE_ONLY ? Slick.Utils : Utils_;
3131
export function Draggable(options: DraggableOption) {
3232
let { containerElement } = options;
3333
const { onDragInit, onDragStart, onDrag, onDragEnd } = options;
34-
let element: HTMLElement | null, startX: number, startY: number, deltaX: number, deltaY: number, dragStarted: boolean;
34+
let element: HTMLElement | null;
35+
let startX: number;
36+
let startY: number;
37+
let deltaX: number;
38+
let deltaY: number;
39+
let dragStarted: boolean;
3540

3641
if (!containerElement) {
37-
containerElement = document;
38-
}
39-
if (!containerElement || typeof containerElement.addEventListener !== 'function') {
40-
throw new Error('[Slick.Draggable] You did not provide a valid container html element that will be used for dragging.');
42+
containerElement = document.body;
4143
}
4244

43-
let originaldd: { dragSource: HTMLElement | Document | null, dragHandle: HTMLElement | null } = {
45+
let originaldd: Partial<DragItem> = {
4446
dragSource: containerElement,
4547
dragHandle: null,
4648
};
4749

48-
if (containerElement) {
49-
containerElement.addEventListener('mousedown', userPressed as EventListener);
50-
containerElement.addEventListener('touchstart', userPressed as EventListener);
50+
function init() {
51+
if (containerElement) {
52+
containerElement.addEventListener('mousedown', userPressed as EventListener);
53+
containerElement.addEventListener('touchstart', userPressed as EventListener);
54+
}
5155
}
5256

53-
function executeDragCallbackWhenDefined(callback?: Function, e?: MouseEvent | Touch | TouchEvent, dd?: any) {
57+
function executeDragCallbackWhenDefined(callback?: (e: DragEvent, dd: DragItem) => boolean | void, evt?: MouseEvent | Touch | TouchEvent, dd?: DragItem) {
5458
if (typeof callback === 'function') {
55-
callback(e, dd);
59+
callback(evt as DragEvent, dd as DragItem);
5660
}
5761
}
5862

@@ -76,7 +80,7 @@ export function Draggable(options: DraggableOption) {
7680
deltaX = targetEvent.clientX - targetEvent.clientX;
7781
deltaY = targetEvent.clientY - targetEvent.clientY;
7882
originaldd = Object.assign(originaldd, { deltaX, deltaY, startX, startY, target });
79-
executeDragCallbackWhenDefined(onDragInit as Function, event, originaldd);
83+
executeDragCallbackWhenDefined(onDragInit as (e: DragEvent, dd: DragPosition) => boolean | void, event, originaldd as DragItem);
8084

8185
document.body.addEventListener('mousemove', userMoved);
8286
document.body.addEventListener('touchmove', userMoved);
@@ -94,18 +98,18 @@ export function Draggable(options: DraggableOption) {
9498

9599
if (!dragStarted) {
96100
originaldd = Object.assign(originaldd, { deltaX, deltaY, startX, startY, target });
97-
executeDragCallbackWhenDefined(onDragStart, event, originaldd);
101+
executeDragCallbackWhenDefined(onDragStart, event, originaldd as DragItem);
98102
dragStarted = true;
99103
}
100104

101105
originaldd = Object.assign(originaldd, { deltaX, deltaY, startX, startY, target });
102-
executeDragCallbackWhenDefined(onDrag, event, originaldd);
106+
executeDragCallbackWhenDefined(onDrag, event, originaldd as DragItem);
103107
}
104108

105109
function userReleased(event: MouseEvent | TouchEvent) {
106110
const { target } = event;
107111
originaldd = Object.assign(originaldd, { target });
108-
executeDragCallbackWhenDefined(onDragEnd, event, originaldd);
112+
executeDragCallbackWhenDefined(onDragEnd, event, originaldd as DragItem);
109113
document.body.removeEventListener('mousemove', userMoved);
110114
document.body.removeEventListener('touchmove', userMoved);
111115
document.body.removeEventListener('mouseup', userReleased);
@@ -114,6 +118,9 @@ export function Draggable(options: DraggableOption) {
114118
dragStarted = false;
115119
}
116120

121+
// initialize Slick.MouseWheel by attaching mousewheel event
122+
init();
123+
117124
// public API
118125
return { destroy };
119126
}

0 commit comments

Comments
 (0)