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
@@ -190,6 +190,7 @@ class Component extends BaseComponent {
190
190
  * @protected
191
191
  */
192
192
  totalColumns: null,
193
+ updateDepth: -1,
193
194
  /**
194
195
  * @member {Object} vdom
195
196
  */
@@ -224,17 +225,16 @@ class Component extends BaseComponent {
224
225
  {wheel : me.onWheel, scope: me}
225
226
  ]);
226
227
 
227
- me.timeAxis = Neo.create(TimeAxisComponent, {
228
+ me.timeAxis = Neo.create({
229
+ module : TimeAxisComponent,
228
230
  appName : me.appName,
229
231
  parentId : me.id,
230
- listeners: {
231
- change: me.onTimeAxisChange,
232
- scope : me
233
- },
232
+ listeners: {change: me.onTimeAxisChange, scope : me},
233
+ windowId : me.windowId,
234
234
  ...me.timeAxisConfig
235
235
  });
236
236
 
237
- me.getColumnTimeAxisContainer().cn[me.timeAxisPosition === 'start' ? 'unshift' : 'push'](me.timeAxis.vdom);
237
+ me.getColumnTimeAxisContainer().cn[me.timeAxisPosition === 'start' ? 'unshift' : 'push'](me.timeAxis.createVdomReference());
238
238
 
239
239
  if (me.calendarStore.getCount() > 0 && me.eventStore.getCount() > 0) {
240
240
  me.needsEventUpdate = true
@@ -686,7 +686,7 @@ class Component extends BaseComponent {
686
686
  let me = this,
687
687
  {editEventContainer} = me.owner,
688
688
  eventNode = path[0],
689
- eventVdom = VDomUtil.findVdomChild(me.vdom, eventNode.id).vdom,
689
+ eventVdom = VDomUtil.find(me.vdom, eventNode.id).vdom,
690
690
  record = me.eventStore.get(eventVdom.flag),
691
691
  {style} = editEventContainer;
692
692
 
@@ -219,7 +219,7 @@ class EventDragZone extends DragZone {
219
219
  endDate = me.newEndDate;
220
220
  startDate = me.newStartDate || record.startDate
221
221
  } else {
222
- startDate = new Date(VDomUtil.findVdomChild(owner.vdom, me.proxyParentId).vdom.flag + 'T00:00:00.000Z');
222
+ startDate = new Date(VDomUtil.find(owner.vdom, me.proxyParentId).vdom.flag + 'T00:00:00.000Z');
223
223
  startDate.setHours(me.axisStartTime);
224
224
  startDate.setMinutes(me.currentInterval * me.intervalSize);
225
225
 
@@ -187,8 +187,8 @@ class TimeAxisComponent extends Component {
187
187
  html = i === 24 ? '00:00' : (i < 10 ? '0' : '') + i + ':00';
188
188
 
189
189
  vdom.cn.push({
190
- cls : ['neo-c-w-timeaxis-item'],
191
- cn : [{html: html}]
190
+ cls: ['neo-c-w-timeaxis-item'],
191
+ cn : [{html}]
192
192
  })
193
193
  }
194
194
  }
@@ -188,7 +188,7 @@ class DragDrop extends Base {
188
188
  intervalHeight = columnRect.height / intervals,
189
189
  position = Math.min(columnRect.height, data.clientY - columnRect.top),
190
190
  currentInterval = Math.floor(position / intervalHeight),
191
- startDate = new Date(VDomUtil.findVdomChild(owner.vdom, data.path[0].id).vdom.flag + 'T00:00:00.000Z'),
191
+ startDate = new Date(VDomUtil.find(owner.vdom, data.path[0].id).vdom.flag + 'T00:00:00.000Z'),
192
192
  dragElement, endDate, eventDragZone, eventId, record;
193
193
 
194
194
  me.isDragging = true;
@@ -216,7 +216,7 @@ class DragDrop extends Base {
216
216
  // wait until the new event got mounted
217
217
  me.timeout(50).then(() => {
218
218
  eventId = owner.getEventId(record.id);
219
- dragElement = VDomUtil.findVdomChild(owner.vdom, eventId).vdom;
219
+ dragElement = VDomUtil.find(owner.vdom, eventId).vdom;
220
220
 
221
221
  eventDragZone = me.getEventDragZone({
222
222
  dragElement,
@@ -294,7 +294,7 @@ class DragDrop extends Base {
294
294
 
295
295
  me.isDragging = true;
296
296
 
297
- dragElement = VDomUtil.findVdomChild(owner.vdom, data.path[0].id).vdom;
297
+ dragElement = VDomUtil.find(owner.vdom, data.path[0].id).vdom;
298
298
 
299
299
  eventDragZone = me.getEventDragZone({
300
300
  dragElement,
@@ -734,7 +734,8 @@ class Base extends CoreBase {
734
734
  }
735
735
 
736
736
  /**
737
- * Returns items which match the property and value
737
+ * Returns items which match the property and value.
738
+ * Properties can contain dots for namespaces => find('vdom.id', 'neo-vnode-1')
738
739
  * @param {Object|String} property
739
740
  * @param {String|Number} [value] Only required in case the first param is a string
740
741
  * @param {Boolean} returnFirstMatch=false
@@ -758,7 +759,7 @@ class Base extends CoreBase {
758
759
  matchArray = [];
759
760
 
760
761
  propertiesArray.forEach(([key, value]) => {
761
- if (item[key] === value) {
762
+ if (Neo.ns(key, false, item) === value) {
762
763
  matchArray.push(true)
763
764
  }
764
765
  });
@@ -770,7 +771,7 @@ class Base extends CoreBase {
770
771
 
771
772
  items.push(item)
772
773
  }
773
- } else if (item[property] === value) {
774
+ } else if (Neo.ns(property, false, item) === value) {
774
775
  if (returnFirstMatch) {
775
776
  return item
776
777
  }
@@ -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
@@ -713,7 +722,7 @@ class Base extends CoreBase {
713
722
  this.changeVdomRootKey('id', value);
714
723
 
715
724
  oldValue && ComponentManager.unregister(oldValue);
716
- ComponentManager.register(this)
725
+ value && ComponentManager.register(this)
717
726
  }
718
727
 
719
728
  /**
@@ -1346,6 +1355,21 @@ class Base extends CoreBase {
1346
1355
  return (Neo.isNumber(oldValue) && oldValue > 0) ? (oldValue - 1) : 0
1347
1356
  }
1348
1357
 
1358
+ /**
1359
+ * Triggered before the updateDepth config gets changed.
1360
+ * @param {Number} value
1361
+ * @param {Number} oldValue
1362
+ * @returns {Number}
1363
+ * @protected
1364
+ */
1365
+ beforeSetUpdateDepth(value, oldValue) {
1366
+ if (oldValue === undefined) {
1367
+ return value
1368
+ }
1369
+
1370
+ return oldValue === -1 || value === -1 ? -1 : Math.max(value, oldValue)
1371
+ }
1372
+
1349
1373
  /**
1350
1374
  * Changes the value of a vdom object attribute or removes it in case it has no value
1351
1375
  * @param {String} key
@@ -1393,6 +1417,22 @@ class Base extends CoreBase {
1393
1417
  }
1394
1418
  }
1395
1419
 
1420
+ /**
1421
+ * Convenience shortcut to create a component reference
1422
+ * @returns {Object}
1423
+ */
1424
+ createVdomReference() {
1425
+ let me = this,
1426
+ reference = {componentId: me.id},
1427
+ vdomId = me.vdom.id;
1428
+
1429
+ if (vdomId && me.id !== vdomId) {
1430
+ reference.id = vdomId
1431
+ }
1432
+
1433
+ return reference
1434
+ }
1435
+
1396
1436
  /**
1397
1437
  * Unregister this instance from the ComponentManager
1398
1438
  * @param {Boolean} updateParentVdom=false true to remove the component from the parent vdom => real dom
@@ -1473,7 +1513,7 @@ class Base extends CoreBase {
1473
1513
  */
1474
1514
  #executeVdomUpdate(vdom, vnode, resolve, reject) {
1475
1515
  let me = this,
1476
- opts = {vdom, vnode},
1516
+ opts = {},
1477
1517
  deltas;
1478
1518
 
1479
1519
  if (Neo.currentWorker.isSharedWorker) {
@@ -1488,6 +1528,12 @@ class Base extends CoreBase {
1488
1528
  me._needsVdomUpdate = false;
1489
1529
  me.afterSetNeedsVdomUpdate?.(false, true);
1490
1530
 
1531
+ opts.vdom = ComponentManager.getVdomTree(vdom, me.updateDepth);
1532
+ opts.vnode = ComponentManager.getVnodeTree(vnode, me.updateDepth);
1533
+
1534
+ // Reset the updateDepth to the default value for the next update cycle
1535
+ me._updateDepth = me.constructor.config.updateDepth;
1536
+
1491
1537
  Neo.vdom.Helper.update(opts).catch(err => {
1492
1538
  me.isVdomUpdating = false;
1493
1539
  console.log('Error attempting to update component dom', err, me);
@@ -1495,9 +1541,9 @@ class Base extends CoreBase {
1495
1541
  reject?.()
1496
1542
  }).then(data => {
1497
1543
  me.isVdomUpdating = false;
1544
+
1498
1545
  // checking if the component got destroyed before the update cycle is done
1499
1546
  if (me.id) {
1500
- // console.log('Component vnode updated', data);
1501
1547
  me.vnode = data.vnode;
1502
1548
 
1503
1549
  deltas = data.deltas;
@@ -1763,8 +1809,7 @@ class Base extends CoreBase {
1763
1809
  * @returns {Object}
1764
1810
  */
1765
1811
  getVdomChild(id, vdom=this.vdom) {
1766
- let node = VDomUtil.findVdomChild(vdom, id);
1767
- return node?.vdom
1812
+ return VDomUtil.find(vdom, id)?.vdom
1768
1813
  }
1769
1814
 
1770
1815
  /**
@@ -2206,7 +2251,7 @@ class Base extends CoreBase {
2206
2251
  parentId : autoMount ? me.getMountedParentId() : undefined,
2207
2252
  parentIndex: autoMount ? me.getMountedParentIndex() : undefined,
2208
2253
  windowId : me.windowId,
2209
- ...me.vdom
2254
+ ...ComponentManager.getVdomTree(me.vdom)
2210
2255
  });
2211
2256
 
2212
2257
  me.onRender(data, useVdomWorker ? autoMount : false);
@@ -2296,7 +2341,7 @@ class Base extends CoreBase {
2296
2341
  * hideMode: 'visibility' uses css visibility.
2297
2342
  */
2298
2343
  show() {
2299
- const me = this;
2344
+ let me = this;
2300
2345
 
2301
2346
  if (me.hideMode !== 'visibility') {
2302
2347
  delete me.vdom.removeDom;
@@ -2323,7 +2368,7 @@ class Base extends CoreBase {
2323
2368
  * @param {Object} [vdom=this.vdom]
2324
2369
  * @param {Boolean} force=false
2325
2370
  */
2326
- syncVdomIds(vnode = this.vnode, vdom = this.vdom, force = false) {
2371
+ syncVdomIds(vnode=this.vnode, vdom=this.vdom, force=false) {
2327
2372
  VDomUtil.syncVdomIds(vnode, vdom, force)
2328
2373
  }
2329
2374
 
@@ -2335,8 +2380,10 @@ class Base extends CoreBase {
2335
2380
  * @param {Neo.vdom.VNode} [vnode=this.vnode]
2336
2381
  */
2337
2382
  syncVnodeTree(vnode=this.vnode) {
2338
- let me = this,
2339
- debug = false,
2383
+ let me = this,
2384
+ childComponents = ComponentManager.getChildren(me),
2385
+ debug = false,
2386
+ map = {},
2340
2387
  childVnode, start;
2341
2388
 
2342
2389
  if (debug) {
@@ -2345,12 +2392,30 @@ class Base extends CoreBase {
2345
2392
 
2346
2393
  me.syncVdomIds();
2347
2394
 
2395
+ if (vnode && me.id !== vnode.id) {
2396
+ ComponentManager.registerWrapperNode(vnode.id, me)
2397
+ }
2398
+
2399
+ // we need one separate iteration first to ensure all wrapper nodes get registered
2400
+ childComponents.forEach(component => {
2401
+ childVnode = VNodeUtil.findChildVnode(me.vnode, component.vdom.id)?.vnode;
2402
+
2403
+ if (childVnode) {
2404
+ map[component.id] = childVnode;
2405
+
2406
+ if (component.id !== childVnode.id) {
2407
+ ComponentManager.registerWrapperNode(childVnode.id, component)
2408
+ }
2409
+ }
2410
+ });
2411
+
2348
2412
  // 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);
2413
+ childComponents.forEach(component => {
2414
+ childVnode = map[component.id];
2351
2415
 
2352
2416
  if (childVnode) {
2353
- component._vnode = childVnode.vnode; // silent update
2417
+ // silent update
2418
+ component._vnode = ComponentManager.addVnodeComponentReferences(childVnode, component.id);
2354
2419
 
2355
2420
  if (!component.rendered) {
2356
2421
  component._rendered = true;
@@ -2363,28 +2428,8 @@ class Base extends CoreBase {
2363
2428
  }
2364
2429
  });
2365
2430
 
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
- });
2431
+ // silent update
2432
+ me._vnode = vnode ? ComponentManager.addVnodeComponentReferences(vnode, me.id) : null;
2388
2433
 
2389
2434
  debug && console.log('syncVnodeTree', me.id, performance.now() - start)
2390
2435
  }
@@ -2472,7 +2517,7 @@ class Base extends CoreBase {
2472
2517
  opts, vdom, vnode, vnodeStyle;
2473
2518
 
2474
2519
  if (delta) {
2475
- vdom = VDomUtil.findVdomChild(me.vdom, id);
2520
+ vdom = VDomUtil.find(me.vdom, id);
2476
2521
  vnode = me.vnode && VNodeUtil.findChildVnode(me.vnode, id);
2477
2522
 
2478
2523
  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));
@@ -358,6 +358,11 @@ class MonacoEditor extends Base {
358
358
  scrollBeyondLastLine: me.scrollBeyondLastLine,
359
359
  theme : me.editorTheme,
360
360
  value : me.stringifyValue(me.value),
361
+
362
+ scrollbar: {
363
+ alwaysConsumeMouseWheel: false // enables page scrolling when over-scrolling the content box
364
+ },
365
+
361
366
  ...me.options
362
367
  }
363
368
  }
@@ -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
  }
@@ -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 : {