neo.mjs 7.16.0 → 8.0.0-alpha.2

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 (77) 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 +6 -6
  12. package/resources/data/deck/learnneo/pages/benefits/Speed.md +5 -4
  13. package/resources/scss/src/calendar/view/week/Component.scss +6 -0
  14. package/resources/scss/src/component/DateSelector.scss +1 -0
  15. package/src/DefaultConfig.mjs +2 -2
  16. package/src/button/Base.mjs +8 -8
  17. package/src/calendar/view/MainContainer.mjs +4 -1
  18. package/src/calendar/view/SettingsContainer.mjs +4 -0
  19. package/src/calendar/view/YearComponent.mjs +0 -3
  20. package/src/calendar/view/calendars/ColorsList.mjs +6 -6
  21. package/src/calendar/view/calendars/Container.mjs +1 -1
  22. package/src/calendar/view/calendars/List.mjs +14 -2
  23. package/src/calendar/view/month/Component.mjs +1 -1
  24. package/src/calendar/view/week/Component.mjs +7 -7
  25. package/src/calendar/view/week/EventDragZone.mjs +1 -1
  26. package/src/calendar/view/week/TimeAxisComponent.mjs +2 -2
  27. package/src/calendar/view/week/plugin/DragDrop.mjs +3 -3
  28. package/src/collection/Base.mjs +4 -3
  29. package/src/component/Base.mjs +125 -49
  30. package/src/component/Circle.mjs +1 -3
  31. package/src/component/DateSelector.mjs +1 -1
  32. package/src/container/Accordion.mjs +1 -1
  33. package/src/container/Base.mjs +19 -7
  34. package/src/core/Base.mjs +10 -9
  35. package/src/draggable/list/DragZone.mjs +1 -1
  36. package/src/draggable/toolbar/DragZone.mjs +1 -1
  37. package/src/draggable/toolbar/SortZone.mjs +1 -1
  38. package/src/draggable/tree/DragZone.mjs +1 -1
  39. package/src/form/Fieldset.mjs +2 -0
  40. package/src/form/field/Color.mjs +4 -4
  41. package/src/form/field/ComboBox.mjs +2 -2
  42. package/src/form/field/Date.mjs +2 -1
  43. package/src/form/field/Picker.mjs +2 -1
  44. package/src/form/field/Text.mjs +8 -8
  45. package/src/layout/Card.mjs +11 -6
  46. package/src/layout/Cube.mjs +15 -4
  47. package/src/list/Chip.mjs +3 -2
  48. package/src/list/Circle.mjs +2 -1
  49. package/src/list/Component.mjs +5 -0
  50. package/src/manager/Component.mjs +158 -4
  51. package/src/manager/DomEvent.mjs +2 -2
  52. package/src/menu/List.mjs +3 -4
  53. package/src/menu/Panel.mjs +1 -1
  54. package/src/selection/Model.mjs +1 -1
  55. package/src/selection/grid/BaseModel.mjs +61 -0
  56. package/src/selection/grid/CellColumnModel.mjs +2 -2
  57. package/src/selection/grid/CellColumnRowModel.mjs +2 -2
  58. package/src/selection/grid/CellModel.mjs +4 -4
  59. package/src/selection/grid/CellRowModel.mjs +9 -3
  60. package/src/selection/grid/ColumnModel.mjs +15 -26
  61. package/src/selection/grid/RowModel.mjs +15 -25
  62. package/src/selection/table/BaseModel.mjs +61 -0
  63. package/src/selection/table/CellColumnModel.mjs +2 -2
  64. package/src/selection/table/CellColumnRowModel.mjs +2 -2
  65. package/src/selection/table/CellModel.mjs +4 -4
  66. package/src/selection/table/CellRowModel.mjs +9 -3
  67. package/src/selection/table/ColumnModel.mjs +7 -8
  68. package/src/selection/table/RowModel.mjs +7 -7
  69. package/src/table/Container.mjs +1 -0
  70. package/src/table/View.mjs +102 -80
  71. package/src/table/header/Button.mjs +3 -5
  72. package/src/table/header/Toolbar.mjs +1 -0
  73. package/src/tree/List.mjs +1 -1
  74. package/src/util/VDom.mjs +42 -11
  75. package/src/util/VNode.mjs +33 -11
  76. package/src/vdom/Helper.mjs +55 -22
  77. package/src/vdom/VNode.mjs +1 -1
@@ -208,10 +208,10 @@ class Base extends CoreBase {
208
208
  isLoading_: false,
209
209
  /**
210
210
  * Internal flag which will get set to true while an update request (worker messages) is in progress
211
- * @member {Boolean} isVdomUpdating=false
211
+ * @member {Boolean} isVdomUpdating_=false
212
212
  * @protected
213
213
  */
214
- isVdomUpdating: false,
214
+ isVdomUpdating_: false,
215
215
  /**
216
216
  * Using the keys config will create an instance of Neo.util.KeyNavigation.
217
217
  * @see {@link Neo.util.KeyNavigation KeyNavigation}
@@ -359,6 +359,15 @@ class Base extends CoreBase {
359
359
  * @member {String|null} ui_=null
360
360
  */
361
361
  ui_: null,
362
+ /**
363
+ * Defines the depth of the vdom tree for the next update cycle.
364
+ * - The value 1 will only send the current vdom structure as it is
365
+ * - The value of 2 will include the vdom of direct children
366
+ * - The value of 3 will include the vdom of grandchildren
367
+ * - The value of -1 will include the full tree of any depth
368
+ * @member {Number} updateDepth_=1
369
+ */
370
+ updateDepth_: 1,
362
371
  /**
363
372
  * The component vnode tree. Available after the component got rendered.
364
373
  * @member {Object} vnode_=null
@@ -395,6 +404,11 @@ class Base extends CoreBase {
395
404
  * @member {String[]} childUpdateCache=[]
396
405
  */
397
406
  childUpdateCache = []
407
+ /**
408
+ * Stores the updateDepth while an update is running to enable checks for parent update collisions
409
+ * @member {Number|null} currentUpdateDepth=null
410
+ */
411
+ currentUpdateDepth = null
398
412
  /**
399
413
  * @member {Function[]} resolveUpdateCache=[]
400
414
  */
@@ -713,7 +727,7 @@ class Base extends CoreBase {
713
727
  this.changeVdomRootKey('id', value);
714
728
 
715
729
  oldValue && ComponentManager.unregister(oldValue);
716
- ComponentManager.register(this)
730
+ value && ComponentManager.register(this)
717
731
  }
718
732
 
719
733
  /**
@@ -758,6 +772,16 @@ class Base extends CoreBase {
758
772
  }
759
773
  }
760
774
 
775
+ /**
776
+ * Triggered after the isVdomUpdating config got changed
777
+ * @param {Number|null} value
778
+ * @param {Number|null} oldValue
779
+ * @protected
780
+ */
781
+ afterSetIsVdomUpdating(value, oldValue) {
782
+ this.currentUpdateDepth = value ? this.updateDepth : null
783
+ }
784
+
761
785
  /**
762
786
  * Triggered after the maxHeight config got changed
763
787
  * @param {Number|String|null} value
@@ -1346,6 +1370,21 @@ class Base extends CoreBase {
1346
1370
  return (Neo.isNumber(oldValue) && oldValue > 0) ? (oldValue - 1) : 0
1347
1371
  }
1348
1372
 
1373
+ /**
1374
+ * Triggered before the updateDepth config gets changed.
1375
+ * @param {Number} value
1376
+ * @param {Number} oldValue
1377
+ * @returns {Number}
1378
+ * @protected
1379
+ */
1380
+ beforeSetUpdateDepth(value, oldValue) {
1381
+ if (oldValue === undefined) {
1382
+ return value
1383
+ }
1384
+
1385
+ return oldValue === -1 || value === -1 ? -1 : Math.max(value, oldValue)
1386
+ }
1387
+
1349
1388
  /**
1350
1389
  * Changes the value of a vdom object attribute or removes it in case it has no value
1351
1390
  * @param {String} key
@@ -1393,6 +1432,22 @@ class Base extends CoreBase {
1393
1432
  }
1394
1433
  }
1395
1434
 
1435
+ /**
1436
+ * Convenience shortcut to create a component reference
1437
+ * @returns {Object}
1438
+ */
1439
+ createVdomReference() {
1440
+ let me = this,
1441
+ reference = {componentId: me.id},
1442
+ vdomId = me.vdom.id;
1443
+
1444
+ if (vdomId && me.id !== vdomId) {
1445
+ reference.id = vdomId
1446
+ }
1447
+
1448
+ return reference
1449
+ }
1450
+
1396
1451
  /**
1397
1452
  * Unregister this instance from the ComponentManager
1398
1453
  * @param {Boolean} updateParentVdom=false true to remove the component from the parent vdom => real dom
@@ -1473,7 +1528,7 @@ class Base extends CoreBase {
1473
1528
  */
1474
1529
  #executeVdomUpdate(vdom, vnode, resolve, reject) {
1475
1530
  let me = this,
1476
- opts = {vdom, vnode},
1531
+ opts = {},
1477
1532
  deltas;
1478
1533
 
1479
1534
  if (Neo.currentWorker.isSharedWorker) {
@@ -1488,6 +1543,12 @@ class Base extends CoreBase {
1488
1543
  me._needsVdomUpdate = false;
1489
1544
  me.afterSetNeedsVdomUpdate?.(false, true);
1490
1545
 
1546
+ opts.vdom = ComponentManager.getVdomTree(vdom, me.updateDepth);
1547
+ opts.vnode = ComponentManager.getVnodeTree(vnode, me.updateDepth);
1548
+
1549
+ // Reset the updateDepth to the default value for the next update cycle
1550
+ me._updateDepth = me.constructor.config.updateDepth;
1551
+
1491
1552
  Neo.vdom.Helper.update(opts).catch(err => {
1492
1553
  me.isVdomUpdating = false;
1493
1554
  console.log('Error attempting to update component dom', err, me);
@@ -1495,9 +1556,9 @@ class Base extends CoreBase {
1495
1556
  reject?.()
1496
1557
  }).then(data => {
1497
1558
  me.isVdomUpdating = false;
1559
+
1498
1560
  // checking if the component got destroyed before the update cycle is done
1499
1561
  if (me.id) {
1500
- // console.log('Component vnode updated', data);
1501
1562
  me.vnode = data.vnode;
1502
1563
 
1503
1564
  deltas = data.deltas;
@@ -1763,8 +1824,7 @@ class Base extends CoreBase {
1763
1824
  * @returns {Object}
1764
1825
  */
1765
1826
  getVdomChild(id, vdom=this.vdom) {
1766
- let node = VDomUtil.findVdomChild(vdom, id);
1767
- return node?.vdom
1827
+ return VDomUtil.find(vdom, id)?.vdom
1768
1828
  }
1769
1829
 
1770
1830
  /**
@@ -1785,6 +1845,16 @@ class Base extends CoreBase {
1785
1845
  return this.vnode
1786
1846
  }
1787
1847
 
1848
+ /**
1849
+ * Checks if a given updateDepth & distance would result in an update collision
1850
+ * @param {Number} updateDepth
1851
+ * @param {Number} distance
1852
+ * @returns {Boolean}
1853
+ */
1854
+ hasUpdateCollision(updateDepth, distance) {
1855
+ return updateDepth === -1 ? true : distance < updateDepth
1856
+ }
1857
+
1788
1858
  /**
1789
1859
  * Hide the component.
1790
1860
  * hideMode: 'removeDom' uses vdom removeDom.
@@ -1844,28 +1914,34 @@ class Base extends CoreBase {
1844
1914
  * Checks for vdom updates inside the parent chain and if found.
1845
1915
  * Registers the component for a vdom update once done.
1846
1916
  * @param {String} parentId=this.parentId
1847
- * @param {Function} [resolve] gets passed by updateVdom()
1917
+ * @param {Function} [resolve] Gets passed by updateVdom()
1918
+ * @param {Number} distance=1 Distance inside the component tree
1848
1919
  * @returns {Boolean}
1849
1920
  */
1850
- isParentVdomUpdating(parentId=this.parentId, resolve) {
1921
+ isParentVdomUpdating(parentId=this.parentId, resolve, distance=1) {
1851
1922
  if (parentId !== 'document.body') {
1852
1923
  let me = this,
1853
1924
  parent = Neo.getComponent(parentId);
1854
1925
 
1855
1926
  if (parent) {
1856
1927
  if (parent.isVdomUpdating) {
1857
- if (Neo.config.logVdomUpdateCollisions) {
1858
- console.warn('vdom parent update conflict with:', parent, 'for:', me)
1859
- }
1928
+ if (me.hasUpdateCollision(parent.currentUpdateDepth, distance)) {
1929
+ if (Neo.config.logVdomUpdateCollisions) {
1930
+ console.warn('vdom parent update conflict with:', parent, 'for:', me)
1931
+ }
1860
1932
 
1861
- NeoArray.add(parent.childUpdateCache, me.id);
1933
+ NeoArray.add(parent.childUpdateCache, me.id);
1862
1934
 
1863
- // Adding the resolve fn to its own cache, since the parent will trigger
1864
- // a new update() directly on this cmp
1865
- resolve && me.resolveUpdateCache.push(resolve)
1866
- return true
1935
+ // Adding the resolve fn to its own cache, since the parent will trigger
1936
+ // a new update() directly on this cmp
1937
+ resolve && me.resolveUpdateCache.push(resolve);
1938
+ return true
1939
+ }
1940
+
1941
+ // If an update is running and does not have a collision, we do not need to check further parents
1942
+ return false
1867
1943
  } else {
1868
- return me.isParentVdomUpdating(parent.parentId, resolve)
1944
+ return me.isParentVdomUpdating(parent.parentId, resolve, distance+1)
1869
1945
  }
1870
1946
  }
1871
1947
  }
@@ -2206,7 +2282,7 @@ class Base extends CoreBase {
2206
2282
  parentId : autoMount ? me.getMountedParentId() : undefined,
2207
2283
  parentIndex: autoMount ? me.getMountedParentIndex() : undefined,
2208
2284
  windowId : me.windowId,
2209
- ...me.vdom
2285
+ ...ComponentManager.getVdomTree(me.vdom)
2210
2286
  });
2211
2287
 
2212
2288
  me.onRender(data, useVdomWorker ? autoMount : false);
@@ -2296,7 +2372,7 @@ class Base extends CoreBase {
2296
2372
  * hideMode: 'visibility' uses css visibility.
2297
2373
  */
2298
2374
  show() {
2299
- const me = this;
2375
+ let me = this;
2300
2376
 
2301
2377
  if (me.hideMode !== 'visibility') {
2302
2378
  delete me.vdom.removeDom;
@@ -2323,7 +2399,7 @@ class Base extends CoreBase {
2323
2399
  * @param {Object} [vdom=this.vdom]
2324
2400
  * @param {Boolean} force=false
2325
2401
  */
2326
- syncVdomIds(vnode = this.vnode, vdom = this.vdom, force = false) {
2402
+ syncVdomIds(vnode=this.vnode, vdom=this.vdom, force=false) {
2327
2403
  VDomUtil.syncVdomIds(vnode, vdom, force)
2328
2404
  }
2329
2405
 
@@ -2335,8 +2411,10 @@ class Base extends CoreBase {
2335
2411
  * @param {Neo.vdom.VNode} [vnode=this.vnode]
2336
2412
  */
2337
2413
  syncVnodeTree(vnode=this.vnode) {
2338
- let me = this,
2339
- debug = false,
2414
+ let me = this,
2415
+ childComponents = ComponentManager.getChildren(me),
2416
+ debug = false,
2417
+ map = {},
2340
2418
  childVnode, start;
2341
2419
 
2342
2420
  if (debug) {
@@ -2345,12 +2423,30 @@ class Base extends CoreBase {
2345
2423
 
2346
2424
  me.syncVdomIds();
2347
2425
 
2426
+ if (vnode && me.id !== vnode.id) {
2427
+ ComponentManager.registerWrapperNode(vnode.id, me)
2428
+ }
2429
+
2430
+ // we need one separate iteration first to ensure all wrapper nodes get registered
2431
+ childComponents.forEach(component => {
2432
+ childVnode = VNodeUtil.findChildVnode(me.vnode, component.vdom.id)?.vnode;
2433
+
2434
+ if (childVnode) {
2435
+ map[component.id] = childVnode;
2436
+
2437
+ if (component.id !== childVnode.id) {
2438
+ ComponentManager.registerWrapperNode(childVnode.id, component)
2439
+ }
2440
+ }
2441
+ });
2442
+
2348
2443
  // delegate the latest node updates to all possible child components found inside the vnode tree
2349
- ComponentManager.getChildren(me).forEach(component => {
2350
- childVnode = VNodeUtil.findChildVnode(me.vnode, component.vdom.id);
2444
+ childComponents.forEach(component => {
2445
+ childVnode = map[component.id];
2351
2446
 
2352
2447
  if (childVnode) {
2353
- component._vnode = childVnode.vnode; // silent update
2448
+ // silent update
2449
+ component._vnode = ComponentManager.addVnodeComponentReferences(childVnode, component.id);
2354
2450
 
2355
2451
  if (!component.rendered) {
2356
2452
  component._rendered = true;
@@ -2363,28 +2459,8 @@ class Base extends CoreBase {
2363
2459
  }
2364
2460
  });
2365
2461
 
2366
- // console.log(me.vnode, me.mounted);
2367
-
2368
- // keep the vnode parent tree in sync
2369
- ComponentManager.getParents(me).forEach((component, index) => {
2370
- if (component.vnode) {
2371
- if (!me.vnode) {
2372
- if (index === 0 && !VNodeUtil.removeChildVnode(component.vnode, me.id)) {
2373
- // This can fail, in case the vnode is already removed (not an issue, better safe than sorry)
2374
- // console.warn('syncVnodeTree: Could not remove the parent vnode for', me.id, component);
2375
- }
2376
- }
2377
-
2378
- // check for dynamically rendered components which get inserted into the component tree
2379
- else if (index === 0 && me.vnode.outerHTML) {
2380
- // console.log('dyn item', me.vnode, me.parentIndex);
2381
- component.vnode.childNodes.splice(me.parentIndex || 0, 0, me.vnode)
2382
- } else if (!VNodeUtil.replaceChildVnode(component.vnode, me.vnode.id, me.vnode)) {
2383
- // todo: can happen for dynamically inserted container items
2384
- // console.warn('syncVnodeTree: Could not replace the parent vnode for', me.vnode.id, component);
2385
- }
2386
- }
2387
- });
2462
+ // silent update
2463
+ me._vnode = vnode ? ComponentManager.addVnodeComponentReferences(vnode, me.id) : null;
2388
2464
 
2389
2465
  debug && console.log('syncVnodeTree', me.id, performance.now() - start)
2390
2466
  }
@@ -2472,7 +2548,7 @@ class Base extends CoreBase {
2472
2548
  opts, vdom, vnode, vnodeStyle;
2473
2549
 
2474
2550
  if (delta) {
2475
- vdom = VDomUtil.findVdomChild(me.vdom, id);
2551
+ vdom = VDomUtil.find(me.vdom, id);
2476
2552
  vnode = me.vnode && VNodeUtil.findChildVnode(me.vnode, id);
2477
2553
 
2478
2554
  if (!me.hasUnmountedVdomChanges) {
@@ -545,9 +545,7 @@ class Circle extends Component {
545
545
  * @returns {Object}
546
546
  */
547
547
  getItemEl(itemId) {
548
- let item = VDomUtil.findVdomChild(this.getFrontEl(), itemId);
549
-
550
- return item?.vdom
548
+ return VDomUtil.find(this.getFrontEl(), itemId)?.vdom
551
549
  }
552
550
 
553
551
  /**
@@ -722,7 +722,7 @@ class DateSelector extends Component {
722
722
  */
723
723
  onCellClick(data) {
724
724
  let me = this,
725
- cellEl = VDomUtil.findVdomChild(me.vdom, data.path[0].id),
725
+ cellEl = VDomUtil.find(me.vdom, data.path[0].id),
726
726
  date = me.currentDate; // cloned
727
727
 
728
728
  date.setDate(parseInt(cellEl.vdom.cn[0].html));
@@ -48,7 +48,7 @@ class Accordion extends Panel {
48
48
  expandedItems_: [],
49
49
  /**
50
50
  * Creates a top header
51
- * @memeber {String|null} title=null
51
+ * @member {String|null} title=null
52
52
  */
53
53
  title_: null
54
54
  }
@@ -168,7 +168,7 @@ class Base extends Component {
168
168
  if (oldValue !== undefined) {
169
169
  super.afterSetMounted(value, oldValue);
170
170
 
171
- for (let i = 0, { items } = this, { length } = items; i < length; i++) {
171
+ for (let i = 0, {items} = this, {length} = items; i < length; i++) {
172
172
  if (!items[i].vdom.removeDom) {
173
173
  items[i].mounted = value
174
174
  }
@@ -377,7 +377,8 @@ class Base extends Component {
377
377
  let me = this,
378
378
  items = me._items,
379
379
  itemsRoot = me.getVdomItemsRoot(),
380
- {layout} = me;
380
+ {layout} = me,
381
+ vdom;
381
382
 
382
383
  itemsRoot.cn = [];
383
384
 
@@ -385,10 +386,13 @@ class Base extends Component {
385
386
  items[index] = item = me.createItem(item, index);
386
387
 
387
388
  if (item instanceof Neo.core.Base) {
388
- layout?.applyChildAttributes(item, index)
389
+ layout?.applyChildAttributes(item, index);
390
+ vdom = item.createVdomReference()
391
+ } else {
392
+ vdom = item.vdom
389
393
  }
390
394
 
391
- itemsRoot.cn.push(item.vdom)
395
+ itemsRoot.cn.push(vdom)
392
396
  });
393
397
 
394
398
  me.update()
@@ -527,12 +531,14 @@ class Base extends Component {
527
531
 
528
532
  me.items = items;
529
533
 
530
- me.getVdomItemsRoot().cn.splice(index, 0, item.vdom)
534
+ me.getVdomItemsRoot().cn.splice(index, 0, item.createVdomReference())
531
535
  }
532
536
 
533
537
  if (!silent) {
538
+ me.updateDepth = -1; // pass the full vdom tree to honor new nested component trees
539
+
534
540
  me.promiseUpdate().then(() => {
535
- me.fire('insert', { index, item })
541
+ me.fire('insert', {index, item})
536
542
  })
537
543
  }
538
544
 
@@ -631,7 +637,7 @@ class Base extends Component {
631
637
 
632
638
  for (; i < len; i++) {
633
639
  if (items[i].id === component.id) {
634
- this.removeAt(i, destroyItem, silent)
640
+ return this.removeAt(i, destroyItem, silent)
635
641
  }
636
642
  }
637
643
  }
@@ -682,6 +688,9 @@ class Base extends Component {
682
688
 
683
689
  me.getVdomItemsRoot().cn.splice(index, 1);
684
690
 
691
+ // the next update cycle needs to include direct children
692
+ me.updateDepth = 2;
693
+
685
694
  !silent && me.update();
686
695
 
687
696
  if (destroyItem) {
@@ -730,6 +739,9 @@ class Base extends Component {
730
739
  NeoArray.move(me.items, item2Index, item1Index);
731
740
  NeoArray.move(me.getVdomItemsRoot().cn, item2Index, item1Index);
732
741
 
742
+ // the next update cycle needs to include direct children
743
+ me.updateDepth = 2;
744
+
733
745
  me.update()
734
746
  }
735
747
  }
package/src/core/Base.mjs CHANGED
@@ -131,7 +131,7 @@ class Base {
131
131
  delete config.id;
132
132
 
133
133
  if (me.constructor.config) {
134
- delete me.constructor.config.id;
134
+ delete me.constructor.config.id
135
135
  }
136
136
 
137
137
  me.getStaticConfig('observable') && me.initObservable(config);
@@ -178,11 +178,13 @@ class Base {
178
178
  }
179
179
  }
180
180
 
181
- if (hasManager) {
182
- Neo.manager.Instance.register(me);
183
- } else {
184
- Neo.idMap = Neo.idMap || {};
185
- Neo.idMap[me.id] = me
181
+ if (value) {
182
+ if (hasManager) {
183
+ Neo.manager.Instance.register(me);
184
+ } else {
185
+ Neo.idMap = Neo.idMap || {};
186
+ Neo.idMap[me.id] = me
187
+ }
186
188
  }
187
189
  }
188
190
 
@@ -275,8 +277,7 @@ class Base {
275
277
  */
276
278
  callOverwritten(...args) {
277
279
  let stack = new Error().stack,
278
- regex = Base.methodNameRegex,
279
- methodName = stack.match(regex)[1];
280
+ methodName = stack.match(Base.methodNameRegex)[1];
280
281
 
281
282
  this.__proto__.constructor.overwrittenMethods[methodName].call(this, ...args)
282
283
  }
@@ -370,7 +371,7 @@ class Base {
370
371
 
371
372
  me.isConfiguring = true;
372
373
  Object.assign(me[configSymbol], me.mergeConfig(config, preventOriginalConfig));
373
- me.processConfigs()
374
+ me.processConfigs();
374
375
  me.isConfiguring = false;
375
376
  }
376
377
 
@@ -118,7 +118,7 @@ class DragZone extends BaseDragZone {
118
118
  let me = this;
119
119
 
120
120
  if (me.owner.draggable) {
121
- me.dragElement = VDomUtil.findVdomChild(me.owner.vdom, data.path[0].id).vdom;
121
+ me.dragElement = VDomUtil.find(me.owner.vdom, data.path[0].id).vdom;
122
122
  me.dragStart(data)
123
123
  }
124
124
  }
@@ -92,7 +92,7 @@ class DragZone extends BaseDragZone {
92
92
  let me = this;
93
93
 
94
94
  if (me.owner.draggable) {
95
- me.dragElement = VDomUtil.findVdomChild(me.owner.vdom, data.path[0].id).vdom;
95
+ me.dragElement = VDomUtil.find(me.owner.vdom, data.path[0].id).vdom;
96
96
  me.dragStart(data)
97
97
  }
98
98
  }
@@ -187,7 +187,7 @@ class SortZone extends DragZone {
187
187
 
188
188
  Object.assign(me, {
189
189
  currentIndex : index,
190
- dragElement : VDomUtil.findVdomChild(owner.vdom, button.id).vdom,
190
+ dragElement : VDomUtil.find(owner.vdom, button.id).vdom,
191
191
  dragProxyConfig : {...me.dragProxyConfig, cls : [...owner.cls]},
192
192
  indexMap : indexMap,
193
193
  ownerStyle : {height: ownerStyle.height, width : ownerStyle.width},
@@ -88,7 +88,7 @@ class DragZone extends BaseDragZone {
88
88
  me.dragElement = {
89
89
  tag: 'ul',
90
90
  cls: ['neo-list-container', 'neo-list'],
91
- cn : [VDomUtil.findVdomChild(me.owner.vdom, data.path[0].id).vdom]
91
+ cn : [VDomUtil.find(me.owner.vdom, data.path[0].id).vdom]
92
92
  };
93
93
 
94
94
  me.dragStart(data)
@@ -213,6 +213,8 @@ class Fieldset extends FormContainer {
213
213
  }
214
214
  } else {
215
215
  if (legend) {
216
+ me.updateDepth = 2;
217
+
216
218
  legend.setSilent({
217
219
  iconCls,
218
220
  text: title
@@ -51,7 +51,7 @@ class Color extends ComboBox {
51
51
  super.construct(config);
52
52
 
53
53
  let me = this,
54
- inputWrapper = VDomUtil.findVdomChild(me.vdom, {id: me.getInputWrapperId()});
54
+ inputWrapper = VDomUtil.find(me.vdom, me.getInputWrapperId());
55
55
 
56
56
  inputWrapper.vdom.cn.unshift({
57
57
  cls : 'neo-color',
@@ -61,7 +61,7 @@ class Color extends ComboBox {
61
61
  }
62
62
  });
63
63
 
64
- me.update();
64
+ me.update()
65
65
  }
66
66
 
67
67
  /**
@@ -73,12 +73,12 @@ class Color extends ComboBox {
73
73
  */
74
74
  afterSetValue(value, oldValue, preventFilter=false) {
75
75
  let me = this,
76
- colorIndicator = VDomUtil.findVdomChild(me.vdom, {id: me.getColorIndicatorId()})?.vdom,
76
+ colorIndicator = VDomUtil.find(me.vdom, me.getColorIndicatorId())?.vdom,
77
77
  {list, record} = me,
78
78
  selectionModel = me.list?.selectionModel;
79
79
 
80
80
  if (colorIndicator) {
81
- colorIndicator.style.backgroundColor = me.getColor();
81
+ colorIndicator.style.backgroundColor = me.getColor()
82
82
  }
83
83
 
84
84
  if (record) {
@@ -456,7 +456,7 @@ class ComboBox extends Picker {
456
456
  * @returns {Object}
457
457
  */
458
458
  getInputHintEl() {
459
- return VDomUtil.findVdomChild(this.vdom, this.getInputHintId())?.vdom
459
+ return VDomUtil.find(this.vdom, this.getInputHintId())?.vdom
460
460
  }
461
461
 
462
462
  /**
@@ -696,7 +696,7 @@ class ComboBox extends Picker {
696
696
  */
697
697
  updateTypeAhead(silent=false) {
698
698
  let me = this,
699
- inputEl = VDomUtil.findVdomChild(me.vdom, {flag: 'neo-real-input'});
699
+ inputEl = VDomUtil.find(me.vdom, {flag: 'neo-real-input'});
700
700
 
701
701
  if (me.typeAhead) {
702
702
  inputEl.parentNode.cn[inputEl.index] = {
@@ -98,7 +98,8 @@ class DateField extends Picker {
98
98
 
99
99
  let me = this;
100
100
 
101
- me.dateSelector = Neo.create(DateSelector, {
101
+ me.dateSelector = Neo.create({
102
+ module : DateSelector,
102
103
  dayNameFormat: 'short',
103
104
  maxValue : me.maxValue,
104
105
  minValue : me.minValue,
@@ -136,7 +136,8 @@ class Picker extends Text {
136
136
  {pickerWidth} = me,
137
137
  pickerComponent = me.createPickerComponent();
138
138
 
139
- me.picker = Neo.create(Container, {
139
+ me.picker = Neo.create({
140
+ module : Container,
140
141
  parentId : 'document.body',
141
142
  floating : true,
142
143
  align : {
@@ -410,7 +410,7 @@ class Text extends Base {
410
410
  */
411
411
  afterSetErrorPositionAbsolute(value, oldValue) {
412
412
  let me = this,
413
- cls = VDomUtil.findVdomChild(me.vdom, {cls: 'neo-textfield-error'}).vdom.cls;
413
+ cls = VDomUtil.find(me.vdom, {cls: 'neo-textfield-error'}).vdom.cls;
414
414
 
415
415
  NeoArray[value ? 'add' : 'remove'](cls, 'neo-absolute');
416
416
 
@@ -824,10 +824,10 @@ class Text extends Base {
824
824
  });
825
825
 
826
826
  postTriggers.sort((a, b) => b.weight - a.weight); // DESC
827
- preTriggers.sort((a, b) => a.weight - b.weight); // ASC
827
+ preTriggers.sort( (a, b) => a.weight - b.weight); // ASC
828
828
 
829
- postTriggers = postTriggers.map(a => a.vdom);
830
- preTriggers = preTriggers.map(a => a.vdom);
829
+ postTriggers = postTriggers.map(trigger => trigger.createVdomReference());
830
+ preTriggers = preTriggers.map( trigger => trigger.createVdomReference());
831
831
 
832
832
  if (inputEl.tag === 'input') {
833
833
  // wrap the input tag
@@ -1090,14 +1090,14 @@ class Text extends Base {
1090
1090
  * @returns {Object|null}
1091
1091
  */
1092
1092
  getCenterBorderEl() {
1093
- return VDomUtil.findVdomChild(this.vdom, {cls: 'neo-center-border'})?.vdom || null
1093
+ return VDomUtil.find(this.vdom, {cls: 'neo-center-border'})?.vdom || null
1094
1094
  }
1095
1095
 
1096
1096
  /**
1097
1097
  * @returns {Object|null}
1098
1098
  */
1099
1099
  getInputEl() {
1100
- return VDomUtil.findVdomChild(this.vdom, {flag: 'neo-real-input'})?.vdom || null
1100
+ return VDomUtil.find(this.vdom, {flag: 'neo-real-input'})?.vdom || null
1101
1101
  }
1102
1102
 
1103
1103
  /**
@@ -1137,7 +1137,7 @@ class Text extends Base {
1137
1137
  * @returns {Object|null}
1138
1138
  */
1139
1139
  getLabelEl() {
1140
- return VDomUtil.findVdomChild(this.vdom, {tag: 'label'})?.vdom || null
1140
+ return VDomUtil.find(this.vdom, {tag: 'label'})?.vdom || null
1141
1141
  }
1142
1142
 
1143
1143
  /**
@@ -1486,7 +1486,7 @@ class Text extends Base {
1486
1486
  NeoArray[value ? 'add' : 'remove'](cls, 'neo-invalid');
1487
1487
  me.cls = cls;
1488
1488
 
1489
- errorWrapper = VDomUtil.findVdomChild(me.vdom, {cls: 'neo-textfield-error-wrapper'}).vdom;
1489
+ errorWrapper = VDomUtil.find(me.vdom, {cls: 'neo-textfield-error-wrapper'}).vdom;
1490
1490
  errorNode = errorWrapper.cn[0];
1491
1491
 
1492
1492
  if (value) {