neo.mjs 10.0.0-alpha.5 → 10.0.0-beta.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 (188) 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/SideNavList.mjs +1 -1
  12. package/apps/portal/index.html +1 -1
  13. package/apps/portal/resources/data/examples_devmode.json +26 -27
  14. package/apps/portal/resources/data/examples_dist_dev.json +26 -27
  15. package/apps/portal/resources/data/examples_dist_esm.json +25 -26
  16. package/apps/portal/resources/data/examples_dist_prod.json +26 -27
  17. package/apps/portal/view/HeaderToolbar.mjs +3 -3
  18. package/apps/portal/view/about/Container.mjs +2 -2
  19. package/apps/portal/view/about/MemberContainer.mjs +3 -3
  20. package/apps/portal/view/blog/List.mjs +7 -7
  21. package/apps/portal/view/examples/List.mjs +4 -4
  22. package/apps/portal/view/home/ContentBox.mjs +2 -2
  23. package/apps/portal/view/home/FeatureSection.mjs +3 -3
  24. package/apps/portal/view/home/FooterContainer.mjs +7 -7
  25. package/apps/portal/view/home/parts/AfterMath.mjs +3 -3
  26. package/apps/portal/view/home/parts/MainNeo.mjs +3 -3
  27. package/apps/portal/view/home/parts/References.mjs +6 -6
  28. package/apps/portal/view/learn/ContentComponent.mjs +102 -111
  29. package/apps/portal/view/learn/PageSectionsContainer.mjs +1 -1
  30. package/apps/portal/view/learn/PageSectionsList.mjs +2 -2
  31. package/apps/portal/view/services/Component.mjs +16 -16
  32. package/apps/realworld/view/FooterComponent.mjs +1 -1
  33. package/apps/realworld/view/HeaderComponent.mjs +8 -8
  34. package/apps/realworld/view/HomeComponent.mjs +6 -6
  35. package/apps/realworld/view/article/CommentComponent.mjs +4 -4
  36. package/apps/realworld/view/article/Component.mjs +14 -14
  37. package/apps/realworld/view/article/CreateCommentComponent.mjs +3 -3
  38. package/apps/realworld/view/article/CreateComponent.mjs +3 -3
  39. package/apps/realworld/view/article/PreviewComponent.mjs +1 -1
  40. package/apps/realworld/view/article/TagListComponent.mjs +2 -2
  41. package/apps/realworld/view/user/ProfileComponent.mjs +8 -8
  42. package/apps/realworld/view/user/SettingsComponent.mjs +4 -4
  43. package/apps/realworld/view/user/SignUpComponent.mjs +4 -4
  44. package/apps/realworld2/view/FooterComponent.mjs +1 -1
  45. package/apps/realworld2/view/HomeContainer.mjs +3 -3
  46. package/apps/realworld2/view/article/DetailsContainer.mjs +1 -1
  47. package/apps/realworld2/view/article/PreviewComponent.mjs +7 -7
  48. package/apps/realworld2/view/article/TagListComponent.mjs +2 -2
  49. package/apps/realworld2/view/user/ProfileContainer.mjs +1 -1
  50. package/apps/route/view/center/CardAdministration.mjs +2 -2
  51. package/apps/route/view/center/CardAdministrationDenied.mjs +1 -1
  52. package/apps/route/view/center/CardContact.mjs +2 -2
  53. package/apps/route/view/center/CardHome.mjs +1 -1
  54. package/apps/route/view/center/CardSection1.mjs +1 -1
  55. package/apps/route/view/center/CardSection2.mjs +1 -1
  56. package/apps/sharedcovid/view/AttributionComponent.mjs +1 -1
  57. package/apps/sharedcovid/view/HeaderContainer.mjs +6 -6
  58. package/apps/sharedcovid/view/MainContainerController.mjs +5 -5
  59. package/apps/sharedcovid/view/TableContainerController.mjs +1 -1
  60. package/apps/sharedcovid/view/country/Gallery.mjs +13 -13
  61. package/apps/sharedcovid/view/country/Helix.mjs +13 -13
  62. package/apps/sharedcovid/view/country/HistoricalDataTable.mjs +1 -1
  63. package/apps/shareddialog/childapps/shareddialog2/view/MainContainer.mjs +1 -1
  64. package/apps/shareddialog/view/MainContainer.mjs +1 -1
  65. package/buildScripts/createApp.mjs +2 -2
  66. package/examples/table/cellEditing/MainContainer.mjs +1 -1
  67. package/examples/table/container/MainContainer.mjs +3 -3
  68. package/examples/table/nestedRecordFields/Viewport.mjs +6 -6
  69. package/examples/tableFiltering/MainContainer.mjs +1 -1
  70. package/examples/tablePerformance/MainContainer.mjs +1 -1
  71. package/examples/tablePerformance/MainContainer2.mjs +1 -1
  72. package/examples/tablePerformance/MainContainer3.mjs +2 -2
  73. package/examples/tableStore/MainContainer.mjs +2 -2
  74. package/learn/Glossary.md +261 -0
  75. package/learn/UsingTheseTopics.md +2 -2
  76. package/learn/benefits/ConfigSystem.md +538 -28
  77. package/learn/benefits/Effort.md +47 -2
  78. package/learn/benefits/Features.md +50 -32
  79. package/learn/benefits/FormsEngine.md +68 -38
  80. package/learn/benefits/MultiWindow.md +33 -7
  81. package/learn/benefits/OffTheMainThread.md +2 -2
  82. package/learn/benefits/Quick.md +45 -12
  83. package/learn/benefits/RPCLayer.md +75 -0
  84. package/learn/benefits/Speed.md +16 -11
  85. package/learn/gettingstarted/ComponentModels.md +4 -4
  86. package/learn/gettingstarted/Config.md +6 -6
  87. package/learn/gettingstarted/DescribingTheUI.md +4 -4
  88. package/learn/gettingstarted/Events.md +6 -6
  89. package/learn/gettingstarted/Extending.md +4 -4
  90. package/learn/gettingstarted/References.md +6 -6
  91. package/learn/gettingstarted/Workspaces.md +6 -6
  92. package/learn/guides/ApplicationBootstrap.md +26 -26
  93. package/learn/guides/ComponentsAndContainers.md +12 -12
  94. package/learn/guides/ConfigSystemDeepDive.md +280 -0
  95. package/learn/guides/CustomComponents.md +2 -2
  96. package/learn/guides/DeclarativeComponentTreesVsImperativeVdom.md +17 -17
  97. package/learn/guides/InstanceLifecycle.md +295 -1
  98. package/learn/guides/MainThreadAddons.md +475 -0
  99. package/learn/guides/PortalApp.md +2 -2
  100. package/learn/guides/StateProviders.md +12 -12
  101. package/learn/guides/WorkingWithVDom.md +14 -14
  102. package/learn/guides/events/CustomEvents.md +16 -16
  103. package/learn/guides/events/DomEvents.md +12 -12
  104. package/learn/javascript/ClassFeatures.md +3 -2
  105. package/learn/javascript/Classes.md +8 -8
  106. package/learn/javascript/NewNode.md +4 -4
  107. package/learn/javascript/Overrides.md +8 -8
  108. package/learn/javascript/Super.md +10 -8
  109. package/learn/tree.json +52 -51
  110. package/learn/tutorials/Earthquakes.md +54 -57
  111. package/learn/tutorials/TodoList.md +4 -4
  112. package/package.json +2 -2
  113. package/resources/scss/src/apps/portal/learn/ContentComponent.scss +12 -0
  114. package/resources/scss/src/table/{View.scss → Body.scss} +1 -1
  115. package/resources/scss/src/table/plugin/CellEditing.scss +1 -1
  116. package/resources/scss/theme-dark/table/{View.scss → Body.scss} +1 -1
  117. package/resources/scss/theme-light/table/{View.scss → Body.scss} +1 -1
  118. package/resources/scss/theme-neo-light/Global.scss +1 -2
  119. package/resources/scss/theme-neo-light/table/{View.scss → Body.scss} +1 -1
  120. package/src/DefaultConfig.mjs +2 -2
  121. package/src/Main.mjs +8 -7
  122. package/src/Neo.mjs +16 -2
  123. package/src/button/Base.mjs +2 -2
  124. package/src/calendar/view/SettingsContainer.mjs +2 -2
  125. package/src/calendar/view/YearComponent.mjs +9 -9
  126. package/src/calendar/view/calendars/ColorsList.mjs +1 -1
  127. package/src/calendar/view/calendars/List.mjs +1 -1
  128. package/src/calendar/view/month/Component.mjs +15 -15
  129. package/src/calendar/view/week/Component.mjs +12 -12
  130. package/src/calendar/view/week/EventDragZone.mjs +4 -4
  131. package/src/calendar/view/week/TimeAxisComponent.mjs +3 -3
  132. package/src/component/Base.mjs +17 -2
  133. package/src/component/Carousel.mjs +2 -2
  134. package/src/component/Chip.mjs +3 -3
  135. package/src/component/Circle.mjs +2 -2
  136. package/src/component/DateSelector.mjs +8 -8
  137. package/src/component/Helix.mjs +1 -1
  138. package/src/component/Label.mjs +3 -18
  139. package/src/component/Legend.mjs +3 -3
  140. package/src/component/MagicMoveText.mjs +6 -14
  141. package/src/component/Process.mjs +3 -3
  142. package/src/component/Progress.mjs +1 -1
  143. package/src/component/StatusBadge.mjs +2 -2
  144. package/src/component/Timer.mjs +2 -2
  145. package/src/component/Toast.mjs +5 -3
  146. package/src/container/AccordionItem.mjs +2 -2
  147. package/src/container/Base.mjs +1 -1
  148. package/src/core/Base.mjs +77 -14
  149. package/src/core/Util.mjs +14 -2
  150. package/src/date/DayViewComponent.mjs +2 -2
  151. package/src/date/SelectorContainer.mjs +1 -1
  152. package/src/draggable/grid/header/toolbar/SortZone.mjs +21 -21
  153. package/src/draggable/table/header/toolbar/SortZone.mjs +1 -1
  154. package/src/form/field/CheckBox.mjs +4 -4
  155. package/src/form/field/FileUpload.mjs +25 -39
  156. package/src/form/field/Range.mjs +1 -1
  157. package/src/form/field/Text.mjs +3 -3
  158. package/src/form/field/TextArea.mjs +2 -3
  159. package/src/grid/Body.mjs +8 -5
  160. package/src/grid/_export.mjs +1 -1
  161. package/src/list/Color.mjs +2 -2
  162. package/src/main/DeltaUpdates.mjs +157 -98
  163. package/src/main/addon/AmCharts.mjs +61 -84
  164. package/src/main/addon/Base.mjs +161 -42
  165. package/src/main/addon/GoogleMaps.mjs +9 -16
  166. package/src/main/addon/HighlightJS.mjs +2 -13
  167. package/src/main/addon/IntersectionObserver.mjs +21 -21
  168. package/src/main/addon/MonacoEditor.mjs +32 -64
  169. package/src/manager/ClassHierarchy.mjs +114 -0
  170. package/src/menu/List.mjs +1 -1
  171. package/src/plugin/Popover.mjs +2 -2
  172. package/src/sitemap/Component.mjs +1 -1
  173. package/src/table/{View.mjs → Body.mjs} +25 -22
  174. package/src/table/Container.mjs +43 -43
  175. package/src/table/_export.mjs +2 -2
  176. package/src/table/plugin/CellEditing.mjs +19 -19
  177. package/src/tooltip/Base.mjs +1 -6
  178. package/src/tree/Accordion.mjs +3 -3
  179. package/src/vdom/Helper.mjs +19 -22
  180. package/src/worker/App.mjs +1 -2
  181. package/src/worker/Base.mjs +7 -5
  182. package/src/worker/Canvas.mjs +2 -3
  183. package/src/worker/Data.mjs +5 -7
  184. package/src/worker/Task.mjs +2 -3
  185. package/src/worker/VDom.mjs +3 -4
  186. package/src/worker/mixin/RemoteMethodAccess.mjs +5 -2
  187. package/learn/guides/MainThreadAddonExample.md +0 -15
  188. package/learn/guides/MainThreadAddonIntro.md +0 -44
@@ -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 = ' '
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,12 +80,28 @@ 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
86
94
  * @protected
87
95
  */
88
96
  isConstructed: false,
97
+ /**
98
+ * The config will get set to `true` once the Promise of `async initAsync()` is resolved.
99
+ * You can use `afterSetIsReady()` to get notified once the ready state is reached.
100
+ * Since not all classes use the Observable mixin, Neo will not fire an event.
101
+ * method body.
102
+ * @member {Boolean} isReady=false
103
+ */
104
+ isReady_: false,
89
105
  /**
90
106
  * Add mixins as an array of classNames, imported modules or a mixed version
91
107
  * @member {String[]|Neo.core.Base[]|null} mixins=null
@@ -96,7 +112,17 @@ class Base {
96
112
  * @member {Class} module=null
97
113
  * @protected
98
114
  */
99
- module: null
115
+ module: null,
116
+ /**
117
+ * Remote method access for other threads. Example use case:
118
+ * remote: {app: ['myRemoteMethod']}
119
+ *
120
+ * ONLY supported for singletons.
121
+ *
122
+ * @member {Object|null} remote_=null
123
+ * @protected
124
+ */
125
+ remote_: null
100
126
  }
101
127
 
102
128
  /**
@@ -154,7 +180,11 @@ class Base {
154
180
  */
155
181
  intercept(me, 'destroy', me.isDestroyedCheck, me);
156
182
 
157
- me.remote && setTimeout(me.initRemote.bind(me), 1)
183
+ // Triggers async logic after the construction chain is done.
184
+ Promise.resolve().then(async () => {
185
+ await me.initAsync();
186
+ me.isReady = true
187
+ })
158
188
  }
159
189
 
160
190
  /**
@@ -181,7 +211,7 @@ class Base {
181
211
  if (hasManager) {
182
212
  Neo.manager.Instance.register(me);
183
213
  } else {
184
- Neo.idMap = Neo.idMap || {};
214
+ Neo.idMap ??= {};
185
215
  Neo.idMap[me.id] = me
186
216
  }
187
217
  }
@@ -255,6 +285,24 @@ class Base {
255
285
  return value
256
286
  }
257
287
 
288
+ /**
289
+ * Triggered before the remote config gets changed
290
+ * @param {Object|null} value
291
+ * @param {Object|null} oldValue
292
+ * @returns {Object|null}
293
+ * @protected
294
+ */
295
+ beforeSetRemote(value, oldValue) {
296
+ let me = this;
297
+
298
+ // Only allow remote access for singletons or main thread addons
299
+ if (value && !me.singleton && !me.isMainThreadAddon) {
300
+ throw new Error('Remote method access is only functional for Singleton classes ' + me.className)
301
+ }
302
+
303
+ return value
304
+ }
305
+
258
306
  /**
259
307
  * @param {String} fn The name of a function to find in the passed scope object.
260
308
  * @param {Object} originName The name of the method inside the originScope.
@@ -367,11 +415,23 @@ class Base {
367
415
 
368
416
  /**
369
417
  * Gets triggered after onConstructed() is done
370
- * @see {@link Neo.core.Base#onConstructed onConstructed}
371
- * @tutorial 02_ClassSystem
372
418
  */
373
419
  init() {}
374
420
 
421
+ /**
422
+ * You can use this method in subclasses to perform asynchronous initialization logic.
423
+ * Make sure to use the parent call `await super.initAsync()` at the beginning of their implementations,
424
+ * or the registration of remote methods will get delayed.
425
+ *
426
+ * A common use case is requiring conditional or optional dynamic imports or fetching initial data.
427
+ *
428
+ * Once the promise returned by this method is fulfilled, the `isReady` config will be set to `true`.
429
+ * @returns {Promise<void>} A promise that resolves when the asynchronous initialization is complete.
430
+ */
431
+ async initAsync() {
432
+ this.remote && this.initRemote()
433
+ }
434
+
375
435
  /**
376
436
  * Applies all class configs to this instance
377
437
  * @param {Object} config
@@ -393,19 +453,14 @@ class Base {
393
453
  * @protected
394
454
  */
395
455
  initRemote() {
396
- let me = this,
397
- {className, remote} = me,
456
+ let {className, remote} = this,
398
457
  {currentWorker} = Neo;
399
458
 
400
- if (!me.singleton && !me.isMainThreadAddon) {
401
- throw new Error('Remote method access is only functional for Singleton classes ' + className)
402
- }
403
-
404
- if (!Neo.config.unitTestMode && Neo.isObject(remote)) {
459
+ if (!Neo.config.unitTestMode) {
405
460
  if (Neo.workerId !== 'main' && currentWorker.isSharedWorker && !currentWorker.isConnected) {
406
461
  currentWorker.on('connected', () => {
407
462
  Base.sendRemotes(className, remote)
408
- }, me, {once: true})
463
+ }, this, {once: true})
409
464
  } else {
410
465
  Base.sendRemotes(className, remote)
411
466
  }
@@ -456,10 +511,18 @@ class Base {
456
511
 
457
512
  /**
458
513
  * Gets triggered after all constructors are done
459
- * @tutorial 02_ClassSystem
460
514
  */
461
515
  onConstructed() {}
462
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
+
463
526
  /**
464
527
  * Helper method to replace string based values containing "@config:" with the matching config value
465
528
  * of this instance.
package/src/core/Util.mjs CHANGED
@@ -175,7 +175,18 @@ class Util extends Base {
175
175
  * @returns {Boolean}
176
176
  */
177
177
  static isObject(value) {
178
- return value?.constructor?.name === 'Object' || false
178
+ return value?.constructor?.name === 'Object'
179
+ }
180
+
181
+ /**
182
+ * Returns true if the passed value is a promise.
183
+ * We are intentionally not checking for `value instanceof Promise`,
184
+ * to support any "thenable" objects for flexibility.
185
+ * @param {Object} value The value to test
186
+ * @returns {Boolean}
187
+ */
188
+ static isPromise(value) {
189
+ return typeof value?.then === 'function'
179
190
  }
180
191
 
181
192
  /**
@@ -184,7 +195,7 @@ class Util extends Base {
184
195
  * @returns {Boolean}
185
196
  */
186
197
  static isRecord(value) {
187
- return value?.constructor?.name === 'Record' || false
198
+ return value?.constructor?.name === 'Record'
188
199
  }
189
200
 
190
201
  /**
@@ -233,6 +244,7 @@ Neo.applyFromNs(Neo, Util, {
233
244
  isFunction : 'isFunction',
234
245
  isNumber : 'isNumber',
235
246
  isObject : 'isObject',
247
+ isPromise : 'isPromise',
236
248
  isRecord : 'isRecord',
237
249
  isString : 'isString',
238
250
  toArray : 'toArray'
@@ -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
 
@@ -54,15 +54,15 @@ class SortZone extends BaseSortZone {
54
54
 
55
55
  let me = this,
56
56
  grid = me.owner.parent,
57
- {view} = grid,
58
- gridRows = view.getVdomRoot().cn,
57
+ {body} = grid,
58
+ bodyWrapperId = Neo.getId('grid-body-wrapper'),
59
+ gridRows = body.getVdomRoot().cn,
59
60
  columnIndex = me.dragElement['aria-colindex'] - 1,
60
- {dataField} = view.columnPositions.getAt(columnIndex),
61
- cells = view.getColumnCells(dataField),
61
+ {dataField} = body.columnPositions.getAt(columnIndex),
62
+ cells = body.getColumnCells(dataField),
62
63
  rows = [],
63
64
  config = await super.createDragProxy(data, false),
64
65
  rect = await grid.getDomRect(),
65
- viewWrapperId = Neo.getId('grid-view-wrapper'),
66
66
  row;
67
67
 
68
68
  config.cls = ['neo-grid-wrapper', me.owner.getTheme()];
@@ -85,9 +85,9 @@ class SortZone extends BaseSortZone {
85
85
  {cn: [
86
86
  {cls: ['neo-grid-container'], cn: [
87
87
  {...config.vdom, cls: ['neo-grid-header-toolbar', 'neo-toolbar']},
88
- {cls: ['neo-grid-view-wrapper'], id: viewWrapperId, cn: [
89
- {cls: ['neo-grid-view'], cn: rows},
90
- {cls: ['neo-grid-scrollbar'], style: {height: view.vdom.cn[0].height}}
88
+ {cls: ['neo-grid-body-wrapper'], id: bodyWrapperId, cn: [
89
+ {cls: ['neo-grid-body'], cn: rows},
90
+ {cls: ['neo-grid-scrollbar'], style: {height: body.vdom.cn[0].height}}
91
91
  ]}
92
92
  ]}
93
93
  ]};
@@ -95,8 +95,8 @@ class SortZone extends BaseSortZone {
95
95
  config.listeners = {
96
96
  mounted() {
97
97
  Neo.main.DomAccess.scrollTo({
98
- id : viewWrapperId,
99
- value : view.scrollTop,
98
+ id : bodyWrapperId,
99
+ value : body.scrollTop,
100
100
  windowId: this.windowId
101
101
  })
102
102
  }
@@ -133,11 +133,11 @@ class SortZone extends BaseSortZone {
133
133
  owner.updateDepth = 2;
134
134
  owner.update();
135
135
 
136
- await owner.passSizeToView();
136
+ await owner.passSizeToBody();
137
137
 
138
138
  await this.timeout(20);
139
139
 
140
- owner.parent.view.createViewData()
140
+ owner.parent.body.createViewData()
141
141
  }
142
142
 
143
143
  /**
@@ -148,11 +148,11 @@ class SortZone extends BaseSortZone {
148
148
 
149
149
  if (this.moveColumnContent) {
150
150
  let me = this,
151
- {view} = me.owner.parent,
151
+ {body} = me.owner.parent,
152
152
  columnIndex = me.dragElement['aria-colindex'] - 1,
153
- columnPosition = view.columnPositions.getAt(columnIndex),
153
+ columnPosition = body.columnPositions.getAt(columnIndex),
154
154
  {dataField} = columnPosition,
155
- cells = view.getColumnCells(dataField);
155
+ cells = body.getColumnCells(dataField);
156
156
 
157
157
  columnPosition.hidden = true;
158
158
 
@@ -160,7 +160,7 @@ class SortZone extends BaseSortZone {
160
160
  cell.style.visibility = 'hidden'
161
161
  });
162
162
 
163
- view.update()
163
+ body.update()
164
164
  }
165
165
  }
166
166
 
@@ -174,12 +174,12 @@ class SortZone extends BaseSortZone {
174
174
  if (this.moveColumnContent) {
175
175
  let me = this,
176
176
  {itemRects} = me,
177
- {view} = me.owner.parent,
178
- {columnPositions} = view,
177
+ {body} = me.owner.parent,
178
+ {columnPositions} = body,
179
179
  column1Position = columnPositions.getAt(index1),
180
180
  column2Position = columnPositions.getAt(index2),
181
- column1Cells = view.getColumnCells(column1Position.dataField),
182
- column2Cells = view.getColumnCells(column2Position.dataField);
181
+ column1Cells = body.getColumnCells(column1Position.dataField),
182
+ column2Cells = body.getColumnCells(column2Position.dataField);
183
183
 
184
184
  Object.assign(column1Position, {
185
185
  width: itemRects[index2].width,
@@ -203,7 +203,7 @@ class SortZone extends BaseSortZone {
203
203
  node.style.width = column2Position.width + 'px'
204
204
  });
205
205
 
206
- view.update()
206
+ body.update()
207
207
  }
208
208
  }
209
209
  }
@@ -63,7 +63,7 @@ class SortZone extends BaseSortZone {
63
63
  owner.updateDepth = 2;
64
64
  owner.update();
65
65
 
66
- owner.parent.view.createViewData()
66
+ owner.parent.body.createViewData()
67
67
  }
68
68
  }
69
69
 
@@ -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;