neo.mjs 8.11.0 → 8.12.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 (33) hide show
  1. package/apps/ServiceWorker.mjs +2 -2
  2. package/apps/portal/index.html +1 -1
  3. package/apps/portal/view/home/FooterContainer.mjs +1 -1
  4. package/examples/ConfigurationViewport.mjs +1 -7
  5. package/examples/ServiceWorker.mjs +2 -2
  6. package/package.json +2 -2
  7. package/resources/scss/src/draggable/DragProxyComponent.scss +9 -0
  8. package/resources/scss/src/draggable/grid/header/toolbar/SortZone.scss +16 -0
  9. package/resources/scss/src/draggable/table/header/toolbar/SortZone.scss +32 -0
  10. package/resources/scss/src/grid/header/Toolbar.scss +0 -1
  11. package/resources/scss/src/table/header/Button.scss +0 -4
  12. package/resources/scss/theme-dark/draggable/grid/header/toolbar/SortZone.scss +3 -0
  13. package/resources/scss/theme-dark/draggable/table/header/toolbar/SortZone.scss +3 -0
  14. package/resources/scss/theme-light/draggable/grid/header/toolbar/SortZone.scss +3 -0
  15. package/resources/scss/theme-light/draggable/table/header/toolbar/SortZone.scss +3 -0
  16. package/resources/scss/theme-neo-light/draggable/grid/header/toolbar/SortZone.scss +3 -0
  17. package/resources/scss/theme-neo-light/draggable/table/header/toolbar/SortZone.scss +3 -0
  18. package/src/DefaultConfig.mjs +2 -2
  19. package/src/component/Base.mjs +2 -6
  20. package/src/draggable/grid/header/toolbar/SortZone.mjs +74 -0
  21. package/src/draggable/table/header/toolbar/SortZone.mjs +70 -0
  22. package/src/draggable/toolbar/SortZone.mjs +23 -14
  23. package/src/grid/header/Button.mjs +0 -109
  24. package/src/grid/header/Toolbar.mjs +32 -0
  25. package/src/main/DomEvents.mjs +10 -50
  26. package/src/main/addon/DragDrop.mjs +9 -20
  27. package/src/selection/grid/BaseModel.mjs +1 -1
  28. package/src/selection/table/BaseModel.mjs +1 -1
  29. package/src/table/Container.mjs +6 -6
  30. package/src/table/View.mjs +10 -10
  31. package/src/table/header/Button.mjs +0 -105
  32. package/src/table/header/Toolbar.mjs +34 -2
  33. package/src/util/Rectangle.mjs +1 -1
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='8.11.0'
23
+ * @member {String} version='8.12.0'
24
24
  */
25
- version: '8.11.0'
25
+ version: '8.12.0'
26
26
  }
27
27
 
28
28
  /**
@@ -16,7 +16,7 @@
16
16
  "@type": "Organization",
17
17
  "name": "Neo.mjs"
18
18
  },
19
- "datePublished": "2025-01-28",
19
+ "datePublished": "2025-01-29",
20
20
  "publisher": {
21
21
  "@type": "Organization",
22
22
  "name": "Neo.mjs"
@@ -107,7 +107,7 @@ class FooterContainer extends Container {
107
107
  }, {
108
108
  module: Component,
109
109
  cls : ['neo-version'],
110
- html : 'v8.11.0'
110
+ html : 'v8.12.0'
111
111
  }]
112
112
  }],
113
113
  /**
@@ -208,13 +208,7 @@ class ConfigurationViewport extends Viewport {
208
208
  if (target === 'cmp') {
209
209
  me.exampleComponent.theme = newTheme
210
210
  } else {
211
- Neo.applyDeltas(me.appName, {
212
- id : me.id, // the viewport can get imported into other apps, so an id makes sense for scoping
213
- cls: {
214
- add : [newTheme],
215
- remove: [oldTheme]
216
- }
217
- })
211
+ me.app.mainView.theme = newTheme
218
212
  }
219
213
  }
220
214
  }
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='8.11.0'
23
+ * @member {String} version='8.12.0'
24
24
  */
25
- version: '8.11.0'
25
+ version: '8.12.0'
26
26
  }
27
27
 
28
28
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo.mjs",
3
- "version": "8.11.0",
3
+ "version": "8.12.0",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -54,7 +54,7 @@
54
54
  "envinfo": "^7.14.0",
55
55
  "fs-extra": "^11.3.0",
56
56
  "highlightjs-line-numbers.js": "^2.9.0",
57
- "inquirer": "^12.3.2",
57
+ "inquirer": "^12.3.3",
58
58
  "marked": "^15.0.6",
59
59
  "monaco-editor": "0.50.0",
60
60
  "neo-jsdoc": "1.0.1",
@@ -1,3 +1,12 @@
1
+ body:has(.neo-is-dragging) {
2
+ cursor: move !important;
3
+
4
+ // We can not put pointer-events: none on the same level as cursor, since it prevents cursor changes
5
+ * {
6
+ pointer-events: none !important;
7
+ }
8
+ }
9
+
1
10
  .neo-dragproxy {
2
11
  pointer-events : none;
3
12
  position : absolute !important;
@@ -0,0 +1,16 @@
1
+ .neo-grid-header-toolbar {
2
+ &.neo-dragproxy {
3
+ height: 30px !important; // Hack to increase the height by the border-bottom height (29 + 1)
4
+
5
+ .neo-button {
6
+ border-right: 1px solid var(--grid-container-border-color);
7
+ }
8
+ }
9
+
10
+ &.neo-is-dragging {
11
+ .neo-button {
12
+ border-right: 1px solid var(--grid-container-border-color); // Would be missing for the last button otherwise
13
+ opacity : var(--grid-header-button-opacity-is-dragging);
14
+ }
15
+ }
16
+ }
@@ -0,0 +1,32 @@
1
+ .neo-table-container:has(.neo-is-dragging) {
2
+ border-top-width: 1px;
3
+ }
4
+
5
+ .neo-table-header-toolbar {
6
+ &.neo-dragproxy {
7
+ border-bottom: 1px solid var(--table-container-border-color);
8
+ height : 31px !important; // Hack to increase the height by the border-bottom height (29 + 1)
9
+ padding: 0 0 1px 0;
10
+
11
+ .neo-table-header-button {
12
+ border-right: 1px solid var(--table-container-border-color);
13
+ }
14
+ }
15
+
16
+ &.neo-is-dragging {
17
+ height: 32px !important;
18
+
19
+ .neo-table-header-button {
20
+ border-right: 1px solid var(--table-container-border-color); // Would be missing for the last button otherwise
21
+ opacity : var(--table-header-button-opacity-is-dragging);
22
+ }
23
+
24
+ .neo-draggable {
25
+ background-color : unset;
26
+ height : 32px !important;
27
+ transition-duration : 200ms;
28
+ transition-property : left, top;
29
+ transition-timing-function: ease-out;
30
+ }
31
+ }
32
+ }
@@ -1,6 +1,5 @@
1
1
  .neo-grid-header-toolbar {
2
2
  border-bottom: 1px solid var(--grid-container-border-color);
3
- border-top : 1px solid var(--grid-container-border-color);
4
3
  padding : 0;
5
4
  width : max-content;
6
5
  }
@@ -16,10 +16,6 @@
16
16
  white-space : nowrap;
17
17
  width : 100% !important;
18
18
 
19
- &.neo-drag-over {
20
- background-image: linear-gradient(green, darkgreen);;
21
- }
22
-
23
19
  &.neo-sort-asc, &.neo-sort-desc {
24
20
  .neo-button-glyph {
25
21
  opacity: 1;
@@ -0,0 +1,3 @@
1
+ :root .neo-theme-dark { // .neo-grid-header-toolbar.neo-is-dragging
2
+ --grid-header-button-opacity-is-dragging: 0.3;
3
+ }
@@ -0,0 +1,3 @@
1
+ :root .neo-theme-dark { // .neo-table-header-toolbar.neo-is-dragging
2
+ --table-header-button-opacity-is-dragging: 0.3;
3
+ }
@@ -0,0 +1,3 @@
1
+ :root .neo-theme-light { // .neo-grid-header-toolbar.neo-is-dragging
2
+ --grid-header-button-opacity-is-dragging: 0.7;
3
+ }
@@ -0,0 +1,3 @@
1
+ :root .neo-theme-light { // .neo-table-header-toolbar.neo-is-dragging
2
+ --table-header-button-opacity-is-dragging: 0.7;
3
+ }
@@ -0,0 +1,3 @@
1
+ :root .neo-theme-neo-light { // .neo-grid-header-toolbar.neo-is-dragging
2
+ --grid-header-button-opacity-is-dragging: 0.7;
3
+ }
@@ -0,0 +1,3 @@
1
+ :root .neo-theme-neo-light { // .neo-table-header-toolbar.neo-is-dragging
2
+ --table-header-button-opacity-is-dragging: 0.7;
3
+ }
@@ -262,12 +262,12 @@ const DefaultConfig = {
262
262
  useVdomWorker: true,
263
263
  /**
264
264
  * buildScripts/injectPackageVersion.mjs will update this value
265
- * @default '8.11.0'
265
+ * @default '8.12.0'
266
266
  * @memberOf! module:Neo
267
267
  * @name config.version
268
268
  * @type String
269
269
  */
270
- version: '8.11.0'
270
+ version: '8.12.0'
271
271
  };
272
272
 
273
273
  Object.assign(DefaultConfig, {
@@ -331,7 +331,7 @@ class Component extends Base {
331
331
  */
332
332
  style_: null,
333
333
  /**
334
- * You can pass an used theme directly to any component,
334
+ * You can pass a used theme directly to any component,
335
335
  * to style specific component trees differently from your main view.
336
336
  * @member {String|null} theme_=null
337
337
  */
@@ -1119,11 +1119,7 @@ class Component extends Base {
1119
1119
  }
1120
1120
  }
1121
1121
 
1122
- if (me.isVdomUpdating || me.silentVdomUpdate) {
1123
- me.needsVdomUpdate = true
1124
- } else if (me.mounted) {
1125
- me.updateCls(value, oldValue)
1126
- }
1122
+ me.update()
1127
1123
  }
1128
1124
 
1129
1125
  /**
@@ -0,0 +1,74 @@
1
+ import BaseSortZone from '../../../toolbar/SortZone.mjs';
2
+ import NeoArray from '../../../../util/Array.mjs';
3
+
4
+ /**
5
+ * @class Neo.draggable.grid.header.toolbar.SortZone
6
+ * @extends Neo.draggable.toolbar.SortZone
7
+ */
8
+ class SortZone extends BaseSortZone {
9
+ static config = {
10
+ /**
11
+ * @member {String} className='Neo.draggable.grid.header.toolbar.SortZone'
12
+ * @protected
13
+ */
14
+ className: 'Neo.draggable.grid.header.toolbar.SortZone',
15
+ /**
16
+ * @member {String} ntype='grid-header-toolbar-sortzone'
17
+ * @protected
18
+ */
19
+ ntype: 'grid-header-toolbar-sortzone',
20
+ /**
21
+ * @member {String|null} itemMargin=null
22
+ * @protected
23
+ */
24
+ itemMargin: '1px',
25
+ /**
26
+ * @member {Boolean} moveVertical=false
27
+ */
28
+ moveVertical: false
29
+ }
30
+
31
+ /**
32
+ * @param {Neo.util.Rectangle} rect
33
+ * @param {Neo.util.Rectangle} parentRect
34
+ */
35
+ adjustProxyRectToParent(rect, parentRect) {
36
+ rect.x = rect.x - parentRect.x - 1;
37
+ rect.y = rect.y - parentRect.y - 1
38
+ }
39
+
40
+ /**
41
+ * @param {Number} fromIndex
42
+ * @param {Number} toIndex
43
+ */
44
+ moveTo(fromIndex, toIndex) {
45
+ super.moveTo(fromIndex, toIndex);
46
+
47
+ // It is crucial to use _columns to not get a shallow copy
48
+ NeoArray.move(this.owner.parent._columns, fromIndex, toIndex);
49
+ }
50
+
51
+ /**
52
+ * @param {Object} data
53
+ */
54
+ async onDragEnd(data) {
55
+ await super.onDragEnd(data);
56
+
57
+ let {owner} = this;
58
+
59
+ owner.items.forEach((item, index) => {
60
+ item.vdom['aria-colindex'] = index + 1; // 1 based
61
+ });
62
+
63
+ owner.updateDepth = 2;
64
+ owner.update();
65
+
66
+ await owner.passSizeToView();
67
+
68
+ await this.timeout(20);
69
+
70
+ owner.parent.view.createViewData()
71
+ }
72
+ }
73
+
74
+ export default Neo.setupClass(SortZone);
@@ -0,0 +1,70 @@
1
+ import BaseSortZone from '../../../toolbar/SortZone.mjs';
2
+ import NeoArray from '../../../../util/Array.mjs';
3
+
4
+ /**
5
+ * @class Neo.draggable.table.header.toolbar.SortZone
6
+ * @extends Neo.draggable.toolbar.SortZone
7
+ */
8
+ class SortZone extends BaseSortZone {
9
+ static config = {
10
+ /**
11
+ * @member {String} className='Neo.draggable.table.header.toolbar.SortZone'
12
+ * @protected
13
+ */
14
+ className: 'Neo.draggable.table.header.toolbar.SortZone',
15
+ /**
16
+ * @member {String} ntype='table-header-toolbar-sortzone'
17
+ * @protected
18
+ */
19
+ ntype: 'table-header-toolbar-sortzone',
20
+ /**
21
+ * @member {String|null} itemMargin=null
22
+ * @protected
23
+ */
24
+ itemMargin: '-2px 1px 1px 1px',
25
+ /**
26
+ * @member {Boolean} moveVertical=false
27
+ */
28
+ moveVertical: false,
29
+ /**
30
+ * @member {Number} offsetY=0
31
+ */
32
+ offsetY: 5
33
+ }
34
+
35
+ /**
36
+ * @param {Neo.util.Rectangle} rect
37
+ * @param {Neo.util.Rectangle} parentRect
38
+ */
39
+ adjustProxyRectToParent(rect, parentRect) {
40
+ rect.x = rect.x - parentRect.x - 1;
41
+ rect.y = rect.y - parentRect.y
42
+ }
43
+
44
+ /**
45
+ * @param {Number} fromIndex
46
+ * @param {Number} toIndex
47
+ */
48
+ moveTo(fromIndex, toIndex) {
49
+ super.moveTo(fromIndex, toIndex);
50
+
51
+ // It is crucial to use _columns to not get a shallow copy
52
+ NeoArray.move(this.owner.parent._columns, fromIndex, toIndex);
53
+ }
54
+
55
+ /**
56
+ * @param {Object} data
57
+ */
58
+ async onDragEnd(data) {
59
+ await super.onDragEnd(data);
60
+
61
+ let {owner} = this;
62
+
63
+ owner.updateDepth = 2;
64
+ owner.update();
65
+
66
+ owner.parent.view.createViewData()
67
+ }
68
+ }
69
+
70
+ export default Neo.setupClass(SortZone);
@@ -31,6 +31,11 @@ class SortZone extends DragZone {
31
31
  * @protected
32
32
  */
33
33
  indexMap: null,
34
+ /**
35
+ * @member {String|null} itemMargin=null
36
+ * @protected
37
+ */
38
+ itemMargin: null,
34
39
  /**
35
40
  * @member {Array|null} itemRects=null
36
41
  * @protected
@@ -96,11 +101,12 @@ class SortZone extends DragZone {
96
101
  owner.style = ownerStyle;
97
102
 
98
103
  owner.items.forEach((item, index) => {
99
- itemStyle = item.style || {};
104
+ itemStyle = item.wrapperStyle || {};
100
105
 
101
106
  Object.assign(itemStyle, {
102
107
  height : itemStyles[index].height || null,
103
108
  left : null,
109
+ margin : null,
104
110
  position: null,
105
111
  top : null,
106
112
  width : itemStyles[index].width || null
@@ -110,7 +116,7 @@ class SortZone extends DragZone {
110
116
  itemStyle.visibility = null
111
117
  }
112
118
 
113
- item.style = itemStyle
119
+ item.wrapperStyle = itemStyle
114
120
  });
115
121
 
116
122
  if (me.startIndex !== me.currentIndex) {
@@ -202,8 +208,8 @@ class SortZone extends DragZone {
202
208
  indexMap[index] = index;
203
209
 
204
210
  itemStyles.push({
205
- height: item.style?.height,
206
- width : item.style?.width
211
+ height: item.height ? `${item.height}px` : item.style?.height,
212
+ width : item.width ? `${item.width}px` : item.style?.width
207
213
  })
208
214
  });
209
215
 
@@ -221,12 +227,15 @@ class SortZone extends DragZone {
221
227
  me.itemRects = itemRects;
222
228
 
223
229
  owner.items.forEach((item, index) => {
224
- itemStyle = item.style || {};
230
+ itemStyle = item.wrapperStyle || {};
225
231
  rect = itemRects[index];
226
232
 
227
- item.style = Object.assign(itemStyle, {
233
+ me.adjustProxyRectToParent?.(rect, me.ownerRect);
234
+
235
+ item.wrapperStyle = Object.assign(itemStyle, {
228
236
  height : `${rect.height}px`,
229
237
  left : `${rect.left}px`,
238
+ margin : me.itemMargin,
230
239
  position: 'absolute',
231
240
  top : `${rect.top}px`,
232
241
  width : `${rect.width}px`
@@ -235,9 +244,9 @@ class SortZone extends DragZone {
235
244
 
236
245
  // we need to add a short (1 frame) delay to ensure the item has switched to an absolute position
237
246
  me.timeout(5).then(() => {
238
- itemStyle = button.style || {};
247
+ itemStyle = button.wrapperStyle || {};
239
248
  itemStyle.visibility = 'hidden';
240
- button.style = itemStyle
249
+ button.wrapperStyle = itemStyle
241
250
  })
242
251
  })
243
252
  }
@@ -288,14 +297,14 @@ class SortZone extends DragZone {
288
297
  * @param {Object} rect
289
298
  */
290
299
  updateItem(index, rect) {
291
- let me = this,
292
- item = me.owner.items[me.indexMap[index]],
293
- {style} = item;
300
+ let me = this,
301
+ item = me.owner.items[me.indexMap[index]],
302
+ {wrapperStyle} = item;
294
303
 
295
- style.left = `${rect.left}px`;
296
- style.top = `${rect.top}px`;
304
+ wrapperStyle.left = `${rect.left}px`;
305
+ wrapperStyle.top = `${rect.top}px`;
297
306
 
298
- item.style = style
307
+ item.wrapperStyle = wrapperStyle
299
308
  }
300
309
  }
301
310
 
@@ -45,10 +45,6 @@ class Button extends BaseButton {
45
45
  * @member {String} defaultSortDirection='ASC'
46
46
  */
47
47
  defaultSortDirection: 'ASC',
48
- /**
49
- * @member {Boolean} draggable_=true
50
- */
51
- draggable_: true,
52
48
  /**
53
49
  * @member {Object} editorConfig=null
54
50
  */
@@ -100,43 +96,6 @@ class Button extends BaseButton {
100
96
  sortable_: true
101
97
  }
102
98
 
103
- /**
104
- * @param {Object} config
105
- */
106
- construct(config) {
107
- super.construct(config);
108
-
109
- let me = this;
110
-
111
- me.draggable && me.addDomListeners({
112
- dragend : me.onDragEnd,
113
- dragenter: me.onDragEnter,
114
- dragleave: me.onDragLeave,
115
- dragover : me.onDragOver,
116
- dragstart: me.onDragStart,
117
- drop : me.onDrop,
118
- scope : me
119
- })
120
- }
121
-
122
- /**
123
- * Triggered after the draggable config got changed
124
- * @param {Boolean} value
125
- * @param {Boolean} oldValue
126
- * @protected
127
- */
128
- afterSetDraggable(value, oldValue) {
129
- let me = this;
130
-
131
- if (value === true) {
132
- me.getVdomRoot().draggable = true
133
- } else {
134
- delete me.getVdomRoot().draggable
135
- }
136
-
137
- me.update()
138
- }
139
-
140
99
  /**
141
100
  * Triggered after the isSorted config got changed
142
101
  * @param {String|null} value
@@ -315,74 +274,6 @@ class Button extends BaseButton {
315
274
  me.isSorted = map[me.isSorted + '']
316
275
  }
317
276
 
318
- /**
319
- * @protected
320
- */
321
- onDragEnd() {
322
- let me = this,
323
- {style} = me;
324
-
325
- delete style.opacity;
326
- me.style = style
327
- }
328
-
329
- /**
330
- * @protected
331
- */
332
- onDragEnter() {
333
- let me = this,
334
- {cls} = me;
335
-
336
- NeoArray.add(cls, 'neo-drag-over');
337
- me.cls = cls
338
- }
339
-
340
- /**
341
- * @protected
342
- */
343
- onDragLeave() {
344
- let me = this,
345
- {cls} = me;
346
-
347
- NeoArray.remove(cls, 'neo-drag-over');
348
- me.cls = cls
349
- }
350
-
351
- /**
352
- * @param {Object} event
353
- */
354
- onDragOver(event) {
355
- //console.log('onDragOver', event);
356
- }
357
-
358
- /**
359
- * @protected
360
- */
361
- onDragStart() {
362
- let me = this,
363
- {style} = me;
364
-
365
- style.opacity = 0.4;
366
- me.style = style
367
- }
368
-
369
- /**
370
- * @param {Object} data
371
- */
372
- onDrop(data) {
373
- let me = this,
374
- headerToolbar = me.parent,
375
- {style} = me,
376
- gridContainer = headerToolbar.parent;
377
-
378
- me.onDragLeave();
379
- headerToolbar.switchItems(me.id, data.srcId);
380
- gridContainer.createViewData(gridContainer.store.data);
381
-
382
- style.opacity = 1;
383
- me.style = style
384
- }
385
-
386
277
  /**
387
278
  * @param {Object} data
388
279
  */
@@ -21,6 +21,10 @@ class Toolbar extends BaseToolbar {
21
21
  * @member {String[]} baseCls=['neo-grid-header-toolbar','neo-toolbar']
22
22
  */
23
23
  baseCls: ['neo-grid-header-toolbar', 'neo-toolbar'],
24
+ /**
25
+ * @member {Boolean} draggable_=true
26
+ */
27
+ draggable_: true,
24
28
  /**
25
29
  * @member {Neo.grid.Container|null} gridContainer=null
26
30
  */
@@ -40,6 +44,8 @@ class Toolbar extends BaseToolbar {
40
44
  */
41
45
  showHeaderFilters_: false,
42
46
  /**
47
+ * Convenience shortcut to pass sortable to all toolbar items.
48
+ * If set to true, header clicks will sort the matching column (ASC, DESC, null)
43
49
  * @member {Boolean} sortable=true
44
50
  */
45
51
  sortable: true,
@@ -50,6 +56,31 @@ class Toolbar extends BaseToolbar {
50
56
  {'aria-rowindex': 1, cn: [{cn: []}]}
51
57
  }
52
58
 
59
+ /**
60
+ * Triggered after the draggable config got changed
61
+ * @param {Boolean} value
62
+ * @param {Boolean} oldValue
63
+ * @protected
64
+ */
65
+ afterSetDraggable(value, oldValue) {
66
+ let me = this;
67
+
68
+ if (value && !me.sortZone) {
69
+ import('../../draggable/grid/header/toolbar/SortZone.mjs').then(module => {
70
+ let {appName, id, windowId} = me;
71
+
72
+ me.sortZone = Neo.create({
73
+ module : module.default,
74
+ appName,
75
+ boundaryContainerId: id,
76
+ owner : me,
77
+ windowId,
78
+ ...me.sortZoneConfig
79
+ })
80
+ })
81
+ }
82
+ }
83
+
53
84
  /**
54
85
  * Triggered after the mounted config got changed
55
86
  * @param {Boolean} value
@@ -98,6 +129,7 @@ class Toolbar extends BaseToolbar {
98
129
  })
99
130
  });
100
131
 
132
+ me.updateDepth = 2;
101
133
  me.update()
102
134
  }
103
135
  }
@@ -194,7 +194,7 @@ class DomEvents extends Base {
194
194
 
195
195
  /**
196
196
  * Local domEvent listener
197
- * @param {Object} event
197
+ * @param {Event} event
198
198
  */
199
199
  domEventListener(event) {
200
200
  let me = this,
@@ -211,40 +211,7 @@ class DomEvents extends Base {
211
211
  }
212
212
  };
213
213
 
214
- // console.log('domEventListener', event.type, target.id, target.value, event);
215
-
216
214
  switch (event.type) {
217
- case 'dragend':
218
- me.dragElementId = null;
219
- break
220
- case 'dragenter':
221
- if (me.dragElementId === target.id) {
222
- return // ignore target and source to be the same
223
- }
224
- break
225
- case 'dragleave':
226
- if (me.dragElementId === target.id) {
227
- return // ignore target and source to be the same
228
- }
229
- break
230
- case 'dragover':
231
- me.onDragOver(event);
232
- event.preventDefault();
233
- break
234
- case 'dragstart':
235
- me.dragElementId = target.id;
236
- break
237
- case 'drop':
238
- if (!me.dragElementId || me.dragElementId === target.id) {
239
- return // drop fires twice by default & drop should not trigger on the drag element
240
- }
241
- if (event.stopPropagation) {
242
- event.stopPropagation() // stops the browser from redirecting.
243
- }
244
- event.preventDefault();
245
- config.data.srcId = me.dragElementId;
246
- me.dragElementId = null;
247
- break
248
215
  case 'mousemove':
249
216
  Object.assign(config.data, me.getMouseEventData(event));
250
217
  break
@@ -427,10 +394,10 @@ class DomEvents extends Base {
427
394
  * @param {Object} event
428
395
  */
429
396
  onBeforeUnload(event) {
430
- let manager = Neo.worker.Manager;
397
+ let {Manager} = Neo.worker;
431
398
 
432
- manager.appNames.forEach(appName => {
433
- manager.broadcast({action: 'disconnect', appName, windowId: manager.windowId})
399
+ Manager.appNames.forEach(appName => {
400
+ Manager.broadcast({action: 'disconnect', appName, windowId: Manager.windowId})
434
401
  })
435
402
  }
436
403
 
@@ -498,13 +465,6 @@ class DomEvents extends Base {
498
465
  me.testPathInclusion(event, preventClickTargets) && event.preventDefault()
499
466
  }
500
467
 
501
- /**
502
- * @param {Object} event
503
- */
504
- onDragOver(event) {
505
- event.dataTransfer.dropEffect = 'move'
506
- }
507
-
508
468
  /**
509
469
  * @param {FocusEvent} event
510
470
  */
@@ -616,13 +576,11 @@ class DomEvents extends Base {
616
576
  * @param {Event} event
617
577
  */
618
578
  onOrientationChange(event) {
619
- const
620
- {orientation} = screen,
579
+ let {orientation} = screen,
621
580
  {angle, type} = orientation,
622
- layout = angle === 0 || angle === 180 ? 'portrait' : 'landscape',
623
- {Manager} = Neo.worker;
581
+ layout = angle === 0 || angle === 180 ? 'portrait' : 'landscape';
624
582
 
625
- Manager.sendMessage('app', {
583
+ Neo.worker.Manager.sendMessage('app', {
626
584
  action: 'orientationChange',
627
585
  data : {angle, layout, type}
628
586
  })
@@ -633,7 +591,9 @@ class DomEvents extends Base {
633
591
  */
634
592
  onScroll(event) {
635
593
  let {clientHeight, clientWidth, scrollLeft, scrollTop} = event.target;
636
- event.preventDefault();
594
+
595
+ event.preventDefault();
596
+
637
597
  this.sendMessageToApp({
638
598
  ...this.getEventData(event),
639
599
  clientHeight,
@@ -196,17 +196,13 @@ class DragDrop extends Base {
196
196
  }
197
197
 
198
198
  /**
199
- * @param {Object} event
199
+ * @param {Event} event
200
200
  */
201
201
  onDragEnd(event) {
202
202
  let me = this,
203
203
  parsedEvent = me.getEventData(event),
204
204
  isDrop = me.pathIncludesDropZone(parsedEvent.targetPath);
205
205
 
206
- DomAccess.setBodyCls({
207
- remove: ['neo-unselectable']
208
- });
209
-
210
206
  if (me.bodyCursorStyle) {
211
207
  DomAccess.setStyle({
212
208
  id : 'document.body',
@@ -254,7 +250,7 @@ class DragDrop extends Base {
254
250
  }
255
251
 
256
252
  /**
257
- * @param {Object} event
253
+ * @param {Event} event
258
254
  */
259
255
  onDragMove(event) {
260
256
  let me = this,
@@ -290,17 +286,14 @@ class DragDrop extends Base {
290
286
  }
291
287
  }
292
288
 
293
- if (!me.moveHorizontal) {
294
- left = me.dragProxyRect.x
289
+ if (me.moveHorizontal) {
290
+ me.dragProxyElement.style.left = `${left}px`
295
291
  }
296
292
 
297
- me.dragProxyElement.style.left = `${left}px`;
298
293
 
299
- if (!me.moveVertical) {
300
- top = me.dragProxyRect.y
294
+ if (me.moveVertical) {
295
+ me.dragProxyElement.style.top = `${top}px`
301
296
  }
302
-
303
- me.dragProxyElement.style.top = `${top}px`
304
297
  }
305
298
 
306
299
  if (!me.dragProxyElement || me.alwaysFireDragMove) {
@@ -318,16 +311,12 @@ class DragDrop extends Base {
318
311
  }
319
312
 
320
313
  /**
321
- * @param {Object} event
314
+ * @param {Event} event
322
315
  */
323
316
  onDragStart(event) {
324
317
  let me = this,
325
318
  rect = event.target.getBoundingClientRect();
326
319
 
327
- DomAccess.setBodyCls({
328
- add: ['neo-unselectable']
329
- });
330
-
331
320
  Object.assign(me, {
332
321
  dragProxyRect: rect,
333
322
  offsetX : event.detail.clientX - rect.left,
@@ -341,7 +330,7 @@ class DragDrop extends Base {
341
330
  }
342
331
 
343
332
  /**
344
- * @param {Object} event
333
+ * @param {Event} event
345
334
  */
346
335
  onMouseEnter(event) {
347
336
  let me = this;
@@ -356,7 +345,7 @@ class DragDrop extends Base {
356
345
  }
357
346
 
358
347
  /**
359
- * @param {Object} event
348
+ * @param {Event} event
360
349
  */
361
350
  onMouseLeave(event) {
362
351
  let me = this;
@@ -20,7 +20,7 @@ class BaseModel extends Model {
20
20
  * @member {String[]} dataFields
21
21
  */
22
22
  get dataFields() {
23
- return this.view.parent.columns.map(c => c.dataField)
23
+ return this.view.parent.columns.map(column => column.dataField)
24
24
  }
25
25
  }
26
26
 
@@ -20,7 +20,7 @@ class BaseModel extends Model {
20
20
  * @member {String[]} dataFields
21
21
  */
22
22
  get dataFields() {
23
- return this.view.parent.columns.map(c => c.dataField)
23
+ return this.view.parent.columns.map(column => column.dataField)
24
24
  }
25
25
  }
26
26
 
@@ -192,7 +192,7 @@ class Container extends BaseContainer {
192
192
  headerToolbar.createItems()
193
193
  }
194
194
 
195
- me.view?.createViewData(me.store.items)
195
+ me.view?.createViewData()
196
196
  }
197
197
  }
198
198
 
@@ -407,12 +407,12 @@ class Container extends BaseContainer {
407
407
  }
408
408
 
409
409
  /**
410
- * @param {Array} inputData
410
+ *
411
411
  */
412
- createViewData(inputData) {
412
+ createViewData() {
413
413
  let me = this;
414
414
 
415
- me.view.createViewData(inputData);
415
+ me.view.createViewData();
416
416
 
417
417
  if (me.useCustomScrollbars && me.scrollbarsCssApplied === false) {
418
418
  me.applyCustomScrollbarsCss()
@@ -478,7 +478,7 @@ class Container extends BaseContainer {
478
478
  let me = this;
479
479
 
480
480
  if (me.rendered) {
481
- me.createViewData(data);
481
+ me.createViewData();
482
482
 
483
483
  if (me.store.sorters.length < 1) {
484
484
  me.removeSortingCss()
@@ -486,7 +486,7 @@ class Container extends BaseContainer {
486
486
  } else {
487
487
  me.on('rendered', () => {
488
488
  me.timeout(50).then(() => {
489
- me.createViewData(data)
489
+ me.createViewData()
490
490
  })
491
491
  }, me, {once: true})
492
492
  }
@@ -310,17 +310,17 @@ class View extends Component {
310
310
  }
311
311
 
312
312
  /**
313
- * @param {Object[]} inputData
313
+ *
314
314
  */
315
- createViewData(inputData) {
316
- let me = this,
317
- amountRows = inputData.length,
318
- i = 0,
319
- rows = [],
320
- {selectedRows} = me;
321
-
322
- for (; i < amountRows; i++) {
323
- rows.push(me.createRow({record: inputData[i], rowIndex: i}))
315
+ createViewData() {
316
+ let me = this,
317
+ {selectedRows, store} = me,
318
+ countRecords = store.getCount(),
319
+ i = 0,
320
+ rows = [];
321
+
322
+ for (; i < countRecords; i++) {
323
+ rows.push(me.createRow({record: store.items[i], rowIndex: i}))
324
324
  }
325
325
 
326
326
  me.vdom.cn = rows;
@@ -110,43 +110,6 @@ class Button extends BaseButton {
110
110
  ]}
111
111
  }
112
112
 
113
- /**
114
- * @param {Object} config
115
- */
116
- construct(config) {
117
- super.construct(config);
118
-
119
- let me = this;
120
-
121
- me.draggable && me.addDomListeners({
122
- dragend : me.onDragEnd,
123
- dragenter: me.onDragEnter,
124
- dragleave: me.onDragLeave,
125
- dragover : me.onDragOver,
126
- dragstart: me.onDragStart,
127
- drop : me.onDrop,
128
- scope : me
129
- })
130
- }
131
-
132
- /**
133
- * Triggered after the draggable config got changed
134
- * @param {Boolean} value
135
- * @param {Boolean} oldValue
136
- * @protected
137
- */
138
- afterSetDraggable(value, oldValue) {
139
- let me = this;
140
-
141
- if (value === true) {
142
- me.getVdomRoot().draggable = true
143
- } else {
144
- delete me.getVdomRoot().draggable
145
- }
146
-
147
- me.update()
148
- }
149
-
150
113
  /**
151
114
  * Triggered after the isSorted config got changed
152
115
  * @param {String|null} value
@@ -413,74 +376,6 @@ class Button extends BaseButton {
413
376
  me.isSorted = map[me.isSorted + '']
414
377
  }
415
378
 
416
- /**
417
- * @protected
418
- */
419
- onDragEnd() {
420
- let me = this,
421
- {style} = me;
422
-
423
- delete style.opacity;
424
- me.style = style
425
- }
426
-
427
- /**
428
- * @protected
429
- */
430
- onDragEnter() {
431
- let me = this,
432
- {cls} = me;
433
-
434
- NeoArray.add(cls, 'neo-drag-over');
435
- me.cls = cls
436
- }
437
-
438
- /**
439
- * @protected
440
- */
441
- onDragLeave() {
442
- let me = this,
443
- {cls} = me;
444
-
445
- NeoArray.remove(cls, 'neo-drag-over');
446
- me.cls = cls
447
- }
448
-
449
- /**
450
- * @param {Object} event
451
- */
452
- onDragOver(event) {
453
- //console.log('onDragOver', event);
454
- }
455
-
456
- /**
457
- * @protected
458
- */
459
- onDragStart() {
460
- let me = this,
461
- {style} = me;
462
-
463
- style.opacity = 0.4;
464
- me.style = style
465
- }
466
-
467
- /**
468
- * @param {Object} data
469
- */
470
- onDrop(data) {
471
- let me = this,
472
- headerToolbar = me.parent,
473
- {style} = me,
474
- tableContainer = headerToolbar.parent;
475
-
476
- me.onDragLeave();
477
- headerToolbar.switchItems(me.id, data.srcId);
478
- tableContainer.createViewData(tableContainer.store.data);
479
-
480
- style.opacity = 1;
481
- me.style = style
482
- }
483
-
484
379
  /**
485
380
  * @protected
486
381
  */
@@ -17,9 +17,13 @@ class Toolbar extends BaseToolbar {
17
17
  */
18
18
  ntype: 'table-header-toolbar',
19
19
  /**
20
- * @member {String[]} baseCls=['table-header-toolbar']
20
+ * @member {String[]} baseCls=['neo-table-header-toolbar']
21
21
  */
22
- baseCls: ['table-header-toolbar'],
22
+ baseCls: ['neo-table-header-toolbar'],
23
+ /**
24
+ * @member {Boolean} draggable_=true
25
+ */
26
+ draggable_: true,
23
27
  /**
24
28
  * @member {String} layout='base'
25
29
  */
@@ -35,6 +39,8 @@ class Toolbar extends BaseToolbar {
35
39
  */
36
40
  showHeaderFilters_: false,
37
41
  /**
42
+ * Convenience shortcut to pass sortable to all toolbar items.
43
+ * If set to true, header clicks will sort the matching column (ASC, DESC, null)
38
44
  * @member {Boolean} sortable=true
39
45
  */
40
46
  sortable: true,
@@ -47,6 +53,31 @@ class Toolbar extends BaseToolbar {
47
53
  ]}
48
54
  }
49
55
 
56
+ /**
57
+ * Triggered after the draggable config got changed
58
+ * @param {Boolean} value
59
+ * @param {Boolean} oldValue
60
+ * @protected
61
+ */
62
+ afterSetDraggable(value, oldValue) {
63
+ let me = this;
64
+
65
+ if (value && !me.sortZone) {
66
+ import('../../draggable/table/header/toolbar/SortZone.mjs').then(module => {
67
+ let {appName, id, windowId} = me;
68
+
69
+ me.sortZone = Neo.create({
70
+ module : module.default,
71
+ appName,
72
+ boundaryContainerId: id,
73
+ owner : me,
74
+ windowId,
75
+ ...me.sortZoneConfig
76
+ })
77
+ })
78
+ }
79
+ }
80
+
50
81
  /**
51
82
  * Triggered after the showHeaderFilters config got changed
52
83
  * @param {Boolean} value
@@ -84,6 +115,7 @@ class Toolbar extends BaseToolbar {
84
115
  })
85
116
  });
86
117
 
118
+ me.updateDepth = 2;
87
119
  me.update()
88
120
  }
89
121
  }
@@ -309,7 +309,7 @@ export default class Rectangle extends DOMRect {
309
309
 
310
310
  /**
311
311
  * Returns a clone of this Rectangle expanded according to the edges array.
312
- * @param {Number}Number[]} edges
312
+ * @param {Number[]} edges
313
313
  * @returns {Rectangle}
314
314
  */
315
315
  expand(edges) {