neo.mjs 8.9.1 → 8.10.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 (34) 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/ServiceWorker.mjs +2 -2
  5. package/examples/grid/container/MainContainer.mjs +19 -15
  6. package/examples/table/cellEditing/MainContainer.mjs +30 -15
  7. package/examples/table/container/MainContainer.mjs +34 -19
  8. package/examples/tableFiltering/MainContainer.mjs +1 -1
  9. package/examples/tableStore/MainContainer.mjs +14 -13
  10. package/examples/tableStore/MainModel.mjs +3 -3
  11. package/package.json +1 -1
  12. package/src/DefaultConfig.mjs +2 -2
  13. package/src/Main.mjs +1 -0
  14. package/src/component/Base.mjs +37 -37
  15. package/src/grid/Container.mjs +11 -11
  16. package/src/grid/View.mjs +9 -1
  17. package/src/selection/Model.mjs +5 -13
  18. package/src/selection/grid/BaseModel.mjs +4 -38
  19. package/src/selection/grid/CellColumnModel.mjs +29 -36
  20. package/src/selection/grid/CellColumnRowModel.mjs +27 -34
  21. package/src/selection/grid/CellModel.mjs +50 -44
  22. package/src/selection/grid/CellRowModel.mjs +18 -35
  23. package/src/selection/grid/ColumnModel.mjs +28 -62
  24. package/src/selection/grid/RowModel.mjs +2 -2
  25. package/src/selection/table/BaseModel.mjs +0 -42
  26. package/src/selection/table/CellColumnModel.mjs +9 -18
  27. package/src/selection/table/CellColumnRowModel.mjs +9 -18
  28. package/src/selection/table/CellModel.mjs +3 -3
  29. package/src/selection/table/CellRowModel.mjs +4 -19
  30. package/src/selection/table/ColumnModel.mjs +9 -9
  31. package/src/selection/table/RowModel.mjs +2 -2
  32. package/src/table/Container.mjs +11 -31
  33. package/src/table/View.mjs +46 -7
  34. package/src/table/plugin/CellEditing.mjs +2 -2
@@ -110,9 +110,6 @@ class Model extends Base {
110
110
  NeoArray.remove(itemCollection, item);
111
111
 
112
112
  if (!silent) {
113
- // We need a bigger depth, since grid.Container & table.Container use selection.Model as a top-level config.
114
- // In case the config would get moved to grid.View & table.View, we would not need it.
115
- view.updateDepth = -1;
116
113
  view.update();
117
114
 
118
115
  me.fire('selectionChange', {
@@ -127,10 +124,11 @@ class Model extends Base {
127
124
 
128
125
  /**
129
126
  * @param {Boolean} [silent] true to prevent a vdom update
127
+ * @param {Object[]|String[]} itemCollection=this.items
130
128
  */
131
- deselectAll(silent) {
129
+ deselectAll(silent, itemCollection=this.items) {
132
130
  let me = this,
133
- items = [...me.items],
131
+ items = [...itemCollection],
134
132
  {view} = me;
135
133
 
136
134
  if (items.length) {
@@ -139,9 +137,6 @@ class Model extends Base {
139
137
  });
140
138
 
141
139
  if (!silent && items.length > 0) {
142
- // We need a bigger depth, since grid.Container & table.Container use selection.Model as a top-level config.
143
- // In case the config would get moved to grid.View & table.View, we would not need it.
144
- view.updateDepth = -1;
145
140
  view.update()
146
141
  }
147
142
 
@@ -235,8 +230,8 @@ class Model extends Base {
235
230
  items: [items]).map(item => item.isRecord ? view.getItemId(item) : Neo.isObject(item) ? item.id : item);
236
231
 
237
232
  if (!Neo.isEqual(itemCollection, items)) {
238
- if (me.singleSelect) {
239
- me.deselectAll(true)
233
+ if (me.singleSelect && itemCollection === me.items) {
234
+ me.deselectAll(true, itemCollection)
240
235
  }
241
236
 
242
237
  items.forEach(node => {
@@ -251,9 +246,6 @@ class Model extends Base {
251
246
  NeoArray.add(itemCollection, items);
252
247
 
253
248
  if (!view.silentSelect) {
254
- // We need a bigger depth, since grid.Container & table.Container use selection.Model as a top-level config.
255
- // In case the config would get moved to grid.View & table.View, we would not need it.
256
- view.updateDepth = -1;
257
249
  view.update()
258
250
  }
259
251
 
@@ -16,45 +16,11 @@ class BaseModel extends Model {
16
16
  }
17
17
 
18
18
  /**
19
- * @param {Object} item
20
- * @param {Boolean} [silent] true to prevent a vdom update
21
- * @param {Object[]|String[]} itemCollection=this.items
22
- * @param {String} [selectedCls]
19
+ * Convenience shortcut
20
+ * @member {String[]} dataFields
23
21
  */
24
- deselect(item, silent, itemCollection=this.items, selectedCls) {
25
- let {view} = this;
26
-
27
- if (!silent) {
28
- view.updateDepth = 2
29
- }
30
-
31
- super.deselect(item, silent, itemCollection, selectedCls)
32
- }
33
-
34
- /**
35
- * @param {Boolean} [silent] true to prevent a vdom update
36
- */
37
- deselectAll(silent) {
38
- let {view} = this;
39
-
40
- if (!silent) {
41
- view.updateDepth = 2
42
- }
43
-
44
- super.deselectAll(silent)
45
- }
46
-
47
- /**
48
- * @param {Object} args
49
- */
50
- select(...args) {
51
- let {view} = this;
52
-
53
- if (!view.silentSelect) {
54
- view.updateDepth = 2
55
- }
56
-
57
- super.select(...args)
22
+ get dataFields() {
23
+ return this.view.parent.columns.map(c => c.dataField)
58
24
  }
59
25
  }
60
26
 
@@ -1,6 +1,5 @@
1
- import CellModel from './CellModel.mjs';
2
- import ColumnModel from './ColumnModel.mjs';
3
- import VDomUtil from '../../util/VDom.mjs';
1
+ import CellModel from './CellModel.mjs';
2
+ import VDomUtil from '../../util/VDom.mjs';
4
3
 
5
4
  /**
6
5
  * @class Neo.selection.grid.CellColumnModel
@@ -29,19 +28,10 @@ class CellColumnModel extends CellModel {
29
28
  */
30
29
  selectedColumnCellCls: 'selected-column-cell',
31
30
  /**
32
- * @member {Array|null} selectedColumnCellIds=null
31
+ * @member {String[]} selectedColumnCellIds=[]
33
32
  * @protected
34
33
  */
35
- selectedColumnCellIds: null
36
- }
37
-
38
- /**
39
- * @param {Object} config
40
- */
41
- construct(config) {
42
- super.construct(config);
43
-
44
- this.selectedColumnCellIds = []
34
+ selectedColumnCellIds: []
45
35
  }
46
36
 
47
37
  /**
@@ -63,14 +53,15 @@ class CellColumnModel extends CellModel {
63
53
  * @param {Object} data
64
54
  */
65
55
  onCellClick(data) {
66
- let me = this,
67
- id = data.data.currentTarget,
68
- columnNodeIds, index, tbodyNode;
56
+ let me = this,
57
+ {view} = me,
58
+ cellId = data.data.currentTarget,
59
+ columnNodeIds, dataField, index;
69
60
 
70
- if (id) {
71
- index = ColumnModel.getColumnIndex(id, me.view.items[0].items);
72
- tbodyNode = VDomUtil.find(me.view.vdom, {cls: 'neo-grid-view'}).vdom;
73
- columnNodeIds = VDomUtil.getColumnNodesIds(tbodyNode, index);
61
+ if (cellId) {
62
+ dataField = view.getDataField(cellId);
63
+ index = view.getColumn(dataField, true);
64
+ columnNodeIds = VDomUtil.getColumnNodesIds(view.vdom.cn[0], index);
74
65
 
75
66
  me.deselectAllCells(true);
76
67
  me.select(columnNodeIds, me.selectedColumnCellIds, me.selectedColumnCellCls)
@@ -80,29 +71,31 @@ class CellColumnModel extends CellModel {
80
71
  }
81
72
 
82
73
  /**
83
- * @param {Object} data
84
74
  * @param {Number} step
85
75
  */
86
- onNavKeyColumn(data, step) {
87
- let me = this,
88
- idArray = ColumnModel.getCellId(data.path).split('__'),
89
- currentColumn = idArray[2],
90
- {view} = me,
91
- fields = view.columns.map(c => c.dataField),
92
- newIndex = (fields.indexOf(currentColumn) + step) % fields.length,
93
- columnNodeIds, tbodyNode;
94
-
95
- while (newIndex < 0) {
96
- newIndex += fields.length
76
+ onNavKeyColumn(step) {
77
+ let me = this,
78
+ {dataFields, view} = me,
79
+ columnNodeIds, currentColumn, index;
80
+
81
+ if (me.hasSelection()) {
82
+ currentColumn = view.getDataField(me.items[0])
83
+ } else {
84
+ currentColumn = dataFields[0]
85
+ }
86
+
87
+ index = (dataFields.indexOf(currentColumn) + step) % dataFields.length;
88
+
89
+ while (index < 0) {
90
+ index += dataFields.length
97
91
  }
98
92
 
99
- tbodyNode = VDomUtil.find(me.view.vdom, {cls: 'neo-grid-view'}).vdom;
100
- columnNodeIds = VDomUtil.getColumnNodesIds(tbodyNode, newIndex);
93
+ columnNodeIds = VDomUtil.getColumnNodesIds(view.vdom.cn[0], index);
101
94
 
102
95
  me.deselectAllCells(true);
103
96
  me.select(columnNodeIds, me.selectedColumnCellIds, me.selectedColumnCellCls);
104
97
 
105
- super.onNavKeyColumn(data, step)
98
+ super.onNavKeyColumn(step)
106
99
  }
107
100
 
108
101
  /**
@@ -1,5 +1,4 @@
1
1
  import CellRowModel from './CellRowModel.mjs';
2
- import ColumnModel from './ColumnModel.mjs';
3
2
  import VDomUtil from '../../util/VDom.mjs';
4
3
 
5
4
  /**
@@ -29,19 +28,10 @@ class CellColumnRowModel extends CellRowModel {
29
28
  */
30
29
  selectedColumnCellCls: 'selected-column-cell',
31
30
  /**
32
- * @member {Array|null} selectedColumnCellIds=null
31
+ * @member {String[]} selectedColumnCellIds=[]
33
32
  * @protected
34
33
  */
35
- selectedColumnCellIds: null
36
- }
37
-
38
- /**
39
- * @param {Object} config
40
- */
41
- construct(config) {
42
- super.construct(config);
43
-
44
- this.selectedColumnCellIds = []
34
+ selectedColumnCellIds: []
45
35
  }
46
36
 
47
37
  /**
@@ -63,14 +53,15 @@ class CellColumnRowModel extends CellRowModel {
63
53
  * @param {Object} data
64
54
  */
65
55
  onCellClick(data) {
66
- let me = this,
67
- id = ColumnModel.getCellId(data.data.path),
68
- columnNodeIds, index, tbodyNode;
56
+ let me = this,
57
+ {view} = me,
58
+ cellId = data.data.currentTarget,
59
+ columnNodeIds, dataField, index;
69
60
 
70
- if (id) {
71
- index = ColumnModel.getColumnIndex(id, me.view.items[0].items);
72
- tbodyNode = VDomUtil.find(me.view.vdom, {cls: 'neo-grid-view'}).vdom;
73
- columnNodeIds = VDomUtil.getColumnNodesIds(tbodyNode, index);
61
+ if (cellId) {
62
+ dataField = view.getDataField(cellId);
63
+ index = view.getColumn(dataField, true);
64
+ columnNodeIds = VDomUtil.getColumnNodesIds(view.vdom.cn[0], index);
74
65
 
75
66
  me.deselectAllCells(true);
76
67
  me.select(columnNodeIds, me.selectedColumnCellIds, me.selectedColumnCellCls)
@@ -80,29 +71,31 @@ class CellColumnRowModel extends CellRowModel {
80
71
  }
81
72
 
82
73
  /**
83
- * @param {Object} data
84
74
  * @param {Number} step
85
75
  */
86
- onNavKeyColumn(data, step) {
87
- let me = this,
88
- idArray = ColumnModel.getCellId(data.path).split('__'),
89
- currentColumn = idArray[2],
90
- {view} = me,
91
- fields = view.columns.map(c => c.dataField),
92
- newIndex = (fields.indexOf(currentColumn) + step) % fields.length,
93
- columnNodeIds, tbodyNode;
94
-
95
- while (newIndex < 0) {
96
- newIndex += fields.length
76
+ onNavKeyColumn(step) {
77
+ let me = this,
78
+ {dataFields, view} = me,
79
+ columnNodeIds, currentColumn, index;
80
+
81
+ if (me.hasSelection()) {
82
+ currentColumn = view.getDataField(me.items[0])
83
+ } else {
84
+ currentColumn = dataFields[0]
85
+ }
86
+
87
+ index = (dataFields.indexOf(currentColumn) + step) % dataFields.length;
88
+
89
+ while (index < 0) {
90
+ index += dataFields.length
97
91
  }
98
92
 
99
- tbodyNode = VDomUtil.find(me.view.vdom, {cls: 'neo-grid-view'}).vdom;
100
- columnNodeIds = VDomUtil.getColumnNodesIds(tbodyNode, newIndex);
93
+ columnNodeIds = VDomUtil.getColumnNodesIds(view.vdom.cn[0], index);
101
94
 
102
95
  me.deselectAllCells(true);
103
96
  me.select(columnNodeIds, me.selectedColumnCellIds, me.selectedColumnCellCls);
104
97
 
105
- super.onNavKeyColumn(data, step)
98
+ super.onNavKeyColumn(step)
106
99
  }
107
100
 
108
101
  /**
@@ -29,7 +29,7 @@ class CellModel extends BaseModel {
29
29
  addDomListener() {
30
30
  let me = this;
31
31
 
32
- me.view.on('cellClick', me.onCellClick, me)
32
+ me.view.parent.on('cellClick', me.onCellClick, me)
33
33
  }
34
34
 
35
35
  /**
@@ -38,7 +38,7 @@ class CellModel extends BaseModel {
38
38
  destroy(...args) {
39
39
  let me = this;
40
40
 
41
- me.view.un('cellClick', me.onCellClick, me);
41
+ me.view.parent.un('cellClick', me.onCellClick, me);
42
42
 
43
43
  super.destroy(...args)
44
44
  }
@@ -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.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
 
@@ -148,13 +153,14 @@ class CellModel extends BaseModel {
148
153
  */
149
154
  unregister() {
150
155
  let me = this,
151
- {id, view} = me;
156
+ {id, view} = me,
157
+ scope = id;
152
158
 
153
159
  view.keys?.removeKeys([
154
- {fn: 'onKeyDownDown' ,key: 'Down' ,scope: id},
155
- {fn: 'onKeyDownLeft' ,key: 'Left' ,scope: id},
156
- {fn: 'onKeyDownRight' ,key: 'Right' ,scope: id},
157
- {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}
158
164
  ]);
159
165
 
160
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.grid.CellRowModel
@@ -25,19 +23,10 @@ class CellRowModel extends CellModel {
25
23
  */
26
24
  cls: 'neo-selection-cellrowmodel',
27
25
  /**
28
- * @member {Array|null} selectedRowIds=null
26
+ * @member {String[]} selectedRowIds=[]
29
27
  * @protected
30
28
  */
31
- selectedRowIds: null
32
- }
33
-
34
- /**
35
- * @param {Object} config
36
- */
37
- construct(config) {
38
- super.construct(config);
39
-
40
- this.selectedRowIds = []
29
+ selectedRowIds: []
41
30
  }
42
31
 
43
32
  /**
@@ -73,49 +62,46 @@ class CellRowModel extends CellModel {
73
62
 
74
63
  NeoArray.remove(me.selectedRowIds, rowId);
75
64
 
76
- if (!silent) {
77
- view.updateDepth = 2;
78
- view.update()
79
- }
65
+ !silent && view.update()
80
66
  }
81
67
 
82
68
  /**
83
69
  * @param {Object} data
84
70
  */
85
71
  onCellClick(data) {
86
- let me = this,
87
- node = RowModel.getRowNode(data.data.path), // we could add a separate export for this method
88
- id = node?.id;
72
+ let me = this,
73
+ record = me.view.getRecord(data.data.currentTarget),
74
+ rowId = me.view.getRowId(record);
89
75
 
90
- if (id) {
76
+ if (rowId) {
91
77
  me.deselectAllRows(true);
92
- me.selectRow(id)
78
+ me.selectRow(rowId)
93
79
  }
94
80
 
95
81
  super.onCellClick(data)
96
82
  }
97
83
 
98
84
  /**
99
- * @param {Object} data
100
85
  * @param {Number} step
101
86
  */
102
- onNavKeyRow(data, step) {
103
- super.onNavKeyRow(data, step);
87
+ onNavKeyRow(step) {
88
+ super.onNavKeyRow(step);
104
89
 
105
90
  let me = this,
106
- node = RowModel.getRowNode(data.path),
107
91
  {view} = me,
108
92
  {store} = view,
109
- vdomNode = VDomUtil.find(view.vdom, node.id),
110
- newIndex = (vdomNode.index + step) % store.getCount(),
111
- {parentNode} = vdomNode,
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,
112
98
  id;
113
99
 
114
100
  while (newIndex < 0) {
115
- newIndex += store.getCount()
101
+ newIndex += countRecords
116
102
  }
117
103
 
118
- id = parentNode.cn[newIndex].id;
104
+ id = view.getRowId(store.getAt(newIndex));
119
105
 
120
106
  if (id) {
121
107
  me.deselectAllRows(true);
@@ -141,10 +127,7 @@ class CellRowModel extends CellModel {
141
127
  me.selectedRowIds.push(id)
142
128
  }
143
129
 
144
- if (!silent) {
145
- view.updateDepth = 2;
146
- view.update()
147
- }
130
+ !silent && view.update()
148
131
  }
149
132
 
150
133
  /**