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
package/src/util/VDom.mjs CHANGED
@@ -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.VDom
@@ -38,6 +39,7 @@ class VDom extends Base {
38
39
  * Search vdom child nodes by id or opts object for a given vdom tree
39
40
  * @param {Object} vdom
40
41
  * @param {Object|String} opts Either an object containing vdom node attributes or a string based id
42
+ * @param {Boolean} replaceComponentRefs=true
41
43
  * @param {Number} [index] Internal flag, do not use it
42
44
  * @param {Object} [parentNode] Internal flag, do not use it
43
45
  * @returns {Object}
@@ -45,10 +47,14 @@ class VDom extends Base {
45
47
  * {String} parentId
46
48
  * {Object} vdom
47
49
  */
48
- static findVdomChild(vdom, opts, index, parentNode) {
50
+ static find(vdom, opts, replaceComponentRefs=true, index, parentNode) {
49
51
  index = index || 0;
50
52
  opts = !Neo.isString(opts) ? opts : {id: opts};
51
53
 
54
+ if (replaceComponentRefs) {
55
+ vdom = VDom.getVdom(vdom)
56
+ }
57
+
52
58
  let child = null,
53
59
  matchArray = [],
54
60
  styleMatch = true,
@@ -72,7 +78,7 @@ class VDom extends Base {
72
78
  }
73
79
  } else if (Neo.isArray(value) && Neo.isArray(vdom[key])) {
74
80
  // todo: either search the vdom array for all keys or compare if the arrays are equal.
75
- throw new Error('findVdomChild: cls matching not supported for target & source types of Arrays')
81
+ throw new Error('find: cls matching not supported for target & source types of Arrays')
76
82
  }
77
83
  break
78
84
  case 'style':
@@ -91,7 +97,7 @@ class VDom extends Base {
91
97
  matchArray.push(true)
92
98
  }
93
99
  } else {
94
- throw new Error('findVdomChild: style matching not supported for mixed target & source types (Object VS String)')
100
+ throw new Error('find: style matching not supported for mixed target & source types (Object VS String)')
95
101
  }
96
102
  break
97
103
  default:
@@ -110,7 +116,7 @@ class VDom extends Base {
110
116
  if (vdom.cn) {
111
117
  for (; i < len; i++) {
112
118
  if (vdom.cn[i]) {
113
- subChild = VDom.findVdomChild(vdom.cn[i], opts, i, vdom);
119
+ subChild = VDom.find(vdom.cn[i], opts, replaceComponentRefs, i, vdom);
114
120
 
115
121
  if (subChild) {
116
122
  child = {
@@ -128,14 +134,13 @@ class VDom extends Base {
128
134
  }
129
135
 
130
136
  /**
131
- * Convenience shortcut for findVdomChild(vdom, {flag: flag});
137
+ * Convenience shortcut for find(vdom, {flag: flag});
132
138
  * @param {Object} vdom
133
139
  * @param {String} flag The flag reference specified on the target vdom child node
134
140
  * @returns {Object} vdom
135
141
  */
136
142
  static getByFlag(vdom, flag) {
137
- let node = VDom.findVdomChild(vdom, {flag});
138
- return node?.vdom
143
+ return VDom.find(vdom, {flag})?.vdom
139
144
  }
140
145
 
141
146
  /**
@@ -145,6 +150,8 @@ class VDom extends Base {
145
150
  * @returns {Array} childIds
146
151
  */
147
152
  static getChildIds(vdom, childIds=[]) {
153
+ vdom = VDom.getVdom(vdom);
154
+
148
155
  let childNodes = vdom?.cn || [];
149
156
 
150
157
  childNodes.forEach(childNode => {
@@ -164,6 +171,8 @@ class VDom extends Base {
164
171
  * @returns {Array}
165
172
  */
166
173
  static getColumnNodes(vdom, index) {
174
+ vdom = VDom.getVdom(vdom);
175
+
167
176
  let columnNodes = [];
168
177
 
169
178
  vdom.cn?.forEach(row => {
@@ -191,6 +200,8 @@ class VDom extends Base {
191
200
  * @returns {Array} an array of vdom nodes which match the flag
192
201
  */
193
202
  static getFlags(vdom, flag, matchArray) {
203
+ vdom = VDom.getVdom(vdom);
204
+
194
205
  if (!matchArray) {
195
206
  matchArray = [];
196
207
 
@@ -217,6 +228,8 @@ class VDom extends Base {
217
228
  * @returns {Array}
218
229
  */
219
230
  static getParentNodes(vdom, id, topLevel=true) {
231
+ vdom = VDom.getVdom(vdom);
232
+
220
233
  let parents = null,
221
234
  i = 0,
222
235
  len = vdom.cn?.length || 0;
@@ -241,6 +254,19 @@ class VDom extends Base {
241
254
  return parents
242
255
  }
243
256
 
257
+ /**
258
+ * Convenience shortcut using manager.Component to replace vdom references if needed
259
+ * @param {Object} vdom
260
+ * @returns {Object}
261
+ */
262
+ static getVdom(vdom) {
263
+ if (vdom.componentId) {
264
+ vdom = ComponentManager.get(vdom.componentId).vdom
265
+ }
266
+
267
+ return vdom
268
+ }
269
+
244
270
  /**
245
271
  * Insert a given nodeToInsert after a targetNode inside a given vdom tree
246
272
  * @param {Object} vdom The vdom tree containing the targetNode
@@ -276,7 +302,7 @@ class VDom extends Base {
276
302
  targetNodeId = targetNodeId.id
277
303
  }
278
304
 
279
- let targetNode = VDom.findVdomChild(vdom, {id: targetNodeId}),
305
+ let targetNode = VDom.find(vdom, targetNodeId),
280
306
  index;
281
307
 
282
308
  if (targetNode) {
@@ -295,7 +321,7 @@ class VDom extends Base {
295
321
  * @returns {Boolean} true in case the node was found & removed
296
322
  */
297
323
  static removeVdomChild(vdom, opts) {
298
- let child = VDom.findVdomChild(vdom, opts);
324
+ let child = VDom.find(vdom, opts);
299
325
 
300
326
  if (child) {
301
327
  child.parentNode.cn.splice(child.index, 1);
@@ -313,6 +339,8 @@ class VDom extends Base {
313
339
  * @returns {Boolean} true in case the node was found and replaced
314
340
  */
315
341
  static replaceVdomChild(vdom, id, newChildNode) {
342
+ vdom = VDom.getVdom(vdom);
343
+
316
344
  let cn = vdom.cn || [],
317
345
  i = 0,
318
346
  len = cn.length,
@@ -347,6 +375,8 @@ class VDom extends Base {
347
375
  */
348
376
  static syncVdomIds(vnode, vdom, force=false) {
349
377
  if (vnode && vdom) {
378
+ vdom = VDom.getVdom(vdom);
379
+
350
380
  let childNodes = vdom.cn,
351
381
  cn, i, len;
352
382
 
@@ -363,7 +393,8 @@ class VDom extends Base {
363
393
  }
364
394
 
365
395
  if (childNodes) {
366
- cn = childNodes.filter(item => item.removeDom !== true);
396
+ cn = childNodes.map(item => VDom.getVdom(item));
397
+ cn = cn.filter(item => item.removeDom !== true);
367
398
  i = 0;
368
399
  len = cn?.length || 0;
369
400
 
@@ -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
  /**