Skip to content

Commit 4f6ae38

Browse files
author
Alain Dumesny
committed
more change event fixes
* pass the original nodes for addEvent/removeEvent instead of clones * _triggerChangeEvent() no longer forced called (with no data, what's the point ?) * commit() calls remove, added, change in that order * updated more samples - use batch calls (the difference in callbacks noise of 0.5.5 vs this code is UDGE for serialize.html as an example) * fixed error when dragging add item over the trash, and then over second grid
1 parent 463193f commit 4f6ae38

File tree

9 files changed

+53
-28
lines changed

9 files changed

+53
-28
lines changed

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,16 +63,16 @@ Using gridstack.js with jQuery UI
6363

6464
```html
6565
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/gridstack@0.5.5/dist/gridstack.min.css" />
66-
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/gridstack@0.5.5/dist/gridstack.all.js"></script>
66+
<script src="https://cdn.jsdelivr.net/npm/gridstack@0.5.5/dist/gridstack.all.js"></script>
6767
```
6868

6969
* Using CDN (debug):
7070

7171
```html
7272
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/gridstack@0.5.5/dist/gridstack.css" />
73-
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/gridstack@0.5.5/dist/gridstack.js"></script>
74-
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/gridstack@0.5.5/dist/jquery-ui.js"></script>
75-
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/gridstack@0.5.5/dist/gridstack.jQueryUI.js"></script>
73+
<script src="https://cdn.jsdelivr.net/npm/gridstack@0.5.5/dist/gridstack.js"></script>
74+
<script src="https://cdn.jsdelivr.net/npm/gridstack@0.5.5/dist/jquery-ui.js"></script>
75+
<script src="https://cdn.jsdelivr.net/npm/gridstack@0.5.5/dist/gridstack.jQueryUI.js"></script>
7676
```
7777

7878
* or local:

demo/advance.html

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ <h1>Advanced Demo</h1>
5353
</div>
5454
</div>
5555
<div class="col-sm-12 col-md-10">
56-
<div class="grid-stack" id="advanced-grid" data-gs-width="12" data-gs-animate="yes">
56+
<div class="grid-stack" id="advanced-grid" data-gs-animate="yes">
5757
<div class="grid-stack-item" data-gs-x="0" data-gs-y="0" data-gs-width="4" data-gs-height="2">
5858
<div class="grid-stack-item-content">1</div>
5959
</div>
@@ -105,7 +105,19 @@ <h1>Advanced Demo</h1>
105105

106106
<script type="text/javascript">
107107
$(function () {
108-
$('#advanced-grid').gridstack({
108+
var $grid = $('#advanced-grid');
109+
110+
$grid.on('added', function(e, items) { log(' added ', items) });
111+
$grid.on('removed', function(e, items) { log(' removed ', items) });
112+
$grid.on('change', function(e, items) { log(' change ', items) });
113+
function log(type, items) {
114+
if (!items) { return; }
115+
var str = '';
116+
for (let i=0; i<items.length && items[i]; i++) { str += ' (x,y)=' + items[i].x + ',' + items[i].y; }
117+
console.log(type + items.length + ' items.' + str );
118+
}
119+
120+
$grid.gridstack({
109121
alwaysShowResizeHandle: /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
110122
navigator.userAgent
111123
),
@@ -116,6 +128,7 @@ <h1>Advanced Demo</h1>
116128
removeTimeout: 100,
117129
acceptWidgets: '.newWidget'
118130
});
131+
119132
$('.newWidget').draggable({
120133
revert: 'invalid',
121134
scroll: false,

demo/responsive.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,13 @@ <h1>Responsive grid demo</h1>
8585
this.grid = $('.grid-stack').data('gridstack');
8686

8787
this.loadGrid = function () {
88+
this.grid.batchUpdate();
8889
this.grid.removeAll();
8990
var items = GridStackUI.Utils.sort(this.serializedData);
9091
items.forEach(function (node, i) {
9192
this.grid.addWidget($('<div><div class="grid-stack-item-content">' + i + '</div></div>'), node);
9293
}.bind(this));
94+
this.grid.commit();
9395
return false;
9496
}.bind(this);
9597

demo/serialization.html

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,19 @@ <h1>Serialization demo</h1>
2727

2828
<script type="text/javascript">
2929
$(function () {
30-
var options = {
31-
};
32-
$('.grid-stack').gridstack(options);
30+
var $grid = $('.grid-stack');
31+
32+
$grid.on('added', function(e, items) { log(' added ', items) });
33+
$grid.on('removed', function(e, items) { log(' removed ', items) });
34+
$grid.on('change', function(e, items) { log(' change ', items) });
35+
function log(type, items) {
36+
if (!items) { return; }
37+
var str = '';
38+
for (let i=0; i<items.length && items[i]; i++) { str += ' (x,y)=' + items[i].x + ',' + items[i].y; }
39+
console.log(type + items.length + ' items.' + str );
40+
}
41+
42+
$grid.gridstack();
3343

3444
new function () {
3545
this.serializedData = [
@@ -46,11 +56,13 @@ <h1>Serialization demo</h1>
4656
this.grid = $('.grid-stack').data('gridstack');
4757

4858
this.loadGrid = function () {
59+
this.grid.batchUpdate();
4960
this.grid.removeAll();
5061
var items = GridStackUI.Utils.sort(this.serializedData);
5162
items.forEach(function (node) {
5263
this.grid.addWidget($('<div><div class="grid-stack-item-content"></div></div>'), node);
5364
}, this);
65+
this.grid.commit();
5466
return false;
5567
}.bind(this);
5668

demo/two.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,9 @@ <h1>Two grids demo</h1>
114114
$grid.on('removed', function(e, items) { log(id, ' removed ', items) });
115115
$grid.on('change', function(e, items) { log(id, ' change ', items) });
116116
function log(id, type, items) {
117+
if (!items) { return; }
117118
var str = '';
118-
for (let i=0; i<items.length; i++ ) { str += ' (x,y)=' + items[i].x + ',' + items[i].y /*+ ' ' + items[i].width + 'x' + items[i].height*/ }
119+
for (let i=0; i<items.length && items[i]; i++) { str += ' (x,y)=' + items[i].x + ',' + items[i].y; }
119120
console.log(id + type + items.length + ' items.' + str );
120121
}
121122

doc/CHANGES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ Change log
3131
- Allow percentage as a valid unit for height [#1093](https://github.com/gridstack/gridstack.js/pull/1093)
3232
- fixed callbacks to get either `added, removed, change` or combination if adding a node require also to change its (x,y) for example.
3333
Also you can now call `batchUpdate()` before calling a bunch of `addWidget()` and get a single event callback (more efficient).
34+
[#1096](https://github.com/gridstack/gridstack.js/pull/1096)
3435

3536
## v0.5.5 (2019-11-27)
3637

spec/e2e/html/column.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,11 @@ <h1>setColumn() grid demo</h1>
3737
{x: 2, y: 0, width: 2, height: 1},
3838
{x: 5, y: 0, width: 1, height: 1},
3939
];
40+
self.grid.batchUpdate();
4041
items.forEach(function (node, i) {
4142
self.grid.addWidget($('<div><div class="grid-stack-item-content">' + i + '</div></div>'), node);
4243
});
44+
self.grid.batchUpdate();
4345

4446
$('#1column').click(function() { self.grid.setColumn(1); });
4547
$('#2column').click(function() { self.grid.setColumn(2); });

spec/e2e/html/gridstack-with-height.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ <h1>gridstack.js tests</h1>
3535
];
3636

3737
this.grid = $('.grid-stack').data('gridstack');
38+
this.grid.batchUpdate();
3839
this.grid.removeAll();
3940
items = GridStackUI.Utils.sort(items);
4041
var id = 0;
@@ -43,6 +44,7 @@ <h1>gridstack.js tests</h1>
4344
w.attr('id', 'item-' + (++id));
4445
this.grid.addWidget(w, node);
4546
}, this);
47+
this.grid.commit();
4648
};
4749
});
4850
</script>

src/gridstack.js

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -877,7 +877,7 @@
877877
.on(trashZone, 'dropover', function(event, ui) {
878878
var el = $(ui.draggable);
879879
var node = el.data('_gridstack_node');
880-
if (node._grid !== self) {
880+
if (!node || node._grid !== self) {
881881
return;
882882
}
883883
el.data('inTrashZone', true);
@@ -886,7 +886,7 @@
886886
.on(trashZone, 'dropout', function(event, ui) {
887887
var el = $(ui.draggable);
888888
var node = el.data('_gridstack_node');
889-
if (node._grid !== self) {
889+
if (!node || node._grid !== self) {
890890
return;
891891
}
892892
el.data('inTrashZone', false);
@@ -1028,36 +1028,28 @@
10281028
}
10291029
};
10301030

1031-
GridStack.prototype._triggerChangeEvent = function(forceTrigger) {
1031+
GridStack.prototype._triggerChangeEvent = function(/*forceTrigger*/) {
10321032
if (this.grid._batchMode) { return; }
10331033
// TODO: compare original X,Y,W,H (or entire node?) instead as _dirty can be a temporary state
10341034
var elements = this.grid.getDirtyNodes();
1035-
var hasChanges = false;
1036-
1037-
var eventParams = []; // eventParams[0] has to be the list of items...
10381035
if (elements && elements.length) {
1039-
eventParams[0] = elements;
1040-
hasChanges = true;
1041-
}
1042-
1043-
if (hasChanges || forceTrigger === true) {
1044-
this.container.trigger('change', eventParams);
1036+
this.container.trigger('change', [elements]);
10451037
this.grid.cleanNodes(); // clear dirty flags now that we called
10461038
}
10471039
};
10481040

10491041
GridStack.prototype._triggerAddEvent = function() {
10501042
if (this.grid._batchMode) { return; }
10511043
if (this.grid._addedNodes && this.grid._addedNodes.length > 0) {
1052-
this.container.trigger('added', [this.grid._addedNodes.map(Utils.clone)]);
1044+
this.container.trigger('added', [this.grid._addedNodes]);
10531045
this.grid._addedNodes = [];
10541046
}
10551047
};
10561048

10571049
GridStack.prototype._triggerRemoveEvent = function() {
10581050
if (this.grid._batchMode) { return; }
10591051
if (this.grid._removedNodes && this.grid._removedNodes.length > 0) {
1060-
this.container.trigger('removed', [this.grid._removedNodes.map(Utils.clone)]);
1052+
this.container.trigger('removed', [this.grid._removedNodes]);
10611053
this.grid._removedNodes = [];
10621054
}
10631055
};
@@ -1319,13 +1311,13 @@
13191311
return;
13201312
}
13211313

1322-
var forceNotify = false;
1314+
// var forceNotify = false; what is the point of calling 'change' event with no data, when the 'removed' event is already called ?
13231315
self.placeholder.detach();
13241316
node.el = o;
13251317
self.placeholder.hide();
13261318

13271319
if (node._isAboutToRemove) {
1328-
forceNotify = true;
1320+
// forceNotify = true;
13291321
var gridToNotify = el.data('_gridstack_node')._grid;
13301322
gridToNotify._triggerRemoveEvent();
13311323
el.removeData('_gridstack_node');
@@ -1353,7 +1345,7 @@
13531345
}
13541346
}
13551347
self._updateContainerHeight();
1356-
self._triggerChangeEvent(forceNotify);
1348+
self._triggerChangeEvent(/*forceNotify*/);
13571349

13581350
self.grid.endUpdate();
13591351

@@ -1770,8 +1762,8 @@
17701762
GridStack.prototype.commit = function() {
17711763
this.grid.commit();
17721764
this._updateContainerHeight();
1773-
this._triggerAddEvent();
17741765
this._triggerRemoveEvent();
1766+
this._triggerAddEvent();
17751767
this._triggerChangeEvent();
17761768
};
17771769

0 commit comments

Comments
 (0)