neo.mjs 8.12.0 → 8.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/apps/ServiceWorker.mjs +2 -2
  2. package/apps/colors/view/TableContainer.mjs +1 -1
  3. package/apps/covid/Util.mjs +9 -9
  4. package/apps/portal/index.html +1 -1
  5. package/apps/portal/view/home/FooterContainer.mjs +1 -1
  6. package/apps/realworld2/view/article/PreviewList.mjs +2 -2
  7. package/apps/sharedcovid/Util.mjs +2 -2
  8. package/examples/ServiceWorker.mjs +2 -2
  9. package/examples/grid/covid/Util.mjs +3 -3
  10. package/examples/grid/nestedRecordFields/Viewport.mjs +27 -4
  11. package/examples/table/container/MainContainer.mjs +4 -4
  12. package/examples/table/covid/Util.mjs +3 -3
  13. package/examples/table/nestedRecordFields/Viewport.mjs +2 -2
  14. package/package.json +2 -2
  15. package/resources/scss/src/draggable/DragProxyComponent.scss +4 -1
  16. package/resources/scss/src/draggable/grid/header/toolbar/SortZone.scss +25 -2
  17. package/src/DefaultConfig.mjs +2 -2
  18. package/src/Neo.mjs +1 -1
  19. package/src/calendar/view/YearComponent.mjs +2 -2
  20. package/src/calendar/view/month/Component.mjs +1 -1
  21. package/src/calendar/view/week/EventDragZone.mjs +32 -29
  22. package/src/calendar/view/week/plugin/DragDrop.mjs +21 -21
  23. package/src/component/Base.mjs +29 -61
  24. package/src/component/DateSelector.mjs +1 -1
  25. package/src/component/Gallery.mjs +1 -1
  26. package/src/component/Helix.mjs +1 -1
  27. package/src/data/Model.mjs +0 -8
  28. package/src/draggable/DragZone.mjs +11 -5
  29. package/src/draggable/grid/header/toolbar/SortZone.mjs +111 -0
  30. package/src/draggable/list/DragZone.mjs +2 -2
  31. package/src/draggable/tab/header/toolbar/SortZone.mjs +2 -2
  32. package/src/draggable/toolbar/DragZone.mjs +3 -3
  33. package/src/draggable/toolbar/SortZone.mjs +2 -2
  34. package/src/draggable/tree/DragZone.mjs +2 -2
  35. package/src/grid/Container.mjs +2 -18
  36. package/src/grid/View.mjs +59 -44
  37. package/src/grid/header/Button.mjs +7 -6
  38. package/src/grid/header/Toolbar.mjs +4 -8
  39. package/src/main/DomAccess.mjs +1 -1
  40. package/src/main/addon/AmCharts.mjs +28 -9
  41. package/src/main/mixin/DeltaUpdates.mjs +13 -7
  42. package/src/selection/grid/RowModel.mjs +59 -20
  43. package/src/selection/table/RowModel.mjs +57 -17
  44. package/src/table/View.mjs +18 -16
  45. package/src/table/header/Button.mjs +7 -6
@@ -488,7 +488,7 @@ class Component extends Base {
488
488
  * @param {String} value
489
489
  */
490
490
  addCls(value) {
491
- let cls = this.cls;
491
+ let {cls} = this;
492
492
 
493
493
  NeoArray.add(cls, value);
494
494
  this.cls = cls
@@ -526,6 +526,17 @@ class Component extends Base {
526
526
  return this.style = Object.assign(this.style, value)
527
527
  }
528
528
 
529
+ /**
530
+ * Add a new wrapperCls to the top level node
531
+ * @param {String} value
532
+ */
533
+ addWrapperCls(value) {
534
+ let {wrapperCls} = this;
535
+
536
+ NeoArray.add(wrapperCls, value);
537
+ this.wrapperCls = wrapperCls
538
+ }
539
+
529
540
  /**
530
541
  * Triggered after the appName config got changed
531
542
  * @param {String|null} value
@@ -560,11 +571,7 @@ class Component extends Base {
560
571
  vdom.cls = cls
561
572
  }
562
573
 
563
- if (me.isVdomUpdating || me.silentVdomUpdate) {
564
- me.needsVdomUpdate = true
565
- } else if (me.mounted && me.vnode) {
566
- me.updateCls(value, oldValue, vdomRoot.id)
567
- }
574
+ me.update()
568
575
  }
569
576
 
570
577
  /**
@@ -1038,7 +1045,7 @@ class Component extends Base {
1038
1045
  * @protected
1039
1046
  */
1040
1047
  afterSetVdom(value, oldValue) {
1041
- this.updateVdom(value)
1048
+ this.updateVdom()
1042
1049
  }
1043
1050
 
1044
1051
  /**
@@ -1098,9 +1105,9 @@ class Component extends Base {
1098
1105
  value = value || [];
1099
1106
 
1100
1107
  let me = this,
1101
- vdom = me.vdom,
1108
+ {vdom} = me,
1102
1109
  vdomRoot = me.getVdomRoot(),
1103
- cls = me.vdom?.cls || [];
1110
+ cls = vdom.cls || [];
1104
1111
 
1105
1112
  if (vdom === vdomRoot) {
1106
1113
  // we need to merge changes
@@ -1114,9 +1121,7 @@ class Component extends Base {
1114
1121
  oldValue && NeoArray.remove(cls, oldValue);
1115
1122
  NeoArray.add(cls, value);
1116
1123
 
1117
- if (vdom) {
1118
- vdom.cls = cls
1119
- }
1124
+ vdom.cls = cls
1120
1125
  }
1121
1126
 
1122
1127
  me.update()
@@ -1545,15 +1550,14 @@ class Component extends Base {
1545
1550
 
1546
1551
  /**
1547
1552
  * Internal method to send update requests to the vdom worker
1548
- * @param {Object} vdom
1549
- * @param {Neo.vdom.VNode} vnode
1550
1553
  * @param {function} [resolve] used by promiseUpdate()
1551
1554
  * @param {function} [reject] used by promiseUpdate()
1552
1555
  * @private
1553
1556
  */
1554
- #executeVdomUpdate(vdom, vnode, resolve, reject) {
1555
- let me = this,
1556
- opts = {},
1557
+ #executeVdomUpdate(resolve, reject) {
1558
+ let me = this,
1559
+ {vdom, vnode} = me,
1560
+ opts = {},
1557
1561
  deltas;
1558
1562
 
1559
1563
  if (currentWorker.isSharedWorker) {
@@ -1576,8 +1580,6 @@ class Component extends Base {
1576
1580
 
1577
1581
  Neo.vdom.Helper.update(opts).catch(err => {
1578
1582
  me.isVdomUpdating = false;
1579
- console.log('Error attempting to update component dom', err, me);
1580
-
1581
1583
  reject?.()
1582
1584
  }).then(data => {
1583
1585
  me.isVdomUpdating = false;
@@ -2197,8 +2199,6 @@ class Component extends Base {
2197
2199
  me._rendered = true; // silent update
2198
2200
  me.fire('rendered', me.id);
2199
2201
 
2200
- // console.log('rendered: ' + me.appName + ' ' + me.id, me);
2201
-
2202
2202
  if (autoMount) {
2203
2203
  me.mounted = true;
2204
2204
 
@@ -2212,13 +2212,11 @@ class Component extends Base {
2212
2212
 
2213
2213
  /**
2214
2214
  * Promise based vdom update
2215
- * @param {Object} vdom=this.vdom
2216
- * @param {Neo.vdom.VNode} vnode= this.vnode
2217
2215
  * @returns {Promise<any>}
2218
2216
  */
2219
- promiseUpdate(vdom=this.vdom, vnode=this.vnode) {
2217
+ promiseUpdate() {
2220
2218
  return new Promise((resolve, reject) => {
2221
- this.updateVdom(vdom, vnode, resolve, reject)
2219
+ this.updateVdom(resolve, reject)
2222
2220
  })
2223
2221
  }
2224
2222
 
@@ -2586,34 +2584,6 @@ class Component extends Base {
2586
2584
  this.afterSetVdom(this.vdom, null)
2587
2585
  }
2588
2586
 
2589
- /**
2590
- * Delta updates for the cls config. Gets called after the cls config gets changed in case the component is mounted.
2591
- * @param {String[]} cls
2592
- * @param {String[]} oldCls
2593
- * @param {String} id=this.id
2594
- * @protected
2595
- */
2596
- updateCls(cls, oldCls, id=this.id) {
2597
- let me = this,
2598
- {vnode} = me,
2599
- vnodeTarget = vnode && VNodeUtil.find(me.vnode, {id})?.vnode;
2600
-
2601
- if (vnode && !Neo.isEqual(cls, oldCls)) {
2602
- if (vnodeTarget) {
2603
- vnodeTarget.className = cls; // keep the vnode in sync
2604
- me.vnode = vnode;
2605
- }
2606
-
2607
- Neo.applyDeltas(me.appName, {
2608
- id,
2609
- cls: {
2610
- add : NeoArray.difference(cls, oldCls),
2611
- remove: NeoArray.difference(oldCls, cls)
2612
- }
2613
- })
2614
- }
2615
- }
2616
-
2617
2587
  /**
2618
2588
  * Creates the style deltas for newValue & oldValue and applies them directly to the DOM.
2619
2589
  * @param {Object|String} value
@@ -2668,15 +2638,13 @@ class Component extends Base {
2668
2638
 
2669
2639
  /**
2670
2640
  * Gets called after the vdom config gets changed in case the component is already mounted (delta updates).
2671
- * @param {Object} vdom=this.vdom
2672
- * @param {Neo.vdom.VNode} vnode=this.vnode
2673
2641
  * @param {function} [resolve] used by promiseUpdate()
2674
2642
  * @param {function} [reject] used by promiseUpdate()
2675
2643
  * @protected
2676
2644
  */
2677
- updateVdom(vdom=this.vdom, vnode=this.vnode, resolve, reject) {
2678
- let me = this,
2679
- {app, mounted, parentId} = me,
2645
+ updateVdom(resolve, reject) {
2646
+ let me = this,
2647
+ {app, mounted, parentId, vnode} = me,
2680
2648
  listenerId;
2681
2649
 
2682
2650
  if (me.isVdomUpdating || me.silentVdomUpdate) {
@@ -2690,7 +2658,7 @@ class Component extends Base {
2690
2658
  app.un('mounted', listenerId);
2691
2659
 
2692
2660
  me.timeout(50).then(() => {
2693
- me.vnode && me.updateVdom(me.vdom, me.vnode, resolve, reject)
2661
+ me.vnode && me.updateVdom(resolve, reject)
2694
2662
  })
2695
2663
  })
2696
2664
  } else {
@@ -2707,10 +2675,10 @@ class Component extends Base {
2707
2675
  // Verify that the critical rendering path => CSS files for the new tree is in place
2708
2676
  if (currentWorker.countLoadingThemeFiles !== 0) {
2709
2677
  currentWorker.on('themeFilesLoaded', function() {
2710
- me.updateVdom(vdom, vnode, resolve, reject)
2678
+ me.updateVdom(resolve, reject)
2711
2679
  }, me, {once: true})
2712
2680
  } else {
2713
- me.#executeVdomUpdate(vdom, vnode, resolve, reject)
2681
+ me.#executeVdomUpdate(resolve, reject)
2714
2682
  }
2715
2683
  }
2716
2684
  }
@@ -547,7 +547,7 @@ class DateSelector extends Component {
547
547
  vdom.cn[2].cn[0].cn[scrollFromTop ? 'unshift' : 'push'](vdom.cn[1]);
548
548
  vdom.cn.splice(1, 1);
549
549
 
550
- me.promiseUpdate(vdom).then(() => {
550
+ me.promiseUpdate().then(() => {
551
551
  y = scrollFromTop ? -data.height : 0;
552
552
  vdom.cn[1].cn[0].style.transform = `translateY(${y}px)`;
553
553
  me.update();
@@ -441,7 +441,7 @@ class Gallery extends Component {
441
441
  itemsRoot.cn.push(vdomItem)
442
442
  }
443
443
 
444
- me.promiseUpdate(vdom).then(() => {
444
+ me.promiseUpdate().then(() => {
445
445
  me[itemsMounted] = true
446
446
  })
447
447
  }
@@ -597,7 +597,7 @@ class Helix extends Component {
597
597
 
598
598
  me[lockWheel] = true;
599
599
 
600
- me.promiseUpdate(vdom).then(() => {
600
+ me.promiseUpdate().then(() => {
601
601
  me[itemsMounted] = true;
602
602
  me.fire('itemsMounted');
603
603
 
@@ -50,14 +50,6 @@ class Model extends Base {
50
50
  */
51
51
  hasNestedFields = false
52
52
 
53
- /**
54
- * @param {Object} config
55
- */
56
- construct(config) {
57
- super.construct(config);
58
- RecordFactory.createRecordClass(this)
59
- }
60
-
61
53
  /**
62
54
  Triggered after the fields config got changed
63
55
  * @param {Object[]|null} value
@@ -184,9 +184,11 @@ class DragZone extends Base {
184
184
  }
185
185
 
186
186
  /**
187
- * @param {Object} data
187
+ * @param {Object} data
188
+ * @param {Boolean} createComponent=true
189
+ * @returns {Object|Neo.draggable.DragProxyComponent}
188
190
  */
189
- createDragProxy(data) {
191
+ async createDragProxy(data, createComponent=true) {
190
192
  let me = this,
191
193
  component = Neo.getComponent(me.getDragElementRoot().id) || me.owner,
192
194
  rect = me.dragElementRect,
@@ -228,7 +230,11 @@ class DragZone extends Base {
228
230
  width : `${data.width}px`
229
231
  });
230
232
 
231
- me.dragProxy = Neo.create(config)
233
+ if (createComponent) {
234
+ return me.dragProxy = Neo.create(config)
235
+ }
236
+
237
+ return config
232
238
  }
233
239
 
234
240
  /**
@@ -304,7 +310,7 @@ class DragZone extends Base {
304
310
  /**
305
311
  * @param {Object} data
306
312
  */
307
- dragStart(data) {
313
+ async dragStart(data) {
308
314
  let me = this,
309
315
  {appName, owner, windowId} = me,
310
316
  {cls} = owner,
@@ -331,7 +337,7 @@ class DragZone extends Base {
331
337
  offsetY
332
338
  });
333
339
 
334
- me.createDragProxy(rect);
340
+ await me.createDragProxy(rect);
335
341
 
336
342
  me.fire('dragStart', {
337
343
  clientX : data.clientX,
@@ -1,5 +1,6 @@
1
1
  import BaseSortZone from '../../../toolbar/SortZone.mjs';
2
2
  import NeoArray from '../../../../util/Array.mjs';
3
+ import VdomUtil from '../../../../util/VDom.mjs';
3
4
 
4
5
  /**
5
6
  * @class Neo.draggable.grid.header.toolbar.SortZone
@@ -22,6 +23,10 @@ class SortZone extends BaseSortZone {
22
23
  * @protected
23
24
  */
24
25
  itemMargin: '1px',
26
+ /**
27
+ * @member {Boolean} moveColumnContent=true
28
+ */
29
+ moveColumnContent: true,
25
30
  /**
26
31
  * @member {Boolean} moveVertical=false
27
32
  */
@@ -37,6 +42,59 @@ class SortZone extends BaseSortZone {
37
42
  rect.y = rect.y - parentRect.y - 1
38
43
  }
39
44
 
45
+ /**
46
+ * @param {Object} data
47
+ * @param {Boolean} createComponent=true
48
+ * @returns {Object|Neo.draggable.DragProxyComponent}
49
+ */
50
+ async createDragProxy(data, createComponent=true) {
51
+ if (!this.moveColumnContent) {
52
+ return await super.createDragProxy(data, createComponent)
53
+ }
54
+
55
+ let me = this,
56
+ grid = me.owner.parent,
57
+ {view} = grid,
58
+ gridRows = view.getVdomRoot().cn,
59
+ columnIndex = me.dragElement['aria-colindex'] - 1,
60
+ {dataField} = view.columnPositions[columnIndex],
61
+ cells = view.getColumnCells(dataField),
62
+ rows = [],
63
+ config = await super.createDragProxy(data, false),
64
+ rect = await grid.getDomRect(),
65
+ row;
66
+
67
+ config.cls = ['neo-grid-wrapper', me.owner.getTheme()];
68
+
69
+ config.style.height = rect.height + 'px';
70
+
71
+ cells.forEach((cell, index) => {
72
+ row = VdomUtil.clone({cls: gridRows[index].cls, cn: [cell]}); // clone to remove ids
73
+
74
+ row.style = {
75
+ height: view.rowHeight + 'px'
76
+ };
77
+
78
+ delete row.cn[0].style.left;
79
+
80
+ rows.push(row)
81
+ });
82
+
83
+ config.vdom =
84
+ {cn: [
85
+ {cls: ['neo-grid-container'], cn: [
86
+ {...config.vdom, cls: ['neo-grid-header-toolbar', 'neo-toolbar']},
87
+ {cls: ['neo-grid-view'], cn: rows}
88
+ ]}
89
+ ]};
90
+
91
+ if (createComponent) {
92
+ return me.dragProxy = Neo.create(config)
93
+ }
94
+
95
+ return config
96
+ }
97
+
40
98
  /**
41
99
  * @param {Number} fromIndex
42
100
  * @param {Number} toIndex
@@ -69,6 +127,59 @@ class SortZone extends BaseSortZone {
69
127
 
70
128
  owner.parent.view.createViewData()
71
129
  }
130
+
131
+ /**
132
+ * @param {Object} data
133
+ */
134
+ async onDragStart(data) {
135
+ await super.onDragStart(data);
136
+
137
+ if (this.moveColumnContent) {
138
+ let me = this,
139
+ {view} = me.owner.parent,
140
+ columnIndex = me.dragElement['aria-colindex'] - 1,
141
+ {dataField} = view.columnPositions[columnIndex],
142
+ cells = view.getColumnCells(dataField);
143
+
144
+ cells.forEach(cell => {
145
+ cell.style.display = 'none'
146
+ });
147
+
148
+ view.update()
149
+ }
150
+ }
151
+
152
+ /**
153
+ * @param {Number} index1
154
+ * @param {Number} index2
155
+ */
156
+ switchItems(index1, index2) {
157
+ if (this.moveColumnContent) {
158
+ let {view} = this.owner.parent,
159
+ columnPositions = view._columnPositions, // no clone
160
+ column1Cells = view.getColumnCells(columnPositions[index1].dataField),
161
+ column2Cells = view.getColumnCells(columnPositions[index2].dataField),
162
+ x;
163
+
164
+ x = columnPositions[index1].x;
165
+ columnPositions[index1].x = columnPositions[index2].x;
166
+ columnPositions[index2].x = x;
167
+
168
+ NeoArray.move(columnPositions, index1, index2);
169
+
170
+ column1Cells.forEach(node => {
171
+ node.style.left = columnPositions[index2].x + 'px'
172
+ });
173
+
174
+ column2Cells.forEach(node => {
175
+ node.style.left = columnPositions[index1].x + 'px'
176
+ });
177
+
178
+ view.update()
179
+ }
180
+
181
+ super.switchItems(index1, index2);
182
+ }
72
183
  }
73
184
 
74
185
  export default Neo.setupClass(SortZone);
@@ -114,12 +114,12 @@ class DragZone extends BaseDragZone {
114
114
  /**
115
115
  * @param {Object} data
116
116
  */
117
- onDragStart(data) {
117
+ async onDragStart(data) {
118
118
  let me = this;
119
119
 
120
120
  if (me.owner.draggable) {
121
121
  me.dragElement = VDomUtil.find(me.owner.vdom, data.path[0].id).vdom;
122
- me.dragStart(data)
122
+ await me.dragStart(data)
123
123
  }
124
124
  }
125
125
 
@@ -53,7 +53,7 @@ class SortZone extends BaseSortZone {
53
53
  /**
54
54
  * @param {Object} data
55
55
  */
56
- onDragStart(data) {
56
+ async onDragStart(data) {
57
57
  let me = this,
58
58
  {owner} = me,
59
59
  cls = owner.cls || [];
@@ -61,7 +61,7 @@ class SortZone extends BaseSortZone {
61
61
  NeoArray.add(cls, 'neo-no-animation');
62
62
  owner.cls = cls;
63
63
 
64
- super.onDragStart(data)
64
+ await super.onDragStart(data)
65
65
  }
66
66
  }
67
67
 
@@ -52,7 +52,7 @@ class DragZone extends BaseDragZone {
52
52
  owner.items.forEach(item => {
53
53
  wrapperCls = item.wrapperCls || [];
54
54
 
55
- NeoArray[draggable ? 'add' : 'remove'](wrapperCls, 'neo-draggable');
55
+ NeoArray.toggle(wrapperCls, 'neo-draggable', draggable);
56
56
  item.wrapperCls = wrapperCls
57
57
  })
58
58
  }
@@ -88,12 +88,12 @@ class DragZone extends BaseDragZone {
88
88
  /**
89
89
  * @param {Object} data
90
90
  */
91
- onDragStart(data) {
91
+ async onDragStart(data) {
92
92
  let me = this;
93
93
 
94
94
  if (me.owner.draggable) {
95
95
  me.dragElement = VDomUtil.find(me.owner.vdom, data.path[0].id).vdom;
96
- me.dragStart(data)
96
+ await me.dragStart(data)
97
97
  }
98
98
  }
99
99
 
@@ -178,7 +178,7 @@ class SortZone extends DragZone {
178
178
  /**
179
179
  * @param {Object} data
180
180
  */
181
- onDragStart(data) {
181
+ async onDragStart(data) {
182
182
  let me = this,
183
183
  button = Neo.getComponent(data.path[0].id),
184
184
  {owner} = me,
@@ -202,7 +202,7 @@ class SortZone extends DragZone {
202
202
  startIndex : index
203
203
  });
204
204
 
205
- me.dragStart(data); // we do not want to trigger the super class call here
205
+ await me.dragStart(data); // we do not want to trigger the super class call here
206
206
 
207
207
  owner.items.forEach((item, index) => {
208
208
  indexMap[index] = index;
@@ -81,7 +81,7 @@ class DragZone extends BaseDragZone {
81
81
  /**
82
82
  * @param {Object} data
83
83
  */
84
- onDragStart(data) {
84
+ async onDragStart(data) {
85
85
  let me = this;
86
86
 
87
87
  if (me.owner.draggable) {
@@ -91,7 +91,7 @@ class DragZone extends BaseDragZone {
91
91
  cn : [VDomUtil.find(me.owner.vdom, data.path[0].id).vdom]
92
92
  };
93
93
 
94
- me.dragStart(data)
94
+ await me.dragStart(data)
95
95
  }
96
96
  }
97
97
  }
@@ -70,11 +70,6 @@ class GridContainer extends BaseContainer {
70
70
  * @member {Number} rowHeight_=32
71
71
  */
72
72
  rowHeight_: 32,
73
- /**
74
- * @member {String|null} scrollbarId_=null
75
- * @protected
76
- */
77
- scrollbarId_: null,
78
73
  /**
79
74
  * @member {Boolean} showHeaderFilters_=false
80
75
  */
@@ -125,14 +120,6 @@ class GridContainer extends BaseContainer {
125
120
  return Neo.getComponent(this.headerToolbarId) || Neo.get(this.headerToolbarId)
126
121
  }
127
122
 
128
- /**
129
- * Convenience method to access the Neo.grid.Scrollbar
130
- * @returns {Neo.grid.Scrollbar|null}
131
- */
132
- get scrollbar() {
133
- return Neo.getComponent(this.scrollbarId) || Neo.get(this.scrollbarId)
134
- }
135
-
136
123
  /**
137
124
  * Convenience method to access the Neo.grid.View
138
125
  * @returns {Neo.grid.View|null}
@@ -151,20 +138,17 @@ class GridContainer extends BaseContainer {
151
138
  {rowHeight, store} = me;
152
139
 
153
140
  me.headerToolbarId = Neo.getId('grid-header-toolbar');
154
- me.scrollbarId = Neo.getId('grid-scrollbar');
155
141
  me.viewId = Neo.getId('grid-view');
156
142
 
157
143
  me.items = [{
158
144
  module : header.Toolbar,
159
- gridContainer : me,
160
145
  id : me.headerToolbarId,
161
146
  showHeaderFilters: me.showHeaderFilters,
162
147
  sortable : me.sortable,
163
148
  ...me.headerToolbarConfig
164
149
  }, {
165
- module : GridView,
166
- containerId: me.id,
167
- id : me.viewId,
150
+ module: GridView,
151
+ id : me.viewId,
168
152
  rowHeight,
169
153
  store,
170
154
  ...me.viewConfig