neo.mjs 10.0.0-beta.4 → 10.0.0-beta.6

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 (485) hide show
  1. package/.github/RELEASE_NOTES/v10.0.0-beta.4.md +2 -2
  2. package/.github/RELEASE_NOTES/v10.0.0-beta.5.md +70 -0
  3. package/.github/RELEASE_NOTES/v10.0.0-beta.6.md +48 -0
  4. package/.github/epic-functional-components.md +498 -0
  5. package/.github/ticket-asymmetric-vdom-updates.md +122 -0
  6. package/README.md +0 -3
  7. package/ServiceWorker.mjs +2 -2
  8. package/apps/colors/store/Colors.mjs +1 -0
  9. package/apps/colors/view/GridContainer.mjs +3 -0
  10. package/apps/colors/view/HeaderToolbar.mjs +2 -0
  11. package/apps/colors/view/Viewport.mjs +3 -0
  12. package/apps/covid/view/FooterContainer.mjs +3 -0
  13. package/apps/covid/view/GalleryContainer.mjs +2 -0
  14. package/apps/covid/view/GalleryContainerController.mjs +1 -0
  15. package/apps/covid/view/HeaderContainer.mjs +2 -0
  16. package/apps/covid/view/HelixContainer.mjs +2 -0
  17. package/apps/covid/view/HelixContainerController.mjs +1 -0
  18. package/apps/covid/view/MainContainer.mjs +3 -0
  19. package/apps/covid/view/TableContainer.mjs +3 -0
  20. package/apps/covid/view/TableContainerController.mjs +1 -0
  21. package/apps/covid/view/WorldMapContainer.mjs +2 -0
  22. package/apps/covid/view/country/Gallery.mjs +3 -0
  23. package/apps/covid/view/country/Helix.mjs +8 -0
  24. package/apps/covid/view/country/HistoricalDataTable.mjs +1 -0
  25. package/apps/covid/view/country/Table.mjs +2 -0
  26. package/apps/covid/view/mapboxGl/Component.mjs +1 -0
  27. package/apps/covid/view/mapboxGl/Container.mjs +2 -0
  28. package/apps/email/EPIC_PLAN.md +58 -0
  29. package/apps/email/neo-config.json +2 -2
  30. package/apps/email/store/Emails.mjs +11 -1
  31. package/apps/email/view/ComposeView.mjs +44 -0
  32. package/apps/email/view/MainView.mjs +89 -0
  33. package/apps/email/view/Viewport.mjs +4 -33
  34. package/apps/email/view/ViewportStateProvider.mjs +3 -3
  35. package/apps/form/store/SideNav.mjs +1 -0
  36. package/apps/form/view/FormContainer.mjs +1 -0
  37. package/apps/form/view/FormPageContainer.mjs +2 -0
  38. package/apps/form/view/SideNavList.mjs +1 -0
  39. package/apps/form/view/Viewport.mjs +3 -0
  40. package/apps/portal/childapps/preview/MainContainer.mjs +1 -0
  41. package/apps/portal/index.html +1 -1
  42. package/apps/portal/store/BlogPosts.mjs +2 -0
  43. package/apps/portal/store/Content.mjs +1 -0
  44. package/apps/portal/store/ContentSections.mjs +1 -0
  45. package/apps/portal/store/Examples.mjs +1 -0
  46. package/apps/portal/view/HeaderToolbar.mjs +1 -0
  47. package/apps/portal/view/Viewport.mjs +5 -0
  48. package/apps/portal/view/ViewportController.mjs +8 -2
  49. package/apps/portal/view/about/Container.mjs +2 -0
  50. package/apps/portal/view/about/MemberContainer.mjs +7 -0
  51. package/apps/portal/view/blog/Container.mjs +2 -0
  52. package/apps/portal/view/blog/List.mjs +2 -0
  53. package/apps/portal/view/examples/List.mjs +1 -0
  54. package/apps/portal/view/examples/TabContainer.mjs +4 -0
  55. package/apps/portal/view/home/ContentBox.mjs +3 -0
  56. package/apps/portal/view/home/FeatureSection.mjs +8 -0
  57. package/apps/portal/view/home/FooterContainer.mjs +4 -1
  58. package/apps/portal/view/home/MainContainer.mjs +2 -0
  59. package/apps/portal/view/home/parts/AfterMath.mjs +2 -0
  60. package/apps/portal/view/home/parts/BaseContainer.mjs +1 -0
  61. package/apps/portal/view/home/parts/Colors.mjs +4 -0
  62. package/apps/portal/view/home/parts/Features.mjs +2 -0
  63. package/apps/portal/view/home/parts/Helix.mjs +5 -0
  64. package/apps/portal/view/home/parts/How.mjs +4 -0
  65. package/apps/portal/view/home/parts/MainNeo.mjs +1 -0
  66. package/apps/portal/view/home/parts/References.mjs +2 -0
  67. package/apps/portal/view/learn/ContentComponent.mjs +11 -5
  68. package/apps/portal/view/learn/ContentTreeList.mjs +2 -0
  69. package/apps/portal/view/learn/CubeLayoutButton.mjs +1 -0
  70. package/apps/portal/view/learn/MainContainer.mjs +4 -0
  71. package/apps/portal/view/learn/PageContainer.mjs +2 -0
  72. package/apps/portal/view/learn/PageSectionsContainer.mjs +3 -0
  73. package/apps/portal/view/learn/PageSectionsList.mjs +1 -0
  74. package/apps/portal/view/services/Component.mjs +1 -0
  75. package/apps/realworld/api/Base.mjs +1 -0
  76. package/apps/realworld/view/HeaderComponent.mjs +4 -0
  77. package/apps/realworld/view/HomeComponent.mjs +7 -0
  78. package/apps/realworld/view/MainContainer.mjs +2 -0
  79. package/apps/realworld/view/MainContainerController.mjs +2 -0
  80. package/apps/realworld/view/article/CommentComponent.mjs +3 -0
  81. package/apps/realworld/view/article/Component.mjs +17 -10
  82. package/apps/realworld/view/article/CreateCommentComponent.mjs +2 -0
  83. package/apps/realworld/view/article/CreateComponent.mjs +5 -0
  84. package/apps/realworld/view/article/PreviewComponent.mjs +9 -0
  85. package/apps/realworld/view/article/TagListComponent.mjs +2 -0
  86. package/apps/realworld/view/user/ProfileComponent.mjs +7 -0
  87. package/apps/realworld/view/user/SettingsComponent.mjs +5 -0
  88. package/apps/realworld/view/user/SignUpComponent.mjs +3 -0
  89. package/apps/realworld2/api/Base.mjs +1 -0
  90. package/apps/realworld2/view/FooterComponent.mjs +1 -0
  91. package/apps/realworld2/view/HeaderToolbar.mjs +3 -0
  92. package/apps/realworld2/view/HomeContainer.mjs +1 -0
  93. package/apps/realworld2/view/MainContainer.mjs +2 -0
  94. package/apps/realworld2/view/MainContainerController.mjs +1 -0
  95. package/apps/realworld2/view/article/Helix.mjs +1 -0
  96. package/apps/realworld2/view/article/PreviewComponent.mjs +9 -0
  97. package/apps/realworld2/view/article/PreviewList.mjs +1 -0
  98. package/apps/realworld2/view/article/TagListComponent.mjs +2 -0
  99. package/apps/route/view/CenterContainer.mjs +1 -0
  100. package/apps/route/view/MainView.mjs +1 -0
  101. package/apps/sharedcovid/childapps/sharedcovidchart/MainContainer.mjs +1 -0
  102. package/apps/sharedcovid/childapps/sharedcovidgallery/MainContainer.mjs +1 -0
  103. package/apps/sharedcovid/childapps/sharedcovidhelix/MainContainer.mjs +1 -0
  104. package/apps/sharedcovid/childapps/sharedcovidmap/MainContainer.mjs +1 -0
  105. package/apps/sharedcovid/view/FooterContainer.mjs +3 -0
  106. package/apps/sharedcovid/view/GalleryContainer.mjs +2 -0
  107. package/apps/sharedcovid/view/GalleryContainerController.mjs +1 -0
  108. package/apps/sharedcovid/view/HeaderContainer.mjs +2 -0
  109. package/apps/sharedcovid/view/HelixContainer.mjs +2 -0
  110. package/apps/sharedcovid/view/HelixContainerController.mjs +1 -0
  111. package/apps/sharedcovid/view/MainContainer.mjs +3 -0
  112. package/apps/sharedcovid/view/TableContainer.mjs +3 -0
  113. package/apps/sharedcovid/view/TableContainerController.mjs +1 -0
  114. package/apps/sharedcovid/view/WorldMapContainer.mjs +2 -0
  115. package/apps/sharedcovid/view/country/Gallery.mjs +3 -0
  116. package/apps/sharedcovid/view/country/Helix.mjs +8 -0
  117. package/apps/sharedcovid/view/country/HistoricalDataTable.mjs +1 -0
  118. package/apps/sharedcovid/view/country/Table.mjs +2 -0
  119. package/apps/sharedcovid/view/mapboxGl/Component.mjs +1 -0
  120. package/apps/sharedcovid/view/mapboxGl/Container.mjs +2 -0
  121. package/apps/shareddialog/childapps/shareddialog2/view/MainContainer.mjs +2 -0
  122. package/apps/shareddialog/view/DemoDialog.mjs +2 -0
  123. package/apps/shareddialog/view/MainContainer.mjs +2 -0
  124. package/apps/shareddialog/view/MainContainerController.mjs +1 -0
  125. package/buildScripts/addReactiveTags.mjs +191 -0
  126. package/buildScripts/checkReactiveTags.mjs +160 -0
  127. package/docs/app/store/Api.mjs +1 -0
  128. package/docs/app/store/Examples.mjs +1 -0
  129. package/docs/app/view/ApiTreeList.mjs +1 -0
  130. package/docs/app/view/ContentTabContainer.mjs +2 -0
  131. package/docs/app/view/ExamplesTreeList.mjs +2 -0
  132. package/docs/app/view/HeaderContainer.mjs +3 -0
  133. package/docs/app/view/MainContainer.mjs +5 -0
  134. package/docs/app/view/classdetails/HeaderComponent.mjs +1 -0
  135. package/docs/app/view/classdetails/MainContainer.mjs +3 -0
  136. package/docs/app/view/classdetails/MembersList.mjs +5 -0
  137. package/docs/app/view/classdetails/SourceViewComponent.mjs +2 -0
  138. package/examples/ConfigurationViewport.mjs +14 -8
  139. package/examples/button/effect/MainContainer.mjs +207 -0
  140. package/examples/button/effect/app.mjs +6 -0
  141. package/examples/button/effect/index.html +11 -0
  142. package/examples/button/effect/neo-config.json +6 -0
  143. package/examples/calendar/weekview/MainContainer.mjs +4 -0
  144. package/examples/component/coronaGallery/CountryGallery.mjs +2 -0
  145. package/examples/component/coronaGallery/CountryStore.mjs +1 -0
  146. package/examples/component/coronaGallery/Viewport.mjs +3 -0
  147. package/examples/component/coronaGallery/ViewportController.mjs +1 -0
  148. package/examples/component/coronaHelix/CountryHelix.mjs +7 -0
  149. package/examples/component/coronaHelix/MainContainer.mjs +1 -0
  150. package/examples/component/gallery/ImageStore.mjs +1 -0
  151. package/examples/component/helix/ImageStore.mjs +1 -0
  152. package/examples/component/helix/Viewport.mjs +3 -0
  153. package/examples/component/helix/ViewportController.mjs +1 -0
  154. package/examples/component/multiWindowCoronaGallery/childapp/Viewport.mjs +1 -0
  155. package/examples/component/multiWindowHelix/childapp/Viewport.mjs +1 -0
  156. package/examples/component/wrapper/googleMaps/MapComponent.mjs +2 -0
  157. package/examples/core/config/MainContainer.mjs +2 -0
  158. package/examples/dialog/DemoDialog.mjs +2 -0
  159. package/examples/dialog/MainContainer.mjs +1 -0
  160. package/examples/form/field/color/MainStore.mjs +1 -0
  161. package/examples/functional/defineComponent/Component.mjs +18 -0
  162. package/examples/functional/defineComponent/MainContainer.mjs +41 -0
  163. package/examples/functional/defineComponent/app.mjs +6 -0
  164. package/examples/functional/defineComponent/index.html +11 -0
  165. package/examples/functional/defineComponent/neo-config.json +6 -0
  166. package/examples/functional/hostComponent/Component.mjs +32 -0
  167. package/examples/functional/hostComponent/MainContainer.mjs +48 -0
  168. package/examples/functional/hostComponent/app.mjs +6 -0
  169. package/examples/functional/hostComponent/index.html +11 -0
  170. package/examples/functional/hostComponent/neo-config.json +6 -0
  171. package/examples/grid/animatedRowSorting/Viewport.mjs +1 -1
  172. package/examples/grid/bigData/ControlsContainer.mjs +3 -0
  173. package/examples/grid/bigData/GridContainer.mjs +4 -2
  174. package/examples/grid/bigData/MainContainer.mjs +2 -0
  175. package/examples/grid/bigData/MainModel.mjs +1 -0
  176. package/examples/grid/bigData/MainStore.mjs +3 -0
  177. package/examples/grid/cellEditing/MainContainer.mjs +1 -1
  178. package/examples/grid/container/MainContainer.mjs +1 -1
  179. package/examples/grid/covid/GridContainer.mjs +3 -0
  180. package/examples/grid/covid/MainContainer.mjs +2 -0
  181. package/examples/grid/covid/Store.mjs +1 -0
  182. package/examples/grid/nestedRecordFields/EditUserDialog.mjs +3 -0
  183. package/examples/grid/nestedRecordFields/Viewport.mjs +3 -1
  184. package/examples/list/animate/List.mjs +4 -0
  185. package/examples/list/animate/MainContainer.mjs +2 -0
  186. package/examples/list/circle/MainStore.mjs +1 -0
  187. package/examples/list/color/MainStore.mjs +1 -0
  188. package/examples/preloadingAssets/view/MainContainer.mjs +2 -0
  189. package/examples/stateProvider/advanced/MainContainer.mjs +1 -0
  190. package/examples/stateProvider/dialog/EditUserDialog.mjs +2 -0
  191. package/examples/stateProvider/dialog/MainContainer.mjs +1 -0
  192. package/examples/stateProvider/extendedClass/MainContainer.mjs +2 -0
  193. package/examples/stateProvider/inline/MainContainer.mjs +1 -0
  194. package/examples/stateProvider/inlineNoStateProvider/MainContainer.mjs +1 -0
  195. package/examples/stateProvider/inlineNoStateProvider/MainContainerController.mjs +2 -0
  196. package/examples/stateProvider/multiWindow/EditUserDialog.mjs +3 -0
  197. package/examples/stateProvider/multiWindow/MainContainer.mjs +1 -0
  198. package/examples/stateProvider/multiWindow/Viewport.mjs +1 -0
  199. package/examples/stateProvider/nestedData/MainContainer.mjs +1 -0
  200. package/examples/stateProvider/table/MainContainer.mjs +1 -0
  201. package/examples/table/covid/MainContainer.mjs +2 -0
  202. package/examples/table/covid/Store.mjs +1 -0
  203. package/examples/table/covid/TableContainer.mjs +3 -0
  204. package/examples/table/nestedRecordFields/EditUserDialog.mjs +3 -0
  205. package/examples/table/nestedRecordFields/Viewport.mjs +1 -0
  206. package/examples/todoList/version1/MainComponent.mjs +1 -1
  207. package/examples/toolbar/breadcrumb/view/MainContainer.mjs +2 -0
  208. package/examples/toolbar/paging/store/Users.mjs +1 -0
  209. package/examples/toolbar/paging/view/AddUserDialog.mjs +3 -0
  210. package/examples/toolbar/paging/view/MainContainer.mjs +3 -0
  211. package/examples/treeAccordion/MainContainer.mjs +2 -2
  212. package/examples/worker/task/MainContainer.mjs +1 -0
  213. package/learn/Glossary.md +1 -0
  214. package/learn/UsingTheseTopics.md +1 -0
  215. package/learn/benefits/ConfigSystem.md +2 -0
  216. package/learn/benefits/Effort.md +1 -0
  217. package/learn/benefits/Features.md +1 -0
  218. package/learn/benefits/FormsEngine.md +1 -0
  219. package/learn/benefits/FourEnvironments.md +2 -0
  220. package/learn/benefits/Introduction.md +2 -0
  221. package/learn/benefits/MultiWindow.md +3 -1
  222. package/learn/benefits/OffTheMainThread.md +2 -0
  223. package/learn/benefits/Quick.md +2 -0
  224. package/learn/benefits/RPCLayer.md +2 -0
  225. package/learn/benefits/Speed.md +2 -0
  226. package/learn/comparisons/NeoVsAngular.md +90 -0
  227. package/learn/comparisons/NeoVsExtJs.md +178 -0
  228. package/learn/comparisons/NeoVsNextJs.md +124 -0
  229. package/learn/comparisons/NeoVsReact.md +95 -0
  230. package/learn/comparisons/NeoVsSolid.md +78 -0
  231. package/learn/comparisons/NeoVsVue.md +92 -0
  232. package/learn/comparisons/Overview.md +46 -0
  233. package/learn/gettingstarted/ComponentModels.md +2 -0
  234. package/learn/gettingstarted/Config.md +2 -0
  235. package/learn/gettingstarted/DescribingTheUI.md +2 -0
  236. package/learn/gettingstarted/Events.md +2 -0
  237. package/learn/gettingstarted/Extending.md +2 -0
  238. package/learn/gettingstarted/References.md +2 -0
  239. package/learn/gettingstarted/Setup.md +3 -2
  240. package/learn/gettingstarted/Workspaces.md +2 -0
  241. package/learn/guides/datahandling/Collections.md +1 -0
  242. package/learn/guides/datahandling/Records.md +1 -0
  243. package/learn/guides/datahandling/StateProviders.md +131 -16
  244. package/learn/guides/datahandling/Tables.md +1 -1
  245. package/learn/guides/fundamentals/ConfigSystemDeepDive.md +1 -0
  246. package/learn/guides/fundamentals/DeclarativeComponentTreesVsImperativeVdom.md +2 -0
  247. package/learn/guides/fundamentals/DeclarativeVDOMWithEffects.md +168 -0
  248. package/learn/guides/fundamentals/ExtendingNeoClasses.md +1 -0
  249. package/learn/guides/fundamentals/InstanceLifecycle.md +3 -1
  250. package/learn/guides/fundamentals/MainThreadAddons.md +2 -0
  251. package/learn/guides/specificfeatures/Mixins.md +3 -1
  252. package/learn/guides/specificfeatures/MultiWindow.md +3 -1
  253. package/learn/guides/specificfeatures/PortalApp.md +2 -0
  254. package/learn/guides/uibuildingblocks/ComponentsAndContainers.md +2 -0
  255. package/learn/guides/uibuildingblocks/CustomComponents.md +2 -0
  256. package/learn/guides/uibuildingblocks/Layouts.md +2 -0
  257. package/learn/guides/uibuildingblocks/WorkingWithVDom.md +2 -0
  258. package/learn/guides/userinteraction/Forms.md +2 -0
  259. package/learn/guides/userinteraction/events/CustomEvents.md +2 -1
  260. package/learn/guides/userinteraction/events/DomEvents.md +2 -0
  261. package/learn/javascript/ClassFeatures.md +4 -3
  262. package/learn/javascript/Classes.md +10 -13
  263. package/learn/javascript/Overrides.md +10 -6
  264. package/learn/javascript/Super.md +12 -8
  265. package/learn/tree.json +71 -63
  266. package/learn/tutorials/Earthquakes.md +2 -0
  267. package/learn/tutorials/RSP.md +3 -1
  268. package/learn/tutorials/TodoList.md +103 -7
  269. package/package.json +6 -4
  270. package/resources/scss/src/apps/email/ComposeView.scss +16 -0
  271. package/resources/scss/src/apps/email/MainView.scss +5 -0
  272. package/resources/scss/src/apps/portal/learn/ContentComponent.scss +5 -4
  273. package/src/DefaultConfig.mjs +12 -2
  274. package/src/Main.mjs +1 -0
  275. package/src/Neo.mjs +377 -178
  276. package/src/Xhr.mjs +1 -0
  277. package/src/button/Base.mjs +13 -0
  278. package/src/button/Effect.mjs +449 -0
  279. package/src/button/Split.mjs +2 -0
  280. package/src/calendar/store/Calendars.mjs +1 -0
  281. package/src/calendar/store/Colors.mjs +1 -0
  282. package/src/calendar/store/Events.mjs +1 -0
  283. package/src/calendar/view/DayComponent.mjs +2 -0
  284. package/src/calendar/view/EditEventContainer.mjs +4 -1
  285. package/src/calendar/view/MainContainer.mjs +13 -0
  286. package/src/calendar/view/MainContainerStateProvider.mjs +14 -28
  287. package/src/calendar/view/SettingsContainer.mjs +1 -0
  288. package/src/calendar/view/YearComponent.mjs +16 -0
  289. package/src/calendar/view/calendars/ColorsList.mjs +2 -0
  290. package/src/calendar/view/calendars/Container.mjs +2 -0
  291. package/src/calendar/view/calendars/EditContainer.mjs +1 -0
  292. package/src/calendar/view/month/Component.mjs +11 -0
  293. package/src/calendar/view/settings/GeneralContainer.mjs +1 -0
  294. package/src/calendar/view/settings/MonthContainer.mjs +1 -0
  295. package/src/calendar/view/settings/WeekContainer.mjs +1 -0
  296. package/src/calendar/view/settings/YearContainer.mjs +1 -0
  297. package/src/calendar/view/week/Component.mjs +15 -1
  298. package/src/calendar/view/week/TimeAxisComponent.mjs +4 -0
  299. package/src/code/LivePreview.mjs +51 -23
  300. package/src/collection/Base.mjs +14 -12
  301. package/src/collection/Filter.mjs +6 -0
  302. package/src/collection/Sorter.mjs +3 -0
  303. package/src/component/Base.mjs +156 -802
  304. package/src/component/Canvas.mjs +1 -0
  305. package/src/component/Chip.mjs +4 -0
  306. package/src/component/Circle.mjs +14 -0
  307. package/src/component/Clock.mjs +4 -0
  308. package/src/component/DateSelector.mjs +12 -0
  309. package/src/component/Gallery.mjs +11 -0
  310. package/src/component/Helix.mjs +24 -0
  311. package/src/component/Label.mjs +1 -0
  312. package/src/component/Legend.mjs +3 -0
  313. package/src/component/MagicMoveText.mjs +4 -0
  314. package/src/component/Progress.mjs +3 -0
  315. package/src/component/Splitter.mjs +3 -0
  316. package/src/component/StatusBadge.mjs +6 -0
  317. package/src/component/Timer.mjs +4 -0
  318. package/src/component/Toast.mjs +6 -0
  319. package/src/component/Video.mjs +1 -0
  320. package/src/component/mwc/Button.mjs +7 -0
  321. package/src/component/mwc/TextField.mjs +9 -0
  322. package/src/component/wrapper/AmChart.mjs +2 -0
  323. package/src/component/wrapper/GoogleMaps.mjs +3 -0
  324. package/src/component/wrapper/MapboxGL.mjs +5 -0
  325. package/src/component/wrapper/MonacoEditor.mjs +12 -0
  326. package/src/container/Accordion.mjs +2 -0
  327. package/src/container/Base.mjs +34 -26
  328. package/src/container/Panel.mjs +1 -0
  329. package/src/container/Viewport.mjs +1 -0
  330. package/src/controller/Application.mjs +1 -0
  331. package/src/controller/Base.mjs +1 -0
  332. package/src/controller/Component.mjs +1 -0
  333. package/src/core/Base.mjs +193 -22
  334. package/src/core/Compare.mjs +4 -7
  335. package/src/core/Config.mjs +137 -33
  336. package/src/core/Effect.mjs +193 -0
  337. package/src/core/EffectBatchManager.mjs +67 -0
  338. package/src/core/EffectManager.mjs +60 -0
  339. package/src/core/IdGenerator.mjs +13 -44
  340. package/src/data/Model.mjs +2 -0
  341. package/src/data/Store.mjs +7 -0
  342. package/src/data/connection/WebSocket.mjs +2 -0
  343. package/src/date/DayViewComponent.mjs +2 -0
  344. package/src/date/SelectorContainer.mjs +14 -0
  345. package/src/dialog/Base.mjs +8 -0
  346. package/src/draggable/DragZone.mjs +5 -0
  347. package/src/draggable/tree/DragZone.mjs +1 -0
  348. package/src/filter/BooleanContainer.mjs +2 -0
  349. package/src/filter/NumberContainer.mjs +3 -0
  350. package/src/filter/ToggleOperatorsButton.mjs +2 -0
  351. package/src/form/Fieldset.mjs +6 -0
  352. package/src/form/field/Base.mjs +7 -0
  353. package/src/form/field/CheckBox.mjs +18 -0
  354. package/src/form/field/Chip.mjs +1 -0
  355. package/src/form/field/ComboBox.mjs +8 -0
  356. package/src/form/field/Country.mjs +1 -0
  357. package/src/form/field/Currency.mjs +2 -0
  358. package/src/form/field/Date.mjs +4 -0
  359. package/src/form/field/Display.mjs +1 -0
  360. package/src/form/field/Email.mjs +1 -0
  361. package/src/form/field/FileUpload.mjs +7 -0
  362. package/src/form/field/Hidden.mjs +1 -0
  363. package/src/form/field/Number.mjs +7 -0
  364. package/src/form/field/Password.mjs +1 -0
  365. package/src/form/field/Phone.mjs +3 -0
  366. package/src/form/field/Picker.mjs +2 -0
  367. package/src/form/field/Radio.mjs +1 -0
  368. package/src/form/field/Range.mjs +3 -0
  369. package/src/form/field/Search.mjs +2 -0
  370. package/src/form/field/Text.mjs +32 -0
  371. package/src/form/field/TextArea.mjs +7 -0
  372. package/src/form/field/Time.mjs +6 -0
  373. package/src/form/field/Url.mjs +3 -0
  374. package/src/form/field/ZipCode.mjs +2 -0
  375. package/src/form/field/trigger/Base.mjs +3 -0
  376. package/src/form/field/trigger/Clear.mjs +2 -0
  377. package/src/form/field/trigger/CopyToClipboard.mjs +2 -0
  378. package/src/form/field/trigger/Date.mjs +1 -0
  379. package/src/form/field/trigger/Picker.mjs +1 -0
  380. package/src/form/field/trigger/Search.mjs +1 -0
  381. package/src/form/field/trigger/SpinDown.mjs +2 -0
  382. package/src/form/field/trigger/SpinUp.mjs +1 -0
  383. package/src/form/field/trigger/Time.mjs +2 -0
  384. package/src/functional/_export.mjs +6 -0
  385. package/src/functional/component/Base.mjs +499 -0
  386. package/src/functional/defineComponent.mjs +102 -0
  387. package/src/functional/useConfig.mjs +52 -0
  388. package/src/functional/useEvent.mjs +43 -0
  389. package/src/grid/Body.mjs +20 -1
  390. package/src/grid/Container.mjs +57 -63
  391. package/src/grid/ScrollManager.mjs +2 -0
  392. package/src/grid/VerticalScrollbar.mjs +2 -0
  393. package/src/grid/column/Base.mjs +2 -0
  394. package/src/grid/column/Component.mjs +1 -1
  395. package/src/grid/header/Button.mjs +7 -0
  396. package/src/grid/header/Toolbar.mjs +6 -0
  397. package/src/grid/plugin/AnimateRows.mjs +2 -0
  398. package/src/layout/Base.mjs +3 -0
  399. package/src/layout/Card.mjs +1 -0
  400. package/src/layout/Cube.mjs +11 -1
  401. package/src/layout/Fit.mjs +1 -0
  402. package/src/layout/Flexbox.mjs +7 -0
  403. package/src/layout/Form.mjs +2 -0
  404. package/src/layout/Grid.mjs +1 -0
  405. package/src/layout/HBox.mjs +1 -0
  406. package/src/layout/VBox.mjs +1 -0
  407. package/src/list/Base.mjs +13 -0
  408. package/src/list/Chip.mjs +1 -0
  409. package/src/list/Circle.mjs +2 -0
  410. package/src/list/Color.mjs +1 -0
  411. package/src/list/plugin/Animate.mjs +2 -0
  412. package/src/main/DeltaUpdates.mjs +1 -0
  413. package/src/main/DomEvents.mjs +2 -0
  414. package/src/main/addon/CloneNode.mjs +1 -0
  415. package/src/main/addon/Cookie.mjs +1 -0
  416. package/src/main/addon/GoogleMaps.mjs +1 -0
  417. package/src/main/addon/LocalStorage.mjs +1 -0
  418. package/src/main/addon/MapboxGL.mjs +1 -0
  419. package/src/main/addon/Markdown.mjs +1 -0
  420. package/src/main/addon/Navigator.mjs +1 -0
  421. package/src/main/addon/Popover.mjs +1 -0
  422. package/src/main/addon/Stylesheet.mjs +1 -0
  423. package/src/main/addon/WindowPosition.mjs +1 -0
  424. package/src/manager/Component.mjs +0 -71
  425. package/src/manager/VDomUpdate.mjs +235 -0
  426. package/src/menu/List.mjs +6 -0
  427. package/src/menu/Model.mjs +1 -0
  428. package/src/menu/Panel.mjs +3 -0
  429. package/src/menu/Store.mjs +1 -0
  430. package/src/mixin/DomEvents.mjs +130 -0
  431. package/src/mixin/VdomLifecycle.mjs +667 -0
  432. package/src/plugin/Base.mjs +1 -0
  433. package/src/plugin/Resizable.mjs +2 -0
  434. package/src/selection/Model.mjs +15 -18
  435. package/src/selection/grid/BaseModel.mjs +1 -0
  436. package/src/sitemap/Component.mjs +1 -0
  437. package/src/state/Provider.mjs +376 -457
  438. package/src/state/createHierarchicalDataProxy.mjs +138 -0
  439. package/src/tab/Container.mjs +6 -0
  440. package/src/tab/Strip.mjs +1 -0
  441. package/src/tab/header/Button.mjs +2 -0
  442. package/src/tab/header/EffectButton.mjs +77 -0
  443. package/src/tab/header/Toolbar.mjs +1 -0
  444. package/src/table/Body.mjs +3 -0
  445. package/src/table/Container.mjs +10 -0
  446. package/src/table/header/Button.mjs +8 -0
  447. package/src/table/header/Toolbar.mjs +5 -0
  448. package/src/table/plugin/CellEditing.mjs +1 -0
  449. package/src/toolbar/Base.mjs +4 -0
  450. package/src/toolbar/Breadcrumb.mjs +3 -0
  451. package/src/toolbar/Paging.mjs +5 -0
  452. package/src/tooltip/Base.mjs +2 -0
  453. package/src/tree/List.mjs +3 -0
  454. package/src/util/HashHistory.mjs +1 -0
  455. package/src/util/KeyNavigation.mjs +2 -0
  456. package/src/util/Matrix.mjs +1 -0
  457. package/src/util/VDom.mjs +7 -1
  458. package/src/util/VNode.mjs +7 -1
  459. package/src/util/vdom/TreeBuilder.mjs +129 -0
  460. package/src/vdom/Helper.mjs +44 -33
  461. package/src/vdom/VNode.mjs +5 -7
  462. package/src/worker/App.mjs +1 -5
  463. package/src/worker/Base.mjs +2 -0
  464. package/src/worker/Manager.mjs +2 -0
  465. package/src/worker/ServiceBase.mjs +6 -1
  466. package/test/siesta/siesta.js +36 -1
  467. package/test/siesta/tests/CollectionBase.mjs +10 -10
  468. package/test/siesta/tests/VdomCalendar.mjs +13 -9
  469. package/test/siesta/tests/VdomHelper.mjs +22 -59
  470. package/test/siesta/tests/config/AfterSetConfig.mjs +100 -0
  471. package/test/siesta/tests/{ReactiveConfigs.mjs → config/Basic.mjs} +58 -21
  472. package/test/siesta/tests/config/CircularDependencies.mjs +166 -0
  473. package/test/siesta/tests/config/CustomFunctions.mjs +69 -0
  474. package/test/siesta/tests/config/Hierarchy.mjs +94 -0
  475. package/test/siesta/tests/config/MemoryLeak.mjs +92 -0
  476. package/test/siesta/tests/config/MultiLevelHierarchy.mjs +85 -0
  477. package/test/siesta/tests/core/Effect.mjs +127 -0
  478. package/test/siesta/tests/core/EffectBatching.mjs +310 -0
  479. package/test/siesta/tests/neo/MixinStaticConfig.mjs +138 -0
  480. package/test/siesta/tests/state/Provider.mjs +537 -0
  481. package/test/siesta/tests/state/ProviderNestedDataConfigs.mjs +255 -0
  482. package/test/siesta/tests/state/createHierarchicalDataProxy.mjs +204 -0
  483. package/test/siesta/tests/vdom/VdomAsymmetricUpdates.mjs +366 -0
  484. package/test/siesta/tests/vdom/VdomRealWorldUpdates.mjs +249 -0
  485. package/learn/javascript/NewNode.md +0 -31
package/src/Xhr.mjs CHANGED
@@ -20,6 +20,7 @@ class Xhr extends XhrConnection {
20
20
  /**
21
21
  * @member {Object} remote={app:['promiseRequest','promiseJson','setDefaultHeaders']}
22
22
  * @protected
23
+ * @reactive
23
24
  */
24
25
  remote: {
25
26
  app: [
@@ -34,10 +34,12 @@ class Button extends Component {
34
34
  ntype: 'button',
35
35
  /**
36
36
  * @member {String} badgePosition_='top-right'
37
+ * @reactive
37
38
  */
38
39
  badgePosition_: 'top-right',
39
40
  /**
40
41
  * @member {String|null} badgeText_=null
42
+ * @reactive
41
43
  */
42
44
  badgeText_: null,
43
45
  /**
@@ -53,6 +55,7 @@ class Button extends Component {
53
55
  * Shortcut for domListeners={click:handler}
54
56
  * A string based value assumes that the handlerFn lives inside a controller.Component
55
57
  * @member {Function|String|null} handler_=null
58
+ * @reactive
56
59
  */
57
60
  handler_: null,
58
61
  /**
@@ -65,17 +68,20 @@ class Button extends Component {
65
68
  /**
66
69
  * The CSS class to use for an icon, e.g. 'fa fa-home'
67
70
  * @member {String|null} [iconCls_=null]
71
+ * @reactive
68
72
  */
69
73
  iconCls_: null,
70
74
  /**
71
75
  * The color to use for an icon, e.g. '#ff0000' [optional]
72
76
  * @member {String|null} iconColor_=null
77
+ * @reactive
73
78
  */
74
79
  iconColor_: null,
75
80
  /**
76
81
  * The position of the icon in case iconCls has a value.
77
82
  * Valid values are: 'top', 'right', 'bottom', 'left'
78
83
  * @member {String} iconPosition_='left'
84
+ * @reactive
79
85
  */
80
86
  iconPosition_: 'left',
81
87
  /**
@@ -84,11 +90,13 @@ class Button extends Component {
84
90
  * Or a configuration object which adds custom configuration to the menu to be
85
91
  * created and includes an `items` property to define the menu items.
86
92
  * @member {Object|Object[]|null} menu_=null
93
+ * @reactive
87
94
  */
88
95
  menu_: null,
89
96
  /**
90
97
  * The pressed state of the Button
91
98
  * @member {Boolean} pressed_=false
99
+ * @reactive
92
100
  */
93
101
  pressed_: false,
94
102
  /**
@@ -96,26 +104,31 @@ class Button extends Component {
96
104
  * Use route for internal navigation and url for external links. Do not use both on the same instance.
97
105
  * Transforms the button tag into an a tag [optional]
98
106
  * @member {String|null} route_=null
107
+ * @reactive
99
108
  */
100
109
  route_: null,
101
110
  /**
102
111
  * The text displayed on the button [optional]
103
112
  * @member {String|null} text=null
113
+ * @reactive
104
114
  */
105
115
  text: null,
106
116
  /**
107
117
  * Transforms the button tag into an a tag [optional]
108
118
  * @member {String|null} url_=null
119
+ * @reactive
109
120
  */
110
121
  url_: null,
111
122
  /**
112
123
  * If url is set, applies the target attribute on the top level vdom node [optional]
113
124
  * @member {String} urlTarget_='_blank'
125
+ * @reactive
114
126
  */
115
127
  urlTarget_: '_blank',
116
128
  /**
117
129
  * True adds an expanding circle on click
118
130
  * @member {Boolean} useRippleEffect_=true
131
+ * @reactive
119
132
  */
120
133
  useRippleEffect_: true,
121
134
  /**
@@ -0,0 +1,449 @@
1
+ import Component from '../component/Base.mjs';
2
+ import Effect from '../core/Effect.mjs';
3
+ import NeoArray from '../util/Array.mjs';
4
+
5
+ /**
6
+ * @class Neo.button.Effect
7
+ * @extends Neo.component.Base
8
+ */
9
+ class EffectButton extends Component {
10
+ /**
11
+ * Valid values for badgePosition
12
+ * @member {String[]} badgePositions=['bottom-left','bottom-right','top-left','top-right']
13
+ * @protected
14
+ * @static
15
+ */
16
+ static badgePositions = ['bottom-left', 'bottom-right', 'top-left', 'top-right']
17
+ /**
18
+ * Valid values for iconPosition
19
+ * @member {String[]} iconPositions=['top','right','bottom','left']
20
+ * @protected
21
+ * @static
22
+ */
23
+ static iconPositions = ['top', 'right', 'bottom', 'left']
24
+
25
+ static config = {
26
+ /**
27
+ * @member {String} className='Neo.button.Effect'
28
+ * @protected
29
+ */
30
+ className: 'Neo.button.Effect',
31
+ /**
32
+ * @member {String} ntype='effect-button'
33
+ * @protected
34
+ */
35
+ ntype: 'effect-button',
36
+ /**
37
+ * @member {String} badgePosition_='top-right'
38
+ * @reactive
39
+ */
40
+ badgePosition_: 'top-right',
41
+ /**
42
+ * @member {String|null} badgeText_=null
43
+ * @reactive
44
+ */
45
+ badgeText_: null,
46
+ /**
47
+ * @member {String[]} baseCls=['neo-button']
48
+ */
49
+ baseCls: ['neo-button'],
50
+ /**
51
+ * @member {String[]} cls=[]
52
+ * @reactive
53
+ */
54
+ cls: [],
55
+ /**
56
+ * false calls Neo.Main.setRoute()
57
+ * @member {Boolean} editRoute=true
58
+ */
59
+ editRoute: true,
60
+ /**
61
+ * Shortcut for domListeners={click:handler}
62
+ * A string based value assumes that the handlerFn lives inside a controller.Component
63
+ * @member {Function|String|null} handler_=null
64
+ * @reactive
65
+ */
66
+ handler_: null,
67
+ /**
68
+ * The scope (this pointer) inside the handler function.
69
+ * Points to the button instance by default.
70
+ * You can use 'this' as a string for convenience reasons
71
+ * @member {Object|String|null} handlerScope=null
72
+ */
73
+ handlerScope: null,
74
+ /**
75
+ * The CSS class to use for an icon, e.g. 'fa fa-home'
76
+ * @member {String|null} [iconCls_=null]
77
+ * @reactive
78
+ */
79
+ iconCls_: null,
80
+ /**
81
+ * The color to use for an icon, e.g. '#ff0000' [optional]
82
+ * @member {String|null} iconColor_=null
83
+ * @reactive
84
+ */
85
+ iconColor_: null,
86
+ /**
87
+ * The position of the icon in case iconCls has a value.
88
+ * Valid values are: 'top', 'right', 'bottom', 'left'
89
+ * @member {String} iconPosition_='left'
90
+ * @reactive
91
+ */
92
+ iconPosition_: 'left',
93
+ /**
94
+ * An array representing the configuration of the menu items.
95
+ *
96
+ * Or a configuration object which adds custom configuration to the menu to be
97
+ * created and includes an `items` property to define the menu items.
98
+ * @member {Object|Object[]|null} menu_=null
99
+ * @reactive
100
+ */
101
+ menu_: null,
102
+ /**
103
+ * The pressed state of the Button
104
+ * @member {Boolean} pressed_=false
105
+ * @reactive
106
+ */
107
+ pressed_: false,
108
+ /**
109
+ * Change the browser hash value on click.
110
+ * Use route for internal navigation and url for external links. Do not use both on the same instance.
111
+ * Transforms the button tag into an a tag [optional]
112
+ * @member {String|null} route_=null
113
+ * @reactive
114
+ */
115
+ route_: null,
116
+ /**
117
+ * @member {String} tag='button'
118
+ * @reactive
119
+ */
120
+ tag: 'button',
121
+ /**
122
+ * Transforms the button tag into an a tag [optional]
123
+ * @member {String|null} url_=null
124
+ * @reactive
125
+ */
126
+ url_: null,
127
+ /**
128
+ * If url is set, applies the target attribute on the top level vdom node [optional]
129
+ * @member {String} urlTarget_='_blank'
130
+ * @reactive
131
+ */
132
+ urlTarget_: '_blank',
133
+ /**
134
+ * True adds an expanding circle on click
135
+ * @member {Boolean} useRippleEffect_=true
136
+ * @reactive
137
+ */
138
+ useRippleEffect_: true
139
+ }
140
+
141
+ /**
142
+ * Time in ms for the ripple effect when clicking on the button.
143
+ * Only active if useRippleEffect is set to true.
144
+ * @member {Number} rippleEffectDuration=400
145
+ */
146
+ rippleEffectDuration = 400
147
+ /**
148
+ * Internal flag to store the last setTimeout() id for ripple effect remove node callbacks
149
+ * @member {Number} #rippleTimeoutId=null
150
+ * @private
151
+ */
152
+ #rippleTimeoutId = null
153
+
154
+ /**
155
+ * @param {Object} config
156
+ */
157
+ construct(config) {
158
+ super.construct(config);
159
+
160
+ let me = this;
161
+
162
+ me.addDomListeners({
163
+ click: me.onClick,
164
+ scope: me
165
+ });
166
+
167
+ me.createVdomEffect()
168
+ }
169
+
170
+ /**
171
+ * Final. Should not be overridden.
172
+ * This is the core reactive effect.
173
+ * @returns {Neo.core.Effect}
174
+ * @protected
175
+ */
176
+ createVdomEffect() {
177
+ return new Effect(() => {
178
+ // The effect's only job is to get the config and trigger an update.
179
+ this._vdom = this.getVdomConfig();
180
+ this.update();
181
+ })
182
+ }
183
+
184
+ /**
185
+ * Builds the array of child nodes (the 'cn' property).
186
+ * Subclasses can override this to add or remove children.
187
+ * @returns {Object[]}
188
+ * @protected
189
+ */
190
+ getVdomChildren() {
191
+ return [
192
+ // iconNode
193
+ {tag: 'span', cls: ['neo-button-glyph', ...this._iconCls || []], removeDom: !this.iconCls, style: {color: this.iconColor || null}},
194
+ // textNode
195
+ {tag: 'span', cls: ['neo-button-text'], id: `${this.id}__text`, removeDom: !this.text, text: this.text},
196
+ // badgeNode
197
+ {cls: ['neo-button-badge', 'neo-' + this.badgePosition], removeDom: !this.badgeText, text: this.badgeText},
198
+ // rippleWrapper
199
+ {cls: ['neo-button-ripple-wrapper'], removeDom: !this.useRippleEffect, cn: [{cls: ['neo-button-ripple']}]}
200
+ ];
201
+ }
202
+
203
+ /**
204
+ * Builds the array of CSS classes for the root element.
205
+ * @returns {String[]}
206
+ * @protected
207
+ */
208
+ getVdomCls() {
209
+ let vdomCls = [...this.baseCls, ...this.cls];
210
+
211
+ NeoArray.toggle(vdomCls, 'no-text', !this.text);
212
+ NeoArray.toggle(vdomCls, 'pressed', this.pressed);
213
+ vdomCls.push('icon-' + this.iconPosition);
214
+
215
+ return vdomCls;
216
+ }
217
+
218
+ /**
219
+ * Builds the top-level VDOM object.
220
+ * Subclasses can override this to add or modify root properties.
221
+ * @returns {Object}
222
+ * @protected
223
+ */
224
+ getVdomConfig() {
225
+ let me = this,
226
+ link = !me.editRoute && me.route || me.url,
227
+ tag = link ? 'a' : 'button';
228
+
229
+ return {
230
+ tag,
231
+ cls : this.getVdomCls(),
232
+ href : link ? (link.startsWith('#') ? link : '#' + link) : null,
233
+ id : me.id,
234
+ style : me.style,
235
+ target : me.url ? me.urlTarget : null,
236
+ type : tag === 'button' ? 'button' : null,
237
+ cn : this.getVdomChildren()
238
+ };
239
+ }
240
+
241
+ /**
242
+ * Triggered after the menu config got changed
243
+ * @param {Object|Object[]|null} value
244
+ * @param {Object|Object[]|null} oldValue
245
+ * @protected
246
+ */
247
+ afterSetMenu(value, oldValue) {
248
+ if (value) {
249
+ import('../menu/List.mjs').then(module => {
250
+ let me = this,
251
+ isArray = Array.isArray(value),
252
+ items = isArray ? value : value.items,
253
+ menuConfig = isArray ? {} : value,
254
+ stateProvider = me.getStateProvider(),
255
+ {appName, theme, windowId} = me,
256
+
257
+ config = Neo.merge({
258
+ module : module.default,
259
+ align : {edgeAlign: 't0-b0', target: me.id},
260
+ appName,
261
+ displayField : 'text',
262
+ floating : true,
263
+ hidden : true,
264
+ parentComponent: me,
265
+ theme,
266
+ windowId
267
+ }, menuConfig);
268
+
269
+ if (items) {
270
+ config.items = items
271
+ }
272
+
273
+ if (stateProvider) {
274
+ config.stateProvider = {parent: stateProvider}
275
+ }
276
+
277
+ me.menuList = Neo.create(config)
278
+ })
279
+ }
280
+ }
281
+
282
+ /**
283
+ * Triggered after the theme config got changed
284
+ * @param {String|null} value
285
+ * @param {String|null} oldValue
286
+ * @protected
287
+ */
288
+ afterSetTheme(value, oldValue) {
289
+ super.afterSetTheme(value, oldValue);
290
+
291
+ let {menuList} = this;
292
+
293
+ if (menuList) {
294
+ menuList.theme = value
295
+ }
296
+ }
297
+
298
+ /**
299
+ * Triggered after the windowId config got changed
300
+ * @param {Number|null} value
301
+ * @param {Number|null} oldValue
302
+ * @protected
303
+ */
304
+ afterSetWindowId(value, oldValue) {
305
+ super.afterSetWindowId(value, oldValue);
306
+
307
+ let {menuList} = this;
308
+
309
+ if (menuList) {
310
+ menuList.windowId = value
311
+ }
312
+ }
313
+
314
+ /**
315
+ * Converts the iconCls array into a string on beforeGet
316
+ * @returns {String}
317
+ * @protected
318
+ */
319
+ beforeGetIconCls() {
320
+ let iconCls = this._iconCls;
321
+
322
+ if (Array.isArray(iconCls)) {
323
+ return iconCls.join(' ')
324
+ }
325
+
326
+ return iconCls
327
+ }
328
+
329
+ /**
330
+ * Triggered before the badgePosition config gets changed
331
+ * @param {String} value
332
+ * @param {String} oldValue
333
+ * @returns {String}
334
+ * @protected
335
+ */
336
+ beforeSetBadgePosition(value, oldValue) {
337
+ return this.beforeSetEnumValue(value, oldValue, 'badgePosition')
338
+ }
339
+
340
+ /**
341
+ * Triggered before the iconCls config gets changed. Converts the string into an array if needed.
342
+ * @param {Array|String|null} value
343
+ * @param {Array|String|null} oldValue
344
+ * @returns {Array}
345
+ * @protected
346
+ */
347
+ beforeSetIconCls(value, oldValue) {
348
+ if (value && !Array.isArray(value)) {
349
+ value = value.split(' ').filter(Boolean)
350
+ }
351
+
352
+ return value
353
+ }
354
+
355
+ /**
356
+ * Triggered before the iconPosition config gets changed
357
+ * @param {String} value
358
+ * @param {String} oldValue
359
+ * @protected
360
+ */
361
+ beforeSetIconPosition(value, oldValue) {
362
+ return this.beforeSetEnumValue(value, oldValue, 'iconPosition')
363
+ }
364
+
365
+ /**
366
+ * @protected
367
+ */
368
+ changeRoute() {
369
+ this.editRoute && Neo.Main.editRoute(this.route)
370
+ }
371
+
372
+ /**
373
+ * @param args
374
+ */
375
+ destroy(...args) {
376
+ this.menuList?.destroy(true, false);
377
+ super.destroy(...args)
378
+ }
379
+
380
+ /**
381
+ * @param {Object} data
382
+ */
383
+ onClick(data) {
384
+ let me = this;
385
+
386
+ me.bindCallback(me.handler, 'handler', me.handlerScope || me);
387
+ me.handler?.(data);
388
+
389
+ me.menu && me.toggleMenu();
390
+ me.route && me.changeRoute(); // only relevant for editRoute=true
391
+ me.useRippleEffect && me.showRipple(data)
392
+ }
393
+
394
+ /**
395
+ * @param {Object} data
396
+ */
397
+ async showRipple(data) {
398
+ let me = this,
399
+ buttonRect = data.path[0].rect,
400
+ diameter = Math.max(buttonRect.height, buttonRect.width),
401
+ radius = diameter / 2,
402
+ rippleEffectDuration = me.rippleEffectDuration,
403
+ rippleWrapper = me.getVdomRoot().cn[3],
404
+ rippleEl = rippleWrapper.cn[0],
405
+ rippleTimeoutId;
406
+
407
+ rippleEl.style = Object.assign(rippleEl.style || {}, {
408
+ animation: 'none',
409
+ height : `${diameter}px`,
410
+ left : `${data.clientX - buttonRect.left - radius}px`,
411
+ top : `${data.clientY - buttonRect.top - radius}px`,
412
+ width : `${diameter}px`
413
+ });
414
+
415
+ delete rippleWrapper.removeDom;
416
+ me.update();
417
+
418
+ await me.timeout(1);
419
+
420
+ rippleEl.style.animation = `ripple ${rippleEffectDuration}ms linear`;
421
+ me.update();
422
+
423
+ me.#rippleTimeoutId = rippleTimeoutId = setTimeout(() => {
424
+ // we do not want to break animations when clicking multiple times
425
+ if (me.#rippleTimeoutId === rippleTimeoutId) {
426
+ me.#rippleTimeoutId = null;
427
+
428
+ rippleWrapper.removeDom = true;
429
+ me.update()
430
+ }
431
+ }, rippleEffectDuration)
432
+ }
433
+
434
+ /**
435
+ *
436
+ */
437
+ async toggleMenu() {
438
+ let {menuList} = this,
439
+ hidden = !menuList.hidden;
440
+
441
+ menuList.hidden = hidden;
442
+
443
+ if (!hidden) {
444
+ await this.timeout(50)
445
+ }
446
+ }
447
+ }
448
+
449
+ export default Neo.setupClass(EffectButton);
@@ -20,6 +20,7 @@ class Split extends Button {
20
20
  ntype: 'split-button',
21
21
  /**
22
22
  * @member {Boolean} hideTriggerButton_=false
23
+ * @reactive
23
24
  */
24
25
  hideTriggerButton_: false,
25
26
  /**
@@ -38,6 +39,7 @@ class Split extends Button {
38
39
  /**
39
40
  * The CSS class to use for the SplitButton icon, e.g. 'fa fa-home'
40
41
  * @member {String} triggerButtonCls_='fa fa-caret-down'
42
+ * @reactive
41
43
  */
42
44
  triggerButtonIconCls_: 'fa fa-caret-down',
43
45
  /**
@@ -18,6 +18,7 @@ class Calendars extends Store {
18
18
  keyProperty: 'id',
19
19
  /**
20
20
  * @member {Neo.data.Model} model=Calendar
21
+ * @reactive
21
22
  */
22
23
  model: Calendar,
23
24
  /**
@@ -29,6 +29,7 @@ class Colors extends Store {
29
29
  keyProperty: 'id',
30
30
  /**
31
31
  * @member {Neo.data.Model} model=Color
32
+ * @reactive
32
33
  */
33
34
  model: Color
34
35
  }
@@ -19,6 +19,7 @@ class Events extends Store {
19
19
  keyProperty: 'id',
20
20
  /**
21
21
  * @member {Neo.data.Model} model=Event
22
+ * @reactive
22
23
  */
23
24
  model: Event,
24
25
  /**
@@ -18,11 +18,13 @@ class DayComponent extends WeekComponent {
18
18
  /**
19
19
  * Amount of hidden columns on both sides each inside this view.
20
20
  * @member {Number} columnsBuffer=1
21
+ * @reactive
21
22
  */
22
23
  columnsBuffer: 1,
23
24
  /**
24
25
  * Amount of visible columns inside this view.
25
26
  * @member {Number} columnsVisible=1
27
+ * @reactive
26
28
  */
27
29
  columnsVisible: 1
28
30
  }
@@ -26,7 +26,7 @@ class EditEventContainer extends FormContainer {
26
26
  */
27
27
  bind: {
28
28
  endTime : data => data.endTime,
29
- intlFormat_time : data => data.intlFormat_time,
29
+ intlFormat_time : data => data.timeFormatter,
30
30
  minimumEventDuration: data => data.minimumEventDuration,
31
31
  startTime : data => data.startTime
32
32
  },
@@ -38,6 +38,7 @@ class EditEventContainer extends FormContainer {
38
38
  * Only full hours are valid for now
39
39
  * format: 'hh:mm'
40
40
  * @member {String} endTime_='24:00'
41
+ * @reactive
41
42
  */
42
43
  endTime_: '24:00',
43
44
  /**
@@ -56,12 +57,14 @@ class EditEventContainer extends FormContainer {
56
57
  owner: null,
57
58
  /**
58
59
  * @member {Neo.calendar.model.Event|null} record_=null
60
+ * @reactive
59
61
  */
60
62
  record_: null,
61
63
  /**
62
64
  * Only full hours are valid for now
63
65
  * format: 'hh:mm'
64
66
  * @member {String} startTime_='00:00'
67
+ * @reactive
65
68
  */
66
69
  startTime_: '00:00',
67
70
  /**