neo.mjs 7.16.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 (71) hide show
  1. package/apps/ServiceWorker.mjs +2 -2
  2. package/apps/portal/view/ViewportController.mjs +1 -1
  3. package/apps/portal/view/home/FooterContainer.mjs +1 -1
  4. package/apps/realworld/view/HomeComponent.mjs +13 -14
  5. package/apps/realworld/view/user/ProfileComponent.mjs +1 -1
  6. package/apps/realworld/view/user/SignUpComponent.mjs +1 -2
  7. package/examples/ServiceWorker.mjs +2 -2
  8. package/examples/table/container/MainContainer.mjs +17 -12
  9. package/examples/table/nestedRecordFields/MainContainer.mjs +3 -1
  10. package/examples/todoList/version1/MainComponent.mjs +1 -1
  11. package/package.json +5 -5
  12. package/src/DefaultConfig.mjs +2 -2
  13. package/src/button/Base.mjs +8 -8
  14. package/src/calendar/view/SettingsContainer.mjs +4 -0
  15. package/src/calendar/view/calendars/ColorsList.mjs +6 -6
  16. package/src/calendar/view/calendars/Container.mjs +1 -1
  17. package/src/calendar/view/calendars/List.mjs +6 -2
  18. package/src/calendar/view/month/Component.mjs +1 -1
  19. package/src/calendar/view/week/Component.mjs +7 -7
  20. package/src/calendar/view/week/EventDragZone.mjs +1 -1
  21. package/src/calendar/view/week/TimeAxisComponent.mjs +2 -2
  22. package/src/calendar/view/week/plugin/DragDrop.mjs +3 -3
  23. package/src/collection/Base.mjs +4 -3
  24. package/src/component/Base.mjs +81 -36
  25. package/src/component/Circle.mjs +1 -3
  26. package/src/component/DateSelector.mjs +1 -1
  27. package/src/container/Accordion.mjs +1 -1
  28. package/src/container/Base.mjs +18 -6
  29. package/src/core/Base.mjs +10 -9
  30. package/src/draggable/list/DragZone.mjs +1 -1
  31. package/src/draggable/toolbar/DragZone.mjs +1 -1
  32. package/src/draggable/toolbar/SortZone.mjs +1 -1
  33. package/src/draggable/tree/DragZone.mjs +1 -1
  34. package/src/form/Fieldset.mjs +2 -0
  35. package/src/form/field/Color.mjs +4 -4
  36. package/src/form/field/ComboBox.mjs +2 -2
  37. package/src/form/field/Date.mjs +2 -1
  38. package/src/form/field/Picker.mjs +2 -1
  39. package/src/form/field/Text.mjs +8 -8
  40. package/src/layout/Card.mjs +1 -0
  41. package/src/list/Chip.mjs +3 -2
  42. package/src/list/Circle.mjs +2 -1
  43. package/src/list/Component.mjs +5 -0
  44. package/src/manager/Component.mjs +158 -4
  45. package/src/manager/DomEvent.mjs +2 -2
  46. package/src/menu/List.mjs +3 -4
  47. package/src/menu/Panel.mjs +1 -1
  48. package/src/selection/Model.mjs +1 -1
  49. package/src/selection/grid/BaseModel.mjs +61 -0
  50. package/src/selection/grid/CellColumnModel.mjs +2 -2
  51. package/src/selection/grid/CellColumnRowModel.mjs +2 -2
  52. package/src/selection/grid/CellModel.mjs +4 -4
  53. package/src/selection/grid/CellRowModel.mjs +9 -3
  54. package/src/selection/grid/ColumnModel.mjs +15 -26
  55. package/src/selection/grid/RowModel.mjs +15 -25
  56. package/src/selection/table/BaseModel.mjs +61 -0
  57. package/src/selection/table/CellColumnModel.mjs +2 -2
  58. package/src/selection/table/CellColumnRowModel.mjs +2 -2
  59. package/src/selection/table/CellModel.mjs +4 -4
  60. package/src/selection/table/CellRowModel.mjs +9 -3
  61. package/src/selection/table/ColumnModel.mjs +7 -8
  62. package/src/selection/table/RowModel.mjs +7 -7
  63. package/src/table/Container.mjs +1 -0
  64. package/src/table/View.mjs +102 -80
  65. package/src/table/header/Button.mjs +3 -5
  66. package/src/table/header/Toolbar.mjs +1 -0
  67. package/src/tree/List.mjs +1 -1
  68. package/src/util/VDom.mjs +42 -11
  69. package/src/util/VNode.mjs +33 -11
  70. package/src/vdom/Helper.mjs +36 -16
  71. package/src/vdom/VNode.mjs +1 -1
@@ -1,4 +1,5 @@
1
- import Base from '../core/Base.mjs';
1
+ import Base from '../core/Base.mjs';
2
+ import ComponentManager from '../manager/Component.mjs';
2
3
 
3
4
  /**
4
5
  * @class Neo.util.VNode
@@ -25,6 +26,8 @@ class VNode extends Base {
25
26
  * {Object} vnode
26
27
  */
27
28
  static findChildVnode(vnode, opts, index, parentNode) {
29
+ vnode = VNode.getVnode(vnode);
30
+
28
31
  index = index || 0;
29
32
  opts = typeof opts !== 'string' ? opts : {id: opts};
30
33
 
@@ -112,6 +115,8 @@ class VNode extends Base {
112
115
  * @returns {Object|null} child vnode or null
113
116
  */
114
117
  static findChildVnodeById(vnode, id) {
118
+ vnode = VNode.getVnode(vnode);
119
+
115
120
  let childNodes = vnode.childNodes || [],
116
121
  i = 0,
117
122
  len = childNodes.length,
@@ -122,7 +127,7 @@ class VNode extends Base {
122
127
  }
123
128
 
124
129
  for (; i < len; i++) {
125
- childNode = childNodes[i];
130
+ childNode = VNode.getVnode(childNodes[i]);
126
131
 
127
132
  if (childNode.id === id) {
128
133
  return childNode
@@ -139,25 +144,38 @@ class VNode extends Base {
139
144
  }
140
145
 
141
146
  /**
142
- * Get the ids of all child nodes of the given vnode
143
- * @param vnode
144
- * @param [childIds=[]]
145
- * @returns {Array} childIds
147
+ * Get the ids of all child nodes of the given vnode, excluding component references
148
+ * @param {Object} vnode
149
+ * @param {String[]} childIds=[]
150
+ * @returns {String[]} childIds
146
151
  */
147
152
  static getChildIds(vnode, childIds=[]) {
148
- let childNodes = vnode && vnode.childNodes || [];
153
+ let childNodes = vnode?.childNodes || [];
149
154
 
150
155
  childNodes.forEach(childNode => {
151
- if (childNode.id) {
156
+ if (childNode.id && !childNode.componentId) {
152
157
  childIds.push(childNode.id)
153
158
  }
154
159
 
155
- childIds = VNode.getChildIds(childNode, childIds)
160
+ VNode.getChildIds(childNode, childIds)
156
161
  });
157
162
 
158
163
  return childIds
159
164
  }
160
165
 
166
+ /**
167
+ * Convenience shortcut using manager.Component to replace vnode references if needed
168
+ * @param {Object} vnode
169
+ * @returns {Object}
170
+ */
171
+ static getVnode(vnode) {
172
+ if (vnode.componentId) {
173
+ vnode = ComponentManager.get(vnode.componentId).vnode
174
+ }
175
+
176
+ return vnode
177
+ }
178
+
161
179
  /**
162
180
  * Removes a child vnode inside a vnode tree by a given id
163
181
  * @param {Object} vnode
@@ -165,6 +183,8 @@ class VNode extends Base {
165
183
  * @returns {Boolean} true in case the node was found and removed
166
184
  */
167
185
  static removeChildVnode(vnode, id) {
186
+ vnode = VNode.getVnode(vnode);
187
+
168
188
  let childNodes = vnode.childNodes || [],
169
189
  i = 0,
170
190
  len = childNodes.length,
@@ -175,7 +195,7 @@ class VNode extends Base {
175
195
  }
176
196
 
177
197
  for (; i < len; i++) {
178
- childNode = childNodes[i];
198
+ childNode = VNode.getVnode(childNodes[i]);
179
199
 
180
200
  if (childNode.id === id) {
181
201
  childNodes.splice(i, 1);
@@ -198,6 +218,8 @@ class VNode extends Base {
198
218
  * @returns {Boolean} true in case the node was found and replaced
199
219
  */
200
220
  static replaceChildVnode(vnode, id, newChildVnode) {
221
+ vnode = VNode.getVnode(vnode);
222
+
201
223
  let childNodes = vnode.childNodes || [],
202
224
  i = 0,
203
225
  len = childNodes.length,
@@ -208,7 +230,7 @@ class VNode extends Base {
208
230
  }
209
231
 
210
232
  for (; i < len; i++) {
211
- childNode = childNodes[i];
233
+ childNode = VNode.getVnode(childNodes[i]);
212
234
 
213
235
  if (childNode.id === id) {
214
236
  childNodes[i] = newChildVnode;
@@ -132,6 +132,10 @@ class Helper extends Base {
132
132
  let {deltas, oldVnode, vnode, vnodeMap} = config,
133
133
  attributes, delta, value, keys, styles, add, remove;
134
134
 
135
+ if (oldVnode.componentId && (oldVnode.id === vnode.id || oldVnode.componentId === vnode.id)) {
136
+ return deltas
137
+ }
138
+
135
139
  if (vnode.vtype === 'text' && vnode.innerHTML !== oldVnode.innerHTML) {
136
140
  deltas.default.push({
137
141
  action : 'updateVtext',
@@ -233,7 +237,7 @@ class Helper extends Base {
233
237
  */
234
238
  createDeltas(config) {
235
239
  let {deltas={default: [], remove: []}, oldVnode, vnode} = config,
236
- oldVnodeId = oldVnode?.id,
240
+ oldVnodeId = oldVnode?.id || oldVnode?.componentId,
237
241
  vnodeId = vnode?.id;
238
242
 
239
243
  // Edge case: setting `removeDom: true` on a top-level vdom node
@@ -259,7 +263,7 @@ class Helper extends Base {
259
263
  indexDelta = 0,
260
264
  insertDelta = 0,
261
265
  len = Math.max(childNodes.length, oldChildNodes.length),
262
- childNode, nodeInNewTree, oldChildNode;
266
+ childNode, nodeInNewTree, oldChildNode, oldChildNodeId;
263
267
 
264
268
  me.compareAttributes({deltas, oldVnode, vnode, vnodeMap});
265
269
 
@@ -285,7 +289,8 @@ class Helper extends Base {
285
289
  }
286
290
 
287
291
  if (oldChildNode) {
288
- nodeInNewTree = vnodeMap.get(oldChildNode.id);
292
+ oldChildNodeId = oldChildNode.id || oldChildNode.componentId;
293
+ nodeInNewTree = vnodeMap.get(oldChildNodeId);
289
294
 
290
295
  // Remove node, if no longer inside the new tree
291
296
  if (!nodeInNewTree) {
@@ -310,7 +315,7 @@ class Helper extends Base {
310
315
  me.insertNode({deltas, index: i + insertDelta, oldVnodeMap, vnode: childNode, vnodeMap});
311
316
  }
312
317
 
313
- if (oldChildNode && vnodeId === vnodeMap.get(oldChildNode.id)?.parentNode.id) {
318
+ if (oldChildNode && vnodeId === vnodeMap.get(oldChildNodeId)?.parentNode.id) {
314
319
  len++;
315
320
  }
316
321
  }
@@ -432,6 +437,15 @@ class Helper extends Base {
432
437
  * @returns {Object|Neo.vdom.VNode|null}
433
438
  */
434
439
  createVnode(opts) {
440
+ // do not create vnode instances for component reference objects
441
+ if (opts.componentId) {
442
+ if (!opts.id) {
443
+ opts.id = opts.componentId
444
+ }
445
+
446
+ return opts
447
+ }
448
+
435
449
  if (opts.removeDom === true) {
436
450
  return null
437
451
  }
@@ -516,11 +530,10 @@ class Helper extends Base {
516
530
  hasUnit = value != parseInt(value);
517
531
  node.style[key] = value + (hasUnit ? '' : 'px');
518
532
  break
533
+ case 'componentId':
519
534
  case 'id':
520
- node.id = value;
521
- break
522
535
  case 'static':
523
- node.static = value;
536
+ node[key] = value;
524
537
  break
525
538
  case 'style':
526
539
  style = node.style;
@@ -557,13 +570,17 @@ class Helper extends Base {
557
570
  */
558
571
  createVnodeMap(config) {
559
572
  let {vnode, parentNode=null, index=0, map=new Map()} = config,
560
- id = vnode?.id;
573
+ id;
561
574
 
562
- map.set(id, {id, index, parentNode, vnode});
575
+ if (vnode) {
576
+ id = vnode.id || vnode.componentId;
563
577
 
564
- vnode?.childNodes?.forEach((childNode, index) => {
565
- this.createVnodeMap({vnode: childNode, parentNode: vnode, index, map})
566
- });
578
+ map.set(id, {id, index, parentNode, vnode});
579
+
580
+ vnode.childNodes?.forEach((childNode, index) => {
581
+ this.createVnodeMap({vnode: childNode, parentNode: vnode, index, map})
582
+ });
583
+ }
567
584
 
568
585
  return map
569
586
  }
@@ -588,7 +605,7 @@ class Helper extends Base {
588
605
  if (currentNode) {
589
606
  movedNodes.set(id, vnodeMap.get(id))
590
607
  } else {
591
- vnode.childNodes.forEach(childNode => {
608
+ vnode.childNodes?.forEach(childNode => {
592
609
  if (childNode.vtype !== 'text') {
593
610
  this.findMovedNodes({movedNodes, oldVnodeMap, vnode: childNode, vnodeMap})
594
611
  }
@@ -677,9 +694,12 @@ class Helper extends Base {
677
694
  * @param {Neo.vdom.VNode} config.oldVnode
678
695
  * @param {Map} config.oldVnodeMap
679
696
  */
680
- removeNode(config) {
681
- let {deltas, oldVnode, oldVnodeMap} = config,
682
- delta = {action: 'removeNode', id: oldVnode.id},
697
+ removeNode({deltas, oldVnode, oldVnodeMap}) {
698
+ if (oldVnode.componentId && !oldVnode.id) {
699
+ oldVnode.id = oldVnode.componentId
700
+ }
701
+
702
+ let delta = {action: 'removeNode', id: oldVnode.id},
683
703
  {parentNode} = oldVnodeMap.get(oldVnode.id);
684
704
 
685
705
  if (oldVnode.vtype === 'text') {
@@ -4,7 +4,7 @@
4
4
  */
5
5
  class VNode {
6
6
  /**
7
- * @param config
7
+ * @param {Object} config
8
8
  */
9
9
  constructor(config) {
10
10
  /**