neo.mjs 8.10.1 → 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 (47) 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/examples/table/container/MainContainer.mjs +1 -2
  7. package/examples/tableFiltering/MainContainer.mjs +1 -1
  8. package/examples/tableFiltering/MainStore.mjs +10 -10
  9. package/package.json +2 -2
  10. package/resources/scss/src/draggable/DragProxyComponent.scss +9 -0
  11. package/resources/scss/src/draggable/grid/header/toolbar/SortZone.scss +16 -0
  12. package/resources/scss/src/draggable/table/header/toolbar/SortZone.scss +32 -0
  13. package/resources/scss/src/grid/View.scss +0 -18
  14. package/resources/scss/src/grid/header/Toolbar.scss +0 -1
  15. package/resources/scss/src/table/View.scss +4 -18
  16. package/resources/scss/src/table/header/Button.scss +0 -4
  17. package/resources/scss/theme-dark/draggable/grid/header/toolbar/SortZone.scss +3 -0
  18. package/resources/scss/theme-dark/draggable/table/header/toolbar/SortZone.scss +3 -0
  19. package/resources/scss/theme-light/draggable/grid/header/toolbar/SortZone.scss +3 -0
  20. package/resources/scss/theme-light/draggable/table/header/toolbar/SortZone.scss +3 -0
  21. package/resources/scss/theme-neo-light/draggable/grid/header/toolbar/SortZone.scss +3 -0
  22. package/resources/scss/theme-neo-light/draggable/table/header/toolbar/SortZone.scss +3 -0
  23. package/src/DefaultConfig.mjs +2 -2
  24. package/src/Main.mjs +9 -3
  25. package/src/component/Base.mjs +2 -6
  26. package/src/draggable/grid/header/toolbar/SortZone.mjs +74 -0
  27. package/src/draggable/table/header/toolbar/SortZone.mjs +70 -0
  28. package/src/draggable/toolbar/SortZone.mjs +23 -14
  29. package/src/form/field/ComboBox.mjs +1 -5
  30. package/src/grid/header/Button.mjs +0 -109
  31. package/src/grid/header/Toolbar.mjs +32 -0
  32. package/src/main/DomAccess.mjs +14 -17
  33. package/src/main/DomEvents.mjs +10 -50
  34. package/src/main/addon/DragDrop.mjs +9 -20
  35. package/src/selection/grid/BaseModel.mjs +1 -1
  36. package/src/selection/table/BaseModel.mjs +8 -0
  37. package/src/selection/table/CellColumnModel.mjs +28 -26
  38. package/src/selection/table/CellColumnRowModel.mjs +25 -23
  39. package/src/selection/table/CellModel.mjs +49 -42
  40. package/src/selection/table/CellRowModel.mjs +18 -20
  41. package/src/selection/table/ColumnModel.mjs +26 -60
  42. package/src/selection/table/RowModel.mjs +16 -48
  43. package/src/table/Container.mjs +6 -6
  44. package/src/table/View.mjs +26 -20
  45. package/src/table/header/Button.mjs +55 -156
  46. package/src/table/header/Toolbar.mjs +34 -2
  47. package/src/util/Rectangle.mjs +1 -1
@@ -54,76 +54,80 @@ class CellModel extends BaseModel {
54
54
  * @param {Object} data
55
55
  */
56
56
  onKeyDownDown(data) {
57
- this.onNavKeyRow(data, 1)
57
+ this.onNavKeyRow(1)
58
58
  }
59
59
 
60
60
  /**
61
61
  * @param {Object} data
62
62
  */
63
63
  onKeyDownLeft(data) {
64
- this.onNavKeyColumn(data, -1)
64
+ this.onNavKeyColumn(-1)
65
65
  }
66
66
 
67
67
  /**
68
68
  * @param {Object} data
69
69
  */
70
70
  onKeyDownRight(data) {
71
- this.onNavKeyColumn(data, 1)
71
+ this.onNavKeyColumn(1)
72
72
  }
73
73
 
74
74
  /**
75
75
  * @param {Object} data
76
76
  */
77
77
  onKeyDownUp(data) {
78
- this.onNavKeyRow(data, -1)
78
+ this.onNavKeyRow(-1)
79
79
  }
80
80
 
81
81
  /**
82
- * @param {Object} data
83
82
  * @param {Number} step
84
83
  */
85
- onNavKeyColumn(data, step) {
86
- let me = this,
87
- {view} = me,
88
- idArray = data.path[0].id.split('__'),
89
- currentColumn = idArray[2],
90
- dataFields = view.parent.columns.map(c => c.dataField),
91
- newIndex = (dataFields.indexOf(currentColumn) + step) % dataFields.length,
92
- id;
84
+ onNavKeyColumn(step) {
85
+ let me = this,
86
+ {dataFields, view} = me,
87
+ {store} = view,
88
+ currentColumn, newIndex, record;
89
+
90
+ if (me.hasSelection()) {
91
+ currentColumn = view.getDataField(me.items[0]);
92
+ record = view.getRecord(me.items[0])
93
+ } else {
94
+ currentColumn = dataFields[0];
95
+ record = store.getAt(0)
96
+ }
97
+
98
+ newIndex = (dataFields.indexOf(currentColumn) + step) % dataFields.length;
93
99
 
94
100
  while (newIndex < 0) {
95
101
  newIndex += dataFields.length
96
102
  }
97
103
 
98
- idArray[2] = dataFields[newIndex];
99
- id = idArray.join('__');
100
-
101
- me.select(id);
102
- view.focus(id)
104
+ me.select(view.getCellId(record, dataFields[newIndex]))
103
105
  }
104
106
 
105
107
  /**
106
- * @param {Object} data
107
108
  * @param {Number} step
108
109
  */
109
- onNavKeyRow(data, step) {
110
- let me = this,
111
- {view} = me,
112
- {store} = view,
113
- idArray = data.path[0].id.split('__'),
114
- recordId = idArray[1],
115
- newIndex = (store.indexOf(recordId) + step) % store.getCount(),
116
- id;
110
+ onNavKeyRow(step) {
111
+ let me = this,
112
+ {view} = me,
113
+ {store} = view,
114
+ currentIndex = 0,
115
+ dataField, newIndex;
116
+
117
+ if (me.hasSelection()) {
118
+ currentIndex = store.indexOf(view.getRecord(me.items[0]));
119
+ dataField = view.getDataField(me.items[0])
120
+ } else {
121
+ dataField = me.dataFields[0]
122
+ }
123
+
124
+ newIndex = (currentIndex + step) % store.getCount();
117
125
 
118
126
  while (newIndex < 0) {
119
127
  newIndex += store.getCount()
120
128
  }
121
129
 
122
- idArray[1] = store.getKeyAt(newIndex);
123
- id = idArray.join('__');
124
-
125
- me.select(id);
126
- view.focus(id)
130
+ me.select(view.getCellId(store.getAt(newIndex), dataField))
127
131
  }
128
132
 
129
133
  /**
@@ -133,13 +137,14 @@ class CellModel extends BaseModel {
133
137
  super.register(component);
134
138
 
135
139
  let me = this,
136
- {id, view} = me;
140
+ {id, view} = me,
141
+ scope = id;
137
142
 
138
143
  view.keys?._keys.push(
139
- {fn: 'onKeyDownDown' ,key: 'Down' ,scope: id},
140
- {fn: 'onKeyDownLeft' ,key: 'Left' ,scope: id},
141
- {fn: 'onKeyDownRight' ,key: 'Right' ,scope: id},
142
- {fn: 'onKeyDownUp' ,key: 'Up' ,scope: id}
144
+ {fn: 'onKeyDownDown' ,key: 'Down' ,scope},
145
+ {fn: 'onKeyDownLeft' ,key: 'Left' ,scope},
146
+ {fn: 'onKeyDownRight' ,key: 'Right' ,scope},
147
+ {fn: 'onKeyDownUp' ,key: 'Up' ,scope}
143
148
  )
144
149
  }
145
150
 
@@ -147,13 +152,15 @@ class CellModel extends BaseModel {
147
152
  *
148
153
  */
149
154
  unregister() {
150
- let {id, view} = this;
155
+ let me = this,
156
+ {id, view} = me,
157
+ scope = id;
151
158
 
152
159
  view.keys?.removeKeys([
153
- {fn: 'onKeyDownDown' ,key: 'Down' ,scope: id},
154
- {fn: 'onKeyDownLeft' ,key: 'Left' ,scope: id},
155
- {fn: 'onKeyDownRight' ,key: 'Right' ,scope: id},
156
- {fn: 'onKeyDownUp' ,key: 'Up' ,scope: id}
160
+ {fn: 'onKeyDownDown' ,key: 'Down' ,scope},
161
+ {fn: 'onKeyDownLeft' ,key: 'Left' ,scope},
162
+ {fn: 'onKeyDownRight' ,key: 'Right' ,scope},
163
+ {fn: 'onKeyDownUp' ,key: 'Up' ,scope}
157
164
  ]);
158
165
 
159
166
  super.unregister()
@@ -1,7 +1,5 @@
1
1
  import CellModel from './CellModel.mjs';
2
2
  import NeoArray from '../../util/Array.mjs';
3
- import RowModel from './RowModel.mjs';
4
- import VDomUtil from '../../util/VDom.mjs';
5
3
 
6
4
  /**
7
5
  * @class Neo.selection.table.CellRowModel
@@ -71,39 +69,39 @@ class CellRowModel extends CellModel {
71
69
  * @param {Object} data
72
70
  */
73
71
  onCellClick(data) {
74
- let me = this,
75
- node = RowModel.getRowNode(data.data.path), // we could add a separate export for this method
76
- id = node?.id;
72
+ let me = this,
73
+ record = me.view.getRecord(data.data.currentTarget),
74
+ rowId = me.view.getRowId(record);
77
75
 
78
- if (id) {
76
+ if (rowId) {
79
77
  me.deselectAllRows(true);
80
- me.selectRow(id)
78
+ me.selectRow(rowId)
81
79
  }
82
80
 
83
81
  super.onCellClick(data)
84
82
  }
85
83
 
86
84
  /**
87
- * @param {Object} data
88
85
  * @param {Number} step
89
86
  */
90
- onNavKeyRow(data, step) {
91
- super.onNavKeyRow(data, step);
92
-
93
- let me = this,
94
- node = RowModel.getRowNode(data.path),
95
- {view} = me,
96
- {store} = view,
97
- vdomNode = VDomUtil.find(view.vdom, node.id),
98
- newIndex = (vdomNode.index + step) % store.getCount(),
99
- parentNode = vdomNode.parentNode,
87
+ onNavKeyRow(step) {
88
+ super.onNavKeyRow(step);
89
+
90
+ let me = this,
91
+ {view} = me,
92
+ {store} = view,
93
+ countRecords = store.getCount(),
94
+ rowId = me.selectedRowIds[0] || view.getRowId(store.getAt(0)),
95
+ record = view.getRecord(rowId),
96
+ index = store.indexOf(record),
97
+ newIndex = (index + step) % countRecords,
100
98
  id;
101
99
 
102
100
  while (newIndex < 0) {
103
- newIndex += store.getCount()
101
+ newIndex += countRecords
104
102
  }
105
103
 
106
- id = parentNode.cn[newIndex].id;
104
+ id = view.getRowId(store.getAt(newIndex));
107
105
 
108
106
  if (id) {
109
107
  me.deselectAllRows(true);
@@ -44,51 +44,19 @@ class ColumnModel extends BaseModel {
44
44
  super.destroy(...args)
45
45
  }
46
46
 
47
- /**
48
- * @param {Object} eventPath
49
- * @returns {String|null} cellId
50
- */
51
- static getCellId(eventPath) {
52
- let id = null,
53
- i = 0,
54
- len = eventPath.length;
55
-
56
- for (; i < len; i++) {
57
- if (eventPath[i].tagName === 'td') {
58
- id = eventPath[i].id;
59
- break
60
- }
61
- }
62
-
63
- return id
64
- }
65
-
66
- /**
67
- * todo: move to table.Container or view
68
- * @param {String} cellId
69
- * @param {Array} columns
70
- * @returns {Number} index
71
- */
72
- static getColumnIndex(cellId, columns) {
73
- let idArray = cellId.split('__'),
74
- currentColumn = idArray[2],
75
- dataFields = columns.map(c => c.dataField);
76
-
77
- return dataFields.indexOf(currentColumn)
78
- }
79
-
80
47
  /**
81
48
  * @param {Object} data
82
49
  */
83
50
  onCellClick(data) {
84
- let me = this,
85
- {headerToolbar} = me.view.parent,
86
- id = data.data.currentTarget,
87
- columnNodeIds, index;
51
+ let me = this,
52
+ {view} = me,
53
+ cellId = data.data.currentTarget,
54
+ columnNodeIds, dataField, index;
88
55
 
89
- if (id) {
90
- index = ColumnModel.getColumnIndex(id, headerToolbar.items);
91
- columnNodeIds = VDomUtil.getColumnNodesIds(me.view.vdom, index);
56
+ if (cellId) {
57
+ dataField = view.getDataField(cellId);
58
+ index = view.getColumn(dataField, true);
59
+ columnNodeIds = VDomUtil.getColumnNodesIds(view.vdom, index);
92
60
 
93
61
  me.select(columnNodeIds)
94
62
  }
@@ -98,41 +66,39 @@ class ColumnModel extends BaseModel {
98
66
  * @param {Object} data
99
67
  */
100
68
  onKeyDownLeft(data) {
101
- this.onNavKeyColumn(data, -1)
69
+ this.onNavKeyColumn(-1)
102
70
  }
103
71
 
104
72
  /**
105
73
  * @param {Object} data
106
74
  */
107
75
  onKeyDownRight(data) {
108
- this.onNavKeyColumn(data, 1)
76
+ this.onNavKeyColumn(1)
109
77
  }
110
78
 
111
79
  /**
112
- * @param {Object} data
113
80
  * @param {Number} step
114
81
  */
115
- onNavKeyColumn(data, step) {
116
- let me = this,
117
- idArray = ColumnModel.getCellId(data.path).split('__'),
118
- currentColumn = idArray[2],
119
- {view} = me,
120
- dataFields = view.parent.columns.map(c => c.dataField),
121
- newIndex = (dataFields.indexOf(currentColumn) + step) % dataFields.length,
122
- columnNodeIds, id, tbodyNode;
123
-
124
- while (newIndex < 0) {
125
- newIndex += dataFields.length
82
+ onNavKeyColumn(step) {
83
+ let me = this,
84
+ {dataFields, view} = me,
85
+ columnNodeIds, currentColumn, index;
86
+
87
+ if (me.hasSelection()) {
88
+ currentColumn = view.getDataField(me.items[0])
89
+ } else {
90
+ currentColumn = dataFields[0]
126
91
  }
127
92
 
128
- idArray[2] = dataFields[newIndex];
129
- id = idArray.join('__');
93
+ index = (dataFields.indexOf(currentColumn) + step) % dataFields.length;
94
+
95
+ while (index < 0) {
96
+ index += dataFields.length
97
+ }
130
98
 
131
- tbodyNode = VDomUtil.find(me.view.vdom, {tag: 'tbody'}).vdom;
132
- columnNodeIds = VDomUtil.getColumnNodesIds(tbodyNode, newIndex);
99
+ columnNodeIds = VDomUtil.getColumnNodesIds(view.vdom, index);
133
100
 
134
- me.select(columnNodeIds);
135
- view.focus(id) // we have to focus one cell to ensure the keynav keeps working
101
+ me.select(columnNodeIds)
136
102
  }
137
103
 
138
104
  /**
@@ -1,5 +1,4 @@
1
1
  import BaseModel from './BaseModel.mjs';
2
- import VDomUtil from '../../util/VDom.mjs';
3
2
 
4
3
  /**
5
4
  * @class Neo.selection.table.RowModel
@@ -44,76 +43,45 @@ class RowModel extends BaseModel {
44
43
  super.destroy(...args)
45
44
  }
46
45
 
47
- /**
48
- * Finds the matching table row for a given row index
49
- * @param {Number} index row index
50
- * @returns {String|null} The table row node id
51
- */
52
- getRowId(index) {
53
- if (index < 0 || this.view.store.getCount() < index) {
54
- return null
55
- }
56
-
57
- return this.view.vdom.cn[0].cn[1].cn[index].id
58
- }
59
-
60
- /**
61
- * Finds the matching table row for a given event path
62
- * @param {Object} path The event path
63
- * @returns {Object|null} The node containing the table row class or null
64
- * @protected
65
- */
66
- static getRowNode(path) {
67
- let i = 0,
68
- len = path.length,
69
- node = null;
70
-
71
- for (; i < len; i++) {
72
- if (path[i].cls.includes('neo-table-row')) {
73
- node = path[i]
74
- }
75
- }
76
-
77
- return node
78
- }
79
-
80
46
  /**
81
47
  * @param {Object} data
82
48
  */
83
49
  onKeyDownDown(data) {
84
- this.onNavKeyRow(data, 1)
50
+ this.onNavKeyRow(1)
85
51
  }
86
52
 
87
53
  /**
88
54
  * @param {Object} data
89
55
  */
90
56
  onKeyDownUp(data) {
91
- this.onNavKeyRow(data, -1)
57
+ this.onNavKeyRow(-1)
92
58
  }
93
59
 
94
60
  /**
95
- * @param {Object} data
96
61
  * @param {Number} step
97
62
  */
98
- onNavKeyRow(data, step) {
63
+ onNavKeyRow(step) {
99
64
  let me = this,
100
- node = RowModel.getRowNode(data.path),
101
65
  {view} = me,
102
66
  {store} = view,
103
- vdomNode = VDomUtil.find(view.vdom, node.id),
104
- newIndex = (vdomNode.index + step) % store.getCount(),
105
- {parentNode} = vdomNode,
106
- id;
67
+ currentIndex = 0,
68
+ newIndex, newRecord, rowId;
69
+
70
+ if (me.hasSelection()) {
71
+ currentIndex = store.indexOf(view.getRecordByRowId(me.items[0]))
72
+ }
73
+
74
+ newIndex = (currentIndex + step) % store.getCount();
107
75
 
108
76
  while (newIndex < 0) {
109
77
  newIndex += store.getCount()
110
78
  }
111
79
 
112
- id = parentNode.cn[newIndex].id;
80
+ newRecord = store.getAt(newIndex);
81
+ rowId = view.getRowId(newRecord);
113
82
 
114
- if (id) {
115
- me.select(id);
116
- view.focus(id);
83
+ if (rowId) {
84
+ me.select(rowId);
117
85
 
118
86
  view.fire('select', {
119
87
  record: store.getAt(newIndex)
@@ -134,7 +102,7 @@ class RowModel extends BaseModel {
134
102
  me.toggleSelection(id);
135
103
 
136
104
  isSelected = me.isSelected(id);
137
- record = view.store.getAt(VDomUtil.find(view.vdom, id).index);
105
+ record = view.getRecord(id);
138
106
 
139
107
  !isSelected && view.onDeselect?.(record);
140
108
 
@@ -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
  }
@@ -67,7 +67,7 @@ class View extends Component {
67
67
  * @member {Object} _vdom={tag: 'tbody', cn : []}
68
68
  */
69
69
  _vdom:
70
- {tag: 'tbody', cn: []}
70
+ {tag: 'tbody', tabIndex: -1, cn: []}
71
71
  }
72
72
 
73
73
  /**
@@ -189,11 +189,10 @@ class View extends Component {
189
189
  }
190
190
 
191
191
  cellConfig = {
192
- tag : 'td',
193
- id : cellId,
194
- cls : cellCls,
195
- style : rendererOutput.style || {},
196
- tabIndex: '-1'
192
+ tag : 'td',
193
+ id : cellId,
194
+ cls : cellCls,
195
+ style: rendererOutput.style || {}
197
196
  };
198
197
 
199
198
  if (colspan && Object.keys(colspan).includes(dataField)) {
@@ -260,11 +259,10 @@ class View extends Component {
260
259
  }
261
260
 
262
261
  tableRow = {
263
- tag : 'tr',
262
+ tag: 'tr',
264
263
  id,
265
- cls : trCls,
266
- cn : [],
267
- tabIndex: '-1'
264
+ cls: trCls,
265
+ cn : []
268
266
  };
269
267
 
270
268
  for (i=0; i < colCount; i++) {
@@ -312,17 +310,17 @@ class View extends Component {
312
310
  }
313
311
 
314
312
  /**
315
- * @param {Object[]} inputData
313
+ *
316
314
  */
317
- createViewData(inputData) {
318
- let me = this,
319
- amountRows = inputData.length,
320
- i = 0,
321
- rows = [],
322
- {selectedRows} = me;
323
-
324
- for (; i < amountRows; i++) {
325
- 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}))
326
324
  }
327
325
 
328
326
  me.vdom.cn = rows;
@@ -409,6 +407,14 @@ class View extends Component {
409
407
  return null
410
408
  }
411
409
 
410
+ /**
411
+ * @param {String} cellId
412
+ * @returns {String}
413
+ */
414
+ getDataField(cellId) {
415
+ return cellId.split('__')[2]
416
+ }
417
+
412
418
  /**
413
419
  * Get the matching record by passing a row id, a cell id or an id inside a table cell.
414
420
  * @param {String} nodeId