neo.mjs 10.0.0-beta.5 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/RELEASE_NOTES/v10.0.0-beta.1.md +20 -0
- package/.github/RELEASE_NOTES/v10.0.0-beta.2.md +73 -0
- package/.github/RELEASE_NOTES/v10.0.0-beta.3.md +39 -0
- 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/RELEASE_NOTES/v10.0.0.md +52 -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 +11 -3
- 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 +29 -19
- 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/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/button/base/MainContainer.mjs +207 -0
- package/examples/functional/button/base/app.mjs +6 -0
- package/examples/functional/button/base/index.html +11 -0
- package/examples/functional/button/base/neo-config.json +6 -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/blog/v10-deep-dive-functional-components.md +293 -0
- package/learn/blog/v10-deep-dive-reactivity.md +522 -0
- package/learn/blog/v10-deep-dive-state-provider.md +432 -0
- package/learn/blog/v10-deep-dive-vdom-revolution.md +194 -0
- package/learn/blog/v10-post1-love-story.md +383 -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 +130 -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 +10 -8
- 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 +28 -2
- 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 -64
- package/learn/tutorials/Earthquakes.md +2 -0
- package/learn/tutorials/RSP.md +3 -1
- package/learn/tutorials/TodoList.md +103 -7
- package/package.json +8 -6
- 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 +219 -166
- package/src/Xhr.mjs +1 -0
- package/src/button/Base.mjs +13 -0
- package/src/button/Effect.mjs +16 -2
- 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 +7 -10
- package/src/collection/Filter.mjs +6 -0
- package/src/collection/Sorter.mjs +3 -0
- package/src/component/Abstract.mjs +412 -0
- package/src/component/Base.mjs +48 -1077
- 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 +7 -3
- 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 +86 -33
- package/src/core/Compare.mjs +4 -7
- package/src/core/Config.mjs +65 -52
- package/src/core/Effect.mjs +86 -24
- package/src/core/EffectManager.mjs +117 -8
- package/src/core/IdGenerator.mjs +13 -44
- package/src/core/Observable.mjs +69 -65
- 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 +43 -5
- 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/button/Base.mjs +384 -0
- package/src/functional/component/Base.mjs +405 -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 +50 -60
- 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/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 +18 -4
- 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 +320 -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 +670 -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 +129 -87
- package/src/state/createHierarchicalDataProxy.mjs +39 -25
- 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 +2 -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 +18 -5
- package/src/util/VNode.mjs +7 -1
- package/src/util/vdom/TreeBuilder.mjs +105 -0
- package/src/vdom/Helper.mjs +35 -23
- package/src/vdom/VNode.mjs +4 -6
- package/src/worker/App.mjs +1 -0
- package/src/worker/Base.mjs +2 -0
- package/src/worker/Manager.mjs +2 -0
- package/src/worker/ServiceBase.mjs +6 -1
- package/src/worker/mixin/RemoteMethodAccess.mjs +1 -6
- package/test/siesta/siesta.js +17 -2
- package/test/siesta/tests/VdomCalendar.mjs +19 -15
- package/test/siesta/tests/VdomHelper.mjs +7 -7
- package/test/siesta/tests/classic/Button.mjs +113 -0
- package/test/siesta/tests/core/Effect.mjs +10 -14
- package/test/siesta/tests/core/EffectBatching.mjs +72 -79
- package/test/siesta/tests/functional/Button.mjs +113 -0
- package/test/siesta/tests/state/ProviderNestedDataConfigs.mjs +314 -0
- package/test/siesta/tests/state/createHierarchicalDataProxy.mjs +42 -55
- package/test/siesta/tests/vdom/Advanced.mjs +14 -8
- package/test/siesta/tests/vdom/VdomAsymmetricUpdates.mjs +366 -0
- package/test/siesta/tests/vdom/VdomRealWorldUpdates.mjs +249 -0
- package/test/siesta/tests/vdom/layout/Cube.mjs +11 -7
- package/test/siesta/tests/vdom/table/Container.mjs +9 -5
- package/learn/javascript/NewNode.md +0 -31
- package/src/core/EffectBatchManager.mjs +0 -68
package/src/code/LivePreview.mjs
CHANGED
@@ -3,10 +3,9 @@ import MonacoEditor from '../component/wrapper/MonacoEditor.mjs'
|
|
3
3
|
import TabContainer from '../tab/Container.mjs';
|
4
4
|
|
5
5
|
const
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
importRegex = /import\s+([\w-]+)\s+from\s+['"]([^'"]+)['"]/;
|
6
|
+
classNameRegex = /className\s*:\s*['\"]([^'\"]+)['\"]/g,
|
7
|
+
exportRegex = /export\s+(?:default\s+)?(?:const|let|var|class|function|async\s+function|generator\s+function|async\s+generator\s+function|(\{[\s\S]*?\}))/g,
|
8
|
+
importRegex = /import\s+(?:([\w-]+)|\{([^}]+)\})\s+from\s+['\"]([^'\"]+)['\"]/;
|
10
9
|
|
11
10
|
/**
|
12
11
|
* @class Neo.code.LivePreview
|
@@ -35,6 +34,7 @@ class LivePreview extends Container {
|
|
35
34
|
/**
|
36
35
|
* Valid values are 'preview' and 'source'
|
37
36
|
* @member {String} activeView_='source'
|
37
|
+
* @reactive
|
38
38
|
*/
|
39
39
|
activeView_: 'source',
|
40
40
|
/**
|
@@ -51,6 +51,7 @@ class LivePreview extends Container {
|
|
51
51
|
enableFullscreen: true,
|
52
52
|
/**
|
53
53
|
* @member {Object|String} layout='fit'
|
54
|
+
* @reactive
|
54
55
|
*/
|
55
56
|
layout: 'fit',
|
56
57
|
/**
|
@@ -78,6 +79,7 @@ class LivePreview extends Container {
|
|
78
79
|
/**
|
79
80
|
* The code to display inside the Monaco editor
|
80
81
|
* @member {String|null} value_=null
|
82
|
+
* @reactive
|
81
83
|
*/
|
82
84
|
value_: null,
|
83
85
|
}
|
@@ -226,19 +228,20 @@ class LivePreview extends Container {
|
|
226
228
|
{environment} = Neo.config,
|
227
229
|
container = me.getPreviewContainer(),
|
228
230
|
source = me.editorValue || me.value,
|
229
|
-
className = me.
|
231
|
+
className = me.findMainClassName(source),
|
230
232
|
cleanLines = [],
|
231
233
|
moduleNameAndPath = [],
|
232
234
|
params = [],
|
233
235
|
vars = [],
|
234
|
-
codeString, promises;
|
236
|
+
codeString, module, promises;
|
235
237
|
|
236
238
|
source.split('\n').forEach(line => {
|
237
239
|
let importMatch = line.match(importRegex);
|
238
240
|
|
239
241
|
if (importMatch) {
|
240
|
-
let
|
241
|
-
|
242
|
+
let defaultImport = importMatch[1],
|
243
|
+
namedImports = importMatch[2]?.split(',').map(name => name.trim()),
|
244
|
+
path = importMatch[3],
|
242
245
|
index;
|
243
246
|
|
244
247
|
// We want the non-minified version for code which can not get bundled.
|
@@ -263,7 +266,7 @@ class LivePreview extends Container {
|
|
263
266
|
}
|
264
267
|
}
|
265
268
|
|
266
|
-
moduleNameAndPath.push({
|
269
|
+
moduleNameAndPath.push({defaultImport, namedImports, path})
|
267
270
|
} else if (line.match(exportRegex)) {
|
268
271
|
// Skip export statements
|
269
272
|
} else {
|
@@ -286,9 +289,15 @@ class LivePreview extends Container {
|
|
286
289
|
// });
|
287
290
|
// Making the promise part of the eval seems weird, but it made it easier to
|
288
291
|
// set up the import vars.
|
289
|
-
promises = moduleNameAndPath.map(item => {
|
290
|
-
|
291
|
-
|
292
|
+
promises = moduleNameAndPath.map((item, i) => {
|
293
|
+
let moduleAlias = `Module${i}`;
|
294
|
+
params.push(moduleAlias);
|
295
|
+
if (item.defaultImport) {
|
296
|
+
vars.push(` const ${item.defaultImport} = ${moduleAlias}.default;`);
|
297
|
+
}
|
298
|
+
if (item.namedImports) {
|
299
|
+
vars.push(` const {${item.namedImports.join(', ')}} = ${moduleAlias};`);
|
300
|
+
}
|
292
301
|
return `import('${item.path}')`
|
293
302
|
});
|
294
303
|
|
@@ -299,11 +308,19 @@ class LivePreview extends Container {
|
|
299
308
|
`${vars.join('\n')}`,
|
300
309
|
` ${cleanLines.join('\n')}`,
|
301
310
|
'',
|
302
|
-
`
|
303
|
-
|
311
|
+
` module = Neo.ns('${className}');`,
|
312
|
+
'',
|
313
|
+
` if (module && (`,
|
314
|
+
` Neo.component.Base.isPrototypeOf(module) ||`,
|
315
|
+
` Neo.functional.component.Base.isPrototypeOf(module)`,
|
316
|
+
` )) {`,
|
317
|
+
` container.add({module})`,
|
304
318
|
' }',
|
305
319
|
'})',
|
306
|
-
'.catch(error =>
|
320
|
+
'.catch(error => {',
|
321
|
+
' console.warn("LivePreview Error:", error);',
|
322
|
+
' container.add({ntype:\'component\', html:error.message});',
|
323
|
+
'})'
|
307
324
|
].join('\n')
|
308
325
|
|
309
326
|
container.removeAll();
|
@@ -321,7 +338,7 @@ class LivePreview extends Container {
|
|
321
338
|
});
|
322
339
|
|
323
340
|
try {
|
324
|
-
new Function('container', codeString)(container);
|
341
|
+
new Function('container', 'module', codeString)(container, module);
|
325
342
|
} catch (error) {
|
326
343
|
container.add({
|
327
344
|
ntype: 'component',
|
@@ -349,18 +366,29 @@ class LivePreview extends Container {
|
|
349
366
|
* @param {String} sourceCode
|
350
367
|
* @returns {String|null}
|
351
368
|
*/
|
352
|
-
|
353
|
-
let
|
354
|
-
|
369
|
+
findMainClassName(sourceCode) {
|
370
|
+
let classNames = this.findClassNames(sourceCode),
|
371
|
+
mainName = null,
|
372
|
+
prioNames = ['MainContainer', 'MainComponent', 'MainView', 'Main'];
|
373
|
+
|
374
|
+
if (classNames.length > 0) {
|
375
|
+
for (const name of prioNames) {
|
376
|
+
mainName = classNames.find(className => className.endsWith(name));
|
377
|
+
if (mainName) {
|
378
|
+
break
|
379
|
+
}
|
380
|
+
}
|
355
381
|
|
356
|
-
|
357
|
-
|
358
|
-
|
382
|
+
if (!mainName) {
|
383
|
+
mainName = classNames[classNames.length - 1]
|
384
|
+
}
|
359
385
|
}
|
360
386
|
|
361
|
-
return
|
387
|
+
return mainName
|
362
388
|
}
|
363
389
|
|
390
|
+
|
391
|
+
|
364
392
|
/**
|
365
393
|
* @returns {Neo.component.Base|null}
|
366
394
|
*/
|
package/src/collection/Base.mjs
CHANGED
@@ -16,6 +16,7 @@ const countMutations = Symbol('countMutations'),
|
|
16
16
|
/**
|
17
17
|
* @class Neo.collection.Base
|
18
18
|
* @extends Neo.core.Base
|
19
|
+
* @mixes Neo.core.Observable
|
19
20
|
*/
|
20
21
|
class Collection extends Base {
|
21
22
|
/**
|
@@ -51,6 +52,7 @@ class Collection extends Base {
|
|
51
52
|
/**
|
52
53
|
* Stores the items.length of the items array in use
|
53
54
|
* @member {Number} count_=0
|
55
|
+
* @reactive
|
54
56
|
*/
|
55
57
|
count_: 0,
|
56
58
|
/**
|
@@ -62,10 +64,12 @@ class Collection extends Base {
|
|
62
64
|
/**
|
63
65
|
* An Array containing Neo.util.Filter config objects or instances
|
64
66
|
* @member {Array} filters_=[]
|
67
|
+
* @reactive
|
65
68
|
*/
|
66
69
|
filters_: [],
|
67
70
|
/**
|
68
71
|
* @member {Object[]|null} items_=null
|
72
|
+
* @reactive
|
69
73
|
*/
|
70
74
|
items_: null,
|
71
75
|
/**
|
@@ -83,6 +87,7 @@ class Collection extends Base {
|
|
83
87
|
* A map containing the key & reference of each collection item for faster access
|
84
88
|
* @member {Map} map_=null
|
85
89
|
* @protected
|
90
|
+
* @reactive
|
86
91
|
*/
|
87
92
|
map_: null,
|
88
93
|
/**
|
@@ -100,11 +105,13 @@ class Collection extends Base {
|
|
100
105
|
/**
|
101
106
|
* An Array containing Neo.util.Sorter config objects or instances
|
102
107
|
* @member {Array} sorters_=[]
|
108
|
+
* @reactive
|
103
109
|
*/
|
104
110
|
sorters_: [],
|
105
111
|
/**
|
106
112
|
* The id of another collection instance to use as this data source
|
107
113
|
* @member {String|null} sourceId_=null
|
114
|
+
* @reactive
|
108
115
|
*/
|
109
116
|
sourceId_: null
|
110
117
|
}
|
@@ -144,16 +151,6 @@ class Collection extends Base {
|
|
144
151
|
return this.splice(null, null, item).addedItems
|
145
152
|
}
|
146
153
|
|
147
|
-
/**
|
148
|
-
* Triggered after the badgePosition config got changed
|
149
|
-
* @param {Number} value
|
150
|
-
* @param {Number} oldValue
|
151
|
-
* @protected
|
152
|
-
*/
|
153
|
-
afterSetCount(value, oldValue) {
|
154
|
-
this.fire('countChange', {oldValue, value})
|
155
|
-
}
|
156
|
-
|
157
154
|
/**
|
158
155
|
* Triggered after the filters config got changed
|
159
156
|
* @param {Array} value
|
@@ -4,6 +4,7 @@ import Observable from '../core/Observable.mjs';
|
|
4
4
|
/**
|
5
5
|
* @class Neo.collection.Filter
|
6
6
|
* @extends Neo.core.Base
|
7
|
+
* @mixes Neo.core.Observable
|
7
8
|
*/
|
8
9
|
class Filter extends Base {
|
9
10
|
/**
|
@@ -38,11 +39,13 @@ class Filter extends Base {
|
|
38
39
|
/**
|
39
40
|
* Setting disabled to true will exclude this filter from the collection filtering logic
|
40
41
|
* @member {Boolean} disabled_=false
|
42
|
+
* @reactive
|
41
43
|
*/
|
42
44
|
disabled_: false,
|
43
45
|
/**
|
44
46
|
* Provide a custom filtering function which has a higher priority than property, operator & value
|
45
47
|
* @member {Function|null} filterBy_=null
|
48
|
+
* @reactive
|
46
49
|
*/
|
47
50
|
filterBy_: null,
|
48
51
|
/**
|
@@ -54,6 +57,7 @@ class Filter extends Base {
|
|
54
57
|
* Set this flag to true before starting bulk updates (e.g. changing property & value)
|
55
58
|
* to prevent multiple change events
|
56
59
|
* @member {Boolean} isUpdating_=false
|
60
|
+
* @reactive
|
57
61
|
*/
|
58
62
|
isUpdating_: false,
|
59
63
|
/**
|
@@ -83,6 +87,7 @@ class Filter extends Base {
|
|
83
87
|
/**
|
84
88
|
* The property to filter by (use the combination of property, operator & value)
|
85
89
|
* @member {String} property_='id'
|
90
|
+
* @reactive
|
86
91
|
*/
|
87
92
|
property_: 'id',
|
88
93
|
/**
|
@@ -93,6 +98,7 @@ class Filter extends Base {
|
|
93
98
|
/**
|
94
99
|
* The value to filter by (use the combination of property, operator & value)
|
95
100
|
* @member {String} value_=null
|
101
|
+
* @reactive
|
96
102
|
*/
|
97
103
|
value_: null
|
98
104
|
}
|
@@ -4,6 +4,7 @@ import Observable from '../core/Observable.mjs';
|
|
4
4
|
/**
|
5
5
|
* @class Neo.collection.Sorter
|
6
6
|
* @extends Neo.core.Base
|
7
|
+
* @mixes Neo.core.Observable
|
7
8
|
*/
|
8
9
|
class Sorter extends Base {
|
9
10
|
/**
|
@@ -33,6 +34,7 @@ class Sorter extends Base {
|
|
33
34
|
/**
|
34
35
|
* The sort direction when using a property.
|
35
36
|
* @member {String} direction_='ASC'
|
37
|
+
* @reactive
|
36
38
|
*/
|
37
39
|
direction_: 'ASC',
|
38
40
|
/**
|
@@ -44,6 +46,7 @@ class Sorter extends Base {
|
|
44
46
|
/**
|
45
47
|
* The property to sort by.
|
46
48
|
* @member {String} property_='id'
|
49
|
+
* @reactive
|
47
50
|
*/
|
48
51
|
property_: 'id',
|
49
52
|
/**
|
@@ -0,0 +1,412 @@
|
|
1
|
+
import Base from '../core/Base.mjs';
|
2
|
+
import ClassSystemUtil from '../util/ClassSystem.mjs';
|
3
|
+
import ComponentManager from '../manager/Component.mjs';
|
4
|
+
import DomEvents from '../mixin/DomEvents.mjs';
|
5
|
+
import Observable from '../core/Observable.mjs';
|
6
|
+
import VdomLifecycle from '../mixin/VdomLifecycle.mjs';
|
7
|
+
|
8
|
+
const
|
9
|
+
closestController = Symbol.for('closestController'),
|
10
|
+
closestProvider = Symbol.for('closestProvider'),
|
11
|
+
twoWayBindingSymbol = Symbol.for('twoWayBinding');
|
12
|
+
|
13
|
+
/**
|
14
|
+
* @class Neo.component.Abstract
|
15
|
+
* @extends Neo.core.Base
|
16
|
+
* @mixes Neo.component.mixin.DomEvents
|
17
|
+
* @mixes Neo.core.Observable
|
18
|
+
* @mixes Neo.component.mixin.VdomLifecycle
|
19
|
+
*/
|
20
|
+
class Abstract extends Base {
|
21
|
+
static config = {
|
22
|
+
/**
|
23
|
+
* @member {String} className='Neo.component.Abstract'
|
24
|
+
* @protected
|
25
|
+
*/
|
26
|
+
className: 'Neo.component.Abstract',
|
27
|
+
/**
|
28
|
+
* @member {String} ntype='abstract-component'
|
29
|
+
* @protected
|
30
|
+
*/
|
31
|
+
ntype: 'abstract-component',
|
32
|
+
/**
|
33
|
+
* The name of the App this component belongs to
|
34
|
+
* @member {String|null} appName_=null
|
35
|
+
* @reactive
|
36
|
+
*/
|
37
|
+
appName_: null,
|
38
|
+
/**
|
39
|
+
* Bind configs to state.Provider data properties.
|
40
|
+
* @member {Object|null} bind=null
|
41
|
+
*/
|
42
|
+
bind: null,
|
43
|
+
/**
|
44
|
+
* Custom CSS selectors to apply to the root level node of this component
|
45
|
+
* @member {String[]} cls_=null
|
46
|
+
* @reactive
|
47
|
+
*/
|
48
|
+
cls_: null,
|
49
|
+
/**
|
50
|
+
* Convenience shortcut to access the data config of the closest state.Provider.
|
51
|
+
* Read only.
|
52
|
+
* @member {Object} data_=null
|
53
|
+
* @protected
|
54
|
+
* @reactive
|
55
|
+
*/
|
56
|
+
data_: null,
|
57
|
+
/**
|
58
|
+
* Disabled components will get the neo-disabled cls applied and won't receive DOM events
|
59
|
+
* @member {Boolean} disabled_=false
|
60
|
+
* @reactive
|
61
|
+
*/
|
62
|
+
disabled_: false,
|
63
|
+
/**
|
64
|
+
* @member {Neo.core.Base[]} mixins=[DomEvents, Observable, VdomLifecycle]
|
65
|
+
*/
|
66
|
+
mixins: [DomEvents, Observable, VdomLifecycle],
|
67
|
+
/**
|
68
|
+
* Override specific stateProvider data properties.
|
69
|
+
* This will merge the content.
|
70
|
+
* @member {Object|null} modelData=null
|
71
|
+
*/
|
72
|
+
modelData: null,
|
73
|
+
/**
|
74
|
+
* True after the component render() method was called. Also fires the rendered event.
|
75
|
+
* @member {Boolean} mounted_=false
|
76
|
+
* @protected
|
77
|
+
* @reactive
|
78
|
+
*/
|
79
|
+
mounted_: false,
|
80
|
+
/**
|
81
|
+
* If the parentId does not match a neo component id, you can manually set this value for finding
|
82
|
+
* view controllers or state providers.
|
83
|
+
* Use case: manually dropping components into a vdom structure
|
84
|
+
* @member {Neo.component.Base|null} parentComponent_=null
|
85
|
+
* @protected
|
86
|
+
* @reactive
|
87
|
+
*/
|
88
|
+
parentComponent_: null,
|
89
|
+
/**
|
90
|
+
* @member {String|null} parentId_=null
|
91
|
+
* @protected
|
92
|
+
* @reactive
|
93
|
+
*/
|
94
|
+
parentId_: null,
|
95
|
+
/**
|
96
|
+
* Optionally add a state.Provider to share state data with child components
|
97
|
+
* @member {Object|null} stateProvider_=null
|
98
|
+
* @reactive
|
99
|
+
*/
|
100
|
+
stateProvider_: null,
|
101
|
+
/**
|
102
|
+
* The custom windowIs (timestamp) this component belongs to
|
103
|
+
* @member {Number|null} windowId_=null
|
104
|
+
* @reactive
|
105
|
+
*/
|
106
|
+
windowId_: null
|
107
|
+
}
|
108
|
+
|
109
|
+
/**
|
110
|
+
* Internal flag which will get set to true while a component is waiting for its mountedPromise
|
111
|
+
* @member {Boolean} isAwaitingMount=false
|
112
|
+
* @protected
|
113
|
+
*/
|
114
|
+
isAwaitingMount = false
|
115
|
+
|
116
|
+
/**
|
117
|
+
* Convenience shortcut to access the App this component belongs to
|
118
|
+
* @returns {Neo.controller.Application|null}
|
119
|
+
*/
|
120
|
+
get app() {
|
121
|
+
return Neo.apps[this.appName] || null
|
122
|
+
}
|
123
|
+
|
124
|
+
/**
|
125
|
+
* A Promise that resolves when the component is mounted to the DOM.
|
126
|
+
* This provides a convenient way to wait for the component to be fully
|
127
|
+
* available and interactive before executing subsequent logic.
|
128
|
+
*
|
129
|
+
* It also handles unmounting by resetting the promise, so it can be safely
|
130
|
+
* awaited again if the component is remounted.
|
131
|
+
* @returns {Promise<Neo.component.Base>}
|
132
|
+
*/
|
133
|
+
get mountedPromise() {
|
134
|
+
let me = this;
|
135
|
+
|
136
|
+
if (!me._mountedPromise) {
|
137
|
+
me._mountedPromise = new Promise(resolve => {
|
138
|
+
if (me.mounted) {
|
139
|
+
resolve(me);
|
140
|
+
} else {
|
141
|
+
me.mountedPromiseResolve = resolve
|
142
|
+
}
|
143
|
+
})
|
144
|
+
}
|
145
|
+
|
146
|
+
return me._mountedPromise
|
147
|
+
}
|
148
|
+
|
149
|
+
/**
|
150
|
+
* Convenience method to access the parent component
|
151
|
+
* @returns {Neo.component.Base|null}
|
152
|
+
*/
|
153
|
+
get parent() {
|
154
|
+
let me = this;
|
155
|
+
|
156
|
+
return me.parentComponent || (me.parentId === 'document.body' ? null : Neo.getComponent(me.parentId))
|
157
|
+
}
|
158
|
+
|
159
|
+
/**
|
160
|
+
* Triggered after any config got changed
|
161
|
+
* @param {String} key
|
162
|
+
* @param {*} value
|
163
|
+
* @param {*} oldValue
|
164
|
+
* @protected
|
165
|
+
*/
|
166
|
+
afterSetConfig(key, value, oldValue) {
|
167
|
+
let me = this;
|
168
|
+
|
169
|
+
if (Neo.isUsingStateProviders && me[twoWayBindingSymbol]) {
|
170
|
+
// When a component config is updated by its state provider, this flag is set to the config's key.
|
171
|
+
// This prevents circular updates in two-way data bindings by skipping the push back to the state provider.
|
172
|
+
if (me._skipTwoWayPush === key) {
|
173
|
+
return;
|
174
|
+
}
|
175
|
+
let binding = me.bind?.[key];
|
176
|
+
|
177
|
+
if (binding?.twoWay) {
|
178
|
+
this.getStateProvider()?.setData(binding.key, value)
|
179
|
+
}
|
180
|
+
}
|
181
|
+
}
|
182
|
+
|
183
|
+
/**
|
184
|
+
* Triggered after the id config got changed
|
185
|
+
* @param {String|null} value
|
186
|
+
* @param {String|null} oldValue
|
187
|
+
* @protected
|
188
|
+
*/
|
189
|
+
afterSetId(value, oldValue) {
|
190
|
+
super.afterSetId(value, oldValue);
|
191
|
+
|
192
|
+
oldValue && ComponentManager.unregister(oldValue);
|
193
|
+
value && ComponentManager.register(this)
|
194
|
+
}
|
195
|
+
|
196
|
+
/**
|
197
|
+
* Triggered after the mounted config got changed
|
198
|
+
* @param {Boolean} value
|
199
|
+
* @param {Boolean} oldValue
|
200
|
+
* @protected
|
201
|
+
*/
|
202
|
+
afterSetMounted(value, oldValue) {
|
203
|
+
if (oldValue !== undefined) {
|
204
|
+
const me = this;
|
205
|
+
|
206
|
+
if (value) { // mount
|
207
|
+
me.initDomEvents?.();
|
208
|
+
me.mountedPromiseResolve?.(this);
|
209
|
+
delete me.mountedPromiseResolve
|
210
|
+
} else { // unmount
|
211
|
+
delete me._mountedPromise
|
212
|
+
}
|
213
|
+
}
|
214
|
+
}
|
215
|
+
|
216
|
+
/**
|
217
|
+
* Triggered after the stateProvider config got changed
|
218
|
+
* @param {Neo.state.Provider} value
|
219
|
+
* @param {Object|Neo.state.Provider|null} oldValue
|
220
|
+
* @protected
|
221
|
+
*/
|
222
|
+
afterSetStateProvider(value, oldValue) {
|
223
|
+
value?.createBindings(this)
|
224
|
+
}
|
225
|
+
|
226
|
+
/**
|
227
|
+
* Triggered after the windowId config got changed
|
228
|
+
* @param {Number|null} value
|
229
|
+
* @param {Number|null} oldValue
|
230
|
+
* @protected
|
231
|
+
*/
|
232
|
+
afterSetWindowId(value, oldValue) {
|
233
|
+
const me = this;
|
234
|
+
|
235
|
+
if (value) {
|
236
|
+
Neo.currentWorker.insertThemeFiles(value, me.__proto__)
|
237
|
+
}
|
238
|
+
|
239
|
+
// If a component gets moved into a different window, an update cycle might still be running.
|
240
|
+
// Since the update might no longer get mapped, we want to re-enable this instance for future updates.
|
241
|
+
if (oldValue) {
|
242
|
+
me.isVdomUpdating = false
|
243
|
+
}
|
244
|
+
}
|
245
|
+
|
246
|
+
/**
|
247
|
+
* Triggered when accessing the data config
|
248
|
+
* Convenience shortcut which is expensive to use, since it will generate a merged parent state providers data map.
|
249
|
+
* @param {Object} value
|
250
|
+
* @protected
|
251
|
+
*/
|
252
|
+
beforeGetData(value) {
|
253
|
+
return this.getStateProvider()?.getHierarchyData()
|
254
|
+
}
|
255
|
+
|
256
|
+
/**
|
257
|
+
* Triggered before the stateProvider config gets changed.
|
258
|
+
* Creates a state.Provider instance if needed.
|
259
|
+
* @param {Object} value
|
260
|
+
* @param {Object} oldValue
|
261
|
+
* @returns {Neo.state.Provider}
|
262
|
+
* @protected
|
263
|
+
*/
|
264
|
+
beforeSetStateProvider(value, oldValue) {
|
265
|
+
oldValue?.destroy();
|
266
|
+
|
267
|
+
if (value) {
|
268
|
+
let me = this,
|
269
|
+
defaultValues = {component: me};
|
270
|
+
|
271
|
+
if (me.modelData) {
|
272
|
+
defaultValues.data = me.modelData
|
273
|
+
}
|
274
|
+
|
275
|
+
return ClassSystemUtil.beforeSetInstance(value, 'Neo.state.Provider', defaultValues)
|
276
|
+
}
|
277
|
+
|
278
|
+
return null
|
279
|
+
}
|
280
|
+
|
281
|
+
/**
|
282
|
+
*
|
283
|
+
*/
|
284
|
+
destroy() {
|
285
|
+
this.removeDomEvents();
|
286
|
+
ComponentManager.unregister(this);
|
287
|
+
this.stateProvider = null; // triggers destroy()
|
288
|
+
super.destroy()
|
289
|
+
}
|
290
|
+
|
291
|
+
/**
|
292
|
+
* Find an instance stored inside a config via optionally passing a ntype.
|
293
|
+
* Returns this[configName] or the closest parent component with a match.
|
294
|
+
* Used by getController() & getStateProvider()
|
295
|
+
* @param {String} configName
|
296
|
+
* @param {String} [ntype]
|
297
|
+
* @returns {Neo.core.Base|null}
|
298
|
+
*/
|
299
|
+
getConfigInstanceByNtype(configName, ntype) {
|
300
|
+
let me = this,
|
301
|
+
config = me[configName],
|
302
|
+
{parentComponent} = me;
|
303
|
+
|
304
|
+
if (config && (!ntype || ntype === config.ntype)) {
|
305
|
+
return config
|
306
|
+
}
|
307
|
+
|
308
|
+
if (!parentComponent && me.parentId) {
|
309
|
+
parentComponent = me.parent || Neo.get(me.parentId);
|
310
|
+
}
|
311
|
+
|
312
|
+
if (parentComponent) {
|
313
|
+
// todo: We need ?. until functional.component.Base supports controllers
|
314
|
+
return parentComponent.getConfigInstanceByNtype?.(configName, ntype)
|
315
|
+
}
|
316
|
+
|
317
|
+
return null
|
318
|
+
}
|
319
|
+
|
320
|
+
/**
|
321
|
+
* Convenience shortcut
|
322
|
+
* @param args
|
323
|
+
* @returns {*}
|
324
|
+
*/
|
325
|
+
getState(...args) {
|
326
|
+
return this.getStateProvider().getData(...args)
|
327
|
+
}
|
328
|
+
|
329
|
+
/**
|
330
|
+
* Returns this.stateProvider or the closest parent stateProvider
|
331
|
+
* @param {String} [ntype]
|
332
|
+
* @returns {Neo.state.Provider|null}
|
333
|
+
*/
|
334
|
+
getStateProvider(ntype) {
|
335
|
+
if (!Neo.isUsingStateProviders) {
|
336
|
+
return null
|
337
|
+
}
|
338
|
+
|
339
|
+
let me = this,
|
340
|
+
provider;
|
341
|
+
|
342
|
+
if (!ntype) {
|
343
|
+
provider = me[closestProvider];
|
344
|
+
|
345
|
+
if (provider) {
|
346
|
+
return provider
|
347
|
+
}
|
348
|
+
}
|
349
|
+
|
350
|
+
provider = me.getConfigInstanceByNtype('stateProvider', ntype);
|
351
|
+
|
352
|
+
if (!ntype) {
|
353
|
+
me[closestProvider] = provider
|
354
|
+
}
|
355
|
+
|
356
|
+
return provider
|
357
|
+
}
|
358
|
+
|
359
|
+
/**
|
360
|
+
* @param args
|
361
|
+
*/
|
362
|
+
initConfig(...args) {
|
363
|
+
super.initConfig(...args);
|
364
|
+
this.getStateProvider()?.createBindings(this)
|
365
|
+
}
|
366
|
+
|
367
|
+
/**
|
368
|
+
* Change multiple configs at once, ensuring that all afterSet methods get all new assigned values
|
369
|
+
* @param {Object} values={}
|
370
|
+
* @param {Boolean} silent=false
|
371
|
+
* @returns {Promise<*>}
|
372
|
+
*/
|
373
|
+
set(values={}, silent=false) {
|
374
|
+
const
|
375
|
+
me = this,
|
376
|
+
wasHidden = me.hidden;
|
377
|
+
|
378
|
+
me.setSilent(values);
|
379
|
+
|
380
|
+
if (!silent && me.needsVdomUpdate) {
|
381
|
+
if (wasHidden && !me.hidden) {
|
382
|
+
me.show?.(); // show() is not part of the abstract base class
|
383
|
+
return Promise.resolve()
|
384
|
+
}
|
385
|
+
|
386
|
+
return me.promiseUpdate()
|
387
|
+
}
|
388
|
+
|
389
|
+
return Promise.resolve()
|
390
|
+
}
|
391
|
+
|
392
|
+
/**
|
393
|
+
* A silent version of set(), which does not trigger a vdom update at the end.
|
394
|
+
* Useful for batching multiple config changes.
|
395
|
+
* @param {Object} values={}
|
396
|
+
*/
|
397
|
+
setSilent(values={}) {
|
398
|
+
this.silentVdomUpdate = true;
|
399
|
+
super.set(values);
|
400
|
+
this.silentVdomUpdate = false
|
401
|
+
}
|
402
|
+
|
403
|
+
/**
|
404
|
+
* Convenience shortcut
|
405
|
+
* @param args
|
406
|
+
*/
|
407
|
+
setState(...args) {
|
408
|
+
this.getStateProvider().setData(...args)
|
409
|
+
}
|
410
|
+
}
|
411
|
+
|
412
|
+
export default Neo.setupClass(Abstract);
|