neo.mjs 8.9.1 → 8.10.1

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 (41) 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/resources/data/deck/learnneo/pages/benefits/Speed.md +3 -3
  13. package/resources/scss/src/button/Base.scss +1 -1
  14. package/resources/scss/src/table/View.scss +0 -2
  15. package/resources/scss/src/toolbar/Base.scss +1 -1
  16. package/resources/scss/theme-dark/button/Base.scss +1 -0
  17. package/resources/scss/theme-light/button/Base.scss +1 -0
  18. package/resources/scss/theme-neo-light/button/Base.scss +1 -0
  19. package/src/DefaultConfig.mjs +2 -2
  20. package/src/Main.mjs +1 -0
  21. package/src/component/Base.mjs +37 -37
  22. package/src/grid/Container.mjs +11 -11
  23. package/src/grid/View.mjs +9 -1
  24. package/src/selection/Model.mjs +5 -13
  25. package/src/selection/grid/BaseModel.mjs +4 -38
  26. package/src/selection/grid/CellColumnModel.mjs +29 -36
  27. package/src/selection/grid/CellColumnRowModel.mjs +27 -34
  28. package/src/selection/grid/CellModel.mjs +50 -44
  29. package/src/selection/grid/CellRowModel.mjs +18 -35
  30. package/src/selection/grid/ColumnModel.mjs +28 -62
  31. package/src/selection/grid/RowModel.mjs +2 -2
  32. package/src/selection/table/BaseModel.mjs +0 -42
  33. package/src/selection/table/CellColumnModel.mjs +9 -18
  34. package/src/selection/table/CellColumnRowModel.mjs +9 -18
  35. package/src/selection/table/CellModel.mjs +3 -3
  36. package/src/selection/table/CellRowModel.mjs +4 -19
  37. package/src/selection/table/ColumnModel.mjs +9 -9
  38. package/src/selection/table/RowModel.mjs +2 -2
  39. package/src/table/Container.mjs +11 -31
  40. package/src/table/View.mjs +46 -7
  41. package/src/table/plugin/CellEditing.mjs +2 -2
@@ -30,7 +30,7 @@ class ColumnModel extends BaseModel {
30
30
  addDomListener() {
31
31
  let me = this;
32
32
 
33
- me.view.on('cellClick', me.onCellClick, me)
33
+ me.view.parent.on('cellClick', me.onCellClick, me)
34
34
  }
35
35
 
36
36
  /**
@@ -39,56 +39,24 @@ class ColumnModel extends BaseModel {
39
39
  destroy(...args) {
40
40
  let me = this;
41
41
 
42
- me.view.un('cellClick', me.onCellClick, me);
42
+ me.view.parent.un('cellClick', me.onCellClick, me);
43
43
 
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].cls.includes('neo-grid-cell')) {
58
- id = eventPath[i].id;
59
- break
60
- }
61
- }
62
-
63
- return id
64
- }
65
-
66
- /**
67
- * todo: move to grid.Container or view
68
- * @param {String} cellId
69
- * @param {Object[]} 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
- id = data.data.currentTarget,
86
- columnNodeIds, index, tbodyNode;
51
+ let me = this,
52
+ {view} = me,
53
+ cellId = data.data.currentTarget,
54
+ columnNodeIds, dataField, index;
87
55
 
88
- if (id) {
89
- index = ColumnModel.getColumnIndex(id, me.view.items[0].items);
90
- tbodyNode = VDomUtil.find(me.view.vdom, {cls: 'neo-grid-view'}).vdom;
91
- columnNodeIds = VDomUtil.getColumnNodesIds(tbodyNode, index);
56
+ if (cellId) {
57
+ dataField = view.getDataField(cellId);
58
+ index = view.getColumn(dataField, true);
59
+ columnNodeIds = VDomUtil.getColumnNodesIds(view.vdom.cn[0], 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
- fields = view.columns.map(c => c.dataField),
121
- newIndex = (fields.indexOf(currentColumn) + step) % fields.length,
122
- columnNodeIds, id, tbodyNode;
123
-
124
- while (newIndex < 0) {
125
- newIndex += fields.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] = fields[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, {cls: 'neo-grid-view'}).vdom;
132
- columnNodeIds = VDomUtil.getColumnNodesIds(tbodyNode, newIndex);
99
+ columnNodeIds = VDomUtil.getColumnNodesIds(view.vdom.cn[0], 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
  /**
@@ -39,7 +39,7 @@ class RowModel extends BaseModel {
39
39
  destroy(...args) {
40
40
  let me = this;
41
41
 
42
- me.view.un('rowClick', me.onRowClick, me);
42
+ me.view.gridContainer.un('rowClick', me.onRowClick, me);
43
43
 
44
44
  super.destroy(...args)
45
45
  }
@@ -103,7 +103,7 @@ class RowModel extends BaseModel {
103
103
  me.toggleSelection(id);
104
104
 
105
105
  isSelected = me.isSelected(id);
106
- record = view.store.getAt(VDomUtil.find(view.vdom, id).index);
106
+ record = view.getRecord(id);
107
107
 
108
108
  !isSelected && view.onDeselect?.(record);
109
109
 
@@ -14,48 +14,6 @@ class BaseModel extends Model {
14
14
  */
15
15
  className: 'Neo.selection.table.BaseModel'
16
16
  }
17
-
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]
23
- */
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)
58
- }
59
17
  }
60
18
 
61
19
  export default Neo.setupClass(BaseModel);
@@ -29,19 +29,10 @@ class CellColumnModel extends CellModel {
29
29
  */
30
30
  selectedColumnCellCls: 'selected-column-cell',
31
31
  /**
32
- * @member {Array|null} selectedColumnCellIds=null
32
+ * @member {String[]} selectedColumnCellIds=[]
33
33
  * @protected
34
34
  */
35
- selectedColumnCellIds: null
36
- }
37
-
38
- /**
39
- * @param {Object} config
40
- */
41
- construct(config) {
42
- super.construct(config);
43
-
44
- this.selectedColumnCellIds = []
35
+ selectedColumnCellIds: []
45
36
  }
46
37
 
47
38
  /**
@@ -63,14 +54,14 @@ class CellColumnModel extends CellModel {
63
54
  * @param {Object} data
64
55
  */
65
56
  onCellClick(data) {
66
- let me = this,
67
- id = data.data.currentTarget,
68
- columnNodeIds, index, tbodyNode;
57
+ let me = this,
58
+ {headerToolbar} = me.view.parent,
59
+ id = data.data.currentTarget,
60
+ columnNodeIds, index;
69
61
 
70
62
  if (id) {
71
- index = ColumnModel.getColumnIndex(id, me.view.items[0].items);
72
- tbodyNode = VDomUtil.find(me.view.vdom, {tag: 'tbody'}).vdom;
73
- columnNodeIds = VDomUtil.getColumnNodesIds(tbodyNode, index);
63
+ index = ColumnModel.getColumnIndex(id, headerToolbar.items);
64
+ columnNodeIds = VDomUtil.getColumnNodesIds(me.view.vdom, index);
74
65
 
75
66
  me.deselectAllCells(true);
76
67
  me.select(columnNodeIds, me.selectedColumnCellIds, me.selectedColumnCellCls)
@@ -88,7 +79,7 @@ class CellColumnModel extends CellModel {
88
79
  idArray = ColumnModel.getCellId(data.path).split('__'),
89
80
  currentColumn = idArray[2],
90
81
  {view} = me,
91
- dataFields = view.columns.map(c => c.dataField),
82
+ dataFields = view.parent.columns.map(c => c.dataField),
92
83
  newIndex = (dataFields.indexOf(currentColumn) + step) % dataFields.length,
93
84
  columnNodeIds, tbodyNode;
94
85
 
@@ -29,19 +29,10 @@ class CellColumnRowModel extends CellRowModel {
29
29
  */
30
30
  selectedColumnCellCls: 'selected-column-cell',
31
31
  /**
32
- * @member {Array|null} selectedColumnCellIds=null
32
+ * @member {String[]} selectedColumnCellIds=[]
33
33
  * @protected
34
34
  */
35
- selectedColumnCellIds: null
36
- }
37
-
38
- /**
39
- * @param {Object} config
40
- */
41
- construct(config) {
42
- super.construct(config);
43
-
44
- this.selectedColumnCellIds = []
35
+ selectedColumnCellIds: []
45
36
  }
46
37
 
47
38
  /**
@@ -63,14 +54,14 @@ class CellColumnRowModel extends CellRowModel {
63
54
  * @param {Object} data
64
55
  */
65
56
  onCellClick(data) {
66
- let me = this,
67
- id = data.data.currentTarget,
68
- columnNodeIds, index, tbodyNode;
57
+ let me = this,
58
+ {headerToolbar} = me.view.parent,
59
+ id = data.data.currentTarget,
60
+ columnNodeIds, index;
69
61
 
70
62
  if (id) {
71
- index = ColumnModel.getColumnIndex(id, me.view.items[0].items);
72
- tbodyNode = VDomUtil.find(me.view.vdom, {tag: 'tbody'}).vdom;
73
- columnNodeIds = VDomUtil.getColumnNodesIds(tbodyNode, index);
63
+ index = ColumnModel.getColumnIndex(id, headerToolbar.items);
64
+ columnNodeIds = VDomUtil.getColumnNodesIds(me.view.vdom, index);
74
65
 
75
66
  me.deselectAllCells(true);
76
67
  me.select(columnNodeIds, me.selectedColumnCellIds, me.selectedColumnCellCls)
@@ -88,7 +79,7 @@ class CellColumnRowModel extends CellRowModel {
88
79
  idArray = ColumnModel.getCellId(data.path).split('__'),
89
80
  currentColumn = idArray[2],
90
81
  {view} = me,
91
- dataFields = view.columns.map(c => c.dataField),
82
+ dataFields = view.parent.columns.map(c => c.dataField),
92
83
  newIndex = (dataFields.indexOf(currentColumn) + step) % dataFields.length,
93
84
  columnNodeIds, tbodyNode;
94
85
 
@@ -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
  }
@@ -87,7 +87,7 @@ class CellModel extends BaseModel {
87
87
  {view} = me,
88
88
  idArray = data.path[0].id.split('__'),
89
89
  currentColumn = idArray[2],
90
- dataFields = view.columns.map(c => c.dataField),
90
+ dataFields = view.parent.columns.map(c => c.dataField),
91
91
  newIndex = (dataFields.indexOf(currentColumn) + step) % dataFields.length,
92
92
  id;
93
93
 
@@ -25,19 +25,10 @@ class CellRowModel extends CellModel {
25
25
  */
26
26
  cls: 'neo-selection-cellrowmodel',
27
27
  /**
28
- * @member {Array|null} selectedRowIds=null
28
+ * @member {String[]} selectedRowIds=[]
29
29
  * @protected
30
30
  */
31
- selectedRowIds: null
32
- }
33
-
34
- /**
35
- * @param {Object} config
36
- */
37
- construct(config) {
38
- super.construct(config);
39
-
40
- this.selectedRowIds = []
31
+ selectedRowIds: []
41
32
  }
42
33
 
43
34
  /**
@@ -73,10 +64,7 @@ class CellRowModel extends CellModel {
73
64
 
74
65
  NeoArray.remove(me.selectedRowIds, rowId);
75
66
 
76
- if (!silent) {
77
- view.updateDepth = 2;
78
- view.update()
79
- }
67
+ !silent && view.update()
80
68
  }
81
69
 
82
70
  /**
@@ -141,10 +129,7 @@ class CellRowModel extends CellModel {
141
129
  me.selectedRowIds.push(id)
142
130
  }
143
131
 
144
- if (!silent) {
145
- view.updateDepth = 2;
146
- view.update()
147
- }
132
+ !silent && view.update()
148
133
  }
149
134
 
150
135
  /**
@@ -30,7 +30,7 @@ class ColumnModel extends BaseModel {
30
30
  addDomListener() {
31
31
  let me = this;
32
32
 
33
- me.view.on('cellClick', me.onCellClick, me)
33
+ me.view.parent.on('cellClick', me.onCellClick, me)
34
34
  }
35
35
 
36
36
  /**
@@ -39,7 +39,7 @@ class ColumnModel extends BaseModel {
39
39
  destroy(...args) {
40
40
  let me = this;
41
41
 
42
- me.view.un('cellClick', me.onCellClick, me);
42
+ me.view.parent.un('cellClick', me.onCellClick, me);
43
43
 
44
44
  super.destroy(...args)
45
45
  }
@@ -81,14 +81,14 @@ class ColumnModel extends BaseModel {
81
81
  * @param {Object} data
82
82
  */
83
83
  onCellClick(data) {
84
- let me = this,
85
- id = data.data.currentTarget,
86
- columnNodeIds, index, tbodyNode;
84
+ let me = this,
85
+ {headerToolbar} = me.view.parent,
86
+ id = data.data.currentTarget,
87
+ columnNodeIds, index;
87
88
 
88
89
  if (id) {
89
- index = ColumnModel.getColumnIndex(id, me.view.items[0].items);
90
- tbodyNode = VDomUtil.find(me.view.vdom, {tag: 'tbody'}).vdom;
91
- columnNodeIds = VDomUtil.getColumnNodesIds(tbodyNode, index);
90
+ index = ColumnModel.getColumnIndex(id, headerToolbar.items);
91
+ columnNodeIds = VDomUtil.getColumnNodesIds(me.view.vdom, index);
92
92
 
93
93
  me.select(columnNodeIds)
94
94
  }
@@ -117,7 +117,7 @@ class ColumnModel extends BaseModel {
117
117
  idArray = ColumnModel.getCellId(data.path).split('__'),
118
118
  currentColumn = idArray[2],
119
119
  {view} = me,
120
- dataFields = view.columns.map(c => c.dataField),
120
+ dataFields = view.parent.columns.map(c => c.dataField),
121
121
  newIndex = (dataFields.indexOf(currentColumn) + step) % dataFields.length,
122
122
  columnNodeIds, id, tbodyNode;
123
123
 
@@ -30,7 +30,7 @@ class RowModel extends BaseModel {
30
30
  addDomListener() {
31
31
  let me = this;
32
32
 
33
- me.view.on('rowClick', me.onRowClick, me)
33
+ me.view.parent.on('rowClick', me.onRowClick, me)
34
34
  }
35
35
 
36
36
  /**
@@ -39,7 +39,7 @@ class RowModel extends BaseModel {
39
39
  destroy(...args) {
40
40
  let me = this;
41
41
 
42
- me.view.un('rowClick', me.onRowClick, me);
42
+ me.view.parent.un('rowClick', me.onRowClick, me);
43
43
 
44
44
  super.destroy(...args)
45
45
  }
@@ -2,7 +2,6 @@ import BaseContainer from '../container/Base.mjs';
2
2
  import ClassSystemUtil from '../util/ClassSystem.mjs';
3
3
  import CssUtil from '../util/Css.mjs';
4
4
  import NeoArray from '../util/Array.mjs';
5
- import RowModel from '../selection/table/RowModel.mjs';
6
5
  import Store from '../data/Store.mjs';
7
6
  import View from './View.mjs';
8
7
  import * as header from './header/_export.mjs';
@@ -50,11 +49,6 @@ class Container extends BaseContainer {
50
49
  * @member {String|null} headerToolbarId_=null
51
50
  */
52
51
  headerToolbarId_: null,
53
- /**
54
- * Additional used keys for the selection model
55
- * @member {Object} keys
56
- */
57
- keys: {},
58
52
  /**
59
53
  * @member {String} layout='base'
60
54
  */
@@ -65,7 +59,9 @@ class Container extends BaseContainer {
65
59
  */
66
60
  scrollbarsCssApplied: false,
67
61
  /**
62
+ * Will get removed in neo v9, assign selection models to table.View instead
68
63
  * @member {Neo.selection.Model} selectionModel_=null
64
+ * @deprecated
69
65
  */
70
66
  selectionModel_: null,
71
67
  /**
@@ -143,10 +139,11 @@ class Container extends BaseContainer {
143
139
  sortable : me.sortable,
144
140
  ...me.headerToolbarConfig
145
141
  }, {
146
- module : View,
147
- containerId: me.id,
148
- id : me.viewId,
149
- store : me.store,
142
+ module : View,
143
+ containerId : me.id,
144
+ id : me.viewId,
145
+ selectionModel: me.selectionModel, // todo: remove this line in neo v9
146
+ store : me.store,
150
147
  ...me.viewConfig
151
148
  }];
152
149
 
@@ -204,9 +201,12 @@ class Container extends BaseContainer {
204
201
  * @param {Neo.selection.Model} value
205
202
  * @param {Neo.selection.Model} oldValue
206
203
  * @protected
204
+ * @deprecated
207
205
  */
208
206
  afterSetSelectionModel(value, oldValue) {
209
- this.rendered && value.register(this)
207
+ if (value && this.view) {
208
+ this.view.selectionModel = value
209
+ }
210
210
  }
211
211
 
212
212
  /**
@@ -292,18 +292,6 @@ class Container extends BaseContainer {
292
292
  return value || oldValue
293
293
  }
294
294
 
295
- /**
296
- * Triggered before the selectionModel config gets changed.
297
- * @param {Neo.selection.Model} value
298
- * @param {Neo.selection.Model} oldValue
299
- * @protected
300
- */
301
- beforeSetSelectionModel(value, oldValue) {
302
- oldValue?.destroy();
303
-
304
- return ClassSystemUtil.beforeSetInstance(value, RowModel)
305
- }
306
-
307
295
  /**
308
296
  * Triggered before the store config gets changed.
309
297
  * @param {Neo.data.Store} value
@@ -461,14 +449,6 @@ class Container extends BaseContainer {
461
449
  return `${this.id}__wrapper`
462
450
  }
463
451
 
464
- /**
465
- *
466
- */
467
- onConstructed() {
468
- super.onConstructed();
469
- this.selectionModel?.register(this)
470
- }
471
-
472
452
  /**
473
453
  * @param {Object} opts
474
454
  * @param {String} opts.direction
@@ -1,6 +1,8 @@
1
- import Component from '../component/Base.mjs';
2
- import NeoArray from '../util/Array.mjs';
3
- import VDomUtil from '../util/VDom.mjs';
1
+ import ClassSystemUtil from '../util/ClassSystem.mjs';
2
+ import Component from '../component/Base.mjs';
3
+ import NeoArray from '../util/Array.mjs';
4
+ import RowModel from '../selection/table/RowModel.mjs';
5
+ import VDomUtil from '../util/VDom.mjs';
4
6
 
5
7
  /**
6
8
  * @class Neo.table.View
@@ -36,10 +38,19 @@ class View extends Component {
36
38
  * @member {Boolean} highlightModifiedCells_=false
37
39
  */
38
40
  highlightModifiedCells_: false,
41
+ /**
42
+ * Additional used keys for the selection model
43
+ * @member {Object} keys
44
+ */
45
+ keys: {},
39
46
  /**
40
47
  * @member {Object} recordVnodeMap={}
41
48
  */
42
49
  recordVnodeMap: {},
50
+ /**
51
+ * @member {Neo.selection.Model} selectionModel_=null
52
+ */
53
+ selectionModel_: null,
43
54
  /**
44
55
  * @member {String} selectedRecordField='annotations.selected'
45
56
  */
@@ -63,10 +74,8 @@ class View extends Component {
63
74
  * @member {String[]} selectedRows
64
75
  */
65
76
  get selectedRows() {
66
- let tableContainer = this.parent;
67
-
68
- if (tableContainer.selectionModel.ntype === 'selection-table-rowmodel') {
69
- return tableContainer.selectionModel.items
77
+ if (this.selectionModel.ntype === 'selection-table-rowmodel') {
78
+ return this.selectionModel.items
70
79
  }
71
80
 
72
81
  return []
@@ -93,6 +102,16 @@ class View extends Component {
93
102
  }])
94
103
  }
95
104
 
105
+ /**
106
+ * Triggered after the selectionModel config got changed
107
+ * @param {Neo.selection.Model} value
108
+ * @param {Neo.selection.Model} oldValue
109
+ * @protected
110
+ */
111
+ afterSetSelectionModel(value, oldValue) {
112
+ this.rendered && value.register(this)
113
+ }
114
+
96
115
  /**
97
116
  * @param {Object} data
98
117
  * @param {String} [data.cellId]
@@ -190,6 +209,18 @@ class View extends Component {
190
209
  return cellConfig
191
210
  }
192
211
 
212
+ /**
213
+ * Triggered before the selectionModel config gets changed.
214
+ * @param {Neo.selection.Model} value
215
+ * @param {Neo.selection.Model} oldValue
216
+ * @protected
217
+ */
218
+ beforeSetSelectionModel(value, oldValue) {
219
+ oldValue?.destroy();
220
+
221
+ return ClassSystemUtil.beforeSetInstance(value, RowModel)
222
+ }
223
+
193
224
  /**
194
225
  * @param {Object} opts
195
226
  * @param {Object} opts.record
@@ -454,6 +485,14 @@ class View extends Component {
454
485
  this.fireCellEvent(data, 'cellDoubleClick')
455
486
  }
456
487
 
488
+ /**
489
+ *
490
+ */
491
+ onConstructed() {
492
+ super.onConstructed();
493
+ this.selectionModel?.register(this)
494
+ }
495
+
457
496
  /**
458
497
  * @param {Object} data
459
498
  */
@@ -65,7 +65,7 @@ class CellEditing extends Plugin {
65
65
  me.onSelectionModelChange({value: selectionModel})
66
66
  }
67
67
 
68
- owner.keys.add({
68
+ owner.view.keys.add({
69
69
  Enter: 'onTableKeyDown',
70
70
  Space: 'onTableKeyDown',
71
71
  scope: me
@@ -156,7 +156,7 @@ class CellEditing extends Plugin {
156
156
 
157
157
  await view.promiseUpdate();
158
158
 
159
- await me.timeout(10);
159
+ await me.timeout(30);
160
160
 
161
161
  editor.focus()
162
162
  }