Skip to content

Commit 622ae1d

Browse files
authored
Merge pull request #2025 from adumesny/master
v6 mouse events and React
2 parents 47b3992 + 3da1c37 commit 622ae1d

File tree

4 files changed

+26
-18
lines changed

4 files changed

+26
-18
lines changed

demo/float.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ <h1>Float grid demo</h1>
2424
<script type="text/javascript">
2525
let grid = GridStack.init({
2626
float: true,
27+
// disableResize: true, // TEST no resizing, but dragging
2728
resizable: { handles: 'all'} // do all sides for testing
2829
});
2930
addEvents(grid);

src/dd-gridstack.ts

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -444,9 +444,11 @@ GridStack.setupDragIn = function(this: GridStack, _dragIn?: string, _dragInOptio
444444
/** @internal prepares the element for drag&drop **/
445445
GridStack.prototype._prepareDragDropByNode = function(this: GridStack, node: GridStackNode): GridStack {
446446
let el = node.el;
447+
const noMove = node.noMove || this.opts.disableDrag;
448+
const noResize = node.noResize || this.opts.disableResize;
447449

448450
// check for disabled grid first
449-
if (this.opts.staticGrid || ((node.noMove || this.opts.disableDrag) && (node.noResize || this.opts.disableResize))) {
451+
if (this.opts.staticGrid || (noMove && noResize)) {
450452
if (node._initDD) {
451453
this._removeDD(el); // nukes everything instead of just disable, will add some styles back next
452454
delete node._initDD;
@@ -537,20 +539,8 @@ GridStack.prototype._prepareDragDropByNode = function(this: GridStack, node: Gri
537539
}
538540

539541
// finally fine tune move vs resize by disabling any part...
540-
if (node.noMove || this.opts.disableDrag) {
541-
dd.draggable(el, 'disable');
542-
el.classList.add('ui-draggable-disabled');
543-
} else {
544-
dd.draggable(el, 'enable');
545-
el.classList.remove('ui-draggable-disabled');
546-
}
547-
if (node.noResize || this.opts.disableResize) {
548-
dd.resizable(el, 'disable');
549-
el.classList.add('ui-resizable-disabled');
550-
} else {
551-
dd.resizable(el, 'enable');
552-
el.classList.remove('ui-resizable-disabled');
553-
}
542+
dd.draggable(el, noMove ? 'disable' : 'enable')
543+
.resizable(el, noResize ? 'disable' : 'enable');
554544

555545
return this;
556546
}

src/dd-manager.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import { DDDraggable } from './dd-draggable';
77
import { DDDroppable } from './dd-droppable';
8+
import { DDResizable } from './dd-resizable';
89

910
/**
1011
* globals that are shared across Drag & Drop instances
@@ -18,4 +19,8 @@ export class DDManager {
1819

1920
/** item we are currently over as drop target */
2021
public static dropElement: DDDroppable;
22+
23+
/** current item we're over for resizing purpose (ignore nested grid resize handles) */
24+
public static overResizeElement: DDResizable;
25+
2126
}

src/dd-resizable.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import { DDResizableHandle } from './dd-resizable-handle';
77
import { DDBaseImplement, HTMLElementExtendOpt } from './dd-base-impl';
88
import { Utils } from './utils';
99
import { DDUIData, Rect, Size } from './types';
10+
import { DDManager } from './dd-manager';
11+
12+
// import { GridItemHTMLElement } from './types'; let count = 0; // TEST
1013

1114
// TODO: merge with DDDragOpt
1215
export interface DDResizableOpt {
@@ -72,12 +75,14 @@ export class DDResizable extends DDBaseImplement implements HTMLElementExtendOpt
7275
super.enable();
7376
this.el.classList.add('ui-resizable');
7477
this.el.classList.remove('ui-resizable-disabled');
78+
this._setupAutoHide(this.option.autoHide);
7579
}
7680

7781
public disable(): void {
7882
super.disable();
7983
this.el.classList.add('ui-resizable-disabled');
8084
this.el.classList.remove('ui-resizable');
85+
this._setupAutoHide(false);
8186
}
8287

8388
public destroy(): void {
@@ -106,7 +111,7 @@ export class DDResizable extends DDBaseImplement implements HTMLElementExtendOpt
106111
protected _setupAutoHide(auto: boolean): DDResizable {
107112
if (auto) {
108113
this.el.classList.add('ui-resizable-autohide');
109-
// use mouseover/mouseout instead of mouseenter/mouseleave to get better performance;
114+
// use mouseover and not mouseenter to get better performance and track for nested cases
110115
this.el.addEventListener('mouseover', this._mouseOver);
111116
this.el.addEventListener('mouseout', this._mouseOut);
112117
} else {
@@ -119,14 +124,21 @@ export class DDResizable extends DDBaseImplement implements HTMLElementExtendOpt
119124

120125
/** @internal */
121126
protected _mouseOver(e: Event) {
127+
// console.log(`${count++} pre-enter ${(this.el as GridItemHTMLElement).gridstackNode._id}`)
128+
// already over a child, ignore. Ideally we just call e.stopPropagation() but see https://github.com/gridstack/gridstack.js/issues/2018
129+
if (DDManager.overResizeElement || DDManager.dragElement) return;
130+
DDManager.overResizeElement = this;
131+
// console.log(`${count++} enter ${(this.el as GridItemHTMLElement).gridstackNode._id}`)
122132
this.el.classList.remove('ui-resizable-autohide');
123-
e.stopPropagation();
124133
}
125134

126135
/** @internal */
127136
protected _mouseOut(e: Event) {
137+
// console.log(`${count++} pre-leave ${(this.el as GridItemHTMLElement).gridstackNode._id}`)
138+
if (DDManager.overResizeElement !== this) return;
139+
delete DDManager.overResizeElement;
140+
// console.log(`${count++} leave ${(this.el as GridItemHTMLElement).gridstackNode._id}`)
128141
this.el.classList.add('ui-resizable-autohide');
129-
e.stopPropagation();
130142
}
131143

132144
/** @internal */

0 commit comments

Comments
 (0)