neo.mjs 4.1.0 → 4.1.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/examples/grid/covid/GridContainer.mjs +113 -0
  2. package/examples/grid/covid/GridContainerController.mjs +62 -0
  3. package/examples/grid/covid/MainContainer.mjs +36 -0
  4. package/examples/grid/covid/Model.mjs +65 -0
  5. package/examples/grid/covid/Store.mjs +35 -0
  6. package/examples/grid/covid/Util.mjs +165 -0
  7. package/examples/grid/covid/app.mjs +6 -0
  8. package/examples/grid/covid/index.html +11 -0
  9. package/examples/grid/covid/neo-config.json +8 -0
  10. package/package.json +3 -3
  11. package/resources/scss/src/examples/grid/covid/GridContainer.scss +21 -0
  12. package/resources/scss/src/grid/Container.scss +5 -33
  13. package/resources/scss/src/grid/View.scss +73 -1
  14. package/resources/scss/src/grid/header/Button.scss +61 -7
  15. package/resources/scss/src/grid/header/Toolbar.scss +4 -2
  16. package/resources/scss/src/table/View.scss +2 -2
  17. package/resources/scss/theme-dark/grid/Container.scss +17 -0
  18. package/resources/scss/theme-dark/grid/View.scss +29 -0
  19. package/resources/scss/theme-dark/grid/_all.scss +3 -0
  20. package/resources/scss/theme-dark/grid/header/Button.scss +15 -0
  21. package/resources/scss/theme-dark/grid/header/Toolbar.scss +0 -0
  22. package/resources/scss/theme-dark/grid/header/_all.scss +2 -0
  23. package/resources/scss/theme-light/grid/Container.scss +17 -0
  24. package/resources/scss/theme-light/grid/View.scss +29 -0
  25. package/resources/scss/theme-light/grid/_all.scss +3 -0
  26. package/resources/scss/theme-light/grid/header/Button.scss +15 -0
  27. package/resources/scss/theme-light/grid/header/Toolbar.scss +0 -0
  28. package/resources/scss/theme-light/grid/header/_all.scss +2 -0
  29. package/src/grid/Container.mjs +252 -83
  30. package/src/grid/View.mjs +206 -11
  31. package/src/grid/header/Button.mjs +127 -2
  32. package/src/grid/header/Toolbar.mjs +42 -54
  33. package/src/selection/grid/CellColumnModel.mjs +122 -0
  34. package/src/selection/grid/CellColumnRowModel.mjs +122 -0
  35. package/src/selection/grid/CellModel.mjs +184 -0
  36. package/src/selection/grid/CellRowModel.mjs +164 -0
  37. package/src/selection/grid/ColumnModel.mjs +185 -0
  38. package/src/selection/grid/RowModel.mjs +188 -0
  39. package/src/selection/table/RowModel.mjs +26 -32
  40. package/src/table/Container.mjs +9 -13
  41. package/src/table/header/Toolbar.mjs +1 -1
@@ -1,10 +1,21 @@
1
1
  import BaseButton from '../../button/Base.mjs';
2
+ import NeoArray from '../../util/Array.mjs';
2
3
 
3
4
  /**
4
5
  * @class Neo.grid.header.Button
5
6
  * @extends Neo.button.Base
6
7
  */
7
8
  class Button extends BaseButton {
9
+ /**
10
+ * Sort direction when clicking on an unsorted button
11
+ * @member {String} defaultSortDirection='ASC'
12
+ */
13
+ defaultSortDirection = 'ASC'
14
+ /**
15
+ * @member {String|null} field=null
16
+ */
17
+ field = null
18
+
8
19
  static getConfig() {return {
9
20
  /**
10
21
  * @member {String} className='Neo.grid.header.Button'
@@ -17,10 +28,124 @@ class Button extends BaseButton {
17
28
  */
18
29
  ntype: 'grid-header-button',
19
30
  /**
20
- * @member {Array} cls=['neo-grid-header-button']
31
+ * @member {String[]} cls=['neo-grid-header-button']
32
+ */
33
+ cls: ['neo-grid-header-button'],
34
+ /**
35
+ * @member {String} iconCls='fa fa-arrow-circle-up'
36
+ */
37
+ iconCls: 'fa fa-arrow-circle-up',
38
+ /**
39
+ * @member {String} iconPosition='right'
40
+ */
41
+ iconPosition: 'right',
42
+ /**
43
+ * 'ASC', 'DESC' or null
44
+ * @member {String|null} isSorted_=null
45
+ * @protected
21
46
  */
22
- cls: ['neo-grid-header-button']
47
+ isSorted_: null
23
48
  }}
49
+
50
+ /**
51
+ * @param {Object} config
52
+ */
53
+ construct(config) {
54
+ super.construct(config);
55
+
56
+ let me = this,
57
+ domListeners = me.domListeners;
58
+
59
+ domListeners.push({
60
+ click: me.onButtonClick,
61
+ scope: me
62
+ })
63
+
64
+ me.domListeners = domListeners;
65
+ }
66
+
67
+ /**
68
+ * Triggered after the isSorted config got changed
69
+ * @param {Boolean} value
70
+ * @param {Boolean} oldValue
71
+ * @protected
72
+ */
73
+ afterSetIsSorted(value, oldValue) {
74
+ let me = this,
75
+ cls = me.cls;
76
+
77
+ switch(value) {
78
+ case null:
79
+ NeoArray.add(cls, 'neo-sort-hidden');
80
+ break;
81
+ case 'ASC':
82
+ NeoArray.remove(cls, 'neo-sort-desc');
83
+ NeoArray.remove(cls, 'neo-sort-hidden');
84
+ NeoArray.add(cls, 'neo-sort-asc');
85
+ break;
86
+ case 'DESC':
87
+ NeoArray.remove(cls, 'neo-sort-asc');
88
+ NeoArray.remove(cls, 'neo-sort-hidden');
89
+ NeoArray.add(cls, 'neo-sort-desc');
90
+ break;
91
+ }
92
+
93
+ me.cls = cls;
94
+
95
+ me.mounted && me.fire('sort', {
96
+ direction: value,
97
+ property : me.field
98
+ });
99
+ }
100
+
101
+ /**
102
+ * @protected
103
+ */
104
+ onButtonClick() {
105
+ let me = this,
106
+ map;
107
+
108
+ if (me.defaultSortDirection === 'DESC') {
109
+ map = {
110
+ ASC : null,
111
+ DESC: 'ASC',
112
+ null: 'DESC'
113
+ };
114
+ } else {
115
+ map = {
116
+ ASC : 'DESC',
117
+ DESC: null,
118
+ null: 'ASC'
119
+ };
120
+ }
121
+
122
+ me.isSorted = map[me.isSorted + ''];
123
+ }
124
+
125
+ /**
126
+ * @protected
127
+ */
128
+ removeSortingCss() {
129
+ let me = this,
130
+ cls = me.cls;
131
+
132
+ NeoArray.add(cls, 'neo-sort-hidden');
133
+
134
+ me.cls = cls;
135
+ me._isSorted = null;
136
+ }
137
+
138
+ /**
139
+ * @param {Object} data
140
+ * @param {String} data.field
141
+ * @param {Number} data.index
142
+ * @param {Object} data.record
143
+ * @param {Number|String} data.value
144
+ * @returns {*}
145
+ */
146
+ renderer(data) {
147
+ return data.value;
148
+ }
24
149
  }
25
150
 
26
151
  Neo.applyClassConfig(Button);
@@ -17,81 +17,69 @@ class Toolbar extends BaseToolbar {
17
17
  */
18
18
  ntype: 'grid-header-toolbar',
19
19
  /**
20
- * @member {Array} cls=['neo-grid-header-toolbar']
20
+ * @member {Array} cls=['neo-grid-header-toolbar','neo-toolbar']
21
21
  */
22
- cls: ['grid-header-toolbar'],
23
- /**
24
- * @member {String} _layout='base'
25
- * @protected
26
- */
27
- _layout : 'base',
22
+ cls: ['neo-grid-header-toolbar', 'neo-toolbar'],
28
23
  /**
29
24
  * @member {Object} itemDefaults={ntype:'grid-header-button'}
30
25
  * @protected
31
26
  */
32
27
  itemDefaults: {
33
28
  ntype: 'grid-header-button'
34
- },
35
- /**
36
- * @member {Object} _vdom
37
- * @protected
38
- */
39
- _vdom:
40
- {cn: [
41
- {cls: ['neo-grid-row'], cn: []}
42
- ]}
29
+ }
43
30
  }}
44
31
 
45
32
  /**
46
- * @param {Array} items
33
+ *
47
34
  */
48
- createItems(items) {
49
- let me = this,
50
- cn = [],
51
- i = 0,
52
- len, vdom;
35
+ createItems() {
36
+ let me = this;
37
+
38
+ me.itemDefaults.showHeaderFilter = me.showHeaderFilters;
53
39
 
54
40
  super.createItems();
55
41
 
56
- items = me.items;
57
- len = items.length;
58
- vdom = me.vdom;
42
+ let dockLeftWidth = 0,
43
+ dockRightWidth = 0,
44
+ items = me.items,
45
+ len = items.length,
46
+ vdom = me.vdom,
47
+ style;
59
48
 
60
- for (; i < len; i++) {
61
- cn.push(items[i]._vdom = {
62
- cls: ['neo-grid-header-cell'],
63
- cn : items[i].vdom
64
- });
49
+ items.forEach((item, index) => {
50
+ style = item.wrapperStyle;
65
51
 
66
- //items[i].vdom.cls = []; // remove the button cls from the th tag
67
- }
52
+ // todo: only add px if number
53
+ if (item.maxWidth) {style.maxWidth = item.maxWidth + 'px'}
54
+ if (item.minWidth) {style.minWidth = item.minWidth + 'px'}
55
+ if (item.width) {style.width = item.width + 'px'}
68
56
 
69
- vdom.cn[0].cn = cn;
57
+ if (item.dock) {
58
+ item.vdom.cls.push('neo-locked');
70
59
 
71
- me.vdom = vdom;
72
- }
60
+ if (item.dock === 'left') {
61
+ style.left = dockLeftWidth + 'px';
62
+ }
73
63
 
74
- /**
75
- * @param dock
76
- * @returns {String} layoutConfig
77
- * @override
78
- */
79
- getLayoutConfig(dock) {
80
- return 'base';
81
- }
64
+ dockLeftWidth += (item.width + 1); // todo: borders fix
65
+ }
82
66
 
83
- /**
84
- * @returns {Object}
85
- */
86
- getVdomRoot() {
87
- return this.vdom.cn[0];
88
- }
67
+ item.wrapperStyle = style;
89
68
 
90
- /**
91
- * @returns {Object}
92
- */
93
- getVnodeRoot() {
94
- return this.vnode.childNodes[0];
69
+ // inverse loop direction
70
+ item = items[len - index -1];
71
+
72
+ if (item.dock === 'right') {
73
+ style = item.wrapperStyle;
74
+ style.right = dockRightWidth + 'px';
75
+
76
+ item.wrapperStyle = style;
77
+
78
+ dockRightWidth += (item.width + 1); // todo: borders fix
79
+ }
80
+ });
81
+
82
+ me.vdom = vdom;
95
83
  }
96
84
  }
97
85
 
@@ -0,0 +1,122 @@
1
+ import CellModel from './CellModel.mjs';
2
+ import ColumnModel from './ColumnModel.mjs';
3
+ import VDomUtil from '../../util/VDom.mjs';
4
+
5
+ /**
6
+ * @class Neo.selection.grid.CellColumnModel
7
+ * @extends Neo.selection.grid.CellModel
8
+ */
9
+ class CellColumnModel extends CellModel {
10
+ static getConfig() {return {
11
+ /**
12
+ * @member {String} className='Neo.selection.grid.CellColumnModel'
13
+ * @protected
14
+ */
15
+ className: 'Neo.selection.grid.CellColumnModel',
16
+ /**
17
+ * @member {String} ntype='selection-grid-cellcolumnmodel'
18
+ * @protected
19
+ */
20
+ ntype: 'selection-grid-cellcolumnmodel',
21
+ /**
22
+ * @member {String} cls='neo-selection-cellcolumnmodel'
23
+ * @protected
24
+ */
25
+ cls: 'neo-selection-cellcolumnmodel',
26
+ /**
27
+ * @member {String} selectedColumnCellCls='selected-column-cell'
28
+ * @protected
29
+ */
30
+ selectedColumnCellCls: 'selected-column-cell',
31
+ /**
32
+ * @member {Array|null} selectedColumnCellIds=null
33
+ * @protected
34
+ */
35
+ selectedColumnCellIds: null
36
+ }}
37
+
38
+ /**
39
+ * @param {Object} config
40
+ */
41
+ construct(config) {
42
+ super.construct(config);
43
+
44
+ this.selectedColumnCellIds = [];
45
+ }
46
+
47
+ /**
48
+ * @param {Boolean} [silent] true to prevent a vdom update
49
+ */
50
+ deselectAllCells(silent) {
51
+ let me = this,
52
+ cellIds = [...me.selectedColumnCellIds],
53
+ view = me.view,
54
+ vdom = view.vdom;
55
+
56
+ cellIds.forEach(cellId => {
57
+ me.deselect(cellId, true, me.selectedColumnCellIds, me.selectedColumnCellCls);
58
+ });
59
+
60
+ if (!silent) {
61
+ view.vdom = vdom;
62
+ }
63
+ }
64
+
65
+ /**
66
+ * @param {Object} data
67
+ */
68
+ onCellClick(data) {
69
+ let me = this,
70
+ id = ColumnModel.getCellId(data.path),
71
+ columnNodeIds, index, tbodyNode;
72
+
73
+ if (id) {
74
+ index = ColumnModel.getColumnIndex(id, me.view.items[0].items);
75
+ tbodyNode = VDomUtil.findVdomChild(me.view.vdom, {tag: 'tbody'}).vdom;
76
+ columnNodeIds = VDomUtil.getColumnNodesIds(tbodyNode, index);
77
+
78
+ me.deselectAllCells(true);
79
+ me.select(columnNodeIds, me.selectedColumnCellIds, me.selectedColumnCellCls);
80
+ }
81
+
82
+ super.onCellClick(data);
83
+ }
84
+
85
+ /**
86
+ * @param {Object} data
87
+ * @param {Number} step
88
+ */
89
+ onNavKeyColumn(data, step) {
90
+ let me = this,
91
+ idArray = ColumnModel.getCellId(data.path).split('__'),
92
+ currentColumn = idArray[2],
93
+ view = me.view,
94
+ dataFields = view.columns.map(c => c.dataField),
95
+ newIndex = (dataFields.indexOf(currentColumn) + step) % dataFields.length,
96
+ columnNodeIds, tbodyNode;
97
+
98
+ while (newIndex < 0) {
99
+ newIndex += dataFields.length;
100
+ }
101
+
102
+ tbodyNode = VDomUtil.findVdomChild(me.view.vdom, {tag: 'tbody'}).vdom;
103
+ columnNodeIds = VDomUtil.getColumnNodesIds(tbodyNode, newIndex);
104
+
105
+ me.deselectAllCells(true);
106
+ me.select(columnNodeIds, me.selectedColumnCellIds, me.selectedColumnCellCls);
107
+
108
+ super.onNavKeyColumn(data, step);
109
+ }
110
+
111
+ /**
112
+ *
113
+ */
114
+ unregister() {
115
+ this.deselectAllCells();
116
+ super.unregister();
117
+ }
118
+ }
119
+
120
+ Neo.applyClassConfig(CellColumnModel);
121
+
122
+ export default CellColumnModel;
@@ -0,0 +1,122 @@
1
+ import CellRowModel from './CellRowModel.mjs';
2
+ import ColumnModel from './ColumnModel.mjs';
3
+ import VDomUtil from '../../util/VDom.mjs';
4
+
5
+ /**
6
+ * @class Neo.selection.grid.CellColumnRowModel
7
+ * @extends Neo.selection.grid.CellRowModel
8
+ */
9
+ class CellColumnRowModel extends CellRowModel {
10
+ static getConfig() {return {
11
+ /**
12
+ * @member {String} className='Neo.selection.grid.CellColumnRowModel'
13
+ * @protected
14
+ */
15
+ className: 'Neo.selection.grid.CellColumnRowModel',
16
+ /**
17
+ * @member {String} ntype='selection-grid-cellcolumnrowmodel'
18
+ * @protected
19
+ */
20
+ ntype: 'selection-grid-cellcolumnrowmodel',
21
+ /**
22
+ * @member {String} cls='neo-selection-cellcolumnrowmodel'
23
+ * @protected
24
+ */
25
+ cls: 'neo-selection-cellcolumnrowmodel',
26
+ /**
27
+ * @member {String} selectedColumnCellCls='selected-column-cell'
28
+ * @protected
29
+ */
30
+ selectedColumnCellCls: 'selected-column-cell',
31
+ /**
32
+ * @member {Array|null} selectedColumnCellIds=null
33
+ * @protected
34
+ */
35
+ selectedColumnCellIds: null
36
+ }}
37
+
38
+ /**
39
+ * @param {Object} config
40
+ */
41
+ construct(config) {
42
+ super.construct(config);
43
+
44
+ this.selectedColumnCellIds = [];
45
+ }
46
+
47
+ /**
48
+ * @param {Boolean} [silent] true to prevent a vdom update
49
+ */
50
+ deselectAllCells(silent) {
51
+ let me = this,
52
+ cellIds = [...me.selectedColumnCellIds],
53
+ view = me.view,
54
+ vdom = view.vdom;
55
+
56
+ cellIds.forEach(cellId => {
57
+ me.deselect(cellId, true, me.selectedColumnCellIds, me.selectedColumnCellCls);
58
+ });
59
+
60
+ if (!silent) {
61
+ view.vdom = vdom;
62
+ }
63
+ }
64
+
65
+ /**
66
+ * @param {Object} data
67
+ */
68
+ onCellClick(data) {
69
+ let me = this,
70
+ id = ColumnModel.getCellId(data.path),
71
+ columnNodeIds, index, tbodyNode;
72
+
73
+ if (id) {
74
+ index = ColumnModel.getColumnIndex(id, me.view.items[0].items);
75
+ tbodyNode = VDomUtil.findVdomChild(me.view.vdom, {tag: 'tbody'}).vdom;
76
+ columnNodeIds = VDomUtil.getColumnNodesIds(tbodyNode, index);
77
+
78
+ me.deselectAllCells(true);
79
+ me.select(columnNodeIds, me.selectedColumnCellIds, me.selectedColumnCellCls);
80
+ }
81
+
82
+ super.onCellClick(data);
83
+ }
84
+
85
+ /**
86
+ * @param {Object} data
87
+ * @param {Number} step
88
+ */
89
+ onNavKeyColumn(data, step) {
90
+ let me = this,
91
+ idArray = ColumnModel.getCellId(data.path).split('__'),
92
+ currentColumn = idArray[2],
93
+ view = me.view,
94
+ dataFields = view.columns.map(c => c.dataField),
95
+ newIndex = (dataFields.indexOf(currentColumn) + step) % dataFields.length,
96
+ columnNodeIds, tbodyNode;
97
+
98
+ while (newIndex < 0) {
99
+ newIndex += dataFields.length;
100
+ }
101
+
102
+ tbodyNode = VDomUtil.findVdomChild(me.view.vdom, {tag: 'tbody'}).vdom;
103
+ columnNodeIds = VDomUtil.getColumnNodesIds(tbodyNode, newIndex);
104
+
105
+ me.deselectAllCells(true);
106
+ me.select(columnNodeIds, me.selectedColumnCellIds, me.selectedColumnCellCls);
107
+
108
+ super.onNavKeyColumn(data, step);
109
+ }
110
+
111
+ /**
112
+ *
113
+ */
114
+ unregister() {
115
+ this.deselectAllCells();
116
+ super.unregister();
117
+ }
118
+ }
119
+
120
+ Neo.applyClassConfig(CellColumnRowModel);
121
+
122
+ export default CellColumnRowModel;
@@ -0,0 +1,184 @@
1
+ import Model from '../Model.mjs';
2
+
3
+ /**
4
+ * @class Neo.selection.grid.CellModel
5
+ * @extends Neo.selection.Model
6
+ */
7
+ class CellModel extends Model {
8
+ static getConfig() {return {
9
+ /**
10
+ * @member {String} className='Neo.selection.grid.CellModel'
11
+ * @protected
12
+ */
13
+ className: 'Neo.selection.grid.CellModel',
14
+ /**
15
+ * @member {String} ntype='selection-grid-cellmodel'
16
+ * @protected
17
+ */
18
+ ntype: 'selection-grid-cellmodel',
19
+ /**
20
+ * @member {String} cls='selection-cellmodel'
21
+ * @protected
22
+ */
23
+ cls: 'neo-selection-cellmodel'
24
+ }}
25
+
26
+ /**
27
+ *
28
+ */
29
+ addDomListener() {
30
+ let me = this,
31
+ view = me.view,
32
+ domListeners = view.domListeners;
33
+
34
+ domListeners.push({
35
+ click : me.onCellClick,
36
+ delegate: '.neo-grid-cell',
37
+ scope : me
38
+ });
39
+
40
+ view.domListeners = domListeners;
41
+ }
42
+
43
+ /**
44
+ * @param {Object} data
45
+ */
46
+ onCellClick(data) {
47
+ let me = this,
48
+ id = null,
49
+ path = data.path,
50
+ i = 0,
51
+ len = path.length;
52
+
53
+ for (; i < len; i++) {
54
+ if (path[i].tagName === 'td') {
55
+ id = path[i].id;
56
+ break;
57
+ }
58
+ }
59
+
60
+ if (id) {
61
+ me.toggleSelection(id);
62
+ }
63
+ }
64
+
65
+ /**
66
+ * @param {Object} data
67
+ */
68
+ onKeyDownDown(data) {
69
+ this.onNavKeyRow(data, 1);
70
+ }
71
+
72
+ /**
73
+ * @param {Object} data
74
+ */
75
+ onKeyDownLeft(data) {
76
+ this.onNavKeyColumn(data, -1);
77
+ }
78
+
79
+ /**
80
+ * @param {Object} data
81
+ */
82
+ onKeyDownRight(data) {
83
+ this.onNavKeyColumn(data, 1);
84
+ }
85
+
86
+ /**
87
+ * @param {Object} data
88
+ */
89
+ onKeyDownUp(data) {
90
+ this.onNavKeyRow(data, -1);
91
+ }
92
+
93
+ /**
94
+ * @param {Object} data
95
+ * @param {Number} step
96
+ */
97
+ onNavKeyColumn(data, step) {
98
+ let me = this,
99
+ view = me.view,
100
+ idArray = data.path[0].id.split('__'),
101
+ currentColumn = idArray[2],
102
+ dataFields = view.columns.map(c => c.dataField),
103
+ newIndex = (dataFields.indexOf(currentColumn) + step) % dataFields.length,
104
+ id;
105
+
106
+ while (newIndex < 0) {
107
+ newIndex += dataFields.length;
108
+ }
109
+
110
+ idArray[2] = dataFields[newIndex];
111
+ id = idArray.join('__');
112
+
113
+ me.select(id);
114
+ view.focus(id);
115
+ }
116
+
117
+ /**
118
+ * @param {Object} data
119
+ * @param {Number} step
120
+ */
121
+ onNavKeyRow(data, step) {
122
+ let me = this,
123
+ view = me.view,
124
+ store = view.store,
125
+ idArray = data.path[0].id.split('__'),
126
+ recordId = idArray[1],
127
+ newIndex = (store.indexOf(recordId) + step) % store.getCount(),
128
+ id;
129
+
130
+ while (newIndex < 0) {
131
+ newIndex += store.getCount();
132
+ }
133
+
134
+ idArray[1] = store.getKeyAt(newIndex);
135
+ id = idArray.join('__');
136
+
137
+ me.select(id);
138
+ view.focus(id);
139
+ }
140
+
141
+ /**
142
+ * @param {Neo.component.Base} component
143
+ */
144
+ register(component) {
145
+ super.register(component);
146
+
147
+ let me = this,
148
+ id = me.id,
149
+ view = me.view;
150
+
151
+ if (view.keys) {
152
+ view.keys._keys.push(
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}
157
+ );
158
+ }
159
+ }
160
+
161
+ /**
162
+ *
163
+ */
164
+ unregister() {
165
+ let me = this,
166
+ id = me.id,
167
+ view = me.view;
168
+
169
+ if (view.keys) {
170
+ view.keys.removeKeys([
171
+ {fn: 'onKeyDownDown' ,key: 'Down' ,scope: id},
172
+ {fn: 'onKeyDownLeft' ,key: 'Left' ,scope: id},
173
+ {fn: 'onKeyDownRight' ,key: 'Right' ,scope: id},
174
+ {fn: 'onKeyDownUp' ,key: 'Up' ,scope: id}
175
+ ]);
176
+ }
177
+
178
+ super.unregister();
179
+ }
180
+ }
181
+
182
+ Neo.applyClassConfig(CellModel);
183
+
184
+ export default CellModel;