neo.mjs 8.14.1 → 8.14.3

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.
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='8.14.1'
23
+ * @member {String} version='8.14.3'
24
24
  */
25
- version: '8.14.1'
25
+ version: '8.14.3'
26
26
  }
27
27
 
28
28
  /**
@@ -16,7 +16,7 @@
16
16
  "@type": "Organization",
17
17
  "name": "Neo.mjs"
18
18
  },
19
- "datePublished": "2025-02-03",
19
+ "datePublished": "2025-02-04",
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.14.1'
110
+ html : 'v8.14.3'
111
111
  }]
112
112
  }],
113
113
  /**
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='8.14.1'
23
+ * @member {String} version='8.14.3'
24
24
  */
25
- version: '8.14.1'
25
+ version: '8.14.3'
26
26
  }
27
27
 
28
28
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo.mjs",
3
- "version": "8.14.1",
3
+ "version": "8.14.3",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -14,6 +14,10 @@
14
14
  .neo-dragproxy {
15
15
  .neo-grid-container {
16
16
  border: none;
17
+
18
+ * {
19
+ scrollbar-width: none;
20
+ }
17
21
  }
18
22
 
19
23
  .neo-grid-header-toolbar {
@@ -23,10 +27,6 @@
23
27
  border-right: 1px solid var(--grid-container-border-color);
24
28
  }
25
29
  }
26
-
27
- .neo-grid-row {
28
- position: unset;
29
- }
30
30
  }
31
31
 
32
32
  .neo-grid-header-toolbar {
@@ -262,12 +262,12 @@ const DefaultConfig = {
262
262
  useVdomWorker: true,
263
263
  /**
264
264
  * buildScripts/injectPackageVersion.mjs will update this value
265
- * @default '8.14.1'
265
+ * @default '8.14.3'
266
266
  * @memberOf! module:Neo
267
267
  * @name config.version
268
268
  * @type String
269
269
  */
270
- version: '8.14.1'
270
+ version: '8.14.3'
271
271
  };
272
272
 
273
273
  Object.assign(DefaultConfig, {
@@ -272,11 +272,11 @@ class Container extends Component {
272
272
 
273
273
  item.reference = ref;
274
274
  result.push(item);
275
- hasWeight ||= ('weight' in item);
275
+ hasWeight ||= ('weight' in item)
276
276
  }
277
277
 
278
278
  if (hasWeight) {
279
- result.sort(byWeight);
279
+ result.sort(byWeight)
280
280
  }
281
281
 
282
282
  value = result
@@ -413,7 +413,9 @@ class Container extends Component {
413
413
 
414
414
  // We need to add items into the vdom
415
415
  me.updateDepth = -1;
416
- me.update()
416
+ me.update();
417
+
418
+ me.fire('itemsCreated', {id: me.id, items})
417
419
  }
418
420
 
419
421
  /**
@@ -19,7 +19,7 @@ class SortZone extends BaseSortZone {
19
19
  */
20
20
  ntype: 'grid-header-toolbar-sortzone',
21
21
  /**
22
- * @member {String|null} itemMargin=null
22
+ * @member {String|null} itemMargin='1px'
23
23
  * @protected
24
24
  */
25
25
  itemMargin: '1px',
@@ -52,28 +52,29 @@ class SortZone extends BaseSortZone {
52
52
  return await super.createDragProxy(data, createComponent)
53
53
  }
54
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(),
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
+ viewWrapperId = Neo.getId('grid-view-wrapper'),
65
66
  row;
66
67
 
67
68
  config.cls = ['neo-grid-wrapper', me.owner.getTheme()];
68
69
 
69
- config.style.height = rect.height + 'px';
70
+ config.style.height = `${rect.height - 2}px`; // minus border-bottom & border-top
70
71
 
71
72
  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
- };
73
+ row = VdomUtil.clone({ // clone to remove ids
74
+ cls : gridRows[index].cls,
75
+ cn : [cell],
76
+ style: gridRows[index].style
77
+ });
77
78
 
78
79
  delete row.cn[0].style.left;
79
80
 
@@ -84,10 +85,24 @@ class SortZone extends BaseSortZone {
84
85
  {cn: [
85
86
  {cls: ['neo-grid-container'], cn: [
86
87
  {...config.vdom, cls: ['neo-grid-header-toolbar', 'neo-toolbar']},
87
- {cls: ['neo-grid-view'], cn: rows}
88
+ {cls: ['neo-grid-view-wrapper'], id: viewWrapperId, cn: [
89
+ {cls: ['neo-grid-view'], cn: rows},
90
+ {cls: ['neo-grid-scrollbar'], style: {height: view.vdom.cn[1].height}}
91
+ ]}
88
92
  ]}
89
93
  ]};
90
94
 
95
+ config.listeners = {
96
+ mounted() {
97
+ Neo.main.DomAccess.scrollTo({
98
+ direction: 'top',
99
+ id : viewWrapperId,
100
+ value : view.scrollPosition.y,
101
+ windowId : this.windowId
102
+ })
103
+ }
104
+ };
105
+
91
106
  if (createComponent) {
92
107
  return me.dragProxy = Neo.create(config)
93
108
  }
@@ -154,31 +169,40 @@ class SortZone extends BaseSortZone {
154
169
  * @param {Number} index2
155
170
  */
156
171
  switchItems(index1, index2) {
172
+ super.switchItems(index1, index2);
173
+
157
174
  if (this.moveColumnContent) {
158
- let {view} = this.owner.parent,
175
+ let me = this,
176
+ {itemRects} = me,
177
+ {view} = me.owner.parent,
159
178
  columnPositions = view._columnPositions, // no clone
160
179
  column1Cells = view.getColumnCells(columnPositions[index1].dataField),
161
- column2Cells = view.getColumnCells(columnPositions[index2].dataField),
162
- x;
180
+ column2Cells = view.getColumnCells(columnPositions[index2].dataField);
163
181
 
164
- x = columnPositions[index1].x;
165
- columnPositions[index1].x = columnPositions[index2].x;
166
- columnPositions[index2].x = x;
182
+ Object.assign(columnPositions[index1], {
183
+ width: itemRects[index2].width,
184
+ x : itemRects[index2].x + 1
185
+ });
186
+
187
+ Object.assign(columnPositions[index2], {
188
+ width: itemRects[index1].width,
189
+ x : itemRects[index1].x + 1
190
+ });
167
191
 
168
192
  NeoArray.move(columnPositions, index1, index2);
169
193
 
170
194
  column1Cells.forEach(node => {
171
- node.style.left = columnPositions[index2].x + 'px'
195
+ node.style.left = columnPositions[index2].x + 'px';
196
+ node.style.width = columnPositions[index2].width + 'px'
172
197
  });
173
198
 
174
199
  column2Cells.forEach(node => {
175
- node.style.left = columnPositions[index1].x + 'px'
200
+ node.style.left = columnPositions[index1].x + 'px';
201
+ node.style.width = columnPositions[index1].width + 'px'
176
202
  });
177
203
 
178
204
  view.update()
179
205
  }
180
-
181
- super.switchItems(index1, index2);
182
206
  }
183
207
  }
184
208
 
@@ -36,8 +36,13 @@ class DragZone extends BaseDragZone {
36
36
  {'drag:start': me.onDragStart, ...opts}
37
37
  ]);
38
38
 
39
- owner.on('insert', me.onItemInsert, me);
39
+ owner.on({
40
+ insert : me.onItemInsert,
41
+ itemsCreated: me.onItemsCreated,
42
+ scope : me
43
+ });
40
44
 
45
+ // The toolbar items can already be created
41
46
  me.adjustToolbarItemCls(true)
42
47
  }
43
48
 
@@ -98,16 +103,25 @@ class DragZone extends BaseDragZone {
98
103
  }
99
104
 
100
105
  /**
101
- * @param {Object} data
102
- * @param {Number} data.index
106
+ * @param {Object} data
107
+ * @param {Number} data.index
103
108
  * @param {Neo.component.Base} data.item
104
109
  */
105
110
  onItemInsert(data) {
106
- let {item} = data,
107
- cls = item.cls || [];
111
+ let {item} = data,
112
+ wrapperCls = item.wrapperCls || [];
113
+
114
+ NeoArray.add(wrapperCls, 'neo-draggable');
115
+ item.wrapperCls = wrapperCls
116
+ }
108
117
 
109
- NeoArray.add(cls, 'neo-draggable');
110
- item.cls = cls
118
+ /**
119
+ * @param {Object} data
120
+ * @param {String} data.id
121
+ * @param {Neo.component.Base[]} data.items
122
+ */
123
+ onItemsCreated(data) {console.log('onItemsCreated');
124
+ this.adjustToolbarItemCls(true)
111
125
  }
112
126
  }
113
127
 
@@ -61,6 +61,14 @@ class SortZone extends DragZone {
61
61
  * @protected
62
62
  */
63
63
  reversedLayoutDirection: false,
64
+ /**
65
+ * @member {Number} scrollLeft=0
66
+ */
67
+ scrollLeft: 0,
68
+ /**
69
+ * @member {Number} scrollTop=0
70
+ */
71
+ scrollTop: 0,
64
72
  /**
65
73
  * Internal flag: onDragStart() will set the value to horizontal or vertical, depending on the current layout.
66
74
  * @member {String} sortDirection='horizontal'
@@ -142,35 +150,38 @@ class SortZone extends DragZone {
142
150
  * @param {Object} data
143
151
  */
144
152
  onDragMove(data) {
145
- if (this.itemRects) { // the method can trigger before we got the client rects from the main thread
146
- let me = this,
147
- moveFactor = 0.55, // we can not use 0.5, since items would jump back & forth
148
- index = me.currentIndex,
149
- {itemRects} = me,
150
- maxItems = itemRects.length - 1,
151
- reversed = me.reversedLayoutDirection,
152
- delta, itemWidth;
153
-
154
- if (me.sortDirection === 'horizontal') {
155
- delta = data.clientX - me.offsetX - itemRects[index].left;
156
- itemWidth = 'width'
157
- } else {
158
- delta = data.clientY - me.offsetY - itemRects[index].top;
159
- itemWidth = 'height'
160
- }
153
+ // the method can trigger before we got the client rects from the main thread
154
+ if (!this.itemRects) {
155
+ return
156
+ }
161
157
 
162
- if (index > 0 && (!reversed && delta < 0 || reversed && delta > 0)) {
163
- if (Math.abs(delta) > itemRects[index - 1][itemWidth] * moveFactor) {
164
- me.currentIndex--;
165
- me.switchItems(index, me.currentIndex)
166
- }
158
+ let me = this,
159
+ moveFactor = 0.55, // we can not use 0.5, since items would jump back & forth
160
+ index = me.currentIndex,
161
+ {itemRects} = me,
162
+ maxItems = itemRects.length - 1,
163
+ reversed = me.reversedLayoutDirection,
164
+ delta, itemWidth;
165
+
166
+ if (me.sortDirection === 'horizontal') {
167
+ delta = data.clientX + me.scrollLeft - me.offsetX - itemRects[index].left;
168
+ itemWidth = 'width'
169
+ } else {
170
+ delta = data.clientY + me.scrollTop - me.offsetY - itemRects[index].top;
171
+ itemWidth = 'height'
172
+ }
173
+
174
+ if (index > 0 && (!reversed && delta < 0 || reversed && delta > 0)) {
175
+ if (Math.abs(delta) > itemRects[index - 1][itemWidth] * moveFactor) {
176
+ me.currentIndex--;
177
+ me.switchItems(index, me.currentIndex)
167
178
  }
179
+ }
168
180
 
169
- else if (index < maxItems && (!reversed && delta > 0 || reversed && delta < 0)) {
170
- if (Math.abs(delta) > itemRects[index + 1][itemWidth] * moveFactor) {
171
- me.currentIndex++;
172
- me.switchItems(index, me.currentIndex)
173
- }
181
+ else if (index < maxItems && (!reversed && delta > 0 || reversed && delta < 0)) {
182
+ if (Math.abs(delta) > itemRects[index + 1][itemWidth] * moveFactor) {
183
+ me.currentIndex++;
184
+ me.switchItems(index, me.currentIndex)
174
185
  }
175
186
  }
176
187
  }
@@ -506,8 +506,11 @@ class GridContainer extends BaseContainer {
506
506
  /**
507
507
  * @param {Object} data
508
508
  */
509
- onScroll(data) {
510
- this.view.scrollPosition = {x: data.scrollLeft, y: this.view.scrollPosition.y}
509
+ onScroll({scrollLeft}) {
510
+ let me = this;
511
+
512
+ me.headerToolbar.scrollLeft = scrollLeft;
513
+ me.view.scrollPosition = {x: scrollLeft, y: me.view.scrollPosition.y}
511
514
  }
512
515
 
513
516
  /**
@@ -34,6 +34,10 @@ class Toolbar extends BaseToolbar {
34
34
  * @member {String} role='row'
35
35
  */
36
36
  role: 'row',
37
+ /**
38
+ * @member {Number} scrollLeft_=0
39
+ */
40
+ scrollLeft_: 0,
37
41
  /**
38
42
  * @member {Boolean} showHeaderFilters_=false
39
43
  */
@@ -62,13 +66,14 @@ class Toolbar extends BaseToolbar {
62
66
 
63
67
  if (value && !me.sortZone) {
64
68
  import('../../draggable/grid/header/toolbar/SortZone.mjs').then(module => {
65
- let {appName, id, windowId} = me;
69
+ let {appName, id, scrollLeft, windowId} = me;
66
70
 
67
71
  me.sortZone = Neo.create({
68
72
  module : module.default,
69
73
  appName,
70
74
  boundaryContainerId: id,
71
75
  owner : me,
76
+ scrollLeft,
72
77
  windowId,
73
78
  ...me.sortZoneConfig
74
79
  })
@@ -108,6 +113,18 @@ class Toolbar extends BaseToolbar {
108
113
  }
109
114
  }
110
115
 
116
+ /**
117
+ * Triggered after the scrollLeft config got changed
118
+ * @param {Number} value
119
+ * @param {Number} oldValue
120
+ * @protected
121
+ */
122
+ afterSetScrollLeft(value, oldValue) {
123
+ if (oldValue !== undefined && this.sortZone) {
124
+ this.sortZone.scrollLeft = value
125
+ }
126
+ }
127
+
111
128
  /**
112
129
  * Triggered after the sortable config got changed
113
130
  * @param {Boolean} value
@@ -932,19 +932,19 @@ class DomAccess extends Base {
932
932
 
933
933
  /**
934
934
  * @param {Object} data
935
- * @param {String} data.direction left, top
935
+ * @param {String} data.direction='top' left, top
936
936
  * @param {String} data.id
937
937
  * @param {Number} data.value
938
938
  * @returns {Object} obj.id => the passed id
939
939
  */
940
- scrollTo(data) {
941
- let node = this.getElement(data.id);
940
+ scrollTo({direction='top', id, value}) {
941
+ let node = this.getElement(id);
942
942
 
943
943
  if (node) {
944
- node[`scroll${Neo.capitalize(data.direction)}`] = data.value
944
+ node[`scroll${Neo.capitalize(direction)}`] = value
945
945
  }
946
946
 
947
- return {id: data.id}
947
+ return {id}
948
948
  }
949
949
 
950
950
  /**