neo.mjs 10.0.0-beta.1 → 10.0.0-beta.3

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 (149) hide show
  1. package/ServiceWorker.mjs +2 -2
  2. package/apps/colors/view/GridContainer.mjs +1 -1
  3. package/apps/covid/view/AttributionComponent.mjs +1 -1
  4. package/apps/covid/view/HeaderContainer.mjs +6 -6
  5. package/apps/covid/view/MainContainerController.mjs +5 -5
  6. package/apps/covid/view/TableContainerController.mjs +1 -1
  7. package/apps/covid/view/country/Gallery.mjs +13 -13
  8. package/apps/covid/view/country/Helix.mjs +13 -13
  9. package/apps/covid/view/country/HistoricalDataTable.mjs +1 -1
  10. package/apps/email/view/Viewport.mjs +2 -2
  11. package/apps/form/view/FormPageContainer.mjs +2 -3
  12. package/apps/form/view/SideNavList.mjs +1 -1
  13. package/apps/portal/index.html +1 -1
  14. package/apps/portal/resources/data/examples_dist_esm.json +1 -1
  15. package/apps/portal/resources/data/examples_dist_prod.json +2 -2
  16. package/apps/portal/view/HeaderToolbar.mjs +3 -3
  17. package/apps/portal/view/about/Container.mjs +2 -2
  18. package/apps/portal/view/about/MemberContainer.mjs +3 -3
  19. package/apps/portal/view/blog/List.mjs +7 -7
  20. package/apps/portal/view/examples/List.mjs +4 -4
  21. package/apps/portal/view/home/ContentBox.mjs +2 -2
  22. package/apps/portal/view/home/FeatureSection.mjs +3 -3
  23. package/apps/portal/view/home/FooterContainer.mjs +7 -7
  24. package/apps/portal/view/home/parts/AfterMath.mjs +3 -3
  25. package/apps/portal/view/home/parts/MainNeo.mjs +3 -3
  26. package/apps/portal/view/home/parts/References.mjs +6 -6
  27. package/apps/portal/view/learn/ContentComponent.mjs +18 -11
  28. package/apps/portal/view/learn/PageSectionsContainer.mjs +1 -1
  29. package/apps/portal/view/learn/PageSectionsList.mjs +2 -2
  30. package/apps/portal/view/services/Component.mjs +16 -16
  31. package/apps/realworld/view/FooterComponent.mjs +1 -1
  32. package/apps/realworld/view/HeaderComponent.mjs +8 -8
  33. package/apps/realworld/view/HomeComponent.mjs +6 -6
  34. package/apps/realworld/view/article/CommentComponent.mjs +4 -4
  35. package/apps/realworld/view/article/Component.mjs +14 -14
  36. package/apps/realworld/view/article/CreateCommentComponent.mjs +3 -3
  37. package/apps/realworld/view/article/CreateComponent.mjs +3 -3
  38. package/apps/realworld/view/article/PreviewComponent.mjs +1 -1
  39. package/apps/realworld/view/article/TagListComponent.mjs +2 -2
  40. package/apps/realworld/view/user/ProfileComponent.mjs +8 -8
  41. package/apps/realworld/view/user/SettingsComponent.mjs +4 -4
  42. package/apps/realworld/view/user/SignUpComponent.mjs +4 -4
  43. package/apps/realworld2/view/FooterComponent.mjs +1 -1
  44. package/apps/realworld2/view/HomeContainer.mjs +3 -3
  45. package/apps/realworld2/view/article/DetailsContainer.mjs +1 -1
  46. package/apps/realworld2/view/article/PreviewComponent.mjs +7 -7
  47. package/apps/realworld2/view/article/TagListComponent.mjs +2 -2
  48. package/apps/realworld2/view/user/ProfileContainer.mjs +1 -1
  49. package/apps/route/view/center/CardAdministration.mjs +2 -2
  50. package/apps/route/view/center/CardAdministrationDenied.mjs +1 -1
  51. package/apps/route/view/center/CardContact.mjs +2 -2
  52. package/apps/route/view/center/CardHome.mjs +1 -1
  53. package/apps/route/view/center/CardSection1.mjs +1 -1
  54. package/apps/route/view/center/CardSection2.mjs +1 -1
  55. package/apps/sharedcovid/view/AttributionComponent.mjs +1 -1
  56. package/apps/sharedcovid/view/HeaderContainer.mjs +6 -6
  57. package/apps/sharedcovid/view/MainContainerController.mjs +5 -5
  58. package/apps/sharedcovid/view/TableContainerController.mjs +1 -1
  59. package/apps/sharedcovid/view/country/Gallery.mjs +13 -13
  60. package/apps/sharedcovid/view/country/Helix.mjs +13 -13
  61. package/apps/sharedcovid/view/country/HistoricalDataTable.mjs +1 -1
  62. package/apps/shareddialog/childapps/shareddialog2/view/MainContainer.mjs +1 -1
  63. package/apps/shareddialog/view/MainContainer.mjs +1 -1
  64. package/buildScripts/createApp.mjs +2 -2
  65. package/learn/Glossary.md +261 -0
  66. package/learn/README.md +9 -14
  67. package/learn/benefits/ConfigSystem.md +536 -26
  68. package/learn/benefits/Effort.md +47 -2
  69. package/learn/benefits/Features.md +50 -32
  70. package/learn/benefits/FormsEngine.md +54 -24
  71. package/learn/benefits/MultiWindow.md +31 -5
  72. package/learn/benefits/Quick.md +45 -12
  73. package/learn/benefits/RPCLayer.md +75 -0
  74. package/learn/benefits/Speed.md +17 -12
  75. package/learn/guides/Collections.md +436 -0
  76. package/learn/guides/ConfigSystemDeepDive.md +280 -0
  77. package/learn/guides/CustomComponents.md +256 -14
  78. package/learn/guides/DeclarativeComponentTreesVsImperativeVdom.md +17 -17
  79. package/learn/guides/ExtendingNeoClasses.md +331 -0
  80. package/learn/guides/Forms.md +449 -1
  81. package/learn/guides/InstanceLifecycle.md +295 -1
  82. package/learn/guides/Layouts.md +246 -1
  83. package/learn/guides/MainThreadAddons.md +475 -0
  84. package/learn/guides/Records.md +286 -0
  85. package/learn/guides/WorkingWithVDom.md +14 -14
  86. package/learn/guides/form_fields/ComboBox.md +241 -0
  87. package/learn/tree.json +57 -51
  88. package/package.json +2 -2
  89. package/resources/scss/src/apps/portal/learn/ContentComponent.scss +9 -0
  90. package/src/DefaultConfig.mjs +2 -2
  91. package/src/Main.mjs +8 -7
  92. package/src/Neo.mjs +16 -2
  93. package/src/button/Base.mjs +2 -2
  94. package/src/calendar/view/SettingsContainer.mjs +2 -2
  95. package/src/calendar/view/YearComponent.mjs +9 -9
  96. package/src/calendar/view/calendars/ColorsList.mjs +1 -1
  97. package/src/calendar/view/calendars/List.mjs +1 -1
  98. package/src/calendar/view/month/Component.mjs +15 -15
  99. package/src/calendar/view/week/Component.mjs +12 -12
  100. package/src/calendar/view/week/EventDragZone.mjs +4 -4
  101. package/src/calendar/view/week/TimeAxisComponent.mjs +3 -3
  102. package/src/component/Base.mjs +17 -2
  103. package/src/component/Carousel.mjs +2 -2
  104. package/src/component/Chip.mjs +3 -3
  105. package/src/component/Circle.mjs +2 -2
  106. package/src/component/DateSelector.mjs +8 -8
  107. package/src/component/Helix.mjs +1 -1
  108. package/src/component/Label.mjs +3 -18
  109. package/src/component/Legend.mjs +3 -3
  110. package/src/component/MagicMoveText.mjs +6 -14
  111. package/src/component/Process.mjs +3 -3
  112. package/src/component/Progress.mjs +1 -1
  113. package/src/component/StatusBadge.mjs +2 -2
  114. package/src/component/Timer.mjs +2 -2
  115. package/src/component/Toast.mjs +5 -3
  116. package/src/container/AccordionItem.mjs +2 -2
  117. package/src/container/Base.mjs +1 -1
  118. package/src/core/Base.mjs +18 -2
  119. package/src/date/DayViewComponent.mjs +2 -2
  120. package/src/date/SelectorContainer.mjs +1 -1
  121. package/src/form/field/CheckBox.mjs +4 -4
  122. package/src/form/field/ComboBox.mjs +6 -1
  123. package/src/form/field/FileUpload.mjs +25 -39
  124. package/src/form/field/Range.mjs +1 -1
  125. package/src/form/field/Text.mjs +3 -3
  126. package/src/form/field/TextArea.mjs +2 -3
  127. package/src/grid/Body.mjs +6 -2
  128. package/src/list/Color.mjs +2 -2
  129. package/src/main/DeltaUpdates.mjs +157 -98
  130. package/src/main/addon/AmCharts.mjs +53 -73
  131. package/src/main/addon/Base.mjs +11 -0
  132. package/src/main/addon/MonacoEditor.mjs +31 -58
  133. package/src/manager/ClassHierarchy.mjs +114 -0
  134. package/src/menu/List.mjs +1 -1
  135. package/src/plugin/Popover.mjs +2 -2
  136. package/src/sitemap/Component.mjs +1 -1
  137. package/src/table/Body.mjs +6 -2
  138. package/src/tooltip/Base.mjs +1 -6
  139. package/src/tree/Accordion.mjs +3 -3
  140. package/src/vdom/Helper.mjs +21 -19
  141. package/src/worker/App.mjs +1 -2
  142. package/src/worker/Base.mjs +6 -4
  143. package/src/worker/Canvas.mjs +2 -3
  144. package/src/worker/Data.mjs +5 -7
  145. package/src/worker/Task.mjs +2 -3
  146. package/src/worker/VDom.mjs +3 -4
  147. package/src/worker/mixin/RemoteMethodAccess.mjs +4 -1
  148. package/learn/guides/MainThreadAddonExample.md +0 -15
  149. package/learn/guides/MainThreadAddonIntro.md +0 -44
@@ -38,9 +38,9 @@ class Chip extends Component {
38
38
  iconCls_: null,
39
39
  /**
40
40
  * The text displayed on the button [optional]
41
- * @member {String|null} text_=null
41
+ * @member {String|null} text=null
42
42
  */
43
- text_: null,
43
+ text: null,
44
44
  /**
45
45
  * Set this one to false when used in lists
46
46
  * @member {Boolean} useDomListeners=true
@@ -132,7 +132,7 @@ class Chip extends Component {
132
132
  textNode.removeDom = true
133
133
  } else {
134
134
  textNode.removeDom = false;
135
- textNode.html = value
135
+ textNode.text = value
136
136
  }
137
137
 
138
138
  this.update()
@@ -850,8 +850,8 @@ class Circle extends Component {
850
850
  let me = this,
851
851
  innerCircle = me.getInnerCircle();
852
852
 
853
- innerCircle.cn[0].html = me.store?.getCount() || 0;
854
- innerCircle.cn[1].html = me.title;
853
+ innerCircle.cn[0].text = me.store?.getCount() || 0;
854
+ innerCircle.cn[1].text = me.title;
855
855
 
856
856
  !silent && me.update()
857
857
  }
@@ -250,7 +250,7 @@ class DateSelector extends Component {
250
250
 
251
251
  me.updateHeaderDays(me.dayNameFormat, '', true);
252
252
 
253
- me.getHeaderMonthEl().html = dt.format(me.currentDate);
253
+ me.getHeaderMonthEl().text = dt.format(me.currentDate);
254
254
 
255
255
  me.update()
256
256
  }
@@ -588,7 +588,7 @@ class DateSelector extends Component {
588
588
  for (; i < len; i++) {
589
589
  config =
590
590
  {cls: ['neo-cell'], cn: [
591
- {cls : ['neo-cell-content'], html: me.intlFormat_day.format(date)}
591
+ {cls : ['neo-cell-content'], text: me.intlFormat_day.format(date)}
592
592
  ]};
593
593
 
594
594
  day = date.getDay();
@@ -652,7 +652,7 @@ class DateSelector extends Component {
652
652
  tabIndex: hasContent ? -1 : null,
653
653
  cn: [{
654
654
  cls : ['neo-cell-content'],
655
- html: hasContent ? day : me.showDisabledDays ? date.getDate() : ''
655
+ text: hasContent ? day : me.showDisabledDays ? date.getDate() : ''
656
656
  }]
657
657
  };
658
658
 
@@ -748,7 +748,7 @@ class DateSelector extends Component {
748
748
  cellEl = VDomUtil.find(me.vdom, data.path[0].id),
749
749
  date = me.currentDate; // cloned
750
750
 
751
- date.setDate(parseInt(cellEl.vdom.cn[0].html));
751
+ date.setDate(parseInt(cellEl.vdom.cn[0].text));
752
752
  date = DateUtil.convertToyyyymmdd(date);
753
753
 
754
754
  // We want to always trigger a change event.
@@ -893,7 +893,7 @@ class DateSelector extends Component {
893
893
  for (; i < 7; i++) {
894
894
  node = centerEl.cn[i];
895
895
 
896
- node.cn[0].html = me.intlFormat_day.format(date);
896
+ node.cn[0].text = me.intlFormat_day.format(date);
897
897
 
898
898
  day = date.getDay();
899
899
 
@@ -927,7 +927,7 @@ class DateSelector extends Component {
927
927
  headerCenterEl, y;
928
928
 
929
929
  if (!me.mounted || !me.useAnimations) {
930
- monthEl.html = currentMonth;
930
+ monthEl.text = currentMonth;
931
931
  !silent && me.update();
932
932
  return null
933
933
  } else {
@@ -954,7 +954,7 @@ class DateSelector extends Component {
954
954
 
955
955
  headerCenterEl.cn[0].cn[0].cn.push({
956
956
  cls : ['neo-month-text'],
957
- html: currentMonth
957
+ text: currentMonth
958
958
  });
959
959
 
960
960
  headerCenterEl.cn[0].cn[0].cn[slideDirection === 'top' ? 'unshift' : 'push'](headerCenterEl.cn[1]);
@@ -1012,7 +1012,7 @@ class DateSelector extends Component {
1012
1012
  let me = this,
1013
1013
  yearEl = me.getHeaderYearEl();
1014
1014
 
1015
- yearEl.html = me.currentDate.getFullYear();
1015
+ yearEl.text = me.currentDate.getFullYear();
1016
1016
 
1017
1017
  !silent && me.update()
1018
1018
  }
@@ -702,7 +702,7 @@ class Helix extends Component {
702
702
  if (me.showCloneInfo) {
703
703
  itemVdom.cn.push({
704
704
  cls : ['contact-name'],
705
- html: record.firstname + ' ' + record.lastname
705
+ text: record.firstname + ' ' + record.lastname
706
706
  })
707
707
  }
708
708
 
@@ -22,25 +22,10 @@ class Label extends Component {
22
22
  */
23
23
  baseCls: ['neo-label'],
24
24
  /**
25
- * @member {String} text_=''
26
- */
27
- text_: '',
28
- /**
29
- * @member {Object} _vdom={tag: 'label'}
25
+ * @member {String} tag='label'
26
+ * @protected
30
27
  */
31
- _vdom:
32
- {tag: 'label', draggable: false}
33
- }
34
-
35
- /**
36
- * Triggered after the text config got changed
37
- * @param {String} value
38
- * @param {String} oldValue
39
- * @protected
40
- */
41
- afterSetText(value, oldValue) {
42
- this.vdom.html = value;
43
- this.update()
28
+ tag: 'label'
44
29
  }
45
30
  }
46
31
 
@@ -27,9 +27,9 @@ class Legend extends Component {
27
27
  */
28
28
  iconCls_: 'far fa-check',
29
29
  /**
30
- * @member {String} text_=''
30
+ * @member {String} text=''
31
31
  */
32
- text_: '',
32
+ text: '',
33
33
  /**
34
34
  * @member {Boolean} useIcon_=true
35
35
  */
@@ -62,7 +62,7 @@ class Legend extends Component {
62
62
  * @protected
63
63
  */
64
64
  afterSetText(value, oldValue) {
65
- this.vdom.cn[1].html = value;
65
+ this.vdom.cn[1].text = value;
66
66
  this.update()
67
67
  }
68
68
 
@@ -51,10 +51,6 @@ class MagicMoveText extends Component {
51
51
  * @member {String} fontFamily_='Helvetica Neue'
52
52
  */
53
53
  fontFamily_: 'Helvetica Neue',
54
- /**
55
- * @member {String} text_=null
56
- */
57
- text_: null,
58
54
  /**
59
55
  * Time in ms for the fadeIn, fadeOut and move character OPs
60
56
  * @member {Number} transitionTime_=500
@@ -258,11 +254,7 @@ class MagicMoveText extends Component {
258
254
  value?.split('').forEach(char => {
259
255
  me.chars.push({name: char});
260
256
 
261
- if (char === ' ') {
262
- char = '&#32;'
263
- }
264
-
265
- measureElement.cn.push({tag: 'span', html: char})
257
+ measureElement.cn.push({tag: 'span', text: char})
266
258
  });
267
259
 
268
260
  if (me.mounted) {
@@ -301,8 +293,8 @@ class MagicMoveText extends Component {
301
293
 
302
294
  charsContainer.push({
303
295
  cls : ['neo-char'],
304
- html : char.name,
305
- style: {color: me.colorFadeIn, left: char.left, opacity: 0, top: char.top}
296
+ style: {color: me.colorFadeIn, left: char.left, opacity: 0, top: char.top},
297
+ text : char.name
306
298
  })
307
299
  }
308
300
  });
@@ -354,7 +346,7 @@ class MagicMoveText extends Component {
354
346
  me.chars[index].top = `${rect.top - parentRect.top }px`;
355
347
  });
356
348
 
357
- measureWrapper.removeDom = true;
349
+ //measureWrapper.removeDom = true;
358
350
  await me.promiseUpdate()
359
351
  }
360
352
 
@@ -409,7 +401,7 @@ class MagicMoveText extends Component {
409
401
  if (start) {
410
402
  me.intervalId = setInterval(me.cycleText.bind(me), me.autoCycleInterval);
411
403
 
412
- me.timeout(20).then(() => {me.cycleText()});
404
+ me.timeout(20).then(() => {me.cycleText()})
413
405
  } else {
414
406
  clearInterval(me.intervalId)
415
407
  }
@@ -491,7 +483,7 @@ class MagicMoveText extends Component {
491
483
 
492
484
  charsContainer.cn.length = 0;
493
485
 
494
- charsContainer.cn.push({html: me.text});
486
+ charsContainer.cn.push({text: me.text});
495
487
  await me.promiseUpdate();
496
488
 
497
489
  me.isTransitioning = false
@@ -169,12 +169,12 @@ class Process extends Base {
169
169
  curItem, content;
170
170
 
171
171
  items.forEach((newItem) => {
172
- curItem = Neo.clone(itemLayout, true),
172
+ curItem = Neo.clone(itemLayout, true);
173
173
  content = curItem.cn[3];
174
174
 
175
175
  content.cn[0].cls.push(newItem.iconCls);
176
- content.cn[1].html = newItem.title;
177
- content.cn[2].html = newItem.text;
176
+ content.cn[1].text = newItem.title;
177
+ content.cn[2].text = newItem.text;
178
178
 
179
179
  NeoArray.add(vdomRoot.cn, curItem)
180
180
  })
@@ -84,7 +84,7 @@ class Progress extends Base {
84
84
  delete label.removeDom
85
85
  }
86
86
 
87
- label.html = value;
87
+ label.text = value;
88
88
  this.update()
89
89
  }
90
90
 
@@ -329,7 +329,7 @@ class StatusBadge extends Base {
329
329
  break;
330
330
  }
331
331
 
332
- labelNode.html = showLabel;
332
+ labelNode.text = showLabel;
333
333
 
334
334
  me.updateStateIconNode(showStateIcon);
335
335
  me.updateSideIconNode(showSideIcon)
@@ -382,7 +382,7 @@ class StatusBadge extends Base {
382
382
  updateLabelNode(value) {
383
383
  let labelNode = this.getVdomRoot().cn[1];
384
384
 
385
- labelNode.html = value;
385
+ labelNode.text = value;
386
386
  labelNode.removeDom = !Boolean(value);
387
387
 
388
388
  this.update()
@@ -74,7 +74,7 @@ class Timer extends Component {
74
74
  {tag: 'button',cls: 'fa fa-play'}
75
75
  ]},
76
76
  {cls: 'flip-card-back', cn : [
77
- {cls: 'runner', html: '00:00'}
77
+ {cls: 'runner', text: '00:00'}
78
78
  ]}
79
79
  ]}
80
80
  ]}
@@ -283,7 +283,7 @@ class Timer extends Component {
283
283
  let me = this,
284
284
  timer = me.vdom.cn[0].cn[1].cn[0].cn[1].cn[0];
285
285
 
286
- timer.html = value;
286
+ timer.text = value;
287
287
  me.update()
288
288
  }
289
289
 
@@ -175,7 +175,7 @@ class Toast extends Component {
175
175
  afterSetMsg(value, oldValue) {
176
176
  let vdom = this.getTextRootVdom().cn[1];
177
177
 
178
- vdom.html = value
178
+ vdom.text = value
179
179
  }
180
180
 
181
181
  /**
@@ -221,8 +221,10 @@ class Toast extends Component {
221
221
  let vdom = this.getTextRootVdom().cn[0];
222
222
 
223
223
  vdom.removeDom = Neo.isEmpty(value);
224
- vdom.html = value;
225
- NeoArray[value ? 'add' : 'remove'](vdom.cls, 'neo-toast-has-title')
224
+ vdom.text = value;
225
+ NeoArray.toggle(vdom.cls, 'neo-toast-has-title', value);
226
+
227
+ this.update()
226
228
  }
227
229
 
228
230
  /**
@@ -78,7 +78,7 @@ class AccordionContainer extends Base {
78
78
  flag : 'titleEl',
79
79
  ntype : 'component',
80
80
  baseCls: ['neo-accordion-header-title'],
81
- html : title
81
+ text : title
82
82
  }, {
83
83
  ntype : 'component',
84
84
  baseCls: ['neo-accordion-header-arrow'],
@@ -154,7 +154,7 @@ class AccordionContainer extends Base {
154
154
  let titleEl = this.down({flag: 'titleEl'});
155
155
 
156
156
  if (titleEl) {
157
- titleEl.html = newValue
157
+ titleEl.text = newValue
158
158
  }
159
159
  }
160
160
 
@@ -389,7 +389,7 @@ class Container extends Component {
389
389
  case 'String': {
390
390
  item = Neo.create({
391
391
  module: Component,
392
- vdom : {html: item},
392
+ vdom : {text: item},
393
393
  ...config
394
394
  });
395
395
 
package/src/core/Base.mjs CHANGED
@@ -80,6 +80,14 @@ class Base {
80
80
  * @member {String|null} id_=null
81
81
  */
82
82
  id_: null,
83
+ /**
84
+ * An array of remote method names that should be intercepted.
85
+ * Names used here must be present inside the `remote_` config.
86
+ * If a remote call for one of these methods arrives, `onInterceptRemotes()` will be called.
87
+ * @member {String[]|null} interceptRemotes=null
88
+ * @protected
89
+ */
90
+ interceptRemotes: null,
83
91
  /**
84
92
  * Neo.create() will change this flag to true after the onConstructed() chain is done.
85
93
  * @member {Boolean} isConstructed=false
@@ -203,7 +211,7 @@ class Base {
203
211
  if (hasManager) {
204
212
  Neo.manager.Instance.register(me);
205
213
  } else {
206
- Neo.idMap = Neo.idMap || {};
214
+ Neo.idMap ??= {};
207
215
  Neo.idMap[me.id] = me
208
216
  }
209
217
  }
@@ -503,10 +511,18 @@ class Base {
503
511
 
504
512
  /**
505
513
  * Gets triggered after all constructors are done
506
- * @tutorial 02_ClassSystem
507
514
  */
508
515
  onConstructed() {}
509
516
 
517
+ /**
518
+ * Placeholder method for intercepting remote calls.
519
+ * Subclasses can override this method to implement custom interception logic.
520
+ * @param {Object} msg The remote message object.
521
+ */
522
+ onInterceptRemotes(msg) {
523
+ // No-op in base class
524
+ }
525
+
510
526
  /**
511
527
  * Helper method to replace string based values containing "@config:" with the matching config value
512
528
  * of this instance.
@@ -104,7 +104,7 @@ class DayViewComponent extends Base {
104
104
  for (; i < len; i++) {
105
105
  config =
106
106
  {cls: ['neo-cell'], cn: [
107
- {cls : ['neo-cell-content'], html: me.intlFormatDay.format(date)}
107
+ {cls : ['neo-cell-content'], text: me.intlFormatDay.format(date)}
108
108
  ]};
109
109
 
110
110
  day = date.getDay();
@@ -168,7 +168,7 @@ class DayViewComponent extends Base {
168
168
  tabIndex: hasContent ? -1 : null,
169
169
  cn: [{
170
170
  cls : ['neo-cell-content'],
171
- html: hasContent ? day : me.showDisabledDays ? date.getDate() : ''
171
+ text: hasContent ? day : me.showDisabledDays ? date.getDate() : ''
172
172
  }]
173
173
  };
174
174
 
@@ -332,7 +332,7 @@ class SelectorContainer extends Container {
332
332
  for (; i < 7; i++) {
333
333
  node = centerEl.cn[i];
334
334
 
335
- node.cn[0].html = me.intlFormatDay.format(date);
335
+ node.cn[0].text = me.intlFormatDay.format(date);
336
336
 
337
337
  day = date.getDay();
338
338
 
@@ -397,7 +397,7 @@ class CheckBox extends Field {
397
397
  showLabel = !!value; // hide the label, in case value === null || value === ''
398
398
 
399
399
  if (showLabel) {
400
- valueLabel.html = value
400
+ valueLabel.text = value
401
401
  }
402
402
 
403
403
  valueLabel.removeDom = !showLabel;
@@ -582,16 +582,16 @@ class CheckBox extends Field {
582
582
  if (!(me.clean && !me.mounted)) {
583
583
  me._error = value; // silent update
584
584
 
585
- NeoArray[value ? 'add' : 'remove'](cls, 'neo-invalid');
585
+ NeoArray.toggle(cls, 'neo-invalid', value);
586
586
  me.cls = cls;
587
587
 
588
588
  errorWrapper = me.vdom.cn[1];
589
589
  errorNode = errorWrapper.cn[0];
590
590
 
591
591
  if (showError) {
592
- errorNode.html = value
592
+ errorNode.text = value
593
593
  } else {
594
- delete errorNode.html
594
+ delete errorNode.text
595
595
  }
596
596
 
597
597
  errorWrapper.removeDom = !showError;
@@ -118,7 +118,12 @@ class ComboBox extends Picker {
118
118
  * which you want to submit instead
119
119
  * @member {Number|String} valueField='id'
120
120
  */
121
- valueField: 'id'
121
+ valueField: 'id',
122
+ /**
123
+ * Default width to prevent rendering issues.
124
+ * @member {Number} width=150
125
+ */
126
+ width: 150
122
127
  }
123
128
 
124
129
  /**
@@ -1,6 +1,5 @@
1
- import Field from './Base.mjs';
2
- import NeoArray from '../../util/Array.mjs';
3
- import StringUtil from '../../util/String.mjs';
1
+ import Field from './Base.mjs';
2
+ import NeoArray from '../../util/Array.mjs';
4
3
 
5
4
  const
6
5
  sizeRE = /^(\d+)(kb|mb|gb)?$/i,
@@ -352,7 +351,7 @@ class FileUpload extends Field {
352
351
  onConstructed() {
353
352
  super.onConstructed(...arguments);
354
353
 
355
- this.vdom.cn[4].html = this.chooseFile;
354
+ this.vdom.cn[4].text = this.chooseFile;
356
355
  }
357
356
 
358
357
  /**
@@ -392,12 +391,9 @@ class FileUpload extends Field {
392
391
  */
393
392
  onInputValueChange({ files }) {
394
393
  const
395
- me = this,
396
- {
397
- types,
398
- cls
399
- } = me,
400
- body = me.vdom.cn[1];
394
+ me = this,
395
+ {cls, types} = me,
396
+ body = me.vdom.cn[1];
401
397
 
402
398
  if (files.length) {
403
399
  NeoArray.remove(cls, 'neo-field-empty');
@@ -406,17 +402,16 @@ class FileUpload extends Field {
406
402
  const
407
403
  file = files.item(0),
408
404
  pointPos = file.name.lastIndexOf('.'),
409
- type = pointPos > -1 ? file.name.slice(pointPos + 1) : '',
410
- escapedFileName = StringUtil.escapeHtml(file.name);
405
+ type = pointPos > -1 ? file.name.slice(pointPos + 1) : '';
411
406
 
412
407
  if (me.types && !types[type]) {
413
- body.cn[0].html = escapedFileName;
414
- body.cn[1].html = `${me.invalidFileFormat} (.${type}) ${me.formatSize(file.size)}`;
408
+ body.cn[0].text = file.name;
409
+ body.cn[1].text = `${me.invalidFileFormat} (.${type}) ${me.formatSize(file.size)}`;
415
410
  me.error = me.pleaseUseTheseTypes?.replace('{allowedFileTypes}', Object.keys(types).join(' .'))
416
411
  }
417
412
  else if (file.size > me.maxSize) {
418
- body.cn[0].html = escapedFileName;
419
- body.cn[1].html = me.formatSize(file.size);
413
+ body.cn[0].text = file.name;
414
+ body.cn[1].text = me.formatSize(file.size);
420
415
  me.error = me.fileSizeMoreThan?.replace('{allowedFileSize}', String(me._maxSize).toUpperCase());
421
416
  }
422
417
  // If it passes the type and maxSize check, upload it
@@ -448,7 +443,7 @@ class FileUpload extends Field {
448
443
  await me.timeout(100);
449
444
  me.focus(me.vdom.cn[2].id);
450
445
 
451
- me.vdom.cn[1].cn[0].html = StringUtil.escapeHtml(file.name);
446
+ me.vdom.cn[1].cn[0].text = file.name;
452
447
  me.update();
453
448
  me.state = 'uploading';
454
449
 
@@ -492,10 +487,10 @@ class FileUpload extends Field {
492
487
 
493
488
  (vdom.style || (vdom.style = {}))['--upload-progress'] = `${progress}turn`;
494
489
 
495
- vdom.cn[1].cn[1].html = `${this.uploading}... (${Math.round(progress * 100)}%)`;
490
+ vdom.cn[1].cn[1].text = `${this.uploading}... (${Math.round(progress * 100)}%)`;
496
491
 
497
492
  this.uploadSize = loaded;
498
- this.update();
493
+ this.update()
499
494
  }
500
495
 
501
496
  onUploadAbort(e) {
@@ -665,15 +660,15 @@ class FileUpload extends Field {
665
660
  afterSetDocument(document) {
666
661
  if (document) {
667
662
  const
668
- me = this,
669
- { cls } = me;
663
+ me = this,
664
+ {cls} = me;
670
665
 
671
666
  NeoArray.remove(cls, 'neo-field-empty');
672
667
  me.cls = cls;
673
668
 
674
669
  me.documentId = document.id;
675
670
  me.fileSize = me.formatSize(document.size);
676
- me.vdom.cn[1].cn[0].html = StringUtil.escapeHtml(document.fileName);
671
+ me.vdom.cn[1].cn[0].text = document.fileName;
677
672
  me.state = me.documentStatusMap[document.status];
678
673
  }
679
674
  }
@@ -704,15 +699,15 @@ class FileUpload extends Field {
704
699
  isChangeEventNeeded = true;
705
700
  break;
706
701
  case 'upload-failed':
707
- status.html = `${me.uploadFailed}${isNaN(me.progress) ? '' : `... (${Math.round(me.progress * 100)}%)`}`;
702
+ status.text = `${me.uploadFailed}${isNaN(me.progress) ? '' : `... (${Math.round(me.progress * 100)}%)`}`;
708
703
  isChangeEventNeeded = true;
709
704
  break;
710
705
  case 'processing':
711
- status.html = `${me.scanning}... (${me.formatSize(me.uploadSize)})`;
706
+ status.text = `${me.scanning}... (${me.formatSize(me.uploadSize)})`;
712
707
  vdom.inert = true;
713
708
  break;
714
709
  case 'scan-failed':
715
- status.html = `${me.malwareFoundInFile}. \u2022 ${me.fileSize}`;
710
+ status.text = `${me.malwareFoundInFile}. \u2022 ${me.fileSize}`;
716
711
  me.error = me.pleaseCheck;
717
712
  isChangeEventNeeded = true;
718
713
  break;
@@ -721,19 +716,19 @@ class FileUpload extends Field {
721
716
  anchor.href = me.createUrl(me.downloadUrl, {
722
717
  [me.documentIdParameter] : me.documentId
723
718
  });
724
- status.html = me.fileSize;
719
+ status.text = me.fileSize;
725
720
  isChangeEventNeeded = true;
726
721
  break;
727
722
  case 'not-downloadable':
728
- status.html = me.document ? me.fileSize : `${me.successfullyUploaded} \u2022 ${me.fileSize}`;
723
+ status.text = me.document ? me.fileSize : `${me.successfullyUploaded} \u2022 ${me.fileSize}`;
729
724
  isChangeEventNeeded = true;
730
725
  break;
731
726
  case 'deleted':
732
- status.html = me.fileWasDeleted;
727
+ status.text = me.fileWasDeleted;
733
728
  isChangeEventNeeded = true;
734
729
  break;
735
730
  case 'error':
736
- status.html = me.fileIsInAnErrorState;
731
+ status.text = me.fileIsInAnErrorState;
737
732
  me.error = me.pleaseCheck;
738
733
  isChangeEventNeeded = true;
739
734
  }
@@ -812,16 +807,7 @@ class FileUpload extends Field {
812
807
  }
813
808
 
814
809
  afterSetError(text) {
815
- if (text) {
816
- this.vdom.cn[5].cn = [{
817
- vtype : 'text',
818
- html : text
819
- }];
820
- }
821
- else {
822
- this.vdom.cn[5].cn = [];
823
- }
824
-
810
+ this.vdom.cn[5].cn = text ? [{vtype : 'text', text}] : [];
825
811
  this.validate();
826
812
  this.update();
827
813
  }
@@ -109,7 +109,7 @@ class Range extends Number {
109
109
  let me = this;
110
110
 
111
111
  if (me.showResultInLabel) {
112
- me.getLabelEl().html = `[${me.value}] ` + me.labelText
112
+ me.getLabelEl().text = `[${me.value}] ` + me.labelText
113
113
  }
114
114
  }
115
115
  }
@@ -788,8 +788,8 @@ class Text extends Field {
788
788
  showLabel = me.labelPosition === 'top',
789
789
  subLabel = me.vdom.cn[1];
790
790
 
791
- subLabel.html = value;
792
791
  subLabel.removeDom = !showLabel;
792
+ subLabel.text = value;
793
793
 
794
794
  me.update()
795
795
  }
@@ -1494,9 +1494,9 @@ class Text extends Field {
1494
1494
  errorNode = errorWrapper.cn[0];
1495
1495
 
1496
1496
  if (value) {
1497
- errorNode.html = value
1497
+ errorNode.text = value
1498
1498
  } else {
1499
- delete errorNode.html
1499
+ delete errorNode.text
1500
1500
  }
1501
1501
 
1502
1502
  errorWrapper.removeDom = !value;
@@ -1,5 +1,4 @@
1
- import StringUtil from '../../util/String.mjs';
2
- import Text from './Text.mjs';
1
+ import Text from './Text.mjs';
3
2
 
4
3
  /**
5
4
  *
@@ -162,7 +161,7 @@ class TextArea extends Text {
162
161
  inputEl = me.getInputEl();
163
162
 
164
163
  if (inputEl) {
165
- inputEl.html = StringUtil.escapeHtml(value)
164
+ inputEl.text = value
166
165
  }
167
166
 
168
167
  super.afterSetValue(value, oldValue);