neo.mjs 7.15.0 → 8.0.0-alpha.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 (80) hide show
  1. package/apps/ServiceWorker.mjs +2 -2
  2. package/apps/portal/index.html +1 -1
  3. package/apps/portal/view/ViewportController.mjs +1 -1
  4. package/apps/portal/view/about/Container.mjs +2 -2
  5. package/apps/portal/view/home/FooterContainer.mjs +1 -1
  6. package/apps/realworld/view/HomeComponent.mjs +13 -14
  7. package/apps/realworld/view/user/ProfileComponent.mjs +1 -1
  8. package/apps/realworld/view/user/SignUpComponent.mjs +1 -2
  9. package/examples/ServiceWorker.mjs +2 -2
  10. package/examples/table/container/MainContainer.mjs +17 -12
  11. package/examples/table/nestedRecordFields/MainContainer.mjs +3 -1
  12. package/examples/todoList/version1/MainComponent.mjs +1 -1
  13. package/package.json +6 -6
  14. package/resources/scss/src/Global.scss +1 -1
  15. package/resources/scss/src/apps/portal/home/parts/MainNeo.scss +10 -5
  16. package/resources/scss/src/global/_all.scss +1 -1
  17. package/resources/scss/theme-neo-light/Global.scss +1 -1
  18. package/resources/scss/theme-neo-light/design-tokens/_all.scss +3 -3
  19. package/src/DefaultConfig.mjs +2 -2
  20. package/src/button/Base.mjs +41 -48
  21. package/src/calendar/view/SettingsContainer.mjs +4 -0
  22. package/src/calendar/view/calendars/ColorsList.mjs +6 -6
  23. package/src/calendar/view/calendars/Container.mjs +1 -1
  24. package/src/calendar/view/calendars/List.mjs +6 -2
  25. package/src/calendar/view/month/Component.mjs +1 -1
  26. package/src/calendar/view/week/Component.mjs +7 -7
  27. package/src/calendar/view/week/EventDragZone.mjs +1 -1
  28. package/src/calendar/view/week/TimeAxisComponent.mjs +2 -2
  29. package/src/calendar/view/week/plugin/DragDrop.mjs +3 -3
  30. package/src/collection/Base.mjs +4 -3
  31. package/src/component/Base.mjs +81 -36
  32. package/src/component/Circle.mjs +1 -3
  33. package/src/component/DateSelector.mjs +1 -1
  34. package/src/component/wrapper/MonacoEditor.mjs +5 -0
  35. package/src/container/Accordion.mjs +1 -1
  36. package/src/container/Base.mjs +18 -6
  37. package/src/core/Base.mjs +10 -9
  38. package/src/draggable/list/DragZone.mjs +1 -1
  39. package/src/draggable/toolbar/DragZone.mjs +1 -1
  40. package/src/draggable/toolbar/SortZone.mjs +1 -1
  41. package/src/draggable/tree/DragZone.mjs +1 -1
  42. package/src/form/Fieldset.mjs +2 -0
  43. package/src/form/field/Color.mjs +4 -4
  44. package/src/form/field/ComboBox.mjs +2 -2
  45. package/src/form/field/Date.mjs +2 -1
  46. package/src/form/field/Picker.mjs +2 -1
  47. package/src/form/field/Text.mjs +8 -8
  48. package/src/layout/Card.mjs +1 -0
  49. package/src/list/Chip.mjs +3 -2
  50. package/src/list/Circle.mjs +2 -1
  51. package/src/list/Component.mjs +5 -0
  52. package/src/manager/Component.mjs +158 -4
  53. package/src/manager/DomEvent.mjs +2 -2
  54. package/src/menu/List.mjs +4 -5
  55. package/src/menu/Panel.mjs +1 -1
  56. package/src/selection/Model.mjs +1 -1
  57. package/src/selection/grid/BaseModel.mjs +61 -0
  58. package/src/selection/grid/CellColumnModel.mjs +2 -2
  59. package/src/selection/grid/CellColumnRowModel.mjs +2 -2
  60. package/src/selection/grid/CellModel.mjs +4 -4
  61. package/src/selection/grid/CellRowModel.mjs +9 -3
  62. package/src/selection/grid/ColumnModel.mjs +15 -26
  63. package/src/selection/grid/RowModel.mjs +15 -25
  64. package/src/selection/menu/ListModel.mjs +1 -5
  65. package/src/selection/table/BaseModel.mjs +61 -0
  66. package/src/selection/table/CellColumnModel.mjs +2 -2
  67. package/src/selection/table/CellColumnRowModel.mjs +2 -2
  68. package/src/selection/table/CellModel.mjs +4 -4
  69. package/src/selection/table/CellRowModel.mjs +9 -3
  70. package/src/selection/table/ColumnModel.mjs +7 -8
  71. package/src/selection/table/RowModel.mjs +7 -7
  72. package/src/table/Container.mjs +1 -0
  73. package/src/table/View.mjs +102 -80
  74. package/src/table/header/Button.mjs +3 -5
  75. package/src/table/header/Toolbar.mjs +1 -0
  76. package/src/tree/List.mjs +1 -1
  77. package/src/util/VDom.mjs +42 -11
  78. package/src/util/VNode.mjs +33 -11
  79. package/src/vdom/Helper.mjs +36 -16
  80. package/src/vdom/VNode.mjs +1 -1
@@ -1,11 +1,11 @@
1
- import Model from '../Model.mjs';
2
- import VDomUtil from '../../util/VDom.mjs';
1
+ import BaseModel from './BaseModel.mjs';
2
+ import VDomUtil from '../../util/VDom.mjs';
3
3
 
4
4
  /**
5
5
  * @class Neo.selection.grid.RowModel
6
- * @extends Neo.selection.Model
6
+ * @extends Neo.selection.grid.BaseModel
7
7
  */
8
- class RowModel extends Model {
8
+ class RowModel extends BaseModel {
9
9
  static config = {
10
10
  /**
11
11
  * @member {String} className='Neo.selection.grid.RowModel'
@@ -41,7 +41,7 @@ class RowModel extends Model {
41
41
 
42
42
  me.view.un('rowClick', me.onRowClick, me);
43
43
 
44
- super.destroy(...args);
44
+ super.destroy(...args)
45
45
  }
46
46
 
47
47
  /**
@@ -100,7 +100,7 @@ class RowModel extends Model {
100
100
  node = RowModel.getRowNode(data.path),
101
101
  {view} = me,
102
102
  {store} = view,
103
- vdomNode = VDomUtil.findVdomChild(view.vdom, node.id),
103
+ vdomNode = VDomUtil.find(view.vdom, node.id),
104
104
  newIndex = (vdomNode.index + step) % store.getCount(),
105
105
  {parentNode} = vdomNode,
106
106
  id;
@@ -134,7 +134,7 @@ class RowModel extends Model {
134
134
  me.toggleSelection(id);
135
135
 
136
136
  isSelected = me.isSelected(id);
137
- record = view.store.getAt(VDomUtil.findVdomChild(view.vdom, id).index);
137
+ record = view.store.getAt(VDomUtil.find(view.vdom, id).index);
138
138
 
139
139
  !isSelected && view.onDeselect?.(record);
140
140
 
@@ -152,15 +152,10 @@ class RowModel extends Model {
152
152
 
153
153
  let {id, view} = this;
154
154
 
155
- view.keys?._keys.push({
156
- fn : 'onKeyDownDown',
157
- key : 'Down',
158
- scope: id
159
- }, {
160
- fn : 'onKeyDownUp',
161
- key : 'Up',
162
- scope: id
163
- })
155
+ view.keys?._keys.push(
156
+ {fn: 'onKeyDownDown', key: 'Down', scope: id},
157
+ {fn: 'onKeyDownUp', key: 'Up', scope: id}
158
+ )
164
159
  }
165
160
 
166
161
  /**
@@ -169,15 +164,10 @@ class RowModel extends Model {
169
164
  unregister() {
170
165
  let {id, view} = this;
171
166
 
172
- view.keys?.removeKeys([{
173
- fn : 'onKeyDownDown',
174
- key : 'Down',
175
- scope: id
176
- }, {
177
- fn : 'onKeyDownUp',
178
- key : 'Up',
179
- scope: id
180
- }]);
167
+ view.keys?.removeKeys([
168
+ {fn: 'onKeyDownDown', key: 'Down', scope: id},
169
+ {fn: 'onKeyDownUp', key: 'Up', scope: id}
170
+ ]);
181
171
 
182
172
  super.unregister()
183
173
  }
@@ -43,11 +43,7 @@ class ListModel extends BaseListModel {
43
43
  * @param {Object} data
44
44
  */
45
45
  onKeyDownRight(data) {
46
- let activeSubMenu = this.view.activeSubMenu;
47
-
48
- if (activeSubMenu) {
49
- activeSubMenu.selectionModel.selectAt(0)
50
- }
46
+ this.view.activeSubMenu?.selectionModel.selectAt(0)
51
47
  }
52
48
  }
53
49
 
@@ -0,0 +1,61 @@
1
+ import Model from '../Model.mjs';
2
+
3
+ /**
4
+ * Abstract base class for all table related selection models
5
+ * @class Neo.selection.table.BaseModel
6
+ * @extends Neo.selection.Model
7
+ * @abstract
8
+ */
9
+ class BaseModel extends Model {
10
+ static config = {
11
+ /**
12
+ * @member {String} className='Neo.selection.table.BaseModel'
13
+ * @protected
14
+ */
15
+ className: 'Neo.selection.table.BaseModel'
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
+ }
60
+
61
+ export default Neo.setupClass(BaseModel);
@@ -69,7 +69,7 @@ class CellColumnModel extends CellModel {
69
69
 
70
70
  if (id) {
71
71
  index = ColumnModel.getColumnIndex(id, me.view.items[0].items);
72
- tbodyNode = VDomUtil.findVdomChild(me.view.vdom, {tag: 'tbody'}).vdom;
72
+ tbodyNode = VDomUtil.find(me.view.vdom, {tag: 'tbody'}).vdom;
73
73
  columnNodeIds = VDomUtil.getColumnNodesIds(tbodyNode, index);
74
74
 
75
75
  me.deselectAllCells(true);
@@ -96,7 +96,7 @@ class CellColumnModel extends CellModel {
96
96
  newIndex += dataFields.length
97
97
  }
98
98
 
99
- tbodyNode = VDomUtil.findVdomChild(me.view.vdom, {tag: 'tbody'}).vdom;
99
+ tbodyNode = VDomUtil.find(me.view.vdom, {tag: 'tbody'}).vdom;
100
100
  columnNodeIds = VDomUtil.getColumnNodesIds(tbodyNode, newIndex);
101
101
 
102
102
  me.deselectAllCells(true);
@@ -69,7 +69,7 @@ class CellColumnRowModel extends CellRowModel {
69
69
 
70
70
  if (id) {
71
71
  index = ColumnModel.getColumnIndex(id, me.view.items[0].items);
72
- tbodyNode = VDomUtil.findVdomChild(me.view.vdom, {tag: 'tbody'}).vdom;
72
+ tbodyNode = VDomUtil.find(me.view.vdom, {tag: 'tbody'}).vdom;
73
73
  columnNodeIds = VDomUtil.getColumnNodesIds(tbodyNode, index);
74
74
 
75
75
  me.deselectAllCells(true);
@@ -96,7 +96,7 @@ class CellColumnRowModel extends CellRowModel {
96
96
  newIndex += dataFields.length
97
97
  }
98
98
 
99
- tbodyNode = VDomUtil.findVdomChild(me.view.vdom, {tag: 'tbody'}).vdom;
99
+ tbodyNode = VDomUtil.find(me.view.vdom, {tag: 'tbody'}).vdom;
100
100
  columnNodeIds = VDomUtil.getColumnNodesIds(tbodyNode, newIndex);
101
101
 
102
102
  me.deselectAllCells(true);
@@ -1,10 +1,10 @@
1
- import Model from '../Model.mjs';
1
+ import BaseModel from './BaseModel.mjs';
2
2
 
3
3
  /**
4
4
  * @class Neo.selection.table.CellModel
5
- * @extends Neo.selection.Model
5
+ * @extends Neo.selection.table.BaseModel
6
6
  */
7
- class CellModel extends Model {
7
+ class CellModel extends BaseModel {
8
8
  static config = {
9
9
  /**
10
10
  * @member {String} className='Neo.selection.table.CellModel'
@@ -40,7 +40,7 @@ class CellModel extends Model {
40
40
 
41
41
  me.view.un('cellClick', me.onCellClick, me);
42
42
 
43
- super.destroy(...args);
43
+ super.destroy(...args)
44
44
  }
45
45
 
46
46
  /**
@@ -73,7 +73,10 @@ class CellRowModel extends CellModel {
73
73
 
74
74
  NeoArray.remove(me.selectedRowIds, rowId);
75
75
 
76
- !silent && view.update()
76
+ if (!silent) {
77
+ view.updateDepth = 2;
78
+ view.update()
79
+ }
77
80
  }
78
81
 
79
82
  /**
@@ -103,7 +106,7 @@ class CellRowModel extends CellModel {
103
106
  node = RowModel.getRowNode(data.path),
104
107
  {view} = me,
105
108
  {store} = view,
106
- vdomNode = VDomUtil.findVdomChild(view.vdom, node.id),
109
+ vdomNode = VDomUtil.find(view.vdom, node.id),
107
110
  newIndex = (vdomNode.index + step) % store.getCount(),
108
111
  parentNode = vdomNode.parentNode,
109
112
  id;
@@ -138,7 +141,10 @@ class CellRowModel extends CellModel {
138
141
  me.selectedRowIds.push(id)
139
142
  }
140
143
 
141
- !silent && view.update()
144
+ if (!silent) {
145
+ view.updateDepth = 2;
146
+ view.update()
147
+ }
142
148
  }
143
149
 
144
150
  /**
@@ -1,11 +1,11 @@
1
- import Model from '../Model.mjs';
2
- import VDomUtil from '../../util/VDom.mjs';
1
+ import BaseModel from './BaseModel.mjs';
2
+ import VDomUtil from '../../util/VDom.mjs';
3
3
 
4
4
  /**
5
5
  * @class Neo.selection.table.ColumnModel
6
- * @extends Neo.selection.Model
6
+ * @extends Neo.selection.table.BaseModel
7
7
  */
8
- class ColumnModel extends Model {
8
+ class ColumnModel extends BaseModel {
9
9
  static config = {
10
10
  /**
11
11
  * @member {String} className='Neo.selection.table.ColumnModel'
@@ -41,7 +41,7 @@ class ColumnModel extends Model {
41
41
 
42
42
  me.view.un('cellClick', me.onCellClick, me);
43
43
 
44
- super.destroy(...args);
44
+ super.destroy(...args)
45
45
  }
46
46
 
47
47
  /**
@@ -87,7 +87,7 @@ class ColumnModel extends Model {
87
87
 
88
88
  if (id) {
89
89
  index = ColumnModel.getColumnIndex(id, me.view.items[0].items);
90
- tbodyNode = VDomUtil.findVdomChild(me.view.vdom, {tag: 'tbody'}).vdom;
90
+ tbodyNode = VDomUtil.find(me.view.vdom, {tag: 'tbody'}).vdom;
91
91
  columnNodeIds = VDomUtil.getColumnNodesIds(tbodyNode, index);
92
92
 
93
93
  me.select(columnNodeIds)
@@ -128,7 +128,7 @@ class ColumnModel extends Model {
128
128
  idArray[2] = dataFields[newIndex];
129
129
  id = idArray.join('__');
130
130
 
131
- tbodyNode = VDomUtil.findVdomChild(me.view.vdom, {tag: 'tbody'}).vdom;
131
+ tbodyNode = VDomUtil.find(me.view.vdom, {tag: 'tbody'}).vdom;
132
132
  columnNodeIds = VDomUtil.getColumnNodesIds(tbodyNode, newIndex);
133
133
 
134
134
  me.select(columnNodeIds);
@@ -149,7 +149,6 @@ class ColumnModel extends Model {
149
149
  )
150
150
  }
151
151
 
152
-
153
152
  /**
154
153
  *
155
154
  */
@@ -1,11 +1,11 @@
1
- import Model from '../Model.mjs';
2
- import VDomUtil from '../../util/VDom.mjs';
1
+ import BaseModel from './BaseModel.mjs';
2
+ import VDomUtil from '../../util/VDom.mjs';
3
3
 
4
4
  /**
5
5
  * @class Neo.selection.table.RowModel
6
- * @extends Neo.selection.Model
6
+ * @extends Neo.selection.table.BaseModel
7
7
  */
8
- class RowModel extends Model {
8
+ class RowModel extends BaseModel {
9
9
  static config = {
10
10
  /**
11
11
  * @member {String} className='Neo.selection.table.RowModel'
@@ -41,7 +41,7 @@ class RowModel extends Model {
41
41
 
42
42
  me.view.un('rowClick', me.onRowClick, me);
43
43
 
44
- super.destroy(...args);
44
+ super.destroy(...args)
45
45
  }
46
46
 
47
47
  /**
@@ -100,7 +100,7 @@ class RowModel extends Model {
100
100
  node = RowModel.getRowNode(data.path),
101
101
  {view} = me,
102
102
  {store} = view,
103
- vdomNode = VDomUtil.findVdomChild(view.vdom, node.id),
103
+ vdomNode = VDomUtil.find(view.vdom, node.id),
104
104
  newIndex = (vdomNode.index + step) % store.getCount(),
105
105
  {parentNode} = vdomNode,
106
106
  id;
@@ -134,7 +134,7 @@ class RowModel extends Model {
134
134
  me.toggleSelection(id);
135
135
 
136
136
  isSelected = me.isSelected(id);
137
- record = view.store.getAt(VDomUtil.findVdomChild(view.vdom, id).index);
137
+ record = view.store.getAt(VDomUtil.find(view.vdom, id).index);
138
138
 
139
139
  !isSelected && view.onDeselect?.(record);
140
140
 
@@ -231,6 +231,7 @@ class Container extends BaseContainer {
231
231
  if (me.dockRightMargin) {
232
232
  cssRules.push('#' + id + '::-webkit-scrollbar-track:horizontal {margin-right: ' + me.dockRightMargin + 'px;}')
233
233
  }
234
+
234
235
  if (cssRules.length > 0) {
235
236
  CssUtil.insertRules(me.appName, cssRules)
236
237
  }
@@ -55,6 +55,19 @@ class View extends Component {
55
55
  {tag: 'tbody', cn: []}
56
56
  }
57
57
 
58
+ /**
59
+ * @member {String[]} selectedRows
60
+ */
61
+ get selectedRows() {
62
+ let tableContainer = this.parent;
63
+
64
+ if (tableContainer.selectionModel.ntype === 'selection-table-rowmodel') {
65
+ return tableContainer.selectionModel.items
66
+ }
67
+
68
+ return []
69
+ }
70
+
58
71
  /**
59
72
  * @param config
60
73
  */
@@ -167,98 +180,106 @@ class View extends Component {
167
180
  }
168
181
 
169
182
  /**
170
- * @param {Object[]} inputData
183
+ * @param {Object} opts
184
+ * @param {Object} opts.record
185
+ * @param {Number} opts.rowIndex
186
+ * @returns {Object}
171
187
  */
172
- createViewData(inputData) {
173
- let me = this,
174
- amountRows = inputData.length,
175
- tableContainer = me.parent,
176
- columns = tableContainer.items[0].items,
177
- colCount = columns.length,
178
- data = [],
179
- i = 0,
180
- {vdom} = me,
181
- config, colspan, colspanKeys, column, dockLeftMargin, dockRightMargin, id, index, j, record, selectedRows, trCls;
182
-
183
- if (tableContainer.selectionModel.ntype === 'selection-table-rowmodel') {
184
- selectedRows = tableContainer.selectionModel.items || [];
188
+ createTableRow({record, rowIndex}) {
189
+ let me = this,
190
+ tableContainer = me.parent,
191
+ colspan = record[me.colspanField],
192
+ colspanKeys = colspan && Object.keys(colspan),
193
+ columns = tableContainer.items[0].items,
194
+ colCount = columns.length,
195
+ dockLeftMargin = 0,
196
+ dockRightMargin = 0,
197
+ id = me.getRowId(record, rowIndex),
198
+ {selectedRows} = me,
199
+ trCls = me.getTrClass(record, rowIndex),
200
+ config, column, columnIndex, i, tableRow;
201
+
202
+ me.recordVnodeMap[id] = rowIndex;
203
+
204
+ if (selectedRows && Neo.ns(me.selectedRecordField, false, record)) {
205
+ NeoArray.add(selectedRows, id)
185
206
  }
186
207
 
187
- for (; i < amountRows; i++) {
188
- record = inputData[i];
189
- colspan = record[me.colspanField];
190
- colspanKeys = colspan && Object.keys(colspan);
191
- id = me.getRowId(record, i);
208
+ if (selectedRows?.includes(id)) {
209
+ trCls.push('neo-selected');
192
210
 
193
- me.recordVnodeMap[id] = i;
211
+ me.parent.fire('select', {
212
+ record
213
+ })
214
+ }
194
215
 
195
- trCls = me.getTrClass(record, i);
216
+ tableRow = {
217
+ tag : 'tr',
218
+ id,
219
+ cls : trCls,
220
+ cn : [],
221
+ tabIndex: '-1'
222
+ };
196
223
 
197
- if (selectedRows && Neo.ns(me.selectedRecordField, false, record)) {
198
- NeoArray.add(selectedRows, id)
199
- }
224
+ for (i=0; i < colCount; i++) {
225
+ column = columns[i];
226
+ config = me.applyRendererOutput({column, record, index: rowIndex, tableContainer});
200
227
 
201
- if (selectedRows?.includes(id)) {
202
- trCls.push('neo-selected');
228
+ if (column.dock) {
229
+ config.cls = ['neo-locked', ...config.cls || []];
203
230
 
204
- me.parent.fire('select', {
205
- record
206
- })
231
+ if (column.dock === 'left') {
232
+ config.style.left = dockLeftMargin + 'px';
233
+ dockLeftMargin += (column.width + 1) // todo: borders fix
234
+ }
207
235
  }
208
236
 
209
- data.push({
210
- tag : 'tr',
211
- id,
212
- cls : trCls,
213
- cn : [],
214
- tabIndex: '-1'
215
- });
237
+ if (column.flex) {
238
+ config.style.width = '100%'
239
+ }
216
240
 
217
- dockLeftMargin = 0;
218
- dockRightMargin = 0;
241
+ tableRow.cn.push(config);
219
242
 
220
- for (j=0; j < colCount; j++) {
221
- column = columns[j];
222
- config = me.applyRendererOutput({column, record, index: i, tableContainer});
243
+ if (colspanKeys?.includes(column.dataField)) {
244
+ i += (colspan[column.dataField] - 1)
245
+ }
246
+ }
223
247
 
224
- if (column.dock) {
225
- config.cls = ['neo-locked', ...config.cls || []];
248
+ for (i=0; i < colCount; i++) {
249
+ columnIndex = colCount - i -1;
250
+ column = columns[columnIndex];
226
251
 
227
- if (column.dock === 'left') {
228
- config.style.left = dockLeftMargin + 'px';
229
- dockLeftMargin += (column.width + 1) // todo: borders fix
230
- }
231
- }
232
-
233
- if (column.flex) {
234
- config.style.width = '100%'
235
- }
236
-
237
- data[i].cn.push(config);
252
+ if (column.dock === 'right') {
253
+ tableRow.cn[columnIndex].style.right = dockRightMargin + 'px';
254
+ dockRightMargin += (column.width + 1) // todo: borders fix
255
+ }
238
256
 
239
- if (colspanKeys?.includes(column.dataField)) {
240
- j += (colspan[column.dataField] - 1)
241
- }
257
+ if (colspanKeys?.includes(column.dataField)) {
258
+ i += (colspan[column.dataField] - 1)
242
259
  }
260
+ }
243
261
 
244
- for (j=0; j < colCount; j++) {
245
- index = colCount - j -1;
246
- column = columns[index];
262
+ // the dock margins are the same for each row
263
+ rowIndex === 0 && Object.assign(tableContainer, {dockLeftMargin, dockRightMargin});
247
264
 
248
- if (column.dock === 'right') {
249
- data[i].cn[index].style.right = dockRightMargin + 'px';
250
- dockRightMargin += (column.width + 1) // todo: borders fix
251
- }
265
+ return tableRow
266
+ }
252
267
 
253
- if (colspanKeys?.includes(column.dataField)) {
254
- j += (colspan[column.dataField] - 1)
255
- }
256
- }
257
- }
268
+ /**
269
+ * @param {Object[]} inputData
270
+ */
271
+ createViewData(inputData) {
272
+ let me = this,
273
+ amountRows = inputData.length,
274
+ i = 0,
275
+ rows = [],
276
+ {selectedRows} = me;
258
277
 
259
- vdom.cn = data;
278
+ for (; i < amountRows; i++) {
279
+ rows.push(me.createTableRow({record: inputData[i], rowIndex: i}))
280
+ }
260
281
 
261
- Object.assign(tableContainer, {dockLeftMargin, dockRightMargin});
282
+ me.vdom.cn = rows;
262
283
 
263
284
  me.promiseUpdate().then(() => {
264
285
  if (selectedRows?.length > 0) {
@@ -440,9 +461,9 @@ class View extends Component {
440
461
  * @param {Neo.data.Model} opts.model The model instance of the changed record
441
462
  * @param {Object} opts.record
442
463
  */
443
- onStoreRecordChange(opts) {
464
+ onStoreRecordChange({fields, model, record}) {
444
465
  let me = this,
445
- fieldNames = opts.fields.map(field => field.name),
466
+ fieldNames = fields.map(field => field.name),
446
467
  needsUpdate = false,
447
468
  tableContainer = me.parent,
448
469
  {selectionModel} = tableContainer,
@@ -450,17 +471,18 @@ class View extends Component {
450
471
  cellId, cellNode, column, index, scope;
451
472
 
452
473
  if (fieldNames.includes(me.colspanField)) {
453
- // we should narrow it down to only update the current row
454
- me.createViewData(me.store.items)
474
+ index = me.store.indexOf(record);
475
+ me.vdom.cn[index] = me.createTableRow({record, rowIndex: index});
476
+ me.update()
455
477
  } else {
456
- opts.fields.forEach(field => {
478
+ fields.forEach(field => {
457
479
  if (field.name === me.selectedRecordField) {
458
480
  if (selectionModel.ntype === 'selection-table-rowmodel') {
459
- selectionModel[!field.value && selectionModel.singleSelect ? 'deselect' : 'select'](me.getRowId(opts.record))
481
+ selectionModel[field.value ? 'select' : 'deselect'](me.getRowId(record))
460
482
  }
461
483
  } else {
462
- cellId = me.getCellId(opts.record, field.name);
463
- cellNode = VDomUtil.findVdomChild(vdom, cellId);
484
+ cellId = me.getCellId(record, field.name);
485
+ cellNode = VDomUtil.find(vdom, cellId);
464
486
 
465
487
  // the vdom might not exist yet => nothing to do in this case
466
488
  if (cellNode?.vdom) {
@@ -469,7 +491,7 @@ class View extends Component {
469
491
  needsUpdate = true;
470
492
  scope = column.rendererScope || tableContainer;
471
493
 
472
- cellNode.parentNode.cn[index] = me.applyRendererOutput({cellId, column, record: opts.record, index, tableContainer})
494
+ cellNode.parentNode.cn[index] = me.applyRendererOutput({cellId, column, record, index, tableContainer})
473
495
  }
474
496
  }
475
497
  })
@@ -204,6 +204,7 @@ class Button extends BaseButton {
204
204
  flag : 'filter-field',
205
205
  hideLabel: true,
206
206
  parentId : me.id,
207
+ style : {marginLeft: '.5em', marginRight: '.5em'},
207
208
  windowId : me.windowId,
208
209
 
209
210
  listeners: {
@@ -212,14 +213,10 @@ class Button extends BaseButton {
212
213
  scope : me
213
214
  },
214
215
 
215
- style: {
216
- marginLeft : '.5em',
217
- marginRight: '.5em'
218
- },
219
216
  ...me.editorConfig
220
217
  });
221
218
 
222
- me.vdom.cn.push(me.filterField.vdom)
219
+ me.vdom.cn.push(me.filterField.createVdomReference())
223
220
  } else {
224
221
  delete me.filterField.vdom.removeDom
225
222
  }
@@ -227,6 +224,7 @@ class Button extends BaseButton {
227
224
  me.filterField.vdom.removeDom = true
228
225
  }
229
226
 
227
+ me.updateDepth = 2;
230
228
  me.update()
231
229
  }
232
230
 
@@ -63,6 +63,7 @@ class Toolbar extends BaseToolbar {
63
63
  })
64
64
  });
65
65
 
66
+ me.updateDepth = -1; // filters can be deeply nested
66
67
  me.update()
67
68
  }
68
69
  }
package/src/tree/List.mjs CHANGED
@@ -475,7 +475,7 @@ class Tree extends Base {
475
475
  onStoreRecordChange(data) {
476
476
  let me = this,
477
477
  {record} = data,
478
- {index, parentNode} = VDomUtil.findVdomChild(me.vdom, me.getItemId(record.id));
478
+ {index, parentNode} = VDomUtil.find(me.vdom, me.getItemId(record.id));
479
479
 
480
480
  parentNode.cn[index] = me.createItem(record);
481
481