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.
- package/.github/RELEASE_NOTES/v10.0.0-beta.4.md +2 -2
- package/.github/RELEASE_NOTES/v10.0.0-beta.5.md +70 -0
- package/.github/RELEASE_NOTES/v10.0.0-beta.6.md +48 -0
- package/.github/epic-functional-components.md +498 -0
- package/.github/ticket-asymmetric-vdom-updates.md +122 -0
- package/README.md +0 -3
- package/ServiceWorker.mjs +2 -2
- package/apps/colors/store/Colors.mjs +1 -0
- package/apps/colors/view/GridContainer.mjs +3 -0
- package/apps/colors/view/HeaderToolbar.mjs +2 -0
- package/apps/colors/view/Viewport.mjs +3 -0
- package/apps/covid/view/FooterContainer.mjs +3 -0
- package/apps/covid/view/GalleryContainer.mjs +2 -0
- package/apps/covid/view/GalleryContainerController.mjs +1 -0
- package/apps/covid/view/HeaderContainer.mjs +2 -0
- package/apps/covid/view/HelixContainer.mjs +2 -0
- package/apps/covid/view/HelixContainerController.mjs +1 -0
- package/apps/covid/view/MainContainer.mjs +3 -0
- package/apps/covid/view/TableContainer.mjs +3 -0
- package/apps/covid/view/TableContainerController.mjs +1 -0
- package/apps/covid/view/WorldMapContainer.mjs +2 -0
- package/apps/covid/view/country/Gallery.mjs +3 -0
- package/apps/covid/view/country/Helix.mjs +8 -0
- package/apps/covid/view/country/HistoricalDataTable.mjs +1 -0
- package/apps/covid/view/country/Table.mjs +2 -0
- package/apps/covid/view/mapboxGl/Component.mjs +1 -0
- package/apps/covid/view/mapboxGl/Container.mjs +2 -0
- package/apps/email/EPIC_PLAN.md +58 -0
- package/apps/email/neo-config.json +2 -2
- package/apps/email/store/Emails.mjs +11 -1
- package/apps/email/view/ComposeView.mjs +44 -0
- package/apps/email/view/MainView.mjs +89 -0
- package/apps/email/view/Viewport.mjs +4 -33
- package/apps/email/view/ViewportStateProvider.mjs +3 -3
- package/apps/form/store/SideNav.mjs +1 -0
- package/apps/form/view/FormContainer.mjs +1 -0
- package/apps/form/view/FormPageContainer.mjs +2 -0
- package/apps/form/view/SideNavList.mjs +1 -0
- package/apps/form/view/Viewport.mjs +3 -0
- package/apps/portal/childapps/preview/MainContainer.mjs +1 -0
- package/apps/portal/index.html +1 -1
- package/apps/portal/store/BlogPosts.mjs +2 -0
- package/apps/portal/store/Content.mjs +1 -0
- package/apps/portal/store/ContentSections.mjs +1 -0
- package/apps/portal/store/Examples.mjs +1 -0
- package/apps/portal/view/HeaderToolbar.mjs +1 -0
- package/apps/portal/view/Viewport.mjs +5 -0
- package/apps/portal/view/ViewportController.mjs +8 -2
- package/apps/portal/view/about/Container.mjs +2 -0
- package/apps/portal/view/about/MemberContainer.mjs +7 -0
- package/apps/portal/view/blog/Container.mjs +2 -0
- package/apps/portal/view/blog/List.mjs +2 -0
- package/apps/portal/view/examples/List.mjs +1 -0
- package/apps/portal/view/examples/TabContainer.mjs +4 -0
- package/apps/portal/view/home/ContentBox.mjs +3 -0
- package/apps/portal/view/home/FeatureSection.mjs +8 -0
- package/apps/portal/view/home/FooterContainer.mjs +4 -1
- package/apps/portal/view/home/MainContainer.mjs +2 -0
- package/apps/portal/view/home/parts/AfterMath.mjs +2 -0
- package/apps/portal/view/home/parts/BaseContainer.mjs +1 -0
- package/apps/portal/view/home/parts/Colors.mjs +4 -0
- package/apps/portal/view/home/parts/Features.mjs +2 -0
- package/apps/portal/view/home/parts/Helix.mjs +5 -0
- package/apps/portal/view/home/parts/How.mjs +4 -0
- package/apps/portal/view/home/parts/MainNeo.mjs +1 -0
- package/apps/portal/view/home/parts/References.mjs +2 -0
- package/apps/portal/view/learn/ContentComponent.mjs +11 -5
- package/apps/portal/view/learn/ContentTreeList.mjs +2 -0
- package/apps/portal/view/learn/CubeLayoutButton.mjs +1 -0
- package/apps/portal/view/learn/MainContainer.mjs +4 -0
- package/apps/portal/view/learn/PageContainer.mjs +2 -0
- package/apps/portal/view/learn/PageSectionsContainer.mjs +3 -0
- package/apps/portal/view/learn/PageSectionsList.mjs +1 -0
- package/apps/portal/view/services/Component.mjs +1 -0
- package/apps/realworld/api/Base.mjs +1 -0
- package/apps/realworld/view/HeaderComponent.mjs +4 -0
- package/apps/realworld/view/HomeComponent.mjs +7 -0
- package/apps/realworld/view/MainContainer.mjs +2 -0
- package/apps/realworld/view/MainContainerController.mjs +2 -0
- package/apps/realworld/view/article/CommentComponent.mjs +3 -0
- package/apps/realworld/view/article/Component.mjs +17 -10
- package/apps/realworld/view/article/CreateCommentComponent.mjs +2 -0
- package/apps/realworld/view/article/CreateComponent.mjs +5 -0
- package/apps/realworld/view/article/PreviewComponent.mjs +9 -0
- package/apps/realworld/view/article/TagListComponent.mjs +2 -0
- package/apps/realworld/view/user/ProfileComponent.mjs +7 -0
- package/apps/realworld/view/user/SettingsComponent.mjs +5 -0
- package/apps/realworld/view/user/SignUpComponent.mjs +3 -0
- package/apps/realworld2/api/Base.mjs +1 -0
- package/apps/realworld2/view/FooterComponent.mjs +1 -0
- package/apps/realworld2/view/HeaderToolbar.mjs +3 -0
- package/apps/realworld2/view/HomeContainer.mjs +1 -0
- package/apps/realworld2/view/MainContainer.mjs +2 -0
- package/apps/realworld2/view/MainContainerController.mjs +1 -0
- package/apps/realworld2/view/article/Helix.mjs +1 -0
- package/apps/realworld2/view/article/PreviewComponent.mjs +9 -0
- package/apps/realworld2/view/article/PreviewList.mjs +1 -0
- package/apps/realworld2/view/article/TagListComponent.mjs +2 -0
- package/apps/route/view/CenterContainer.mjs +1 -0
- package/apps/route/view/MainView.mjs +1 -0
- package/apps/sharedcovid/childapps/sharedcovidchart/MainContainer.mjs +1 -0
- package/apps/sharedcovid/childapps/sharedcovidgallery/MainContainer.mjs +1 -0
- package/apps/sharedcovid/childapps/sharedcovidhelix/MainContainer.mjs +1 -0
- package/apps/sharedcovid/childapps/sharedcovidmap/MainContainer.mjs +1 -0
- package/apps/sharedcovid/view/FooterContainer.mjs +3 -0
- package/apps/sharedcovid/view/GalleryContainer.mjs +2 -0
- package/apps/sharedcovid/view/GalleryContainerController.mjs +1 -0
- package/apps/sharedcovid/view/HeaderContainer.mjs +2 -0
- package/apps/sharedcovid/view/HelixContainer.mjs +2 -0
- package/apps/sharedcovid/view/HelixContainerController.mjs +1 -0
- package/apps/sharedcovid/view/MainContainer.mjs +3 -0
- package/apps/sharedcovid/view/TableContainer.mjs +3 -0
- package/apps/sharedcovid/view/TableContainerController.mjs +1 -0
- package/apps/sharedcovid/view/WorldMapContainer.mjs +2 -0
- package/apps/sharedcovid/view/country/Gallery.mjs +3 -0
- package/apps/sharedcovid/view/country/Helix.mjs +8 -0
- package/apps/sharedcovid/view/country/HistoricalDataTable.mjs +1 -0
- package/apps/sharedcovid/view/country/Table.mjs +2 -0
- package/apps/sharedcovid/view/mapboxGl/Component.mjs +1 -0
- package/apps/sharedcovid/view/mapboxGl/Container.mjs +2 -0
- package/apps/shareddialog/childapps/shareddialog2/view/MainContainer.mjs +2 -0
- package/apps/shareddialog/view/DemoDialog.mjs +2 -0
- package/apps/shareddialog/view/MainContainer.mjs +2 -0
- package/apps/shareddialog/view/MainContainerController.mjs +1 -0
- package/buildScripts/addReactiveTags.mjs +191 -0
- package/buildScripts/checkReactiveTags.mjs +160 -0
- package/docs/app/store/Api.mjs +1 -0
- package/docs/app/store/Examples.mjs +1 -0
- package/docs/app/view/ApiTreeList.mjs +1 -0
- package/docs/app/view/ContentTabContainer.mjs +2 -0
- package/docs/app/view/ExamplesTreeList.mjs +2 -0
- package/docs/app/view/HeaderContainer.mjs +3 -0
- package/docs/app/view/MainContainer.mjs +5 -0
- package/docs/app/view/classdetails/HeaderComponent.mjs +1 -0
- package/docs/app/view/classdetails/MainContainer.mjs +3 -0
- package/docs/app/view/classdetails/MembersList.mjs +5 -0
- package/docs/app/view/classdetails/SourceViewComponent.mjs +2 -0
- package/examples/ConfigurationViewport.mjs +14 -8
- package/examples/button/effect/MainContainer.mjs +207 -0
- package/examples/button/effect/app.mjs +6 -0
- package/examples/button/effect/index.html +11 -0
- package/examples/button/effect/neo-config.json +6 -0
- package/examples/calendar/weekview/MainContainer.mjs +4 -0
- package/examples/component/coronaGallery/CountryGallery.mjs +2 -0
- package/examples/component/coronaGallery/CountryStore.mjs +1 -0
- package/examples/component/coronaGallery/Viewport.mjs +3 -0
- package/examples/component/coronaGallery/ViewportController.mjs +1 -0
- package/examples/component/coronaHelix/CountryHelix.mjs +7 -0
- package/examples/component/coronaHelix/MainContainer.mjs +1 -0
- package/examples/component/gallery/ImageStore.mjs +1 -0
- package/examples/component/helix/ImageStore.mjs +1 -0
- package/examples/component/helix/Viewport.mjs +3 -0
- package/examples/component/helix/ViewportController.mjs +1 -0
- package/examples/component/multiWindowCoronaGallery/childapp/Viewport.mjs +1 -0
- package/examples/component/multiWindowHelix/childapp/Viewport.mjs +1 -0
- package/examples/component/wrapper/googleMaps/MapComponent.mjs +2 -0
- package/examples/core/config/MainContainer.mjs +2 -0
- package/examples/dialog/DemoDialog.mjs +2 -0
- package/examples/dialog/MainContainer.mjs +1 -0
- package/examples/form/field/color/MainStore.mjs +1 -0
- package/examples/functional/defineComponent/Component.mjs +18 -0
- package/examples/functional/defineComponent/MainContainer.mjs +41 -0
- package/examples/functional/defineComponent/app.mjs +6 -0
- package/examples/functional/defineComponent/index.html +11 -0
- package/examples/functional/defineComponent/neo-config.json +6 -0
- package/examples/functional/hostComponent/Component.mjs +32 -0
- package/examples/functional/hostComponent/MainContainer.mjs +48 -0
- package/examples/functional/hostComponent/app.mjs +6 -0
- package/examples/functional/hostComponent/index.html +11 -0
- package/examples/functional/hostComponent/neo-config.json +6 -0
- package/examples/grid/animatedRowSorting/Viewport.mjs +1 -1
- package/examples/grid/bigData/ControlsContainer.mjs +3 -0
- package/examples/grid/bigData/GridContainer.mjs +4 -2
- package/examples/grid/bigData/MainContainer.mjs +2 -0
- package/examples/grid/bigData/MainModel.mjs +1 -0
- package/examples/grid/bigData/MainStore.mjs +3 -0
- package/examples/grid/cellEditing/MainContainer.mjs +1 -1
- package/examples/grid/container/MainContainer.mjs +1 -1
- package/examples/grid/covid/GridContainer.mjs +3 -0
- package/examples/grid/covid/MainContainer.mjs +2 -0
- package/examples/grid/covid/Store.mjs +1 -0
- package/examples/grid/nestedRecordFields/EditUserDialog.mjs +3 -0
- package/examples/grid/nestedRecordFields/Viewport.mjs +3 -1
- package/examples/list/animate/List.mjs +4 -0
- package/examples/list/animate/MainContainer.mjs +2 -0
- package/examples/list/circle/MainStore.mjs +1 -0
- package/examples/list/color/MainStore.mjs +1 -0
- package/examples/preloadingAssets/view/MainContainer.mjs +2 -0
- package/examples/stateProvider/advanced/MainContainer.mjs +1 -0
- package/examples/stateProvider/dialog/EditUserDialog.mjs +2 -0
- package/examples/stateProvider/dialog/MainContainer.mjs +1 -0
- package/examples/stateProvider/extendedClass/MainContainer.mjs +2 -0
- package/examples/stateProvider/inline/MainContainer.mjs +1 -0
- package/examples/stateProvider/inlineNoStateProvider/MainContainer.mjs +1 -0
- package/examples/stateProvider/inlineNoStateProvider/MainContainerController.mjs +2 -0
- package/examples/stateProvider/multiWindow/EditUserDialog.mjs +3 -0
- package/examples/stateProvider/multiWindow/MainContainer.mjs +1 -0
- package/examples/stateProvider/multiWindow/Viewport.mjs +1 -0
- package/examples/stateProvider/nestedData/MainContainer.mjs +1 -0
- package/examples/stateProvider/table/MainContainer.mjs +1 -0
- package/examples/table/covid/MainContainer.mjs +2 -0
- package/examples/table/covid/Store.mjs +1 -0
- package/examples/table/covid/TableContainer.mjs +3 -0
- package/examples/table/nestedRecordFields/EditUserDialog.mjs +3 -0
- package/examples/table/nestedRecordFields/Viewport.mjs +1 -0
- package/examples/todoList/version1/MainComponent.mjs +1 -1
- package/examples/toolbar/breadcrumb/view/MainContainer.mjs +2 -0
- package/examples/toolbar/paging/store/Users.mjs +1 -0
- package/examples/toolbar/paging/view/AddUserDialog.mjs +3 -0
- package/examples/toolbar/paging/view/MainContainer.mjs +3 -0
- package/examples/treeAccordion/MainContainer.mjs +2 -2
- package/examples/worker/task/MainContainer.mjs +1 -0
- package/learn/Glossary.md +1 -0
- package/learn/UsingTheseTopics.md +1 -0
- package/learn/benefits/ConfigSystem.md +2 -0
- package/learn/benefits/Effort.md +1 -0
- package/learn/benefits/Features.md +1 -0
- package/learn/benefits/FormsEngine.md +1 -0
- package/learn/benefits/FourEnvironments.md +2 -0
- package/learn/benefits/Introduction.md +2 -0
- package/learn/benefits/MultiWindow.md +3 -1
- package/learn/benefits/OffTheMainThread.md +2 -0
- package/learn/benefits/Quick.md +2 -0
- package/learn/benefits/RPCLayer.md +2 -0
- package/learn/benefits/Speed.md +2 -0
- package/learn/comparisons/NeoVsAngular.md +90 -0
- package/learn/comparisons/NeoVsExtJs.md +178 -0
- package/learn/comparisons/NeoVsNextJs.md +124 -0
- package/learn/comparisons/NeoVsReact.md +95 -0
- package/learn/comparisons/NeoVsSolid.md +78 -0
- package/learn/comparisons/NeoVsVue.md +92 -0
- package/learn/comparisons/Overview.md +46 -0
- package/learn/gettingstarted/ComponentModels.md +2 -0
- package/learn/gettingstarted/Config.md +2 -0
- package/learn/gettingstarted/DescribingTheUI.md +2 -0
- package/learn/gettingstarted/Events.md +2 -0
- package/learn/gettingstarted/Extending.md +2 -0
- package/learn/gettingstarted/References.md +2 -0
- package/learn/gettingstarted/Setup.md +3 -2
- package/learn/gettingstarted/Workspaces.md +2 -0
- package/learn/guides/datahandling/Collections.md +1 -0
- package/learn/guides/datahandling/Records.md +1 -0
- package/learn/guides/datahandling/StateProviders.md +131 -16
- package/learn/guides/datahandling/Tables.md +1 -1
- package/learn/guides/fundamentals/ConfigSystemDeepDive.md +1 -0
- package/learn/guides/fundamentals/DeclarativeComponentTreesVsImperativeVdom.md +2 -0
- package/learn/guides/fundamentals/DeclarativeVDOMWithEffects.md +168 -0
- package/learn/guides/fundamentals/ExtendingNeoClasses.md +1 -0
- package/learn/guides/fundamentals/InstanceLifecycle.md +3 -1
- package/learn/guides/fundamentals/MainThreadAddons.md +2 -0
- package/learn/guides/specificfeatures/Mixins.md +3 -1
- package/learn/guides/specificfeatures/MultiWindow.md +3 -1
- package/learn/guides/specificfeatures/PortalApp.md +2 -0
- package/learn/guides/uibuildingblocks/ComponentsAndContainers.md +2 -0
- package/learn/guides/uibuildingblocks/CustomComponents.md +2 -0
- package/learn/guides/uibuildingblocks/Layouts.md +2 -0
- package/learn/guides/uibuildingblocks/WorkingWithVDom.md +2 -0
- package/learn/guides/userinteraction/Forms.md +2 -0
- package/learn/guides/userinteraction/events/CustomEvents.md +2 -1
- package/learn/guides/userinteraction/events/DomEvents.md +2 -0
- package/learn/javascript/ClassFeatures.md +4 -3
- package/learn/javascript/Classes.md +10 -13
- package/learn/javascript/Overrides.md +10 -6
- package/learn/javascript/Super.md +12 -8
- package/learn/tree.json +71 -63
- package/learn/tutorials/Earthquakes.md +2 -0
- package/learn/tutorials/RSP.md +3 -1
- package/learn/tutorials/TodoList.md +103 -7
- package/package.json +6 -4
- package/resources/scss/src/apps/email/ComposeView.scss +16 -0
- package/resources/scss/src/apps/email/MainView.scss +5 -0
- package/resources/scss/src/apps/portal/learn/ContentComponent.scss +5 -4
- package/src/DefaultConfig.mjs +12 -2
- package/src/Main.mjs +1 -0
- package/src/Neo.mjs +377 -178
- package/src/Xhr.mjs +1 -0
- package/src/button/Base.mjs +13 -0
- package/src/button/Effect.mjs +449 -0
- package/src/button/Split.mjs +2 -0
- package/src/calendar/store/Calendars.mjs +1 -0
- package/src/calendar/store/Colors.mjs +1 -0
- package/src/calendar/store/Events.mjs +1 -0
- package/src/calendar/view/DayComponent.mjs +2 -0
- package/src/calendar/view/EditEventContainer.mjs +4 -1
- package/src/calendar/view/MainContainer.mjs +13 -0
- package/src/calendar/view/MainContainerStateProvider.mjs +14 -28
- package/src/calendar/view/SettingsContainer.mjs +1 -0
- package/src/calendar/view/YearComponent.mjs +16 -0
- package/src/calendar/view/calendars/ColorsList.mjs +2 -0
- package/src/calendar/view/calendars/Container.mjs +2 -0
- package/src/calendar/view/calendars/EditContainer.mjs +1 -0
- package/src/calendar/view/month/Component.mjs +11 -0
- package/src/calendar/view/settings/GeneralContainer.mjs +1 -0
- package/src/calendar/view/settings/MonthContainer.mjs +1 -0
- package/src/calendar/view/settings/WeekContainer.mjs +1 -0
- package/src/calendar/view/settings/YearContainer.mjs +1 -0
- package/src/calendar/view/week/Component.mjs +15 -1
- package/src/calendar/view/week/TimeAxisComponent.mjs +4 -0
- package/src/code/LivePreview.mjs +51 -23
- package/src/collection/Base.mjs +14 -12
- package/src/collection/Filter.mjs +6 -0
- package/src/collection/Sorter.mjs +3 -0
- package/src/component/Base.mjs +156 -802
- package/src/component/Canvas.mjs +1 -0
- package/src/component/Chip.mjs +4 -0
- package/src/component/Circle.mjs +14 -0
- package/src/component/Clock.mjs +4 -0
- package/src/component/DateSelector.mjs +12 -0
- package/src/component/Gallery.mjs +11 -0
- package/src/component/Helix.mjs +24 -0
- package/src/component/Label.mjs +1 -0
- package/src/component/Legend.mjs +3 -0
- package/src/component/MagicMoveText.mjs +4 -0
- package/src/component/Progress.mjs +3 -0
- package/src/component/Splitter.mjs +3 -0
- package/src/component/StatusBadge.mjs +6 -0
- package/src/component/Timer.mjs +4 -0
- package/src/component/Toast.mjs +6 -0
- package/src/component/Video.mjs +1 -0
- package/src/component/mwc/Button.mjs +7 -0
- package/src/component/mwc/TextField.mjs +9 -0
- package/src/component/wrapper/AmChart.mjs +2 -0
- package/src/component/wrapper/GoogleMaps.mjs +3 -0
- package/src/component/wrapper/MapboxGL.mjs +5 -0
- package/src/component/wrapper/MonacoEditor.mjs +12 -0
- package/src/container/Accordion.mjs +2 -0
- package/src/container/Base.mjs +34 -26
- package/src/container/Panel.mjs +1 -0
- package/src/container/Viewport.mjs +1 -0
- package/src/controller/Application.mjs +1 -0
- package/src/controller/Base.mjs +1 -0
- package/src/controller/Component.mjs +1 -0
- package/src/core/Base.mjs +193 -22
- package/src/core/Compare.mjs +4 -7
- package/src/core/Config.mjs +137 -33
- package/src/core/Effect.mjs +193 -0
- package/src/core/EffectBatchManager.mjs +67 -0
- package/src/core/EffectManager.mjs +60 -0
- package/src/core/IdGenerator.mjs +13 -44
- package/src/data/Model.mjs +2 -0
- package/src/data/Store.mjs +7 -0
- package/src/data/connection/WebSocket.mjs +2 -0
- package/src/date/DayViewComponent.mjs +2 -0
- package/src/date/SelectorContainer.mjs +14 -0
- package/src/dialog/Base.mjs +8 -0
- package/src/draggable/DragZone.mjs +5 -0
- package/src/draggable/tree/DragZone.mjs +1 -0
- package/src/filter/BooleanContainer.mjs +2 -0
- package/src/filter/NumberContainer.mjs +3 -0
- package/src/filter/ToggleOperatorsButton.mjs +2 -0
- package/src/form/Fieldset.mjs +6 -0
- package/src/form/field/Base.mjs +7 -0
- package/src/form/field/CheckBox.mjs +18 -0
- package/src/form/field/Chip.mjs +1 -0
- package/src/form/field/ComboBox.mjs +8 -0
- package/src/form/field/Country.mjs +1 -0
- package/src/form/field/Currency.mjs +2 -0
- package/src/form/field/Date.mjs +4 -0
- package/src/form/field/Display.mjs +1 -0
- package/src/form/field/Email.mjs +1 -0
- package/src/form/field/FileUpload.mjs +7 -0
- package/src/form/field/Hidden.mjs +1 -0
- package/src/form/field/Number.mjs +7 -0
- package/src/form/field/Password.mjs +1 -0
- package/src/form/field/Phone.mjs +3 -0
- package/src/form/field/Picker.mjs +2 -0
- package/src/form/field/Radio.mjs +1 -0
- package/src/form/field/Range.mjs +3 -0
- package/src/form/field/Search.mjs +2 -0
- package/src/form/field/Text.mjs +32 -0
- package/src/form/field/TextArea.mjs +7 -0
- package/src/form/field/Time.mjs +6 -0
- package/src/form/field/Url.mjs +3 -0
- package/src/form/field/ZipCode.mjs +2 -0
- package/src/form/field/trigger/Base.mjs +3 -0
- package/src/form/field/trigger/Clear.mjs +2 -0
- package/src/form/field/trigger/CopyToClipboard.mjs +2 -0
- package/src/form/field/trigger/Date.mjs +1 -0
- package/src/form/field/trigger/Picker.mjs +1 -0
- package/src/form/field/trigger/Search.mjs +1 -0
- package/src/form/field/trigger/SpinDown.mjs +2 -0
- package/src/form/field/trigger/SpinUp.mjs +1 -0
- package/src/form/field/trigger/Time.mjs +2 -0
- package/src/functional/_export.mjs +6 -0
- package/src/functional/component/Base.mjs +499 -0
- package/src/functional/defineComponent.mjs +102 -0
- package/src/functional/useConfig.mjs +52 -0
- package/src/functional/useEvent.mjs +43 -0
- package/src/grid/Body.mjs +20 -1
- package/src/grid/Container.mjs +57 -63
- package/src/grid/ScrollManager.mjs +2 -0
- package/src/grid/VerticalScrollbar.mjs +2 -0
- package/src/grid/column/Base.mjs +2 -0
- package/src/grid/column/Component.mjs +1 -1
- package/src/grid/header/Button.mjs +7 -0
- package/src/grid/header/Toolbar.mjs +6 -0
- package/src/grid/plugin/AnimateRows.mjs +2 -0
- package/src/layout/Base.mjs +3 -0
- package/src/layout/Card.mjs +1 -0
- package/src/layout/Cube.mjs +11 -1
- package/src/layout/Fit.mjs +1 -0
- package/src/layout/Flexbox.mjs +7 -0
- package/src/layout/Form.mjs +2 -0
- package/src/layout/Grid.mjs +1 -0
- package/src/layout/HBox.mjs +1 -0
- package/src/layout/VBox.mjs +1 -0
- package/src/list/Base.mjs +13 -0
- package/src/list/Chip.mjs +1 -0
- package/src/list/Circle.mjs +2 -0
- package/src/list/Color.mjs +1 -0
- package/src/list/plugin/Animate.mjs +2 -0
- package/src/main/DeltaUpdates.mjs +1 -0
- package/src/main/DomEvents.mjs +2 -0
- package/src/main/addon/CloneNode.mjs +1 -0
- package/src/main/addon/Cookie.mjs +1 -0
- package/src/main/addon/GoogleMaps.mjs +1 -0
- package/src/main/addon/LocalStorage.mjs +1 -0
- package/src/main/addon/MapboxGL.mjs +1 -0
- package/src/main/addon/Markdown.mjs +1 -0
- package/src/main/addon/Navigator.mjs +1 -0
- package/src/main/addon/Popover.mjs +1 -0
- package/src/main/addon/Stylesheet.mjs +1 -0
- package/src/main/addon/WindowPosition.mjs +1 -0
- package/src/manager/Component.mjs +0 -71
- package/src/manager/VDomUpdate.mjs +235 -0
- package/src/menu/List.mjs +6 -0
- package/src/menu/Model.mjs +1 -0
- package/src/menu/Panel.mjs +3 -0
- package/src/menu/Store.mjs +1 -0
- package/src/mixin/DomEvents.mjs +130 -0
- package/src/mixin/VdomLifecycle.mjs +667 -0
- package/src/plugin/Base.mjs +1 -0
- package/src/plugin/Resizable.mjs +2 -0
- package/src/selection/Model.mjs +15 -18
- package/src/selection/grid/BaseModel.mjs +1 -0
- package/src/sitemap/Component.mjs +1 -0
- package/src/state/Provider.mjs +376 -457
- package/src/state/createHierarchicalDataProxy.mjs +138 -0
- package/src/tab/Container.mjs +6 -0
- package/src/tab/Strip.mjs +1 -0
- package/src/tab/header/Button.mjs +2 -0
- package/src/tab/header/EffectButton.mjs +77 -0
- package/src/tab/header/Toolbar.mjs +1 -0
- package/src/table/Body.mjs +3 -0
- package/src/table/Container.mjs +10 -0
- package/src/table/header/Button.mjs +8 -0
- package/src/table/header/Toolbar.mjs +5 -0
- package/src/table/plugin/CellEditing.mjs +1 -0
- package/src/toolbar/Base.mjs +4 -0
- package/src/toolbar/Breadcrumb.mjs +3 -0
- package/src/toolbar/Paging.mjs +5 -0
- package/src/tooltip/Base.mjs +2 -0
- package/src/tree/List.mjs +3 -0
- package/src/util/HashHistory.mjs +1 -0
- package/src/util/KeyNavigation.mjs +2 -0
- package/src/util/Matrix.mjs +1 -0
- package/src/util/VDom.mjs +7 -1
- package/src/util/VNode.mjs +7 -1
- package/src/util/vdom/TreeBuilder.mjs +129 -0
- package/src/vdom/Helper.mjs +44 -33
- package/src/vdom/VNode.mjs +5 -7
- package/src/worker/App.mjs +1 -5
- package/src/worker/Base.mjs +2 -0
- package/src/worker/Manager.mjs +2 -0
- package/src/worker/ServiceBase.mjs +6 -1
- package/test/siesta/siesta.js +36 -1
- package/test/siesta/tests/CollectionBase.mjs +10 -10
- package/test/siesta/tests/VdomCalendar.mjs +13 -9
- package/test/siesta/tests/VdomHelper.mjs +22 -59
- package/test/siesta/tests/config/AfterSetConfig.mjs +100 -0
- package/test/siesta/tests/{ReactiveConfigs.mjs → config/Basic.mjs} +58 -21
- package/test/siesta/tests/config/CircularDependencies.mjs +166 -0
- package/test/siesta/tests/config/CustomFunctions.mjs +69 -0
- package/test/siesta/tests/config/Hierarchy.mjs +94 -0
- package/test/siesta/tests/config/MemoryLeak.mjs +92 -0
- package/test/siesta/tests/config/MultiLevelHierarchy.mjs +85 -0
- package/test/siesta/tests/core/Effect.mjs +127 -0
- package/test/siesta/tests/core/EffectBatching.mjs +310 -0
- package/test/siesta/tests/neo/MixinStaticConfig.mjs +138 -0
- package/test/siesta/tests/state/Provider.mjs +537 -0
- package/test/siesta/tests/state/ProviderNestedDataConfigs.mjs +255 -0
- package/test/siesta/tests/state/createHierarchicalDataProxy.mjs +204 -0
- package/test/siesta/tests/vdom/VdomAsymmetricUpdates.mjs +366 -0
- package/test/siesta/tests/vdom/VdomRealWorldUpdates.mjs +249 -0
- package/learn/javascript/NewNode.md +0 -31
@@ -5,6 +5,10 @@ import Style from '../../../src/util/Style.mjs';
|
|
5
5
|
import VdomHelper from '../../../src/vdom/Helper.mjs';
|
6
6
|
import VDomUtil from '../../../src/util/VDom.mjs';
|
7
7
|
|
8
|
+
// tests are designed for this rendering mode
|
9
|
+
Neo.config.useDomApiRenderer = false;
|
10
|
+
VdomHelper.onNeoConfigChange({useDomApiRenderer: false})
|
11
|
+
|
8
12
|
let deltas, output, tmp, vdom, vnode;
|
9
13
|
|
10
14
|
StartTest(t => {
|
@@ -18,16 +22,14 @@ StartTest(t => {
|
|
18
22
|
vdom = {tag: 'div'};
|
19
23
|
t.diag("VdomHelper.create({tag: div});");
|
20
24
|
|
21
|
-
|
25
|
+
output = VdomHelper.create({vdom}); vnode = output.vnode;
|
22
26
|
|
23
27
|
t.isDeeplyStrict(vnode, {
|
24
28
|
attributes: {},
|
25
29
|
childNodes: [],
|
26
30
|
className : [],
|
27
31
|
id : 'neo-vnode-1',
|
28
|
-
innerHTML : undefined,
|
29
32
|
nodeName : 'div',
|
30
|
-
outerHTML : '<div id="neo-vnode-1"></div>', // will only get created using VdomHelper.create()
|
31
33
|
style : {},
|
32
34
|
vtype : 'vnode'
|
33
35
|
}, 'vnode got created successfully');
|
@@ -48,7 +50,6 @@ StartTest(t => {
|
|
48
50
|
childNodes: [],
|
49
51
|
className : ['neo-component'],
|
50
52
|
id : 'neo-vnode-1',
|
51
|
-
innerHTML : undefined,
|
52
53
|
nodeName : 'div',
|
53
54
|
style : {},
|
54
55
|
vtype : 'vnode'
|
@@ -68,7 +69,6 @@ StartTest(t => {
|
|
68
69
|
childNodes: [],
|
69
70
|
className : ['neo-panel', 'neo-container', 'neo-component'],
|
70
71
|
id : 'neo-vnode-1',
|
71
|
-
innerHTML : undefined,
|
72
72
|
nodeName : 'div',
|
73
73
|
style : {},
|
74
74
|
vtype : 'vnode'
|
@@ -88,7 +88,6 @@ StartTest(t => {
|
|
88
88
|
childNodes: [],
|
89
89
|
className : ['neo-container'],
|
90
90
|
id : 'neo-vnode-1',
|
91
|
-
innerHTML : undefined,
|
92
91
|
nodeName : 'div',
|
93
92
|
style : {},
|
94
93
|
vtype : 'vnode'
|
@@ -110,7 +109,6 @@ StartTest(t => {
|
|
110
109
|
childNodes: [],
|
111
110
|
className : ['neo-container'],
|
112
111
|
id : 'neo-vnode-1',
|
113
|
-
innerHTML : undefined,
|
114
112
|
nodeName : 'div',
|
115
113
|
style : {backgroundColor: 'red'},
|
116
114
|
vtype : 'vnode'
|
@@ -133,7 +131,6 @@ StartTest(t => {
|
|
133
131
|
childNodes: [],
|
134
132
|
className : ['neo-container'],
|
135
133
|
id : 'neo-vnode-1',
|
136
|
-
innerHTML : undefined,
|
137
134
|
nodeName : 'div',
|
138
135
|
style : {backgroundColor: 'red', color: 'green', height: '100px'},
|
139
136
|
vtype : 'vnode'
|
@@ -157,7 +154,6 @@ StartTest(t => {
|
|
157
154
|
childNodes: [],
|
158
155
|
className : ['neo-container'],
|
159
156
|
id : 'neo-vnode-1',
|
160
|
-
innerHTML : undefined,
|
161
157
|
nodeName : 'div',
|
162
158
|
style : {color: 'green'},
|
163
159
|
vtype : 'vnode'
|
@@ -183,7 +179,6 @@ StartTest(t => {
|
|
183
179
|
childNodes: [],
|
184
180
|
className : ['neo-container'],
|
185
181
|
id : 'neo-vnode-1',
|
186
|
-
innerHTML : undefined,
|
187
182
|
nodeName : 'div',
|
188
183
|
style : {color: 'green'},
|
189
184
|
vtype : 'vnode'
|
@@ -206,7 +201,6 @@ StartTest(t => {
|
|
206
201
|
childNodes: [],
|
207
202
|
className : ['neo-container'],
|
208
203
|
id : 'neo-vnode-1',
|
209
|
-
innerHTML : undefined,
|
210
204
|
nodeName : 'div',
|
211
205
|
style : {color: 'green'},
|
212
206
|
vtype : 'vnode'
|
@@ -229,7 +223,6 @@ StartTest(t => {
|
|
229
223
|
childNodes: [],
|
230
224
|
className : ['neo-container'],
|
231
225
|
id : 'neo-vnode-1',
|
232
|
-
innerHTML : undefined,
|
233
226
|
nodeName : 'div',
|
234
227
|
style : {color: 'green'},
|
235
228
|
vtype : 'vnode'
|
@@ -254,15 +247,14 @@ StartTest(t => {
|
|
254
247
|
attributes: {},
|
255
248
|
className : ['neo-container'],
|
256
249
|
id : 'neo-vnode-1',
|
257
|
-
innerHTML : undefined,
|
258
250
|
nodeName : 'div',
|
259
251
|
style : {color: 'green'},
|
260
252
|
vtype : 'vnode',
|
261
253
|
|
262
254
|
childNodes: [
|
263
|
-
{attributes: {}, childNodes: [], className: [], id: 'neo-vnode-2',
|
264
|
-
{attributes: {}, childNodes: [], className: [], id: 'neo-button-1',
|
265
|
-
{attributes: {}, childNodes: [], className: [], id: 'neo-vnode-3',
|
255
|
+
{attributes: {}, childNodes: [], className: [], id: 'neo-vnode-2', nodeName: 'div', style: {}, vtype: 'vnode'},
|
256
|
+
{attributes: {}, childNodes: [], className: [], id: 'neo-button-1', nodeName: 'div', style: {}, vtype: 'vnode'},
|
257
|
+
{attributes: {}, childNodes: [], className: [], id: 'neo-vnode-3', nodeName: 'div', style: {}, vtype: 'vnode'}
|
266
258
|
]
|
267
259
|
}, 'vnode got updated successfully');
|
268
260
|
|
@@ -281,15 +273,14 @@ StartTest(t => {
|
|
281
273
|
attributes: {},
|
282
274
|
className : ['neo-container'],
|
283
275
|
id : 'neo-vnode-1',
|
284
|
-
innerHTML : undefined,
|
285
276
|
nodeName : 'div',
|
286
277
|
style : {color: 'green'},
|
287
278
|
vtype : 'vnode',
|
288
279
|
|
289
280
|
childNodes: [
|
290
|
-
{attributes: {}, childNodes: [], className: [], id: 'neo-vnode-3',
|
291
|
-
{attributes: {}, childNodes: [], className: [], id: 'neo-button-1',
|
292
|
-
{attributes: {}, childNodes: [], className: [], id: 'neo-vnode-2',
|
281
|
+
{attributes: {}, childNodes: [], className: [], id: 'neo-vnode-3', nodeName: 'div', style: {}, vtype: 'vnode'},
|
282
|
+
{attributes: {}, childNodes: [], className: [], id: 'neo-button-1', nodeName: 'div', style: {}, vtype: 'vnode'},
|
283
|
+
{attributes: {}, childNodes: [], className: [], id: 'neo-vnode-2', nodeName: 'div', style: {}, vtype: 'vnode'}
|
293
284
|
]
|
294
285
|
}, 'vnode got updated successfully');
|
295
286
|
|
@@ -307,15 +298,14 @@ StartTest(t => {
|
|
307
298
|
attributes: {},
|
308
299
|
className : ['neo-container'],
|
309
300
|
id : 'neo-vnode-1',
|
310
|
-
innerHTML : undefined,
|
311
301
|
nodeName : 'div',
|
312
302
|
style : {color: 'green'},
|
313
303
|
vtype : 'vnode',
|
314
304
|
|
315
305
|
childNodes: [
|
316
|
-
{attributes: {}, childNodes: [], className: [], id: 'neo-button-1',
|
317
|
-
{attributes: {}, childNodes: [], className: [], id: 'neo-vnode-2',
|
318
|
-
{attributes: {}, childNodes: [], className: [], id: 'neo-vnode-3',
|
306
|
+
{attributes: {}, childNodes: [], className: [], id: 'neo-button-1', nodeName: 'div', style: {}, vtype: 'vnode'},
|
307
|
+
{attributes: {}, childNodes: [], className: [], id: 'neo-vnode-2', nodeName: 'div', style: {}, vtype: 'vnode'},
|
308
|
+
{attributes: {}, childNodes: [], className: [], id: 'neo-vnode-3', nodeName: 'div', style: {}, vtype: 'vnode'}
|
319
309
|
]
|
320
310
|
}, 'vnode got updated successfully');
|
321
311
|
|
@@ -333,15 +323,14 @@ StartTest(t => {
|
|
333
323
|
attributes: {},
|
334
324
|
className : ['neo-container'],
|
335
325
|
id : 'neo-vnode-1',
|
336
|
-
innerHTML : undefined,
|
337
326
|
nodeName : 'div',
|
338
327
|
style : {color: 'green'},
|
339
328
|
vtype : 'vnode',
|
340
329
|
|
341
330
|
childNodes: [
|
342
|
-
{attributes: {}, childNodes: [], className: [], id: 'neo-vnode-3',
|
343
|
-
{attributes: {}, childNodes: [], className: [], id: 'neo-button-1',
|
344
|
-
{attributes: {}, childNodes: [], className: [], id: 'neo-vnode-2',
|
331
|
+
{attributes: {}, childNodes: [], className: [], id: 'neo-vnode-3', nodeName: 'div', style: {}, vtype: 'vnode'},
|
332
|
+
{attributes: {}, childNodes: [], className: [], id: 'neo-button-1', nodeName: 'div', style: {}, vtype: 'vnode'},
|
333
|
+
{attributes: {}, childNodes: [], className: [], id: 'neo-vnode-2', nodeName: 'div', style: {}, vtype: 'vnode'}
|
345
334
|
]
|
346
335
|
}, 'vnode got updated successfully');
|
347
336
|
|
@@ -370,15 +359,13 @@ StartTest(t => {
|
|
370
359
|
]
|
371
360
|
};
|
372
361
|
|
373
|
-
|
362
|
+
output = VdomHelper.create({vdom}); vnode = output.vnode;
|
374
363
|
|
375
364
|
t.isDeeplyStrict(vnode, {
|
376
365
|
attributes: {},
|
377
366
|
className : ['neo-list-container', 'neo-list'],
|
378
367
|
id : 'neo-list-1',
|
379
|
-
innerHTML : undefined,
|
380
368
|
nodeName : 'ul',
|
381
|
-
outerHTML : '<ul style="width:100px;" class="neo-list-container neo-list" id="neo-list-1"><li class="neo-list-item" id="neo-list-1__bhaustein" tabIndex="-1">Bastian</li><li class="neo-list-item" id="neo-list-1__camtnbikerrwc" tabIndex="-1">Gerard</li><li class="neo-list-item" id="neo-list-1__jsakalos" tabIndex="-1">Jozef</li><li class="neo-list-item" id="neo-list-1__mrsunshine" tabIndex="-1">Nils</li><li class="neo-list-item" id="neo-list-1__rwaters" tabIndex="-1">Rich</li><li class="neo-list-item" id="neo-list-1__tobiu" tabIndex="-1">Tobias</li></ul>',
|
382
369
|
style : {width: '100px'},
|
383
370
|
vtype : 'vnode',
|
384
371
|
|
@@ -406,7 +393,6 @@ StartTest(t => {
|
|
406
393
|
attributes: {},
|
407
394
|
className : ['neo-list-container', 'neo-list'],
|
408
395
|
id : 'neo-list-1',
|
409
|
-
innerHTML : undefined,
|
410
396
|
nodeName : 'ul',
|
411
397
|
style : {width: '100px'},
|
412
398
|
vtype : 'vnode',
|
@@ -443,7 +429,6 @@ StartTest(t => {
|
|
443
429
|
attributes: {},
|
444
430
|
className : ['neo-list-container', 'neo-list'],
|
445
431
|
id : 'neo-list-1',
|
446
|
-
innerHTML : undefined,
|
447
432
|
nodeName : 'ul',
|
448
433
|
style : {width: '100px'},
|
449
434
|
vtype : 'vnode',
|
@@ -481,7 +466,6 @@ StartTest(t => {
|
|
481
466
|
attributes: {},
|
482
467
|
className : ['neo-list-container', 'neo-list'],
|
483
468
|
id : 'neo-list-1',
|
484
|
-
innerHTML : undefined,
|
485
469
|
nodeName : 'ul',
|
486
470
|
style : {width: '100px'},
|
487
471
|
vtype : 'vnode',
|
@@ -558,15 +542,13 @@ StartTest(t => {
|
|
558
542
|
{id: '9', html: 'w'}
|
559
543
|
]};
|
560
544
|
|
561
|
-
|
545
|
+
output = VdomHelper.create({vdom}); vnode = output.vnode;
|
562
546
|
|
563
547
|
t.isDeeplyStrict(vnode, {
|
564
548
|
attributes: {},
|
565
549
|
className : [],
|
566
550
|
id : 'root',
|
567
|
-
innerHTML : undefined,
|
568
551
|
nodeName : 'div',
|
569
|
-
outerHTML : t.any(String),
|
570
552
|
style : {},
|
571
553
|
vtype : 'vnode',
|
572
554
|
|
@@ -603,7 +585,6 @@ StartTest(t => {
|
|
603
585
|
attributes: {},
|
604
586
|
className : [],
|
605
587
|
id : 'root',
|
606
|
-
innerHTML : undefined,
|
607
588
|
nodeName : 'div',
|
608
589
|
style : {},
|
609
590
|
vtype : 'vnode',
|
@@ -635,15 +616,13 @@ StartTest(t => {
|
|
635
616
|
]}
|
636
617
|
]};
|
637
618
|
|
638
|
-
|
619
|
+
output = VdomHelper.create({vdom}); vnode = output.vnode;
|
639
620
|
|
640
621
|
t.isDeeplyStrict(vnode, {
|
641
622
|
attributes: {},
|
642
623
|
className : [],
|
643
624
|
id : 'level-1',
|
644
|
-
innerHTML : undefined,
|
645
625
|
nodeName : 'div',
|
646
|
-
outerHTML : t.any(String),
|
647
626
|
style : {},
|
648
627
|
vtype : 'vnode',
|
649
628
|
|
@@ -651,7 +630,6 @@ StartTest(t => {
|
|
651
630
|
id : 'level-2',
|
652
631
|
attributes: {},
|
653
632
|
className : [],
|
654
|
-
innerHTML : undefined,
|
655
633
|
nodeName : 'div',
|
656
634
|
style : {},
|
657
635
|
vtype : 'vnode',
|
@@ -661,7 +639,6 @@ StartTest(t => {
|
|
661
639
|
attributes: {},
|
662
640
|
childNodes: [],
|
663
641
|
className : [],
|
664
|
-
innerHTML : undefined,
|
665
642
|
nodeName : 'div',
|
666
643
|
style : {},
|
667
644
|
vtype : 'vnode'
|
@@ -678,7 +655,6 @@ StartTest(t => {
|
|
678
655
|
attributes: {},
|
679
656
|
className : [],
|
680
657
|
id : 'level-1',
|
681
|
-
innerHTML : undefined,
|
682
658
|
nodeName : 'div',
|
683
659
|
style : {},
|
684
660
|
vtype : 'vnode',
|
@@ -688,7 +664,6 @@ StartTest(t => {
|
|
688
664
|
attributes: {},
|
689
665
|
childNodes: [],
|
690
666
|
className : [],
|
691
|
-
innerHTML : undefined,
|
692
667
|
nodeName : 'div',
|
693
668
|
style : {},
|
694
669
|
vtype : 'vnode'
|
@@ -714,15 +689,13 @@ StartTest(t => {
|
|
714
689
|
]}
|
715
690
|
]};
|
716
691
|
|
717
|
-
|
692
|
+
output = VdomHelper.create({vdom}); vnode = output.vnode;
|
718
693
|
|
719
694
|
t.isDeeplyStrict(vnode, {
|
720
695
|
attributes: {},
|
721
696
|
className : [],
|
722
697
|
id : 'level-1',
|
723
|
-
innerHTML : undefined,
|
724
698
|
nodeName : 'div',
|
725
|
-
outerHTML : t.any(String),
|
726
699
|
style : {},
|
727
700
|
vtype : 'vnode',
|
728
701
|
|
@@ -730,7 +703,6 @@ StartTest(t => {
|
|
730
703
|
id : 'level-2',
|
731
704
|
attributes: {},
|
732
705
|
className : [],
|
733
|
-
innerHTML : undefined,
|
734
706
|
nodeName : 'div',
|
735
707
|
style : {},
|
736
708
|
vtype : 'vnode',
|
@@ -740,7 +712,6 @@ StartTest(t => {
|
|
740
712
|
attributes: {},
|
741
713
|
childNodes: [],
|
742
714
|
className : [],
|
743
|
-
innerHTML : undefined,
|
744
715
|
nodeName : 'div',
|
745
716
|
style : {},
|
746
717
|
vtype : 'vnode'
|
@@ -749,7 +720,6 @@ StartTest(t => {
|
|
749
720
|
attributes: {},
|
750
721
|
childNodes: [],
|
751
722
|
className : [],
|
752
|
-
innerHTML : undefined,
|
753
723
|
nodeName : 'div',
|
754
724
|
style : {},
|
755
725
|
vtype : 'vnode'
|
@@ -766,7 +736,6 @@ StartTest(t => {
|
|
766
736
|
attributes: {},
|
767
737
|
className : [],
|
768
738
|
id : 'level-1',
|
769
|
-
innerHTML : undefined,
|
770
739
|
nodeName : 'div',
|
771
740
|
style : {},
|
772
741
|
vtype : 'vnode',
|
@@ -776,7 +745,6 @@ StartTest(t => {
|
|
776
745
|
attributes: {},
|
777
746
|
childNodes: [],
|
778
747
|
className : [],
|
779
|
-
innerHTML : undefined,
|
780
748
|
nodeName : 'div',
|
781
749
|
style : {},
|
782
750
|
vtype : 'vnode'
|
@@ -785,7 +753,6 @@ StartTest(t => {
|
|
785
753
|
attributes: {},
|
786
754
|
childNodes: [],
|
787
755
|
className : [],
|
788
|
-
innerHTML : undefined,
|
789
756
|
nodeName : 'div',
|
790
757
|
style : {},
|
791
758
|
vtype : 'vnode'
|
@@ -810,7 +777,7 @@ StartTest(t => {
|
|
810
777
|
]}
|
811
778
|
]};
|
812
779
|
|
813
|
-
|
780
|
+
output = VdomHelper.create({vdom}); vnode = output.vnode;
|
814
781
|
|
815
782
|
vdom =
|
816
783
|
{id: 'level-1', cn: [
|
@@ -825,7 +792,6 @@ StartTest(t => {
|
|
825
792
|
attributes: {},
|
826
793
|
className : [],
|
827
794
|
id : 'level-1',
|
828
|
-
innerHTML : undefined,
|
829
795
|
nodeName : 'div',
|
830
796
|
style : {},
|
831
797
|
vtype : 'vnode',
|
@@ -835,7 +801,6 @@ StartTest(t => {
|
|
835
801
|
attributes: {},
|
836
802
|
childNodes: [],
|
837
803
|
className : [],
|
838
|
-
innerHTML : undefined,
|
839
804
|
nodeName : 'div',
|
840
805
|
style : {},
|
841
806
|
vtype : 'vnode'
|
@@ -844,7 +809,6 @@ StartTest(t => {
|
|
844
809
|
attributes: {},
|
845
810
|
childNodes: [],
|
846
811
|
className : [],
|
847
|
-
innerHTML : undefined,
|
848
812
|
nodeName : 'div',
|
849
813
|
style : {},
|
850
814
|
vtype : 'vnode'
|
@@ -853,7 +817,6 @@ StartTest(t => {
|
|
853
817
|
attributes: {},
|
854
818
|
childNodes: [],
|
855
819
|
className : [],
|
856
|
-
innerHTML : undefined,
|
857
820
|
nodeName : 'div',
|
858
821
|
style : {},
|
859
822
|
vtype : 'vnode'
|
@@ -0,0 +1,100 @@
|
|
1
|
+
import Neo from '../../../../src/Neo.mjs';
|
2
|
+
import * as core from '../../../../src/core/_export.mjs';
|
3
|
+
|
4
|
+
class TestComponent extends core.Base {
|
5
|
+
static config = {
|
6
|
+
className : 'Neo.Test.AfterSetConfigComponent',
|
7
|
+
configA_ : 'initialA',
|
8
|
+
configB_ : 'initialB',
|
9
|
+
configC_ : 'initialC',
|
10
|
+
nonReactive : 'initialNonReactive' // Non-reactive config
|
11
|
+
}
|
12
|
+
|
13
|
+
classField = 'initialClassField'; // Public class field
|
14
|
+
|
15
|
+
afterSetConfigCalls = [];
|
16
|
+
|
17
|
+
afterSetConfig(key, newValue, oldValue) {
|
18
|
+
this.afterSetConfigCalls.push({key, newValue, oldValue});
|
19
|
+
}
|
20
|
+
}
|
21
|
+
Neo.setupClass(TestComponent);
|
22
|
+
|
23
|
+
StartTest(t => {
|
24
|
+
t.it('afterSetConfig should be called for individual config changes', t => {
|
25
|
+
const instance = Neo.create(TestComponent);
|
26
|
+
instance.afterSetConfigCalls = []; // Reset for this test
|
27
|
+
|
28
|
+
instance.configA = 'valueA';
|
29
|
+
t.is(instance.afterSetConfigCalls.length, 1, 'afterSetConfig should be called once');
|
30
|
+
t.isDeeplyStrict(instance.afterSetConfigCalls[0], {key: 'configA', newValue: 'valueA', oldValue: 'initialA'}, 'Correct arguments for configA');
|
31
|
+
|
32
|
+
instance.configB = 'valueB';
|
33
|
+
t.is(instance.afterSetConfigCalls.length, 2, 'afterSetConfig should be called twice');
|
34
|
+
t.isDeeplyStrict(instance.afterSetConfigCalls[1], {key: 'configB', newValue: 'valueB', oldValue: 'initialB'}, 'Correct arguments for configB');
|
35
|
+
});
|
36
|
+
|
37
|
+
t.it('afterSetConfig should be called for each changed reactive config when using instance.set()', t => {
|
38
|
+
const instance = Neo.create(TestComponent);
|
39
|
+
instance.afterSetConfigCalls = []; // Reset for this test
|
40
|
+
|
41
|
+
instance.set({
|
42
|
+
configA: 'newValueA',
|
43
|
+
configB: 'newValueB',
|
44
|
+
configC: 'newValueC'
|
45
|
+
});
|
46
|
+
|
47
|
+
t.is(instance.afterSetConfigCalls.length, 3, 'afterSetConfig should be called three times');
|
48
|
+
t.isDeeplyStrict(instance.afterSetConfigCalls[0], {key: 'configA', newValue: 'newValueA', oldValue: 'initialA'}, 'Correct arguments for configA via set()');
|
49
|
+
t.isDeeplyStrict(instance.afterSetConfigCalls[1], {key: 'configB', newValue: 'newValueB', oldValue: 'initialB'}, 'Correct arguments for configB via set()');
|
50
|
+
t.isDeeplyStrict(instance.afterSetConfigCalls[2], {key: 'configC', newValue: 'newValueC', oldValue: 'initialC'}, 'Correct arguments for configC via set()');
|
51
|
+
});
|
52
|
+
|
53
|
+
t.it('afterSetConfig should not be called for unchanged values', t => {
|
54
|
+
const instance = Neo.create(TestComponent);
|
55
|
+
instance.afterSetConfigCalls = []; // Reset for this test
|
56
|
+
|
57
|
+
instance.configA = 'initialA'; // Set to same value
|
58
|
+
t.is(instance.afterSetConfigCalls.length, 0, 'afterSetConfig should not be called for unchanged individual reactive config');
|
59
|
+
|
60
|
+
instance.set({
|
61
|
+
configA: 'initialA',
|
62
|
+
configB: 'initialB'
|
63
|
+
});
|
64
|
+
t.is(instance.afterSetConfigCalls.length, 0, 'afterSetConfig should not be called for unchanged reactive configs via set()');
|
65
|
+
});
|
66
|
+
|
67
|
+
t.it('instance.set() should update class fields and non-reactive configs without calling afterSetConfig', t => {
|
68
|
+
const instance = Neo.create(TestComponent);
|
69
|
+
instance.afterSetConfigCalls = []; // Reset for this test
|
70
|
+
|
71
|
+
instance.set({
|
72
|
+
configA : 'changedA', // Reactive
|
73
|
+
nonReactive: 'changedNonReactive', // Non-reactive
|
74
|
+
classField : 'changedClassField' // Class field
|
75
|
+
});
|
76
|
+
|
77
|
+
// Verify reactive config update and afterSetConfig call
|
78
|
+
t.is(instance.configA, 'changedA', 'Reactive configA should be updated');
|
79
|
+
t.is(instance.afterSetConfigCalls.length, 1, 'afterSetConfig should be called only once for configA');
|
80
|
+
t.isDeeplyStrict(instance.afterSetConfigCalls[0], {key: 'configA', newValue: 'changedA', oldValue: 'initialA'}, 'Correct arguments for configA');
|
81
|
+
|
82
|
+
// Verify non-reactive config update, no afterSetConfig call
|
83
|
+
t.is(instance.nonReactive, 'changedNonReactive', 'Non-reactive config should be updated');
|
84
|
+
|
85
|
+
// Verify class field update, no afterSetConfig call
|
86
|
+
t.is(instance.classField, 'changedClassField', 'Class field should be updated');
|
87
|
+
|
88
|
+
// Reset and test with only non-reactive/class field changes
|
89
|
+
instance.afterSetConfigCalls = [];
|
90
|
+
instance.set({
|
91
|
+
nonReactive: 'changedAgainNonReactive',
|
92
|
+
classField : 'changedAgainClassField'
|
93
|
+
});
|
94
|
+
|
95
|
+
t.is(instance.afterSetConfigCalls.length, 0, 'afterSetConfig should not be called for only non-reactive/class field changes');
|
96
|
+
t.is(instance.nonReactive, 'changedAgainNonReactive', 'Non-reactive config should be updated again');
|
97
|
+
t.is(instance.classField, 'changedAgainClassField', 'Class field should be updated again');
|
98
|
+
});
|
99
|
+
});
|
100
|
+
|
@@ -1,20 +1,20 @@
|
|
1
|
-
import Neo
|
2
|
-
import * as core
|
3
|
-
import {isDescriptor} from '
|
1
|
+
import Neo from '../../../../src/Neo.mjs';
|
2
|
+
import * as core from '../../../../src/core/_export.mjs';
|
3
|
+
import {isDescriptor} from '../../../../src/core/ConfigSymbols.mjs';
|
4
4
|
|
5
5
|
class MyComponent extends core.Base {
|
6
6
|
static config = {
|
7
|
-
className: 'Neo.TestComponent',
|
8
|
-
myConfig_
|
9
|
-
arrayConfig_: {
|
7
|
+
className : 'Neo.TestComponent',
|
8
|
+
myConfig_ : 'initialValue',
|
9
|
+
arrayConfig_ : {
|
10
10
|
[isDescriptor]: true,
|
11
|
-
value: [],
|
12
|
-
merge: 'replace'
|
11
|
+
value : [],
|
12
|
+
merge : 'replace'
|
13
13
|
},
|
14
14
|
objectConfig_: {
|
15
15
|
[isDescriptor]: true,
|
16
|
-
value: {},
|
17
|
-
merge: 'deep'
|
16
|
+
value : {},
|
17
|
+
merge : 'deep'
|
18
18
|
}
|
19
19
|
}
|
20
20
|
|
@@ -27,13 +27,12 @@ MyComponent = Neo.setupClass(MyComponent);
|
|
27
27
|
|
28
28
|
StartTest(t => {
|
29
29
|
t.it('Basic reactivity with subscribe', t => {
|
30
|
-
const instance
|
31
|
-
const configController = instance.getConfig('myConfig');
|
30
|
+
const instance = Neo.create(MyComponent);
|
32
31
|
|
33
32
|
let subscriberCalled = false;
|
34
33
|
let receivedNewValue, receivedOldValue;
|
35
34
|
|
36
|
-
const cleanup =
|
35
|
+
const cleanup = instance.observeConfig(instance, 'myConfig', (newValue, oldValue) => {
|
37
36
|
subscriberCalled = true;
|
38
37
|
receivedNewValue = newValue;
|
39
38
|
receivedOldValue = oldValue;
|
@@ -54,21 +53,20 @@ StartTest(t => {
|
|
54
53
|
|
55
54
|
t.it('Descriptor: arrayConfig_ with merge: replace', t => {
|
56
55
|
const instance = Neo.create(MyComponent);
|
57
|
-
const configController = instance.getConfig('arrayConfig');
|
58
56
|
|
59
57
|
let subscriberCalled = 0;
|
60
|
-
|
58
|
+
instance.observeConfig(instance, 'arrayConfig', (newValue, oldValue) => {
|
61
59
|
subscriberCalled++;
|
62
60
|
});
|
63
61
|
|
64
62
|
const arr1 = [1, 2, 3];
|
65
63
|
instance.arrayConfig = arr1;
|
66
|
-
t.
|
64
|
+
t.isDeeplyStrict(instance.arrayConfig, arr1, 'Array should be replaced');
|
67
65
|
t.is(subscriberCalled, 1, 'Subscriber called once for array replacement');
|
68
66
|
|
69
67
|
const arr2 = [4, 5, 6];
|
70
68
|
instance.arrayConfig = arr2;
|
71
|
-
t.
|
69
|
+
t.isDeeplyStrict(instance.arrayConfig, arr2, 'Array should be replaced again');
|
72
70
|
t.is(subscriberCalled, 2, 'Subscriber called twice for array replacement');
|
73
71
|
|
74
72
|
// Setting the same array should not trigger a change by default isEqual
|
@@ -78,16 +76,15 @@ StartTest(t => {
|
|
78
76
|
|
79
77
|
t.it('Descriptor: objectConfig_ with merge: deep', t => {
|
80
78
|
const instance = Neo.create(MyComponent);
|
81
|
-
const configController = instance.getConfig('objectConfig');
|
82
79
|
|
83
80
|
let subscriberCalled = 0;
|
84
|
-
|
81
|
+
instance.observeConfig(instance, 'objectConfig', (newValue, oldValue) => {
|
85
82
|
subscriberCalled++;
|
86
83
|
});
|
87
84
|
|
88
85
|
const obj1 = {a: 1, b: {c: 2}};
|
89
86
|
instance.objectConfig = obj1;
|
90
|
-
t.
|
87
|
+
t.isDeeplyStrict(instance.objectConfig, obj1, 'Object should be set');
|
91
88
|
t.is(subscriberCalled, 1, 'Subscriber called once for object set');
|
92
89
|
|
93
90
|
// Deep merge should happen, but default isEqual will still compare references
|
@@ -103,10 +100,50 @@ StartTest(t => {
|
|
103
100
|
|
104
101
|
// Modifying a nested property should trigger a change if isEqual is deep
|
105
102
|
// NOTE: The current Config.mjs uses Neo.isEqual which is a deep comparison.
|
106
|
-
// If the object reference changes, it will trigger. If the object reference stays the same,
|
103
|
+
// If the object reference changes, it will trigger. If the object reference stays the same,
|
104
|
+
// but content changes, it will not trigger unless isEqual is customized.
|
107
105
|
// For now, this test relies on the fact that setting a new object reference triggers the change.
|
108
106
|
const obj3 = {a: 1, b: {c: 2}};
|
109
107
|
instance.objectConfig = obj3;
|
110
108
|
t.is(subscriberCalled, 3, 'Subscriber called for new object reference');
|
111
109
|
});
|
110
|
+
|
111
|
+
t.it('Multiple subscriptions from same owner ID', t => {
|
112
|
+
const instance = Neo.create(MyComponent);
|
113
|
+
const publisher = instance; // Observing itself for simplicity
|
114
|
+
const configName = 'myConfig';
|
115
|
+
|
116
|
+
let callback1Called = false;
|
117
|
+
let callback2Called = false;
|
118
|
+
|
119
|
+
const cleanup1 = instance.observeConfig(publisher, configName, (newValue, oldValue) => {
|
120
|
+
callback1Called = true;
|
121
|
+
});
|
122
|
+
|
123
|
+
const cleanup2 = instance.observeConfig(publisher, configName, (newValue, oldValue) => {
|
124
|
+
callback2Called = true;
|
125
|
+
});
|
126
|
+
|
127
|
+
// Reset flags
|
128
|
+
callback1Called = false;
|
129
|
+
callback2Called = false;
|
130
|
+
|
131
|
+
// Change the config value
|
132
|
+
instance.myConfig = 'changedValue';
|
133
|
+
|
134
|
+
t.ok(callback1Called, 'First callback should be called');
|
135
|
+
t.ok(callback2Called, 'Second callback should be called');
|
136
|
+
|
137
|
+
// Test cleanup
|
138
|
+
cleanup1();
|
139
|
+
cleanup2();
|
140
|
+
|
141
|
+
callback1Called = false;
|
142
|
+
callback2Called = false;
|
143
|
+
|
144
|
+
instance.myConfig = 'anotherChange';
|
145
|
+
|
146
|
+
t.notOk(callback1Called, 'First callback should NOT be called after cleanup');
|
147
|
+
t.notOk(callback2Called, 'Second callback should NOT be called after cleanup');
|
148
|
+
});
|
112
149
|
});
|