neo.mjs 10.0.0-beta.5 → 10.0.0

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 (491) hide show
  1. package/.github/RELEASE_NOTES/v10.0.0-beta.1.md +20 -0
  2. package/.github/RELEASE_NOTES/v10.0.0-beta.2.md +73 -0
  3. package/.github/RELEASE_NOTES/v10.0.0-beta.3.md +39 -0
  4. package/.github/RELEASE_NOTES/v10.0.0-beta.5.md +70 -0
  5. package/.github/RELEASE_NOTES/v10.0.0-beta.6.md +48 -0
  6. package/.github/RELEASE_NOTES/v10.0.0.md +52 -0
  7. package/.github/epic-functional-components.md +498 -0
  8. package/.github/ticket-asymmetric-vdom-updates.md +122 -0
  9. package/README.md +0 -3
  10. package/ServiceWorker.mjs +2 -2
  11. package/apps/colors/store/Colors.mjs +1 -0
  12. package/apps/colors/view/GridContainer.mjs +3 -0
  13. package/apps/colors/view/HeaderToolbar.mjs +2 -0
  14. package/apps/colors/view/Viewport.mjs +3 -0
  15. package/apps/covid/view/FooterContainer.mjs +3 -0
  16. package/apps/covid/view/GalleryContainer.mjs +2 -0
  17. package/apps/covid/view/GalleryContainerController.mjs +1 -0
  18. package/apps/covid/view/HeaderContainer.mjs +2 -0
  19. package/apps/covid/view/HelixContainer.mjs +2 -0
  20. package/apps/covid/view/HelixContainerController.mjs +1 -0
  21. package/apps/covid/view/MainContainer.mjs +3 -0
  22. package/apps/covid/view/TableContainer.mjs +3 -0
  23. package/apps/covid/view/TableContainerController.mjs +1 -0
  24. package/apps/covid/view/WorldMapContainer.mjs +2 -0
  25. package/apps/covid/view/country/Gallery.mjs +3 -0
  26. package/apps/covid/view/country/Helix.mjs +8 -0
  27. package/apps/covid/view/country/HistoricalDataTable.mjs +1 -0
  28. package/apps/covid/view/country/Table.mjs +2 -0
  29. package/apps/covid/view/mapboxGl/Component.mjs +1 -0
  30. package/apps/covid/view/mapboxGl/Container.mjs +2 -0
  31. package/apps/email/EPIC_PLAN.md +58 -0
  32. package/apps/email/neo-config.json +2 -2
  33. package/apps/email/store/Emails.mjs +11 -1
  34. package/apps/email/view/ComposeView.mjs +44 -0
  35. package/apps/email/view/MainView.mjs +89 -0
  36. package/apps/email/view/Viewport.mjs +4 -33
  37. package/apps/email/view/ViewportStateProvider.mjs +3 -3
  38. package/apps/form/store/SideNav.mjs +1 -0
  39. package/apps/form/view/FormContainer.mjs +1 -0
  40. package/apps/form/view/FormPageContainer.mjs +2 -0
  41. package/apps/form/view/SideNavList.mjs +1 -0
  42. package/apps/form/view/Viewport.mjs +3 -0
  43. package/apps/portal/childapps/preview/MainContainer.mjs +1 -0
  44. package/apps/portal/index.html +1 -1
  45. package/apps/portal/store/BlogPosts.mjs +2 -0
  46. package/apps/portal/store/Content.mjs +1 -0
  47. package/apps/portal/store/ContentSections.mjs +1 -0
  48. package/apps/portal/store/Examples.mjs +1 -0
  49. package/apps/portal/view/HeaderToolbar.mjs +1 -0
  50. package/apps/portal/view/Viewport.mjs +5 -0
  51. package/apps/portal/view/ViewportController.mjs +11 -3
  52. package/apps/portal/view/about/Container.mjs +2 -0
  53. package/apps/portal/view/about/MemberContainer.mjs +7 -0
  54. package/apps/portal/view/blog/Container.mjs +2 -0
  55. package/apps/portal/view/blog/List.mjs +2 -0
  56. package/apps/portal/view/examples/List.mjs +29 -19
  57. package/apps/portal/view/examples/TabContainer.mjs +4 -0
  58. package/apps/portal/view/home/ContentBox.mjs +3 -0
  59. package/apps/portal/view/home/FeatureSection.mjs +8 -0
  60. package/apps/portal/view/home/FooterContainer.mjs +4 -1
  61. package/apps/portal/view/home/MainContainer.mjs +2 -0
  62. package/apps/portal/view/home/parts/AfterMath.mjs +2 -0
  63. package/apps/portal/view/home/parts/BaseContainer.mjs +1 -0
  64. package/apps/portal/view/home/parts/Colors.mjs +4 -0
  65. package/apps/portal/view/home/parts/Features.mjs +2 -0
  66. package/apps/portal/view/home/parts/Helix.mjs +5 -0
  67. package/apps/portal/view/home/parts/How.mjs +4 -0
  68. package/apps/portal/view/home/parts/MainNeo.mjs +1 -0
  69. package/apps/portal/view/home/parts/References.mjs +2 -0
  70. package/apps/portal/view/learn/ContentComponent.mjs +11 -5
  71. package/apps/portal/view/learn/ContentTreeList.mjs +2 -0
  72. package/apps/portal/view/learn/CubeLayoutButton.mjs +1 -0
  73. package/apps/portal/view/learn/MainContainer.mjs +4 -0
  74. package/apps/portal/view/learn/PageContainer.mjs +2 -0
  75. package/apps/portal/view/learn/PageSectionsContainer.mjs +3 -0
  76. package/apps/portal/view/learn/PageSectionsList.mjs +1 -0
  77. package/apps/portal/view/services/Component.mjs +1 -0
  78. package/apps/realworld/api/Base.mjs +1 -0
  79. package/apps/realworld/view/HeaderComponent.mjs +4 -0
  80. package/apps/realworld/view/HomeComponent.mjs +7 -0
  81. package/apps/realworld/view/MainContainer.mjs +2 -0
  82. package/apps/realworld/view/MainContainerController.mjs +2 -0
  83. package/apps/realworld/view/article/CommentComponent.mjs +3 -0
  84. package/apps/realworld/view/article/Component.mjs +17 -10
  85. package/apps/realworld/view/article/CreateCommentComponent.mjs +2 -0
  86. package/apps/realworld/view/article/CreateComponent.mjs +5 -0
  87. package/apps/realworld/view/article/PreviewComponent.mjs +9 -0
  88. package/apps/realworld/view/article/TagListComponent.mjs +2 -0
  89. package/apps/realworld/view/user/ProfileComponent.mjs +7 -0
  90. package/apps/realworld/view/user/SettingsComponent.mjs +5 -0
  91. package/apps/realworld/view/user/SignUpComponent.mjs +3 -0
  92. package/apps/realworld2/api/Base.mjs +1 -0
  93. package/apps/realworld2/view/FooterComponent.mjs +1 -0
  94. package/apps/realworld2/view/HeaderToolbar.mjs +3 -0
  95. package/apps/realworld2/view/HomeContainer.mjs +1 -0
  96. package/apps/realworld2/view/MainContainer.mjs +2 -0
  97. package/apps/realworld2/view/MainContainerController.mjs +1 -0
  98. package/apps/realworld2/view/article/Helix.mjs +1 -0
  99. package/apps/realworld2/view/article/PreviewComponent.mjs +9 -0
  100. package/apps/realworld2/view/article/PreviewList.mjs +1 -0
  101. package/apps/realworld2/view/article/TagListComponent.mjs +2 -0
  102. package/apps/route/view/CenterContainer.mjs +1 -0
  103. package/apps/route/view/MainView.mjs +1 -0
  104. package/apps/sharedcovid/childapps/sharedcovidchart/MainContainer.mjs +1 -0
  105. package/apps/sharedcovid/childapps/sharedcovidgallery/MainContainer.mjs +1 -0
  106. package/apps/sharedcovid/childapps/sharedcovidhelix/MainContainer.mjs +1 -0
  107. package/apps/sharedcovid/childapps/sharedcovidmap/MainContainer.mjs +1 -0
  108. package/apps/sharedcovid/view/FooterContainer.mjs +3 -0
  109. package/apps/sharedcovid/view/GalleryContainer.mjs +2 -0
  110. package/apps/sharedcovid/view/GalleryContainerController.mjs +1 -0
  111. package/apps/sharedcovid/view/HeaderContainer.mjs +2 -0
  112. package/apps/sharedcovid/view/HelixContainer.mjs +2 -0
  113. package/apps/sharedcovid/view/HelixContainerController.mjs +1 -0
  114. package/apps/sharedcovid/view/MainContainer.mjs +3 -0
  115. package/apps/sharedcovid/view/TableContainer.mjs +3 -0
  116. package/apps/sharedcovid/view/TableContainerController.mjs +1 -0
  117. package/apps/sharedcovid/view/WorldMapContainer.mjs +2 -0
  118. package/apps/sharedcovid/view/country/Gallery.mjs +3 -0
  119. package/apps/sharedcovid/view/country/Helix.mjs +8 -0
  120. package/apps/sharedcovid/view/country/HistoricalDataTable.mjs +1 -0
  121. package/apps/sharedcovid/view/country/Table.mjs +2 -0
  122. package/apps/sharedcovid/view/mapboxGl/Component.mjs +1 -0
  123. package/apps/sharedcovid/view/mapboxGl/Container.mjs +2 -0
  124. package/apps/shareddialog/childapps/shareddialog2/view/MainContainer.mjs +2 -0
  125. package/apps/shareddialog/view/DemoDialog.mjs +2 -0
  126. package/apps/shareddialog/view/MainContainer.mjs +2 -0
  127. package/apps/shareddialog/view/MainContainerController.mjs +1 -0
  128. package/buildScripts/addReactiveTags.mjs +191 -0
  129. package/buildScripts/checkReactiveTags.mjs +160 -0
  130. package/docs/app/store/Api.mjs +1 -0
  131. package/docs/app/store/Examples.mjs +1 -0
  132. package/docs/app/view/ApiTreeList.mjs +1 -0
  133. package/docs/app/view/ContentTabContainer.mjs +2 -0
  134. package/docs/app/view/ExamplesTreeList.mjs +2 -0
  135. package/docs/app/view/HeaderContainer.mjs +3 -0
  136. package/docs/app/view/MainContainer.mjs +5 -0
  137. package/docs/app/view/classdetails/HeaderComponent.mjs +1 -0
  138. package/docs/app/view/classdetails/MainContainer.mjs +3 -0
  139. package/docs/app/view/classdetails/MembersList.mjs +5 -0
  140. package/docs/app/view/classdetails/SourceViewComponent.mjs +2 -0
  141. package/examples/ConfigurationViewport.mjs +14 -8
  142. package/examples/calendar/weekview/MainContainer.mjs +4 -0
  143. package/examples/component/coronaGallery/CountryGallery.mjs +2 -0
  144. package/examples/component/coronaGallery/CountryStore.mjs +1 -0
  145. package/examples/component/coronaGallery/Viewport.mjs +3 -0
  146. package/examples/component/coronaGallery/ViewportController.mjs +1 -0
  147. package/examples/component/coronaHelix/CountryHelix.mjs +7 -0
  148. package/examples/component/coronaHelix/MainContainer.mjs +1 -0
  149. package/examples/component/gallery/ImageStore.mjs +1 -0
  150. package/examples/component/helix/ImageStore.mjs +1 -0
  151. package/examples/component/helix/Viewport.mjs +3 -0
  152. package/examples/component/helix/ViewportController.mjs +1 -0
  153. package/examples/component/multiWindowCoronaGallery/childapp/Viewport.mjs +1 -0
  154. package/examples/component/multiWindowHelix/childapp/Viewport.mjs +1 -0
  155. package/examples/component/wrapper/googleMaps/MapComponent.mjs +2 -0
  156. package/examples/core/config/MainContainer.mjs +2 -0
  157. package/examples/dialog/DemoDialog.mjs +2 -0
  158. package/examples/dialog/MainContainer.mjs +1 -0
  159. package/examples/form/field/color/MainStore.mjs +1 -0
  160. package/examples/functional/button/base/MainContainer.mjs +207 -0
  161. package/examples/functional/button/base/app.mjs +6 -0
  162. package/examples/functional/button/base/index.html +11 -0
  163. package/examples/functional/button/base/neo-config.json +6 -0
  164. package/examples/functional/defineComponent/Component.mjs +18 -0
  165. package/examples/functional/defineComponent/MainContainer.mjs +41 -0
  166. package/examples/functional/defineComponent/app.mjs +6 -0
  167. package/examples/functional/defineComponent/index.html +11 -0
  168. package/examples/functional/defineComponent/neo-config.json +6 -0
  169. package/examples/functional/hostComponent/Component.mjs +32 -0
  170. package/examples/functional/hostComponent/MainContainer.mjs +48 -0
  171. package/examples/functional/hostComponent/app.mjs +6 -0
  172. package/examples/functional/hostComponent/index.html +11 -0
  173. package/examples/functional/hostComponent/neo-config.json +6 -0
  174. package/examples/grid/animatedRowSorting/Viewport.mjs +1 -1
  175. package/examples/grid/bigData/ControlsContainer.mjs +3 -0
  176. package/examples/grid/bigData/GridContainer.mjs +4 -2
  177. package/examples/grid/bigData/MainContainer.mjs +2 -0
  178. package/examples/grid/bigData/MainModel.mjs +1 -0
  179. package/examples/grid/bigData/MainStore.mjs +3 -0
  180. package/examples/grid/cellEditing/MainContainer.mjs +1 -1
  181. package/examples/grid/container/MainContainer.mjs +1 -1
  182. package/examples/grid/covid/GridContainer.mjs +3 -0
  183. package/examples/grid/covid/MainContainer.mjs +2 -0
  184. package/examples/grid/covid/Store.mjs +1 -0
  185. package/examples/grid/nestedRecordFields/EditUserDialog.mjs +3 -0
  186. package/examples/grid/nestedRecordFields/Viewport.mjs +3 -1
  187. package/examples/list/animate/List.mjs +4 -0
  188. package/examples/list/animate/MainContainer.mjs +2 -0
  189. package/examples/list/circle/MainStore.mjs +1 -0
  190. package/examples/list/color/MainStore.mjs +1 -0
  191. package/examples/preloadingAssets/view/MainContainer.mjs +2 -0
  192. package/examples/stateProvider/advanced/MainContainer.mjs +1 -0
  193. package/examples/stateProvider/dialog/EditUserDialog.mjs +2 -0
  194. package/examples/stateProvider/dialog/MainContainer.mjs +1 -0
  195. package/examples/stateProvider/extendedClass/MainContainer.mjs +2 -0
  196. package/examples/stateProvider/inline/MainContainer.mjs +1 -0
  197. package/examples/stateProvider/inlineNoStateProvider/MainContainer.mjs +1 -0
  198. package/examples/stateProvider/inlineNoStateProvider/MainContainerController.mjs +2 -0
  199. package/examples/stateProvider/multiWindow/EditUserDialog.mjs +3 -0
  200. package/examples/stateProvider/multiWindow/MainContainer.mjs +1 -0
  201. package/examples/stateProvider/multiWindow/Viewport.mjs +1 -0
  202. package/examples/stateProvider/nestedData/MainContainer.mjs +1 -0
  203. package/examples/stateProvider/table/MainContainer.mjs +1 -0
  204. package/examples/table/covid/MainContainer.mjs +2 -0
  205. package/examples/table/covid/Store.mjs +1 -0
  206. package/examples/table/covid/TableContainer.mjs +3 -0
  207. package/examples/table/nestedRecordFields/EditUserDialog.mjs +3 -0
  208. package/examples/table/nestedRecordFields/Viewport.mjs +1 -0
  209. package/examples/todoList/version1/MainComponent.mjs +1 -1
  210. package/examples/toolbar/breadcrumb/view/MainContainer.mjs +2 -0
  211. package/examples/toolbar/paging/store/Users.mjs +1 -0
  212. package/examples/toolbar/paging/view/AddUserDialog.mjs +3 -0
  213. package/examples/toolbar/paging/view/MainContainer.mjs +3 -0
  214. package/examples/treeAccordion/MainContainer.mjs +2 -2
  215. package/examples/worker/task/MainContainer.mjs +1 -0
  216. package/learn/Glossary.md +1 -0
  217. package/learn/UsingTheseTopics.md +1 -0
  218. package/learn/benefits/ConfigSystem.md +2 -0
  219. package/learn/benefits/Effort.md +1 -0
  220. package/learn/benefits/Features.md +1 -0
  221. package/learn/benefits/FormsEngine.md +1 -0
  222. package/learn/benefits/FourEnvironments.md +2 -0
  223. package/learn/benefits/Introduction.md +2 -0
  224. package/learn/benefits/MultiWindow.md +3 -1
  225. package/learn/benefits/OffTheMainThread.md +2 -0
  226. package/learn/benefits/Quick.md +2 -0
  227. package/learn/benefits/RPCLayer.md +2 -0
  228. package/learn/benefits/Speed.md +2 -0
  229. package/learn/blog/v10-deep-dive-functional-components.md +293 -0
  230. package/learn/blog/v10-deep-dive-reactivity.md +522 -0
  231. package/learn/blog/v10-deep-dive-state-provider.md +432 -0
  232. package/learn/blog/v10-deep-dive-vdom-revolution.md +194 -0
  233. package/learn/blog/v10-post1-love-story.md +383 -0
  234. package/learn/comparisons/NeoVsAngular.md +90 -0
  235. package/learn/comparisons/NeoVsExtJs.md +178 -0
  236. package/learn/comparisons/NeoVsNextJs.md +124 -0
  237. package/learn/comparisons/NeoVsReact.md +95 -0
  238. package/learn/comparisons/NeoVsSolid.md +78 -0
  239. package/learn/comparisons/NeoVsVue.md +92 -0
  240. package/learn/comparisons/Overview.md +46 -0
  241. package/learn/gettingstarted/ComponentModels.md +2 -0
  242. package/learn/gettingstarted/Config.md +2 -0
  243. package/learn/gettingstarted/DescribingTheUI.md +2 -0
  244. package/learn/gettingstarted/Events.md +2 -0
  245. package/learn/gettingstarted/Extending.md +2 -0
  246. package/learn/gettingstarted/References.md +2 -0
  247. package/learn/gettingstarted/Setup.md +3 -2
  248. package/learn/gettingstarted/Workspaces.md +2 -0
  249. package/learn/guides/datahandling/Collections.md +1 -0
  250. package/learn/guides/datahandling/Records.md +1 -0
  251. package/learn/guides/datahandling/StateProviders.md +130 -16
  252. package/learn/guides/datahandling/Tables.md +1 -1
  253. package/learn/guides/fundamentals/ConfigSystemDeepDive.md +1 -0
  254. package/learn/guides/fundamentals/DeclarativeComponentTreesVsImperativeVdom.md +2 -0
  255. package/learn/guides/fundamentals/DeclarativeVDOMWithEffects.md +10 -8
  256. package/learn/guides/fundamentals/ExtendingNeoClasses.md +1 -0
  257. package/learn/guides/fundamentals/InstanceLifecycle.md +3 -1
  258. package/learn/guides/fundamentals/MainThreadAddons.md +2 -0
  259. package/learn/guides/specificfeatures/Mixins.md +3 -1
  260. package/learn/guides/specificfeatures/MultiWindow.md +3 -1
  261. package/learn/guides/specificfeatures/PortalApp.md +2 -0
  262. package/learn/guides/uibuildingblocks/ComponentsAndContainers.md +2 -0
  263. package/learn/guides/uibuildingblocks/CustomComponents.md +2 -0
  264. package/learn/guides/uibuildingblocks/Layouts.md +2 -0
  265. package/learn/guides/uibuildingblocks/WorkingWithVDom.md +28 -2
  266. package/learn/guides/userinteraction/Forms.md +2 -0
  267. package/learn/guides/userinteraction/events/CustomEvents.md +2 -1
  268. package/learn/guides/userinteraction/events/DomEvents.md +2 -0
  269. package/learn/javascript/ClassFeatures.md +4 -3
  270. package/learn/javascript/Classes.md +10 -13
  271. package/learn/javascript/Overrides.md +10 -6
  272. package/learn/javascript/Super.md +12 -8
  273. package/learn/tree.json +71 -64
  274. package/learn/tutorials/Earthquakes.md +2 -0
  275. package/learn/tutorials/RSP.md +3 -1
  276. package/learn/tutorials/TodoList.md +103 -7
  277. package/package.json +8 -6
  278. package/resources/scss/src/apps/email/ComposeView.scss +16 -0
  279. package/resources/scss/src/apps/email/MainView.scss +5 -0
  280. package/resources/scss/src/apps/portal/learn/ContentComponent.scss +5 -4
  281. package/src/DefaultConfig.mjs +12 -2
  282. package/src/Main.mjs +1 -0
  283. package/src/Neo.mjs +219 -166
  284. package/src/Xhr.mjs +1 -0
  285. package/src/button/Base.mjs +13 -0
  286. package/src/button/Effect.mjs +16 -2
  287. package/src/button/Split.mjs +2 -0
  288. package/src/calendar/store/Calendars.mjs +1 -0
  289. package/src/calendar/store/Colors.mjs +1 -0
  290. package/src/calendar/store/Events.mjs +1 -0
  291. package/src/calendar/view/DayComponent.mjs +2 -0
  292. package/src/calendar/view/EditEventContainer.mjs +4 -1
  293. package/src/calendar/view/MainContainer.mjs +13 -0
  294. package/src/calendar/view/MainContainerStateProvider.mjs +14 -28
  295. package/src/calendar/view/SettingsContainer.mjs +1 -0
  296. package/src/calendar/view/YearComponent.mjs +16 -0
  297. package/src/calendar/view/calendars/ColorsList.mjs +2 -0
  298. package/src/calendar/view/calendars/Container.mjs +2 -0
  299. package/src/calendar/view/calendars/EditContainer.mjs +1 -0
  300. package/src/calendar/view/month/Component.mjs +11 -0
  301. package/src/calendar/view/settings/GeneralContainer.mjs +1 -0
  302. package/src/calendar/view/settings/MonthContainer.mjs +1 -0
  303. package/src/calendar/view/settings/WeekContainer.mjs +1 -0
  304. package/src/calendar/view/settings/YearContainer.mjs +1 -0
  305. package/src/calendar/view/week/Component.mjs +15 -1
  306. package/src/calendar/view/week/TimeAxisComponent.mjs +4 -0
  307. package/src/code/LivePreview.mjs +51 -23
  308. package/src/collection/Base.mjs +7 -10
  309. package/src/collection/Filter.mjs +6 -0
  310. package/src/collection/Sorter.mjs +3 -0
  311. package/src/component/Abstract.mjs +412 -0
  312. package/src/component/Base.mjs +48 -1077
  313. package/src/component/Canvas.mjs +1 -0
  314. package/src/component/Chip.mjs +4 -0
  315. package/src/component/Circle.mjs +14 -0
  316. package/src/component/Clock.mjs +4 -0
  317. package/src/component/DateSelector.mjs +12 -0
  318. package/src/component/Gallery.mjs +11 -0
  319. package/src/component/Helix.mjs +24 -0
  320. package/src/component/Label.mjs +1 -0
  321. package/src/component/Legend.mjs +3 -0
  322. package/src/component/MagicMoveText.mjs +4 -0
  323. package/src/component/Progress.mjs +3 -0
  324. package/src/component/Splitter.mjs +3 -0
  325. package/src/component/StatusBadge.mjs +6 -0
  326. package/src/component/Timer.mjs +4 -0
  327. package/src/component/Toast.mjs +6 -0
  328. package/src/component/Video.mjs +1 -0
  329. package/src/component/mwc/Button.mjs +7 -0
  330. package/src/component/mwc/TextField.mjs +9 -0
  331. package/src/component/wrapper/AmChart.mjs +2 -0
  332. package/src/component/wrapper/GoogleMaps.mjs +3 -0
  333. package/src/component/wrapper/MapboxGL.mjs +5 -0
  334. package/src/component/wrapper/MonacoEditor.mjs +12 -0
  335. package/src/container/Accordion.mjs +2 -0
  336. package/src/container/Base.mjs +7 -3
  337. package/src/container/Panel.mjs +1 -0
  338. package/src/container/Viewport.mjs +1 -0
  339. package/src/controller/Application.mjs +1 -0
  340. package/src/controller/Base.mjs +1 -0
  341. package/src/controller/Component.mjs +1 -0
  342. package/src/core/Base.mjs +86 -33
  343. package/src/core/Compare.mjs +4 -7
  344. package/src/core/Config.mjs +65 -52
  345. package/src/core/Effect.mjs +86 -24
  346. package/src/core/EffectManager.mjs +117 -8
  347. package/src/core/IdGenerator.mjs +13 -44
  348. package/src/core/Observable.mjs +69 -65
  349. package/src/data/Model.mjs +2 -0
  350. package/src/data/Store.mjs +7 -0
  351. package/src/data/connection/WebSocket.mjs +2 -0
  352. package/src/date/DayViewComponent.mjs +2 -0
  353. package/src/date/SelectorContainer.mjs +14 -0
  354. package/src/dialog/Base.mjs +8 -0
  355. package/src/draggable/DragZone.mjs +5 -0
  356. package/src/draggable/tree/DragZone.mjs +1 -0
  357. package/src/filter/BooleanContainer.mjs +2 -0
  358. package/src/filter/NumberContainer.mjs +3 -0
  359. package/src/filter/ToggleOperatorsButton.mjs +2 -0
  360. package/src/form/Fieldset.mjs +6 -0
  361. package/src/form/field/Base.mjs +7 -0
  362. package/src/form/field/CheckBox.mjs +18 -0
  363. package/src/form/field/Chip.mjs +1 -0
  364. package/src/form/field/ComboBox.mjs +8 -0
  365. package/src/form/field/Country.mjs +1 -0
  366. package/src/form/field/Currency.mjs +2 -0
  367. package/src/form/field/Date.mjs +4 -0
  368. package/src/form/field/Display.mjs +1 -0
  369. package/src/form/field/Email.mjs +1 -0
  370. package/src/form/field/FileUpload.mjs +7 -0
  371. package/src/form/field/Hidden.mjs +1 -0
  372. package/src/form/field/Number.mjs +7 -0
  373. package/src/form/field/Password.mjs +1 -0
  374. package/src/form/field/Phone.mjs +3 -0
  375. package/src/form/field/Picker.mjs +2 -0
  376. package/src/form/field/Radio.mjs +1 -0
  377. package/src/form/field/Range.mjs +3 -0
  378. package/src/form/field/Search.mjs +2 -0
  379. package/src/form/field/Text.mjs +43 -5
  380. package/src/form/field/TextArea.mjs +7 -0
  381. package/src/form/field/Time.mjs +6 -0
  382. package/src/form/field/Url.mjs +3 -0
  383. package/src/form/field/ZipCode.mjs +2 -0
  384. package/src/form/field/trigger/Base.mjs +3 -0
  385. package/src/form/field/trigger/Clear.mjs +2 -0
  386. package/src/form/field/trigger/CopyToClipboard.mjs +2 -0
  387. package/src/form/field/trigger/Date.mjs +1 -0
  388. package/src/form/field/trigger/Picker.mjs +1 -0
  389. package/src/form/field/trigger/Search.mjs +1 -0
  390. package/src/form/field/trigger/SpinDown.mjs +2 -0
  391. package/src/form/field/trigger/SpinUp.mjs +1 -0
  392. package/src/form/field/trigger/Time.mjs +2 -0
  393. package/src/functional/_export.mjs +6 -0
  394. package/src/functional/button/Base.mjs +384 -0
  395. package/src/functional/component/Base.mjs +405 -0
  396. package/src/functional/defineComponent.mjs +102 -0
  397. package/src/functional/useConfig.mjs +52 -0
  398. package/src/functional/useEvent.mjs +43 -0
  399. package/src/grid/Body.mjs +20 -1
  400. package/src/grid/Container.mjs +50 -60
  401. package/src/grid/ScrollManager.mjs +2 -0
  402. package/src/grid/VerticalScrollbar.mjs +2 -0
  403. package/src/grid/column/Base.mjs +2 -0
  404. package/src/grid/header/Button.mjs +7 -0
  405. package/src/grid/header/Toolbar.mjs +6 -0
  406. package/src/grid/plugin/AnimateRows.mjs +2 -0
  407. package/src/layout/Base.mjs +3 -0
  408. package/src/layout/Card.mjs +1 -0
  409. package/src/layout/Cube.mjs +18 -4
  410. package/src/layout/Fit.mjs +1 -0
  411. package/src/layout/Flexbox.mjs +7 -0
  412. package/src/layout/Form.mjs +2 -0
  413. package/src/layout/Grid.mjs +1 -0
  414. package/src/layout/HBox.mjs +1 -0
  415. package/src/layout/VBox.mjs +1 -0
  416. package/src/list/Base.mjs +13 -0
  417. package/src/list/Chip.mjs +1 -0
  418. package/src/list/Circle.mjs +2 -0
  419. package/src/list/Color.mjs +1 -0
  420. package/src/list/plugin/Animate.mjs +2 -0
  421. package/src/main/DeltaUpdates.mjs +1 -0
  422. package/src/main/DomEvents.mjs +2 -0
  423. package/src/main/addon/CloneNode.mjs +1 -0
  424. package/src/main/addon/Cookie.mjs +1 -0
  425. package/src/main/addon/GoogleMaps.mjs +1 -0
  426. package/src/main/addon/LocalStorage.mjs +1 -0
  427. package/src/main/addon/MapboxGL.mjs +1 -0
  428. package/src/main/addon/Markdown.mjs +1 -0
  429. package/src/main/addon/Navigator.mjs +1 -0
  430. package/src/main/addon/Popover.mjs +1 -0
  431. package/src/main/addon/Stylesheet.mjs +1 -0
  432. package/src/main/addon/WindowPosition.mjs +1 -0
  433. package/src/manager/Component.mjs +0 -71
  434. package/src/manager/VDomUpdate.mjs +320 -0
  435. package/src/menu/List.mjs +6 -0
  436. package/src/menu/Model.mjs +1 -0
  437. package/src/menu/Panel.mjs +3 -0
  438. package/src/menu/Store.mjs +1 -0
  439. package/src/mixin/DomEvents.mjs +130 -0
  440. package/src/mixin/VdomLifecycle.mjs +670 -0
  441. package/src/plugin/Base.mjs +1 -0
  442. package/src/plugin/Resizable.mjs +2 -0
  443. package/src/selection/Model.mjs +15 -18
  444. package/src/selection/grid/BaseModel.mjs +1 -0
  445. package/src/sitemap/Component.mjs +1 -0
  446. package/src/state/Provider.mjs +129 -87
  447. package/src/state/createHierarchicalDataProxy.mjs +39 -25
  448. package/src/tab/Container.mjs +6 -0
  449. package/src/tab/Strip.mjs +1 -0
  450. package/src/tab/header/Button.mjs +2 -0
  451. package/src/tab/header/EffectButton.mjs +2 -0
  452. package/src/tab/header/Toolbar.mjs +1 -0
  453. package/src/table/Body.mjs +3 -0
  454. package/src/table/Container.mjs +10 -0
  455. package/src/table/header/Button.mjs +8 -0
  456. package/src/table/header/Toolbar.mjs +5 -0
  457. package/src/table/plugin/CellEditing.mjs +1 -0
  458. package/src/toolbar/Base.mjs +4 -0
  459. package/src/toolbar/Breadcrumb.mjs +3 -0
  460. package/src/toolbar/Paging.mjs +5 -0
  461. package/src/tooltip/Base.mjs +2 -0
  462. package/src/tree/List.mjs +3 -0
  463. package/src/util/HashHistory.mjs +1 -0
  464. package/src/util/KeyNavigation.mjs +2 -0
  465. package/src/util/Matrix.mjs +1 -0
  466. package/src/util/VDom.mjs +18 -5
  467. package/src/util/VNode.mjs +7 -1
  468. package/src/util/vdom/TreeBuilder.mjs +105 -0
  469. package/src/vdom/Helper.mjs +35 -23
  470. package/src/vdom/VNode.mjs +4 -6
  471. package/src/worker/App.mjs +1 -0
  472. package/src/worker/Base.mjs +2 -0
  473. package/src/worker/Manager.mjs +2 -0
  474. package/src/worker/ServiceBase.mjs +6 -1
  475. package/src/worker/mixin/RemoteMethodAccess.mjs +1 -6
  476. package/test/siesta/siesta.js +17 -2
  477. package/test/siesta/tests/VdomCalendar.mjs +19 -15
  478. package/test/siesta/tests/VdomHelper.mjs +7 -7
  479. package/test/siesta/tests/classic/Button.mjs +113 -0
  480. package/test/siesta/tests/core/Effect.mjs +10 -14
  481. package/test/siesta/tests/core/EffectBatching.mjs +72 -79
  482. package/test/siesta/tests/functional/Button.mjs +113 -0
  483. package/test/siesta/tests/state/ProviderNestedDataConfigs.mjs +314 -0
  484. package/test/siesta/tests/state/createHierarchicalDataProxy.mjs +42 -55
  485. package/test/siesta/tests/vdom/Advanced.mjs +14 -8
  486. package/test/siesta/tests/vdom/VdomAsymmetricUpdates.mjs +366 -0
  487. package/test/siesta/tests/vdom/VdomRealWorldUpdates.mjs +249 -0
  488. package/test/siesta/tests/vdom/layout/Cube.mjs +11 -7
  489. package/test/siesta/tests/vdom/table/Container.mjs +9 -5
  490. package/learn/javascript/NewNode.md +0 -31
  491. package/src/core/EffectBatchManager.mjs +0 -68
@@ -3,10 +3,9 @@ import MonacoEditor from '../component/wrapper/MonacoEditor.mjs'
3
3
  import TabContainer from '../tab/Container.mjs';
4
4
 
5
5
  const
6
- classDeclarationRegex = /class\s+([a-zA-Z$_][a-zA-Z0-9$_]*)\s*(?:extends\s+[a-zA-Z$_][a-zA-Z0-9$_]*)?\s*{[\s\S]*?}/g,
7
- classNameRegex = /className\s*:\s*['"]([^'"]+)['"]/g,
8
- exportRegex = /export\s+(?:default\s+)?(?:const|let|var|class|function|async\s+function|generator\s+function|async\s+generator\s+function|(\{[\s\S]*?\}))/g,
9
- importRegex = /import\s+([\w-]+)\s+from\s+['"]([^'"]+)['"]/;
6
+ classNameRegex = /className\s*:\s*['\"]([^'\"]+)['\"]/g,
7
+ exportRegex = /export\s+(?:default\s+)?(?:const|let|var|class|function|async\s+function|generator\s+function|async\s+generator\s+function|(\{[\s\S]*?\}))/g,
8
+ importRegex = /import\s+(?:([\w-]+)|\{([^}]+)\})\s+from\s+['\"]([^'\"]+)['\"]/;
10
9
 
11
10
  /**
12
11
  * @class Neo.code.LivePreview
@@ -35,6 +34,7 @@ class LivePreview extends Container {
35
34
  /**
36
35
  * Valid values are 'preview' and 'source'
37
36
  * @member {String} activeView_='source'
37
+ * @reactive
38
38
  */
39
39
  activeView_: 'source',
40
40
  /**
@@ -51,6 +51,7 @@ class LivePreview extends Container {
51
51
  enableFullscreen: true,
52
52
  /**
53
53
  * @member {Object|String} layout='fit'
54
+ * @reactive
54
55
  */
55
56
  layout: 'fit',
56
57
  /**
@@ -78,6 +79,7 @@ class LivePreview extends Container {
78
79
  /**
79
80
  * The code to display inside the Monaco editor
80
81
  * @member {String|null} value_=null
82
+ * @reactive
81
83
  */
82
84
  value_: null,
83
85
  }
@@ -226,19 +228,20 @@ class LivePreview extends Container {
226
228
  {environment} = Neo.config,
227
229
  container = me.getPreviewContainer(),
228
230
  source = me.editorValue || me.value,
229
- className = me.findLastClassName(source),
231
+ className = me.findMainClassName(source),
230
232
  cleanLines = [],
231
233
  moduleNameAndPath = [],
232
234
  params = [],
233
235
  vars = [],
234
- codeString, promises;
236
+ codeString, module, promises;
235
237
 
236
238
  source.split('\n').forEach(line => {
237
239
  let importMatch = line.match(importRegex);
238
240
 
239
241
  if (importMatch) {
240
- let moduleName = importMatch[1],
241
- path = importMatch[2],
242
+ let defaultImport = importMatch[1],
243
+ namedImports = importMatch[2]?.split(',').map(name => name.trim()),
244
+ path = importMatch[3],
242
245
  index;
243
246
 
244
247
  // We want the non-minified version for code which can not get bundled.
@@ -263,7 +266,7 @@ class LivePreview extends Container {
263
266
  }
264
267
  }
265
268
 
266
- moduleNameAndPath.push({moduleName, path})
269
+ moduleNameAndPath.push({defaultImport, namedImports, path})
267
270
  } else if (line.match(exportRegex)) {
268
271
  // Skip export statements
269
272
  } else {
@@ -286,9 +289,15 @@ class LivePreview extends Container {
286
289
  // });
287
290
  // Making the promise part of the eval seems weird, but it made it easier to
288
291
  // set up the import vars.
289
- promises = moduleNameAndPath.map(item => {
290
- params.push(`${item.moduleName}Module`);
291
- vars.push(` const ${item.moduleName} = ${item.moduleName}Module.default;`);
292
+ promises = moduleNameAndPath.map((item, i) => {
293
+ let moduleAlias = `Module${i}`;
294
+ params.push(moduleAlias);
295
+ if (item.defaultImport) {
296
+ vars.push(` const ${item.defaultImport} = ${moduleAlias}.default;`);
297
+ }
298
+ if (item.namedImports) {
299
+ vars.push(` const {${item.namedImports.join(', ')}} = ${moduleAlias};`);
300
+ }
292
301
  return `import('${item.path}')`
293
302
  });
294
303
 
@@ -299,11 +308,19 @@ class LivePreview extends Container {
299
308
  `${vars.join('\n')}`,
300
309
  ` ${cleanLines.join('\n')}`,
301
310
  '',
302
- ` if (${className} && Neo.component.Base.isPrototypeOf(${className})) {`,
303
- ` container.add({module:${className}})`,
311
+ ` module = Neo.ns('${className}');`,
312
+ '',
313
+ ` if (module && (`,
314
+ ` Neo.component.Base.isPrototypeOf(module) ||`,
315
+ ` Neo.functional.component.Base.isPrototypeOf(module)`,
316
+ ` )) {`,
317
+ ` container.add({module})`,
304
318
  ' }',
305
319
  '})',
306
- '.catch(error => container.add({ntype:\'component\', html:error.message}));'
320
+ '.catch(error => {',
321
+ ' console.warn("LivePreview Error:", error);',
322
+ ' container.add({ntype:\'component\', html:error.message});',
323
+ '})'
307
324
  ].join('\n')
308
325
 
309
326
  container.removeAll();
@@ -321,7 +338,7 @@ class LivePreview extends Container {
321
338
  });
322
339
 
323
340
  try {
324
- new Function('container', codeString)(container);
341
+ new Function('container', 'module', codeString)(container, module);
325
342
  } catch (error) {
326
343
  container.add({
327
344
  ntype: 'component',
@@ -349,18 +366,29 @@ class LivePreview extends Container {
349
366
  * @param {String} sourceCode
350
367
  * @returns {String|null}
351
368
  */
352
- findLastClassName(sourceCode) {
353
- let lastClassName = null,
354
- match;
369
+ findMainClassName(sourceCode) {
370
+ let classNames = this.findClassNames(sourceCode),
371
+ mainName = null,
372
+ prioNames = ['MainContainer', 'MainComponent', 'MainView', 'Main'];
373
+
374
+ if (classNames.length > 0) {
375
+ for (const name of prioNames) {
376
+ mainName = classNames.find(className => className.endsWith(name));
377
+ if (mainName) {
378
+ break
379
+ }
380
+ }
355
381
 
356
- while ((match = classDeclarationRegex.exec(sourceCode)) !== null) {
357
- // Update the last class name found
358
- lastClassName = match[1]
382
+ if (!mainName) {
383
+ mainName = classNames[classNames.length - 1]
384
+ }
359
385
  }
360
386
 
361
- return lastClassName
387
+ return mainName
362
388
  }
363
389
 
390
+
391
+
364
392
  /**
365
393
  * @returns {Neo.component.Base|null}
366
394
  */
@@ -16,6 +16,7 @@ const countMutations = Symbol('countMutations'),
16
16
  /**
17
17
  * @class Neo.collection.Base
18
18
  * @extends Neo.core.Base
19
+ * @mixes Neo.core.Observable
19
20
  */
20
21
  class Collection extends Base {
21
22
  /**
@@ -51,6 +52,7 @@ class Collection extends Base {
51
52
  /**
52
53
  * Stores the items.length of the items array in use
53
54
  * @member {Number} count_=0
55
+ * @reactive
54
56
  */
55
57
  count_: 0,
56
58
  /**
@@ -62,10 +64,12 @@ class Collection extends Base {
62
64
  /**
63
65
  * An Array containing Neo.util.Filter config objects or instances
64
66
  * @member {Array} filters_=[]
67
+ * @reactive
65
68
  */
66
69
  filters_: [],
67
70
  /**
68
71
  * @member {Object[]|null} items_=null
72
+ * @reactive
69
73
  */
70
74
  items_: null,
71
75
  /**
@@ -83,6 +87,7 @@ class Collection extends Base {
83
87
  * A map containing the key & reference of each collection item for faster access
84
88
  * @member {Map} map_=null
85
89
  * @protected
90
+ * @reactive
86
91
  */
87
92
  map_: null,
88
93
  /**
@@ -100,11 +105,13 @@ class Collection extends Base {
100
105
  /**
101
106
  * An Array containing Neo.util.Sorter config objects or instances
102
107
  * @member {Array} sorters_=[]
108
+ * @reactive
103
109
  */
104
110
  sorters_: [],
105
111
  /**
106
112
  * The id of another collection instance to use as this data source
107
113
  * @member {String|null} sourceId_=null
114
+ * @reactive
108
115
  */
109
116
  sourceId_: null
110
117
  }
@@ -144,16 +151,6 @@ class Collection extends Base {
144
151
  return this.splice(null, null, item).addedItems
145
152
  }
146
153
 
147
- /**
148
- * Triggered after the badgePosition config got changed
149
- * @param {Number} value
150
- * @param {Number} oldValue
151
- * @protected
152
- */
153
- afterSetCount(value, oldValue) {
154
- this.fire('countChange', {oldValue, value})
155
- }
156
-
157
154
  /**
158
155
  * Triggered after the filters config got changed
159
156
  * @param {Array} value
@@ -4,6 +4,7 @@ import Observable from '../core/Observable.mjs';
4
4
  /**
5
5
  * @class Neo.collection.Filter
6
6
  * @extends Neo.core.Base
7
+ * @mixes Neo.core.Observable
7
8
  */
8
9
  class Filter extends Base {
9
10
  /**
@@ -38,11 +39,13 @@ class Filter extends Base {
38
39
  /**
39
40
  * Setting disabled to true will exclude this filter from the collection filtering logic
40
41
  * @member {Boolean} disabled_=false
42
+ * @reactive
41
43
  */
42
44
  disabled_: false,
43
45
  /**
44
46
  * Provide a custom filtering function which has a higher priority than property, operator & value
45
47
  * @member {Function|null} filterBy_=null
48
+ * @reactive
46
49
  */
47
50
  filterBy_: null,
48
51
  /**
@@ -54,6 +57,7 @@ class Filter extends Base {
54
57
  * Set this flag to true before starting bulk updates (e.g. changing property & value)
55
58
  * to prevent multiple change events
56
59
  * @member {Boolean} isUpdating_=false
60
+ * @reactive
57
61
  */
58
62
  isUpdating_: false,
59
63
  /**
@@ -83,6 +87,7 @@ class Filter extends Base {
83
87
  /**
84
88
  * The property to filter by (use the combination of property, operator & value)
85
89
  * @member {String} property_='id'
90
+ * @reactive
86
91
  */
87
92
  property_: 'id',
88
93
  /**
@@ -93,6 +98,7 @@ class Filter extends Base {
93
98
  /**
94
99
  * The value to filter by (use the combination of property, operator & value)
95
100
  * @member {String} value_=null
101
+ * @reactive
96
102
  */
97
103
  value_: null
98
104
  }
@@ -4,6 +4,7 @@ import Observable from '../core/Observable.mjs';
4
4
  /**
5
5
  * @class Neo.collection.Sorter
6
6
  * @extends Neo.core.Base
7
+ * @mixes Neo.core.Observable
7
8
  */
8
9
  class Sorter extends Base {
9
10
  /**
@@ -33,6 +34,7 @@ class Sorter extends Base {
33
34
  /**
34
35
  * The sort direction when using a property.
35
36
  * @member {String} direction_='ASC'
37
+ * @reactive
36
38
  */
37
39
  direction_: 'ASC',
38
40
  /**
@@ -44,6 +46,7 @@ class Sorter extends Base {
44
46
  /**
45
47
  * The property to sort by.
46
48
  * @member {String} property_='id'
49
+ * @reactive
47
50
  */
48
51
  property_: 'id',
49
52
  /**
@@ -0,0 +1,412 @@
1
+ import Base from '../core/Base.mjs';
2
+ import ClassSystemUtil from '../util/ClassSystem.mjs';
3
+ import ComponentManager from '../manager/Component.mjs';
4
+ import DomEvents from '../mixin/DomEvents.mjs';
5
+ import Observable from '../core/Observable.mjs';
6
+ import VdomLifecycle from '../mixin/VdomLifecycle.mjs';
7
+
8
+ const
9
+ closestController = Symbol.for('closestController'),
10
+ closestProvider = Symbol.for('closestProvider'),
11
+ twoWayBindingSymbol = Symbol.for('twoWayBinding');
12
+
13
+ /**
14
+ * @class Neo.component.Abstract
15
+ * @extends Neo.core.Base
16
+ * @mixes Neo.component.mixin.DomEvents
17
+ * @mixes Neo.core.Observable
18
+ * @mixes Neo.component.mixin.VdomLifecycle
19
+ */
20
+ class Abstract extends Base {
21
+ static config = {
22
+ /**
23
+ * @member {String} className='Neo.component.Abstract'
24
+ * @protected
25
+ */
26
+ className: 'Neo.component.Abstract',
27
+ /**
28
+ * @member {String} ntype='abstract-component'
29
+ * @protected
30
+ */
31
+ ntype: 'abstract-component',
32
+ /**
33
+ * The name of the App this component belongs to
34
+ * @member {String|null} appName_=null
35
+ * @reactive
36
+ */
37
+ appName_: null,
38
+ /**
39
+ * Bind configs to state.Provider data properties.
40
+ * @member {Object|null} bind=null
41
+ */
42
+ bind: null,
43
+ /**
44
+ * Custom CSS selectors to apply to the root level node of this component
45
+ * @member {String[]} cls_=null
46
+ * @reactive
47
+ */
48
+ cls_: null,
49
+ /**
50
+ * Convenience shortcut to access the data config of the closest state.Provider.
51
+ * Read only.
52
+ * @member {Object} data_=null
53
+ * @protected
54
+ * @reactive
55
+ */
56
+ data_: null,
57
+ /**
58
+ * Disabled components will get the neo-disabled cls applied and won't receive DOM events
59
+ * @member {Boolean} disabled_=false
60
+ * @reactive
61
+ */
62
+ disabled_: false,
63
+ /**
64
+ * @member {Neo.core.Base[]} mixins=[DomEvents, Observable, VdomLifecycle]
65
+ */
66
+ mixins: [DomEvents, Observable, VdomLifecycle],
67
+ /**
68
+ * Override specific stateProvider data properties.
69
+ * This will merge the content.
70
+ * @member {Object|null} modelData=null
71
+ */
72
+ modelData: null,
73
+ /**
74
+ * True after the component render() method was called. Also fires the rendered event.
75
+ * @member {Boolean} mounted_=false
76
+ * @protected
77
+ * @reactive
78
+ */
79
+ mounted_: false,
80
+ /**
81
+ * If the parentId does not match a neo component id, you can manually set this value for finding
82
+ * view controllers or state providers.
83
+ * Use case: manually dropping components into a vdom structure
84
+ * @member {Neo.component.Base|null} parentComponent_=null
85
+ * @protected
86
+ * @reactive
87
+ */
88
+ parentComponent_: null,
89
+ /**
90
+ * @member {String|null} parentId_=null
91
+ * @protected
92
+ * @reactive
93
+ */
94
+ parentId_: null,
95
+ /**
96
+ * Optionally add a state.Provider to share state data with child components
97
+ * @member {Object|null} stateProvider_=null
98
+ * @reactive
99
+ */
100
+ stateProvider_: null,
101
+ /**
102
+ * The custom windowIs (timestamp) this component belongs to
103
+ * @member {Number|null} windowId_=null
104
+ * @reactive
105
+ */
106
+ windowId_: null
107
+ }
108
+
109
+ /**
110
+ * Internal flag which will get set to true while a component is waiting for its mountedPromise
111
+ * @member {Boolean} isAwaitingMount=false
112
+ * @protected
113
+ */
114
+ isAwaitingMount = false
115
+
116
+ /**
117
+ * Convenience shortcut to access the App this component belongs to
118
+ * @returns {Neo.controller.Application|null}
119
+ */
120
+ get app() {
121
+ return Neo.apps[this.appName] || null
122
+ }
123
+
124
+ /**
125
+ * A Promise that resolves when the component is mounted to the DOM.
126
+ * This provides a convenient way to wait for the component to be fully
127
+ * available and interactive before executing subsequent logic.
128
+ *
129
+ * It also handles unmounting by resetting the promise, so it can be safely
130
+ * awaited again if the component is remounted.
131
+ * @returns {Promise<Neo.component.Base>}
132
+ */
133
+ get mountedPromise() {
134
+ let me = this;
135
+
136
+ if (!me._mountedPromise) {
137
+ me._mountedPromise = new Promise(resolve => {
138
+ if (me.mounted) {
139
+ resolve(me);
140
+ } else {
141
+ me.mountedPromiseResolve = resolve
142
+ }
143
+ })
144
+ }
145
+
146
+ return me._mountedPromise
147
+ }
148
+
149
+ /**
150
+ * Convenience method to access the parent component
151
+ * @returns {Neo.component.Base|null}
152
+ */
153
+ get parent() {
154
+ let me = this;
155
+
156
+ return me.parentComponent || (me.parentId === 'document.body' ? null : Neo.getComponent(me.parentId))
157
+ }
158
+
159
+ /**
160
+ * Triggered after any config got changed
161
+ * @param {String} key
162
+ * @param {*} value
163
+ * @param {*} oldValue
164
+ * @protected
165
+ */
166
+ afterSetConfig(key, value, oldValue) {
167
+ let me = this;
168
+
169
+ if (Neo.isUsingStateProviders && me[twoWayBindingSymbol]) {
170
+ // When a component config is updated by its state provider, this flag is set to the config's key.
171
+ // This prevents circular updates in two-way data bindings by skipping the push back to the state provider.
172
+ if (me._skipTwoWayPush === key) {
173
+ return;
174
+ }
175
+ let binding = me.bind?.[key];
176
+
177
+ if (binding?.twoWay) {
178
+ this.getStateProvider()?.setData(binding.key, value)
179
+ }
180
+ }
181
+ }
182
+
183
+ /**
184
+ * Triggered after the id config got changed
185
+ * @param {String|null} value
186
+ * @param {String|null} oldValue
187
+ * @protected
188
+ */
189
+ afterSetId(value, oldValue) {
190
+ super.afterSetId(value, oldValue);
191
+
192
+ oldValue && ComponentManager.unregister(oldValue);
193
+ value && ComponentManager.register(this)
194
+ }
195
+
196
+ /**
197
+ * Triggered after the mounted config got changed
198
+ * @param {Boolean} value
199
+ * @param {Boolean} oldValue
200
+ * @protected
201
+ */
202
+ afterSetMounted(value, oldValue) {
203
+ if (oldValue !== undefined) {
204
+ const me = this;
205
+
206
+ if (value) { // mount
207
+ me.initDomEvents?.();
208
+ me.mountedPromiseResolve?.(this);
209
+ delete me.mountedPromiseResolve
210
+ } else { // unmount
211
+ delete me._mountedPromise
212
+ }
213
+ }
214
+ }
215
+
216
+ /**
217
+ * Triggered after the stateProvider config got changed
218
+ * @param {Neo.state.Provider} value
219
+ * @param {Object|Neo.state.Provider|null} oldValue
220
+ * @protected
221
+ */
222
+ afterSetStateProvider(value, oldValue) {
223
+ value?.createBindings(this)
224
+ }
225
+
226
+ /**
227
+ * Triggered after the windowId config got changed
228
+ * @param {Number|null} value
229
+ * @param {Number|null} oldValue
230
+ * @protected
231
+ */
232
+ afterSetWindowId(value, oldValue) {
233
+ const me = this;
234
+
235
+ if (value) {
236
+ Neo.currentWorker.insertThemeFiles(value, me.__proto__)
237
+ }
238
+
239
+ // If a component gets moved into a different window, an update cycle might still be running.
240
+ // Since the update might no longer get mapped, we want to re-enable this instance for future updates.
241
+ if (oldValue) {
242
+ me.isVdomUpdating = false
243
+ }
244
+ }
245
+
246
+ /**
247
+ * Triggered when accessing the data config
248
+ * Convenience shortcut which is expensive to use, since it will generate a merged parent state providers data map.
249
+ * @param {Object} value
250
+ * @protected
251
+ */
252
+ beforeGetData(value) {
253
+ return this.getStateProvider()?.getHierarchyData()
254
+ }
255
+
256
+ /**
257
+ * Triggered before the stateProvider config gets changed.
258
+ * Creates a state.Provider instance if needed.
259
+ * @param {Object} value
260
+ * @param {Object} oldValue
261
+ * @returns {Neo.state.Provider}
262
+ * @protected
263
+ */
264
+ beforeSetStateProvider(value, oldValue) {
265
+ oldValue?.destroy();
266
+
267
+ if (value) {
268
+ let me = this,
269
+ defaultValues = {component: me};
270
+
271
+ if (me.modelData) {
272
+ defaultValues.data = me.modelData
273
+ }
274
+
275
+ return ClassSystemUtil.beforeSetInstance(value, 'Neo.state.Provider', defaultValues)
276
+ }
277
+
278
+ return null
279
+ }
280
+
281
+ /**
282
+ *
283
+ */
284
+ destroy() {
285
+ this.removeDomEvents();
286
+ ComponentManager.unregister(this);
287
+ this.stateProvider = null; // triggers destroy()
288
+ super.destroy()
289
+ }
290
+
291
+ /**
292
+ * Find an instance stored inside a config via optionally passing a ntype.
293
+ * Returns this[configName] or the closest parent component with a match.
294
+ * Used by getController() & getStateProvider()
295
+ * @param {String} configName
296
+ * @param {String} [ntype]
297
+ * @returns {Neo.core.Base|null}
298
+ */
299
+ getConfigInstanceByNtype(configName, ntype) {
300
+ let me = this,
301
+ config = me[configName],
302
+ {parentComponent} = me;
303
+
304
+ if (config && (!ntype || ntype === config.ntype)) {
305
+ return config
306
+ }
307
+
308
+ if (!parentComponent && me.parentId) {
309
+ parentComponent = me.parent || Neo.get(me.parentId);
310
+ }
311
+
312
+ if (parentComponent) {
313
+ // todo: We need ?. until functional.component.Base supports controllers
314
+ return parentComponent.getConfigInstanceByNtype?.(configName, ntype)
315
+ }
316
+
317
+ return null
318
+ }
319
+
320
+ /**
321
+ * Convenience shortcut
322
+ * @param args
323
+ * @returns {*}
324
+ */
325
+ getState(...args) {
326
+ return this.getStateProvider().getData(...args)
327
+ }
328
+
329
+ /**
330
+ * Returns this.stateProvider or the closest parent stateProvider
331
+ * @param {String} [ntype]
332
+ * @returns {Neo.state.Provider|null}
333
+ */
334
+ getStateProvider(ntype) {
335
+ if (!Neo.isUsingStateProviders) {
336
+ return null
337
+ }
338
+
339
+ let me = this,
340
+ provider;
341
+
342
+ if (!ntype) {
343
+ provider = me[closestProvider];
344
+
345
+ if (provider) {
346
+ return provider
347
+ }
348
+ }
349
+
350
+ provider = me.getConfigInstanceByNtype('stateProvider', ntype);
351
+
352
+ if (!ntype) {
353
+ me[closestProvider] = provider
354
+ }
355
+
356
+ return provider
357
+ }
358
+
359
+ /**
360
+ * @param args
361
+ */
362
+ initConfig(...args) {
363
+ super.initConfig(...args);
364
+ this.getStateProvider()?.createBindings(this)
365
+ }
366
+
367
+ /**
368
+ * Change multiple configs at once, ensuring that all afterSet methods get all new assigned values
369
+ * @param {Object} values={}
370
+ * @param {Boolean} silent=false
371
+ * @returns {Promise<*>}
372
+ */
373
+ set(values={}, silent=false) {
374
+ const
375
+ me = this,
376
+ wasHidden = me.hidden;
377
+
378
+ me.setSilent(values);
379
+
380
+ if (!silent && me.needsVdomUpdate) {
381
+ if (wasHidden && !me.hidden) {
382
+ me.show?.(); // show() is not part of the abstract base class
383
+ return Promise.resolve()
384
+ }
385
+
386
+ return me.promiseUpdate()
387
+ }
388
+
389
+ return Promise.resolve()
390
+ }
391
+
392
+ /**
393
+ * A silent version of set(), which does not trigger a vdom update at the end.
394
+ * Useful for batching multiple config changes.
395
+ * @param {Object} values={}
396
+ */
397
+ setSilent(values={}) {
398
+ this.silentVdomUpdate = true;
399
+ super.set(values);
400
+ this.silentVdomUpdate = false
401
+ }
402
+
403
+ /**
404
+ * Convenience shortcut
405
+ * @param args
406
+ */
407
+ setState(...args) {
408
+ this.getStateProvider().setData(...args)
409
+ }
410
+ }
411
+
412
+ export default Neo.setupClass(Abstract);