neo.mjs 4.2.7 → 4.3.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 (86) hide show
  1. package/apps/realworld/view/HomeComponent.mjs +3 -6
  2. package/apps/realworld/view/article/CommentComponent.mjs +3 -6
  3. package/apps/realworld/view/article/Component.mjs +4 -7
  4. package/apps/realworld/view/article/CreateCommentComponent.mjs +3 -6
  5. package/apps/realworld/view/article/CreateComponent.mjs +3 -6
  6. package/apps/realworld/view/article/PreviewComponent.mjs +2 -5
  7. package/apps/realworld/view/article/TagListComponent.mjs +2 -5
  8. package/apps/realworld/view/user/ProfileComponent.mjs +3 -6
  9. package/apps/realworld/view/user/SettingsComponent.mjs +3 -6
  10. package/apps/realworld/view/user/SignUpComponent.mjs +2 -5
  11. package/apps/realworld2/view/article/PreviewComponent.mjs +2 -5
  12. package/apps/realworld2/view/article/TagListComponent.mjs +2 -5
  13. package/apps/website/view/MainContainer.mjs +1 -0
  14. package/apps/website/view/MainContainerController.mjs +7 -0
  15. package/apps/website/view/blog/List.mjs +41 -3
  16. package/apps/website/view/examples/List.mjs +28 -3
  17. package/apps/website/view/examples/TabContainer.mjs +7 -4
  18. package/buildScripts/addConfig.mjs +1 -0
  19. package/examples/ConfigurationViewport.mjs +1 -1
  20. package/examples/button/base/MainContainer.mjs +75 -12
  21. package/examples/tab/container/MainContainer.mjs +3 -3
  22. package/examples/todoList/version1/MainComponent.mjs +3 -6
  23. package/package.json +1 -1
  24. package/resources/scss/src/apps/website/blog/List.scss +2 -2
  25. package/resources/scss/src/apps/website/examples/List.scss +2 -2
  26. package/resources/scss/src/button/Base.scss +41 -3
  27. package/resources/scss/src/calendar/view/calendars/ColorsList.scss +5 -2
  28. package/resources/scss/src/layout/Card.scss +6 -10
  29. package/resources/scss/src/list/Base.scss +11 -3
  30. package/resources/scss/src/tab/Container.scss +3 -4
  31. package/resources/scss/src/tab/header/Button.scss +6 -1
  32. package/resources/scss/src/table/Container.scss +3 -1
  33. package/resources/scss/src/table/header/Button.scss +21 -1
  34. package/resources/scss/src/tree/List.scss +11 -1
  35. package/resources/scss/theme-dark/button/Base.scss +7 -1
  36. package/resources/scss/theme-dark/table/header/Button.scss +11 -9
  37. package/resources/scss/theme-light/button/Base.scss +7 -1
  38. package/resources/scss/theme-light/table/header/Button.scss +11 -9
  39. package/src/button/Base.mjs +151 -43
  40. package/src/calendar/view/YearComponent.mjs +3 -6
  41. package/src/calendar/view/calendars/ColorsList.mjs +18 -0
  42. package/src/calendar/view/calendars/EditContainer.mjs +7 -9
  43. package/src/calendar/view/month/Component.mjs +3 -6
  44. package/src/calendar/view/week/Component.mjs +3 -6
  45. package/src/calendar/view/week/plugin/DragDrop.mjs +6 -9
  46. package/src/component/Base.mjs +123 -58
  47. package/src/component/Carousel.mjs +5 -17
  48. package/src/component/Chip.mjs +2 -7
  49. package/src/component/Circle.mjs +4 -7
  50. package/src/component/DateSelector.mjs +5 -8
  51. package/src/component/Gallery.mjs +4 -7
  52. package/src/component/Helix.mjs +2 -5
  53. package/src/component/Splitter.mjs +3 -6
  54. package/src/component/mwc/Button.mjs +4 -7
  55. package/src/component/mwc/TextField.mjs +2 -5
  56. package/src/draggable/DropZone.mjs +3 -7
  57. package/src/draggable/list/DragZone.mjs +6 -9
  58. package/src/draggable/toolbar/DragZone.mjs +5 -8
  59. package/src/form/Fieldset.mjs +3 -6
  60. package/src/form/field/CheckBox.mjs +2 -5
  61. package/src/form/field/Range.mjs +3 -6
  62. package/src/form/field/Text.mjs +2 -5
  63. package/src/form/field/trigger/Base.mjs +4 -12
  64. package/src/grid/header/Button.mjs +3 -6
  65. package/src/layout/Base.mjs +5 -7
  66. package/src/layout/Card.mjs +32 -35
  67. package/src/layout/Fit.mjs +11 -11
  68. package/src/layout/Flexbox.mjs +28 -36
  69. package/src/layout/HBox.mjs +1 -1
  70. package/src/layout/VBox.mjs +1 -1
  71. package/src/list/Base.mjs +31 -11
  72. package/src/plugin/Resizable.mjs +3 -6
  73. package/src/selection/grid/CellModel.mjs +3 -6
  74. package/src/selection/grid/ColumnModel.mjs +3 -6
  75. package/src/selection/grid/RowModel.mjs +3 -6
  76. package/src/selection/table/CellModel.mjs +3 -6
  77. package/src/selection/table/ColumnModel.mjs +3 -6
  78. package/src/selection/table/RowModel.mjs +3 -6
  79. package/src/sitemap/Component.mjs +3 -6
  80. package/src/tab/Container.mjs +1 -1
  81. package/src/tab/header/Button.mjs +13 -2
  82. package/src/table/Container.mjs +11 -3
  83. package/src/table/header/Button.mjs +9 -5
  84. package/src/tooltip/Base.mjs +5 -15
  85. package/src/tree/List.mjs +4 -0
  86. package/src/util/KeyNavigation.mjs +8 -13
@@ -75,6 +75,11 @@ class Base extends CoreBase {
75
75
  * @member {Object|null} bind=null
76
76
  */
77
77
  bind: null,
78
+ /**
79
+ * CSS selectors to apply to the root level node of this component
80
+ * @member {String[]} cls_=null
81
+ */
82
+ cls_: null,
78
83
  /**
79
84
  * manager.Focus will change this flag on focusin & out dom events
80
85
  * @member {Boolean} containsFocus_=false
@@ -271,6 +276,10 @@ class Base extends CoreBase {
271
276
  * @member {Number|String|null} width_=null
272
277
  */
273
278
  width_: null,
279
+ /**
280
+ * @member {String[]|null} wrapperCls_=null
281
+ */
282
+ wrapperCls_: null,
274
283
  /**
275
284
  * Top level style attributes. Useful in case getVdomRoot() does not point to the top level DOM node.
276
285
  * @member {Object|null} wrapperStyle_=null
@@ -283,44 +292,6 @@ class Base extends CoreBase {
283
292
  _vdom: {}
284
293
  }}
285
294
 
286
- /**
287
- * CSS selectors to apply to the top level node of this component
288
- * @member {String[]} cls=[]
289
- */
290
- get cls() {
291
- return this._cls ? Neo.clone(this._cls) : [];
292
- }
293
- set cls(value) {
294
- value = value ? value : [];
295
-
296
- let me = this,
297
- vdom = me.vdom,
298
- vdomRoot = me.getVdomRoot(),
299
- oldCls;
300
-
301
- if (typeof value === 'string') {
302
- value = value.split('');
303
- }
304
-
305
- if (me.mounted) {
306
- oldCls = Neo.clone(me._cls);
307
- }
308
-
309
- me._cls = value;
310
-
311
- if (vdomRoot) {
312
- vdomRoot.cls = [...value];
313
- }
314
-
315
- me._vdom = vdom; // silent update
316
-
317
- if (me.silentVdomUpdate) {
318
- me.needsVdomUpdate = true;
319
- } else if (me.mounted) {
320
- me.updateCls(value, oldCls);
321
- }
322
- }
323
-
324
295
  /**
325
296
  * Apply component based listeners
326
297
  * @member {Object} listeners={}
@@ -375,16 +346,11 @@ class Base extends CoreBase {
375
346
  return this._vdom;
376
347
  }
377
348
  set vdom(value) {
378
- let me = this,
379
- app = Neo.apps[me.appName],
380
- vdom = value,
381
- vdomRoot = me.getVdomRoot(),
349
+ let me = this,
350
+ app = Neo.apps[me.appName],
351
+ vdom = value,
382
352
  listenerId;
383
353
 
384
- if (vdomRoot && me.cls) {
385
- vdomRoot.cls = me.cls;
386
- }
387
-
388
354
  // It is important to keep the vdom tree stable to ensure that containers do not lose the references to their
389
355
  // child vdom trees. The if case should not happen, but in case it does, keeping the reference and merging
390
356
  // the content over seems to be the best strategy
@@ -432,6 +398,22 @@ class Base extends CoreBase {
432
398
  this.cls = cls;
433
399
  }
434
400
 
401
+ /**
402
+ * Convenience shortcut to add additional dom listeners
403
+ * @param {Object|Object[]} value
404
+ */
405
+ addDomListeners(value) {
406
+ if (!Array.isArray(value)) {
407
+ value = [value];
408
+ }
409
+
410
+ let domListeners = this.domListeners;
411
+
412
+ domListeners.push(...value);
413
+
414
+ this.domListeners = domListeners;
415
+ }
416
+
435
417
  /**
436
418
  * Either a string like 'color: red; background-color: blue;'
437
419
  * or an object containing style attributes
@@ -458,6 +440,38 @@ class Base extends CoreBase {
458
440
  value && Neo.currentWorker.insertThemeFiles(value, this.__proto__);
459
441
  }
460
442
 
443
+ /**
444
+ * Triggered after the cls config got changed
445
+ * @param {String[]|null} value
446
+ * @param {String[]|null} oldValue
447
+ * @protected
448
+ */
449
+ afterSetCls(value, oldValue) {
450
+ oldValue = oldValue ? oldValue : [];
451
+ value = value ? value : [];
452
+
453
+ let me = this,
454
+ vdom = me.vdom,
455
+ vdomRoot = me.getVdomRoot(),
456
+ cls;
457
+
458
+ if (vdom !== vdomRoot) {
459
+ // we are using a wrapper node
460
+ vdomRoot.cls = [...value];
461
+ } else {
462
+ // we need to merge changes
463
+ cls = [...me.wrapperCls, ...value];
464
+ NeoArray.remove(cls, NeoArray.difference(oldValue, value));
465
+ vdom.cls = cls;
466
+ }
467
+
468
+ if (me.isVdomUpdating || me.silentVdomUpdate) {
469
+ me.needsVdomUpdate = true;
470
+ } else if (me.mounted) {
471
+ me.updateCls(value, oldValue, vdomRoot.id);
472
+ }
473
+ }
474
+
461
475
  /**
462
476
  * Triggered after any config got changed
463
477
  * @param {String} key
@@ -693,6 +707,39 @@ class Base extends CoreBase {
693
707
  this.changeVdomRootKey('width', value);
694
708
  }
695
709
 
710
+ /**
711
+ * Triggered after the wrapperCls config got changed
712
+ * @param {String[]|null} value
713
+ * @param {String[]|null} oldValue
714
+ * @protected
715
+ */
716
+ afterSetWrapperCls(value, oldValue) {
717
+ let me = this,
718
+ vdom = me.vdom,
719
+ vdomRoot = me.getVdomRoot(),
720
+ cls = me.vdom?.cls || [];
721
+
722
+ if (vdom === vdomRoot) {
723
+ // we are not using a wrapper => cls & wrapperCls share the same node
724
+ me.afterSetCls(me._cls, me._cls);
725
+ } else {
726
+ value = value ? value : [];
727
+
728
+ oldValue && NeoArray.remove(cls, oldValue);
729
+ NeoArray.add(cls, value);
730
+
731
+ if (vdom) {
732
+ vdom.cls = cls;
733
+ }
734
+
735
+ if (me.isVdomUpdating || me.silentVdomUpdate) {
736
+ me.needsVdomUpdate = true;
737
+ } else if (me.mounted) {
738
+ me.updateCls(value, oldValue);
739
+ }
740
+ }
741
+ }
742
+
696
743
  /**
697
744
  * Triggered after the wrapperStyle config got changed
698
745
  * @param {Object} value
@@ -713,6 +760,15 @@ class Base extends CoreBase {
713
760
  }
714
761
  }
715
762
 
763
+ /**
764
+ * Triggered when accessing the cls config
765
+ * @param {String[]|null} value
766
+ * @protected
767
+ */
768
+ beforeGetCls(value) {
769
+ return value ? [...value]: [];
770
+ }
771
+
716
772
  /**
717
773
  * Triggered when accessing the data config
718
774
  * Convenience shortcut which is expensive to use,
@@ -724,6 +780,15 @@ class Base extends CoreBase {
724
780
  return this.getModel().getHierarchyData();
725
781
  }
726
782
 
783
+ /**
784
+ * Triggered when accessing the wrapperCls config
785
+ * @param {String[]|null} value
786
+ * @protected
787
+ */
788
+ beforeGetWrapperCls(value) {
789
+ return value ? [...value]: [];
790
+ }
791
+
727
792
  /**
728
793
  * Triggered when accessing the wrapperStyle config
729
794
  * @param {Object} value
@@ -1182,13 +1247,11 @@ class Base extends CoreBase {
1182
1247
  // avoid any interference on prototype level
1183
1248
  // does not clone existing Neo instances
1184
1249
  me._vdom = Neo.clone(vdom, true, true);
1185
- me.cls = config.cls;
1186
1250
 
1187
1251
  me[Neo.isEmpty(config.style) ? '_style' : 'style'] = config.style;
1188
1252
 
1189
1253
  me.wrapperStyle = Neo.clone(config.wrapperStyle, false);
1190
1254
 
1191
- delete config.cls;
1192
1255
  delete config.style;
1193
1256
  delete config._vdom;
1194
1257
  delete config.vdom;
@@ -1632,28 +1695,30 @@ class Base extends CoreBase {
1632
1695
 
1633
1696
  /**
1634
1697
  * Delta updates for the cls config. Gets called after the cls config gets changed in case the component is mounted.
1635
- * @param {Array} cls
1636
- * @param {Array} oldCls
1698
+ * @param {String[]} cls
1699
+ * @param {String[]} oldCls
1700
+ * @param {String} id=this.id
1637
1701
  * @protected
1638
1702
  */
1639
- updateCls(cls, oldCls) {
1640
- let me = this,
1641
- vnode = me.vnode,
1703
+ updateCls(cls, oldCls, id=this.id) {
1704
+ let me = this,
1705
+ vnode = me.vnode,
1706
+ vnodeTarget = VNodeUtil.findChildVnode(me.vnode, {id})?.vnode,
1642
1707
  opts;
1643
1708
 
1644
1709
  if (!Neo.isEqual(cls, oldCls)) {
1645
- if (vnode) {
1646
- vnode.className = cls; // keep the vnode in sync
1710
+ if (vnodeTarget) {
1711
+ vnodeTarget.className = cls; // keep the vnode in sync
1647
1712
  me.vnode = vnode;
1648
1713
  }
1649
1714
 
1650
1715
  opts = {
1651
1716
  action: 'updateDom',
1652
1717
  deltas: [{
1653
- id : me.id,
1718
+ id,
1654
1719
  cls: {
1655
- add : Neo.util.Array.difference(cls, oldCls),
1656
- remove: Neo.util.Array.difference(oldCls, cls)
1720
+ add : NeoArray.difference(cls, oldCls),
1721
+ remove: NeoArray.difference(oldCls, cls)
1657
1722
  }
1658
1723
  }]
1659
1724
  };
@@ -99,24 +99,12 @@ class Carousel extends Component {
99
99
  construct(config) {
100
100
  super.construct(config);
101
101
 
102
- let me = this,
103
- domListeners = me.domListeners;
104
-
105
- domListeners.push({
106
- click: {
107
- fn : me.onCarouselBtnClick,
108
- delegate: '.neo-carousel-btn',
109
- scope : me
110
- }
111
- }, {
112
- click: {
113
- fn : me.onClick,
114
- delegate: '.neo-carousel-item',
115
- scope : me
116
- }
117
- });
102
+ let me = this;
118
103
 
119
- me.domListeners = domListeners;
104
+ me.addDomListeners([
105
+ {click: me.onCarouselBtnClick, delegate: '.neo-carousel-btn', scope: me},
106
+ {click: me.onClick, delegate: '.neo-carousel-item', scope: me}
107
+ ]);
120
108
  }
121
109
 
122
110
  /**
@@ -63,19 +63,14 @@ class Chip extends Component {
63
63
  construct(config) {
64
64
  super.construct(config);
65
65
 
66
- let me = this,
67
- domListeners;
66
+ let me = this;
68
67
 
69
68
  if (me.useDomListeners) {
70
- domListeners = me.domListeners;
71
-
72
- domListeners.push({
69
+ me.addDomListeners({
73
70
  click : me.onCloseButtonClick,
74
71
  delegate: 'neo-chip-close-button',
75
72
  scope : me
76
73
  });
77
-
78
- me.domListeners = domListeners;
79
74
  }
80
75
  }
81
76
 
@@ -132,9 +132,8 @@ class Circle extends Component {
132
132
  cls : ['neo-circle', 'neo-circle-back']
133
133
  });
134
134
 
135
- let me = this,
136
- domListeners = me.domListeners,
137
- vdom = me.vdom;
135
+ let me = this,
136
+ vdom = me.vdom;
138
137
 
139
138
  if (!me.backsideIconPath) {
140
139
  me.backsideIconPath = Neo.config.resourcesPath + 'images/circle/';
@@ -144,7 +143,7 @@ class Circle extends Component {
144
143
  me.itemImagePath = Neo.config.resourcesPath + 'examples/';
145
144
  }
146
145
 
147
- domListeners.push({
146
+ me.addDomListeners([{
148
147
  mouseenter: me.expand,
149
148
  mouseleave: me.collapse,
150
149
  scope : me
@@ -166,9 +165,7 @@ class Circle extends Component {
166
165
  wheel : me.onMouseWheel,
167
166
  delegate : 'neo-circle',
168
167
  scope : me
169
- });
170
-
171
- me.domListeners = domListeners;
168
+ }]);
172
169
 
173
170
  me.store = Neo.create(Collection, {
174
171
  keyProperty: 'id'
@@ -143,15 +143,12 @@ class DateSelector extends Component {
143
143
  construct(config) {
144
144
  super.construct(config);
145
145
 
146
- let me = this,
147
- domListeners = me.domListeners;
148
-
149
- domListeners.push({
150
- click: {fn: me.onComponentClick, scope: me},
151
- wheel: {fn: me.onComponentWheel, scope: me}
152
- });
146
+ let me = this;
153
147
 
154
- me.domListeners = domListeners;
148
+ me.addDomListeners([
149
+ {click: me.onComponentClick, scope: me},
150
+ {wheel: me.onComponentWheel, scope: me}
151
+ ]);
155
152
 
156
153
  me.updateHeaderMonth(0, 0, true);
157
154
  me.updateHeaderYear(0, true);
@@ -176,18 +176,15 @@ class Gallery extends Component {
176
176
  construct(config) {
177
177
  super.construct(config);
178
178
 
179
- let me = this,
180
- domListeners = Neo.clone(me.domListeners, true);
179
+ let me = this;
181
180
 
182
181
  me[itemsMounted] = false;
183
182
 
184
- domListeners.push({
183
+ me.addDomListeners({
185
184
  click: me.onClick,
186
185
  wheel: me.onMouseWheel,
187
186
  scope: me
188
187
  });
189
-
190
- me.domListeners = domListeners;
191
188
  }
192
189
 
193
190
  /**
@@ -579,8 +576,8 @@ class Gallery extends Component {
579
576
  let me = this;
580
577
 
581
578
  if (me.mouseWheelEnabled) {
582
- me._translateX = me.translateX - (me.deltaX * me.mouseWheelDeltaX); // silent update
583
- me._translateZ = me.translateZ + (me.deltaY * me.mouseWheelDeltaY); // silent update
579
+ me._translateX = me.translateX - (data.deltaX * me.mouseWheelDeltaX); // silent update
580
+ me._translateZ = me.translateZ + (data.deltaY * me.mouseWheelDeltaY); // silent update
584
581
 
585
582
  me.moveOrigin();
586
583
 
@@ -252,8 +252,7 @@ class Helix extends Component {
252
252
  construct(config) {
253
253
  super.construct(config);
254
254
 
255
- let me = this,
256
- domListeners = Neo.clone(me.domListeners, true);
255
+ let me = this;
257
256
 
258
257
  me[itemsMounted] = false;
259
258
  me[lockWheel] = false;
@@ -262,13 +261,11 @@ class Helix extends Component {
262
261
  me.imageSource = Neo.config.resourcesPath + 'examples/';
263
262
  }
264
263
 
265
- domListeners.push({
264
+ me.addDomListeners({
266
265
  click: me.onClick,
267
266
  wheel: me.onMouseWheel,
268
267
  scope: me
269
268
  });
270
-
271
- me.domListeners = domListeners;
272
269
  }
273
270
 
274
271
  /**
@@ -74,15 +74,12 @@ class Splitter extends Component {
74
74
  construct(config) {
75
75
  super.construct(config);
76
76
 
77
- let me = this,
78
- domListeners = me.domListeners;
77
+ let me = this;
79
78
 
80
- domListeners.push(
79
+ me.addDomListeners([
81
80
  {'drag:end' : me.onDragEnd, scope: me},
82
81
  {'drag:start': me.onDragStart, scope: me}
83
- );
84
-
85
- me.domListeners = domListeners;
82
+ ]);
86
83
  }
87
84
 
88
85
  /**
@@ -99,13 +99,10 @@ class Button extends Component {
99
99
  * @protected
100
100
  */
101
101
  afterSetHandler(value, oldValue) {
102
- if (value) {
103
- let me = this,
104
- domListeners = me.domListeners;
105
-
106
- domListeners.push({click: value, scope: me});
107
- me.domListeners = domListeners;
108
- }
102
+ value && this.addDomListeners({
103
+ click: value,
104
+ scope: this
105
+ });
109
106
  }
110
107
 
111
108
  /**
@@ -77,14 +77,11 @@ class TextField extends Component {
77
77
  Neo.main.addon.Mwc.loadTextFieldModule();
78
78
  }
79
79
 
80
- let me = this,
81
- domListeners = me.domListeners;
80
+ let me = this;
82
81
 
83
- domListeners.push(
82
+ me.addDomListeners(
84
83
  {input: me.onInputValueChange, scope: me}
85
84
  );
86
-
87
- me.domListeners = domListeners;
88
85
  }
89
86
 
90
87
  /**
@@ -28,17 +28,13 @@ class DropZone extends Base {
28
28
  construct(config) {
29
29
  super.construct(config);
30
30
 
31
- let me = this,
32
- owner = me.owner,
33
- domListeners = owner.domListeners;
31
+ let me = this;
34
32
 
35
- domListeners.push(
33
+ me.owner.addDomListeners([
36
34
  {'drop' : me.onDrop, scope: me},
37
35
  {'drop:enter': me.onDropEnter, scope: me},
38
36
  {'drop:leave': me.onDropLeave, scope: me}
39
- );
40
-
41
- owner.domListeners = domListeners;
37
+ ]);
42
38
  }
43
39
 
44
40
  /**
@@ -32,18 +32,15 @@ class DragZone extends BaseDragZone {
32
32
  construct(config) {
33
33
  super.construct(config);
34
34
 
35
- let me = this,
36
- owner = me.owner,
37
- domListeners = owner.domListeners,
38
- opts = {delegate: '.neo-draggable', scope: me},
39
- store = owner.store;
35
+ let me = this,
36
+ owner = me.owner,
37
+ opts = {delegate: '.neo-draggable', scope: me},
38
+ store = owner.store;
40
39
 
41
- domListeners.push(
40
+ owner.addDomListeners([
42
41
  {'drag:end' : me.onDragEnd, ...opts},
43
42
  {'drag:start': me.onDragStart, ...opts}
44
- );
45
-
46
- owner.domListeners = domListeners;
43
+ ]);
47
44
 
48
45
  store.on({
49
46
  load : me.onStoreLoad,
@@ -26,18 +26,15 @@ class DragZone extends BaseDragZone {
26
26
  construct(config) {
27
27
  super.construct(config);
28
28
 
29
- let me = this,
30
- owner = me.owner,
31
- domListeners = owner.domListeners,
32
- opts = {delegate: '.neo-draggable', scope: me};
29
+ let me = this,
30
+ owner = me.owner,
31
+ opts = {delegate: '.neo-draggable', scope: me};
33
32
 
34
- domListeners.push(
33
+ owner.addDomListeners([
35
34
  {'drag:end' : me.onDragEnd, ...opts},
36
35
  {'drag:move' : me.onDragMove, ...opts},
37
36
  {'drag:start': me.onDragStart, ...opts}
38
- );
39
-
40
- owner.domListeners = domListeners;
37
+ ]);
41
38
 
42
39
  owner.on('insert', me.onItemInsert, me);
43
40
 
@@ -126,9 +126,8 @@ class Fieldset extends Container {
126
126
  * @protected
127
127
  */
128
128
  afterSetCollapsible(value, oldValue) {
129
- let me = this,
130
- cls = me.cls,
131
- domListeners = me.domListeners || [];
129
+ let me = this,
130
+ cls = me.cls;
132
131
 
133
132
  NeoArray[value ? 'add' : 'remove'](cls, 'neo-collapsible');
134
133
  me.cls = cls;
@@ -140,12 +139,10 @@ class Fieldset extends Container {
140
139
  if (value && !me.hasLabelClickListener) {
141
140
  me.hasLabelClickListener = true;
142
141
 
143
- domListeners.push({
142
+ me.addDomListeners({
144
143
  click : me.onLegendClick,
145
144
  delegate: 'neo-legend'
146
145
  });
147
-
148
- me.domListeners = domListeners;
149
146
  }
150
147
  }
151
148
 
@@ -75,14 +75,11 @@ class CheckBox extends Base {
75
75
  construct(config) {
76
76
  super.construct(config);
77
77
 
78
- let me = this,
79
- domListeners = me.domListeners;
78
+ let me = this;
80
79
 
81
- domListeners.push(
80
+ me.addDomListeners(
82
81
  {change: me.onInputValueChange, scope: me}
83
82
  );
84
-
85
- me.domListeners = domListeners;
86
83
  }
87
84
 
88
85
  /**
@@ -51,20 +51,17 @@ class Range extends Number {
51
51
  construct(config) {
52
52
  super.construct(config);
53
53
 
54
- let me = this,
55
- domListeners = me.domListeners,
56
- inputEl = me.vdom.cn[1];
54
+ let me = this,
55
+ inputEl = me.vdom.cn[1];
57
56
 
58
57
  if (me.useInputEvent) {
59
- domListeners.push({
58
+ me.addDomListeners({
60
59
  input: {
61
60
  fn : me.onInputValueChange,
62
61
  id : me.vdom.cn[1].id,
63
62
  scope : me
64
63
  }
65
64
  });
66
-
67
- me.domListeners = domListeners;
68
65
  }
69
66
 
70
67
  inputEl.cls = ['neo-rangefield-input']; // replace neo-textfield-input
@@ -151,14 +151,11 @@ class Text extends Base {
151
151
  construct(config) {
152
152
  super.construct(config);
153
153
 
154
- let me = this,
155
- domListeners = me.domListeners;
154
+ let me = this;
156
155
 
157
- domListeners.push(
156
+ me.addDomListeners(
158
157
  {input: me.onInputValueChange, scope: me}
159
158
  );
160
-
161
- me.domListeners = domListeners;
162
159
  }
163
160
 
164
161
  /**