jopijs 0.0.1
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/README.md +134 -0
- package/bin/jopib.js +4 -0
- package/bin/jopin.js +4 -0
- package/dist/@bundler/_logs.d.ts +2 -0
- package/dist/@bundler/_logs.js +4 -0
- package/dist/@bundler/_logs.js.map +1 -0
- package/dist/@bundler/core.d.ts +1 -0
- package/dist/@bundler/core.js +34 -0
- package/dist/@bundler/core.js.map +1 -0
- package/dist/@bundler/esbuild.d.ts +6 -0
- package/dist/@bundler/esbuild.js +111 -0
- package/dist/@bundler/esbuild.js.map +1 -0
- package/dist/@bundler/index.d.ts +2 -0
- package/dist/@bundler/index.js +3 -0
- package/dist/@bundler/index.js.map +1 -0
- package/dist/@bundler/plugins.d.ts +13 -0
- package/dist/@bundler/plugins.js +145 -0
- package/dist/@bundler/plugins.js.map +1 -0
- package/dist/@bundler/tailwind.d.ts +3 -0
- package/dist/@bundler/tailwind.js +119 -0
- package/dist/@bundler/tailwind.js.map +1 -0
- package/dist/@core/PageComponent.d.ts +6 -0
- package/dist/@core/PageComponent.js +10 -0
- package/dist/@core/PageComponent.js.map +1 -0
- package/dist/@core/_logs.d.ts +7 -0
- package/dist/@core/_logs.js +9 -0
- package/dist/@core/_logs.js.map +1 -0
- package/dist/@core/automaticStartStop.d.ts +25 -0
- package/dist/@core/automaticStartStop.js +106 -0
- package/dist/@core/automaticStartStop.js.map +1 -0
- package/dist/@core/browserCacheControl.d.ts +21 -0
- package/dist/@core/browserCacheControl.js +17 -0
- package/dist/@core/browserCacheControl.js.map +1 -0
- package/dist/@core/bundler/bundler.d.ts +22 -0
- package/dist/@core/bundler/bundler.js +90 -0
- package/dist/@core/bundler/bundler.js.map +1 -0
- package/dist/@core/bundler/common.d.ts +2 -0
- package/dist/@core/bundler/common.js +17 -0
- package/dist/@core/bundler/common.js.map +1 -0
- package/dist/@core/bundler/config.d.ts +20 -0
- package/dist/@core/bundler/config.js +11 -0
- package/dist/@core/bundler/config.js.map +1 -0
- package/dist/@core/bundler/extraContent.d.ts +6 -0
- package/dist/@core/bundler/extraContent.js +27 -0
- package/dist/@core/bundler/extraContent.js.map +1 -0
- package/dist/@core/bundler/pagesGenerator.d.ts +1 -0
- package/dist/@core/bundler/pagesGenerator.js +173 -0
- package/dist/@core/bundler/pagesGenerator.js.map +1 -0
- package/dist/@core/bundler/server.d.ts +8 -0
- package/dist/@core/bundler/server.js +35 -0
- package/dist/@core/bundler/server.js.map +1 -0
- package/dist/@core/caches/InMemoryCache.d.ts +35 -0
- package/dist/@core/caches/InMemoryCache.js +353 -0
- package/dist/@core/caches/InMemoryCache.js.map +1 -0
- package/dist/@core/caches/SimpleFileCache.d.ts +18 -0
- package/dist/@core/caches/SimpleFileCache.js +171 -0
- package/dist/@core/caches/SimpleFileCache.js.map +1 -0
- package/dist/@core/caches/cache.d.ts +36 -0
- package/dist/@core/caches/cache.js +33 -0
- package/dist/@core/caches/cache.js.map +1 -0
- package/dist/@core/caches/webSiteMirrorCache.d.ts +16 -0
- package/dist/@core/caches/webSiteMirrorCache.js +81 -0
- package/dist/@core/caches/webSiteMirrorCache.js.map +1 -0
- package/dist/@core/gzip.d.ts +4 -0
- package/dist/@core/gzip.js +31 -0
- package/dist/@core/gzip.js.map +1 -0
- package/dist/@core/index.d.ts +18 -0
- package/dist/@core/index.js +19 -0
- package/dist/@core/index.js.map +1 -0
- package/dist/@core/internalTools.d.ts +14 -0
- package/dist/@core/internalTools.js +79 -0
- package/dist/@core/internalTools.js.map +1 -0
- package/dist/@core/jQuery.d.ts +5 -0
- package/dist/@core/jQuery.js +18 -0
- package/dist/@core/jQuery.js.map +1 -0
- package/dist/@core/jopiEasy.d.ts +287 -0
- package/dist/@core/jopiEasy.js +983 -0
- package/dist/@core/jopiEasy.js.map +1 -0
- package/dist/@core/jopiRequest.d.ts +269 -0
- package/dist/@core/jopiRequest.js +1060 -0
- package/dist/@core/jopiRequest.js.map +1 -0
- package/dist/@core/jopiServer.d.ts +77 -0
- package/dist/@core/jopiServer.js +100 -0
- package/dist/@core/jopiServer.js.map +1 -0
- package/dist/@core/jopiWebSite.d.ts +319 -0
- package/dist/@core/jopiWebSite.js +653 -0
- package/dist/@core/jopiWebSite.js.map +1 -0
- package/dist/@core/letsEncrypt.d.ts +25 -0
- package/dist/@core/letsEncrypt.js +189 -0
- package/dist/@core/letsEncrypt.js.map +1 -0
- package/dist/@core/linker.d.ts +4 -0
- package/dist/@core/linker.js +37 -0
- package/dist/@core/linker.js.map +1 -0
- package/dist/@core/loadBalancing.d.ts +18 -0
- package/dist/@core/loadBalancing.js +126 -0
- package/dist/@core/loadBalancing.js.map +1 -0
- package/dist/@core/middlewares/CorsMiddleware.d.ts +5 -0
- package/dist/@core/middlewares/CorsMiddleware.js +15 -0
- package/dist/@core/middlewares/CorsMiddleware.js.map +1 -0
- package/dist/@core/middlewares/DdosProtection.d.ts +42 -0
- package/dist/@core/middlewares/DdosProtection.js +62 -0
- package/dist/@core/middlewares/DdosProtection.js.map +1 -0
- package/dist/@core/middlewares/index.d.ts +10 -0
- package/dist/@core/middlewares/index.js +14 -0
- package/dist/@core/middlewares/index.js.map +1 -0
- package/dist/@core/publicTools.d.ts +8 -0
- package/dist/@core/publicTools.js +11 -0
- package/dist/@core/publicTools.js.map +1 -0
- package/dist/@core/routeConfig.d.ts +48 -0
- package/dist/@core/routeConfig.js +102 -0
- package/dist/@core/routeConfig.js.map +1 -0
- package/dist/@core/searchParamFilter.d.ts +70 -0
- package/dist/@core/searchParamFilter.js +212 -0
- package/dist/@core/searchParamFilter.js.map +1 -0
- package/dist/@core/serverFetch.d.ts +122 -0
- package/dist/@core/serverFetch.js +312 -0
- package/dist/@core/serverFetch.js.map +1 -0
- package/dist/@core/serverImpl/server_bunjs.d.ts +29 -0
- package/dist/@core/serverImpl/server_bunjs.js +180 -0
- package/dist/@core/serverImpl/server_bunjs.js.map +1 -0
- package/dist/@core/serverImpl/server_nodejs.d.ts +22 -0
- package/dist/@core/serverImpl/server_nodejs.js +235 -0
- package/dist/@core/serverImpl/server_nodejs.js.map +1 -0
- package/dist/@core/serverInstanceBuilder.d.ts +17 -0
- package/dist/@core/serverInstanceBuilder.js +14 -0
- package/dist/@core/serverInstanceBuilder.js.map +1 -0
- package/dist/@core/userStores.d.ts +13 -0
- package/dist/@core/userStores.js +20 -0
- package/dist/@core/userStores.js.map +1 -0
- package/dist/@crawler/common.d.ts +203 -0
- package/dist/@crawler/common.js +68 -0
- package/dist/@crawler/common.js.map +1 -0
- package/dist/@crawler/core.d.ts +87 -0
- package/dist/@crawler/core.js +586 -0
- package/dist/@crawler/core.js.map +1 -0
- package/dist/@crawler/directFileCache.d.ts +10 -0
- package/dist/@crawler/directFileCache.js +60 -0
- package/dist/@crawler/directFileCache.js.map +1 -0
- package/dist/@crawler/index.d.ts +4 -0
- package/dist/@crawler/index.js +5 -0
- package/dist/@crawler/index.js.map +1 -0
- package/dist/@crawler/urlMapping.d.ts +21 -0
- package/dist/@crawler/urlMapping.js +52 -0
- package/dist/@crawler/urlMapping.js.map +1 -0
- package/dist/@crawler/utils.d.ts +6 -0
- package/dist/@crawler/utils.js +13 -0
- package/dist/@crawler/utils.js.map +1 -0
- package/dist/@generated/index.d.ts +29 -0
- package/dist/@generated/index.js +93 -0
- package/dist/@generated/index.js.map +1 -0
- package/dist/@linker/arobaseTypes.d.ts +50 -0
- package/dist/@linker/arobaseTypes.js +235 -0
- package/dist/@linker/arobaseTypes.js.map +1 -0
- package/dist/@linker/changeProof.d.ts +5 -0
- package/dist/@linker/changeProof.js +50 -0
- package/dist/@linker/changeProof.js.map +1 -0
- package/dist/@linker/config.d.ts +2 -0
- package/dist/@linker/config.js +40 -0
- package/dist/@linker/config.js.map +1 -0
- package/dist/@linker/engine.d.ts +156 -0
- package/dist/@linker/engine.js +665 -0
- package/dist/@linker/engine.js.map +1 -0
- package/dist/@linker/index.d.ts +3 -0
- package/dist/@linker/index.js +4 -0
- package/dist/@linker/index.js.map +1 -0
- package/dist/@linker/install.d.ts +4 -0
- package/dist/@linker/install.js +42 -0
- package/dist/@linker/install.js.map +1 -0
- package/dist/@linker/modInstaller.d.ts +10 -0
- package/dist/@linker/modInstaller.js +38 -0
- package/dist/@linker/modInstaller.js.map +1 -0
- package/dist/@linker/typeEvents.d.ts +9 -0
- package/dist/@linker/typeEvents.js +48 -0
- package/dist/@linker/typeEvents.js.map +1 -0
- package/dist/@linker/typeRoutes.d.ts +23 -0
- package/dist/@linker/typeRoutes.js +197 -0
- package/dist/@linker/typeRoutes.js.map +1 -0
- package/dist/@linker/typeUiComposite.d.ts +6 -0
- package/dist/@linker/typeUiComposite.js +16 -0
- package/dist/@linker/typeUiComposite.js.map +1 -0
- package/dist/@loader/index.d.ts +1 -0
- package/dist/@loader/index.js +17 -0
- package/dist/@loader/index.js.map +1 -0
- package/dist/@loader/nodeJsLoader.d.ts +2 -0
- package/dist/@loader/nodeJsLoader.js +19 -0
- package/dist/@loader/nodeJsLoader.js.map +1 -0
- package/dist/@loader-client/index.d.ts +33 -0
- package/dist/@loader-client/index.js +98 -0
- package/dist/@loader-client/index.js.map +1 -0
- package/dist/@loader-tools/bunJsLoader.d.ts +1 -0
- package/dist/@loader-tools/bunJsLoader.js +28 -0
- package/dist/@loader-tools/bunJsLoader.js.map +1 -0
- package/dist/@loader-tools/config.d.ts +49 -0
- package/dist/@loader-tools/config.js +79 -0
- package/dist/@loader-tools/config.js.map +1 -0
- package/dist/@loader-tools/cssModuleCompiler.d.ts +5 -0
- package/dist/@loader-tools/cssModuleCompiler.js +65 -0
- package/dist/@loader-tools/cssModuleCompiler.js.map +1 -0
- package/dist/@loader-tools/esBuildPlugin.d.ts +5 -0
- package/dist/@loader-tools/esBuildPlugin.js +113 -0
- package/dist/@loader-tools/esBuildPlugin.js.map +1 -0
- package/dist/@loader-tools/index.d.ts +9 -0
- package/dist/@loader-tools/index.js +10 -0
- package/dist/@loader-tools/index.js.map +1 -0
- package/dist/@loader-tools/jopin.d.ts +10 -0
- package/dist/@loader-tools/jopin.js +331 -0
- package/dist/@loader-tools/jopin.js.map +1 -0
- package/dist/@loader-tools/nodeJsLoader.d.ts +13 -0
- package/dist/@loader-tools/nodeJsLoader.js +101 -0
- package/dist/@loader-tools/nodeJsLoader.js.map +1 -0
- package/dist/@loader-tools/nodeJsResolver.d.ts +2 -0
- package/dist/@loader-tools/nodeJsResolver.js +117 -0
- package/dist/@loader-tools/nodeJsResolver.js.map +1 -0
- package/dist/@loader-tools/rules.d.ts +3 -0
- package/dist/@loader-tools/rules.js +33 -0
- package/dist/@loader-tools/rules.js.map +1 -0
- package/dist/@loader-tools/sourceChangesWatcher.d.ts +39 -0
- package/dist/@loader-tools/sourceChangesWatcher.js +182 -0
- package/dist/@loader-tools/sourceChangesWatcher.js.map +1 -0
- package/dist/@loader-tools/tools.d.ts +21 -0
- package/dist/@loader-tools/tools.js +113 -0
- package/dist/@loader-tools/tools.js.map +1 -0
- package/dist/@loader-tools/transform.d.ts +5 -0
- package/dist/@loader-tools/transform.js +114 -0
- package/dist/@loader-tools/transform.js.map +1 -0
- package/dist/@loader-tools/virtualUrl.d.ts +9 -0
- package/dist/@loader-tools/virtualUrl.js +40 -0
- package/dist/@loader-tools/virtualUrl.js.map +1 -0
- package/dist/@tool-jopinb/index.d.ts +1 -0
- package/dist/@tool-jopinb/index.js +9 -0
- package/dist/@tool-jopinb/index.js.map +1 -0
- package/dist/@ui/components.d.ts +27 -0
- package/dist/@ui/components.js +42 -0
- package/dist/@ui/components.js.map +1 -0
- package/dist/@ui/cssModules.d.ts +11 -0
- package/dist/@ui/cssModules.js +17 -0
- package/dist/@ui/cssModules.js.map +1 -0
- package/dist/@ui/hooks.d.ts +31 -0
- package/dist/@ui/hooks.js +71 -0
- package/dist/@ui/hooks.js.map +1 -0
- package/dist/@ui/index.d.ts +9 -0
- package/dist/@ui/index.js +11 -0
- package/dist/@ui/index.js.map +1 -0
- package/dist/@ui/internal.d.ts +4 -0
- package/dist/@ui/internal.js +10 -0
- package/dist/@ui/internal.js.map +1 -0
- package/dist/@ui/modules.d.ts +41 -0
- package/dist/@ui/modules.js +74 -0
- package/dist/@ui/modules.js.map +1 -0
- package/dist/@ui/objectRegistry.d.ts +12 -0
- package/dist/@ui/objectRegistry.js +35 -0
- package/dist/@ui/objectRegistry.js.map +1 -0
- package/dist/@ui/pageController.d.ts +61 -0
- package/dist/@ui/pageController.js +166 -0
- package/dist/@ui/pageController.js.map +1 -0
- package/dist/@ui/tools.d.ts +24 -0
- package/dist/@ui/tools.js +78 -0
- package/dist/@ui/tools.js.map +1 -0
- package/dist/@uikit/core/UiKitModule.d.ts +6 -0
- package/dist/@uikit/core/UiKitModule.js +18 -0
- package/dist/@uikit/core/UiKitModule.js.map +1 -0
- package/dist/@uikit/core/index.d.ts +1 -0
- package/dist/@uikit/core/index.js +4 -0
- package/dist/@uikit/core/index.js.map +1 -0
- package/dist/@uikit/core/jBundler_ifBrowser.d.ts +1 -0
- package/dist/@uikit/core/jBundler_ifBrowser.js +5 -0
- package/dist/@uikit/core/jBundler_ifBrowser.js.map +1 -0
- package/dist/@uikit/core/jBundler_ifServer.d.ts +6 -0
- package/dist/@uikit/core/jBundler_ifServer.js +17 -0
- package/dist/@uikit/core/jBundler_ifServer.js.map +1 -0
- package/dist/@uikit/forms/components.d.ts +18 -0
- package/dist/@uikit/forms/components.js +69 -0
- package/dist/@uikit/forms/components.js.map +1 -0
- package/dist/@uikit/forms/hooks.d.ts +4 -0
- package/dist/@uikit/forms/hooks.js +31 -0
- package/dist/@uikit/forms/hooks.js.map +1 -0
- package/dist/@uikit/forms/index.d.ts +3 -0
- package/dist/@uikit/forms/index.js +4 -0
- package/dist/@uikit/forms/index.js.map +1 -0
- package/dist/@uikit/forms/interfaces.d.ts +101 -0
- package/dist/@uikit/forms/interfaces.js +4 -0
- package/dist/@uikit/forms/interfaces.js.map +1 -0
- package/dist/@uikit/forms/private.d.ts +40 -0
- package/dist/@uikit/forms/private.js +307 -0
- package/dist/@uikit/forms/private.js.map +1 -0
- package/dist/@uikit/helpers/hooks.d.ts +33 -0
- package/dist/@uikit/helpers/hooks.js +107 -0
- package/dist/@uikit/helpers/hooks.js.map +1 -0
- package/dist/@uikit/helpers/index.d.ts +2 -0
- package/dist/@uikit/helpers/index.js +3 -0
- package/dist/@uikit/helpers/index.js.map +1 -0
- package/dist/@uikit/helpers/tools.d.ts +8 -0
- package/dist/@uikit/helpers/tools.js +35 -0
- package/dist/@uikit/helpers/tools.js.map +1 -0
- package/dist/@uikit/index.d.ts +10 -0
- package/dist/@uikit/index.js +13 -0
- package/dist/@uikit/index.js.map +1 -0
- package/dist/@uikit/menu/core.d.ts +21 -0
- package/dist/@uikit/menu/core.js +191 -0
- package/dist/@uikit/menu/core.js.map +1 -0
- package/dist/@uikit/menu/hooks.d.ts +5 -0
- package/dist/@uikit/menu/hooks.js +24 -0
- package/dist/@uikit/menu/hooks.js.map +1 -0
- package/dist/@uikit/menu/index.d.ts +3 -0
- package/dist/@uikit/menu/index.js +4 -0
- package/dist/@uikit/menu/index.js.map +1 -0
- package/dist/@uikit/menu/interfaces.d.ts +20 -0
- package/dist/@uikit/menu/interfaces.js +8 -0
- package/dist/@uikit/menu/interfaces.js.map +1 -0
- package/dist/@uikit/menu/internal.d.ts +40 -0
- package/dist/@uikit/menu/internal.js +191 -0
- package/dist/@uikit/menu/internal.js.map +1 -0
- package/dist/@uikit/reactRouter/hooks/jBundler_ifBrowser.d.ts +18 -0
- package/dist/@uikit/reactRouter/hooks/jBundler_ifBrowser.js +40 -0
- package/dist/@uikit/reactRouter/hooks/jBundler_ifBrowser.js.map +1 -0
- package/dist/@uikit/reactRouter/hooks/jBundler_ifServer.d.ts +28 -0
- package/dist/@uikit/reactRouter/hooks/jBundler_ifServer.js +35 -0
- package/dist/@uikit/reactRouter/hooks/jBundler_ifServer.js.map +1 -0
- package/dist/@uikit/reactRouter/index.d.ts +1 -0
- package/dist/@uikit/reactRouter/index.js +2 -0
- package/dist/@uikit/reactRouter/index.js.map +1 -0
- package/dist/@uikit/users/hooks.d.ts +10 -0
- package/dist/@uikit/users/hooks.js +39 -0
- package/dist/@uikit/users/hooks.js.map +1 -0
- package/dist/@uikit/users/index.d.ts +1 -0
- package/dist/@uikit/users/index.js +2 -0
- package/dist/@uikit/users/index.js.map +1 -0
- package/dist/@uikit/variants/index.d.ts +7 -0
- package/dist/@uikit/variants/index.js +16 -0
- package/dist/@uikit/variants/index.js.map +1 -0
- package/package.json +115 -0
- package/src/@bundler/README.md +1 -0
- package/src/@bundler/_logs.ts +4 -0
- package/src/@bundler/core.ts +41 -0
- package/src/@bundler/esbuild.ts +141 -0
- package/src/@bundler/index.ts +3 -0
- package/src/@bundler/plugins.ts +163 -0
- package/src/@bundler/tailwind.ts +139 -0
- package/src/@core/PageComponent.tsx +25 -0
- package/src/@core/README.md +1 -0
- package/src/@core/_logs.ts +11 -0
- package/src/@core/automaticStartStop.ts +132 -0
- package/src/@core/browserCacheControl.ts +40 -0
- package/src/@core/bundler/bundler.ts +128 -0
- package/src/@core/bundler/common.ts +18 -0
- package/src/@core/bundler/config.ts +37 -0
- package/src/@core/bundler/extraContent.ts +30 -0
- package/src/@core/bundler/pagesGenerator.ts +194 -0
- package/src/@core/bundler/server.ts +41 -0
- package/src/@core/caches/InMemoryCache.ts +483 -0
- package/src/@core/caches/SimpleFileCache.ts +205 -0
- package/src/@core/caches/cache.ts +77 -0
- package/src/@core/caches/webSiteMirrorCache.ts +90 -0
- package/src/@core/cheerio.d.ts +332 -0
- package/src/@core/gzip.ts +33 -0
- package/src/@core/index.ts +23 -0
- package/src/@core/internalTools.ts +95 -0
- package/src/@core/jQuery.ts +22 -0
- package/src/@core/jopiEasy.ts +1285 -0
- package/src/@core/jopiRequest.tsx +1279 -0
- package/src/@core/jopiServer.ts +188 -0
- package/src/@core/jopiWebSite.tsx +1027 -0
- package/src/@core/letsEncrypt.ts +243 -0
- package/src/@core/linker.ts +42 -0
- package/src/@core/loadBalancing.ts +152 -0
- package/src/@core/middlewares/CorsMiddleware.ts +23 -0
- package/src/@core/middlewares/DdosProtection.ts +120 -0
- package/src/@core/middlewares/index.ts +16 -0
- package/src/@core/publicTools.ts +14 -0
- package/src/@core/routeConfig.ts +104 -0
- package/src/@core/searchParamFilter.ts +315 -0
- package/src/@core/serverFetch.ts +454 -0
- package/src/@core/serverImpl/server_bunjs.tsx +230 -0
- package/src/@core/serverImpl/server_nodejs.ts +312 -0
- package/src/@core/serverInstanceBuilder.ts +36 -0
- package/src/@core/userStores.ts +34 -0
- package/src/@crawler/README.md +1 -0
- package/src/@crawler/common.ts +275 -0
- package/src/@crawler/core.ts +678 -0
- package/src/@crawler/directFileCache.ts +69 -0
- package/src/@crawler/index.ts +4 -0
- package/src/@crawler/urlMapping.ts +67 -0
- package/src/@crawler/utils.ts +13 -0
- package/src/@generated/index.ts +134 -0
- package/src/@linker/arobaseTypes.ts +325 -0
- package/src/@linker/changeProof.ts +53 -0
- package/src/@linker/config.ts +46 -0
- package/src/@linker/engine.ts +865 -0
- package/src/@linker/index.ts +3 -0
- package/src/@linker/install.ts +39 -0
- package/src/@linker/modInstaller.ts +50 -0
- package/src/@linker/typeEvents.ts +58 -0
- package/src/@linker/typeRoutes.ts +255 -0
- package/src/@linker/typeUiComposite.ts +19 -0
- package/src/@loader/README.md +4 -0
- package/src/@loader/bunHtmlCompiler.mjs +27 -0
- package/src/@loader/index.ts +19 -0
- package/src/@loader/loader.mjs +7 -0
- package/src/@loader/nodeJsLoader.ts +21 -0
- package/src/@loader-client/README.md +2 -0
- package/src/@loader-client/index.ts +108 -0
- package/src/@loader-tools/README.md +6 -0
- package/src/@loader-tools/bunJsLoader.ts +33 -0
- package/src/@loader-tools/config.ts +142 -0
- package/src/@loader-tools/cssModuleCompiler.ts +76 -0
- package/src/@loader-tools/esBuildPlugin.ts +142 -0
- package/src/@loader-tools/index.ts +11 -0
- package/src/@loader-tools/jopin.ts +403 -0
- package/src/@loader-tools/nodeJsLoader.ts +119 -0
- package/src/@loader-tools/nodeJsResolver.ts +140 -0
- package/src/@loader-tools/rules.ts +45 -0
- package/src/@loader-tools/sourceChangesWatcher.ts +225 -0
- package/src/@loader-tools/tools.ts +139 -0
- package/src/@loader-tools/transform.ts +138 -0
- package/src/@loader-tools/virtualUrl.ts +57 -0
- package/src/@loader-types/README.md +15 -0
- package/src/@loader-types/extensions.d.ts +65 -0
- package/src/@tool-jopinb/README.md +1 -0
- package/src/@tool-jopinb/index.ts +11 -0
- package/src/@ui/README.md +3 -0
- package/src/@ui/components.tsx +49 -0
- package/src/@ui/cssModules.tsx +27 -0
- package/src/@ui/hooks.tsx +95 -0
- package/src/@ui/index.ts +13 -0
- package/src/@ui/internal.ts +12 -0
- package/src/@ui/modules.ts +100 -0
- package/src/@ui/objectRegistry.ts +50 -0
- package/src/@ui/pageController.ts +203 -0
- package/src/@ui/tools.ts +116 -0
- package/src/@uikit/README.md +1 -0
- package/src/@uikit/core/UiKitModule.ts +20 -0
- package/src/@uikit/core/index.ts +4 -0
- package/src/@uikit/core/jBundler_ifBrowser.ts +4 -0
- package/src/@uikit/core/jBundler_ifServer.ts +18 -0
- package/src/@uikit/forms/components.tsx +97 -0
- package/src/@uikit/forms/hooks.ts +38 -0
- package/src/@uikit/forms/index.ts +3 -0
- package/src/@uikit/forms/interfaces.ts +159 -0
- package/src/@uikit/forms/private.ts +365 -0
- package/src/@uikit/helpers/hooks.ts +133 -0
- package/src/@uikit/helpers/index.ts +2 -0
- package/src/@uikit/helpers/tools.ts +39 -0
- package/src/@uikit/index.ts +15 -0
- package/src/@uikit/menu/core.ts +227 -0
- package/src/@uikit/menu/hooks.ts +28 -0
- package/src/@uikit/menu/index.ts +3 -0
- package/src/@uikit/menu/interfaces.ts +26 -0
- package/src/@uikit/menu/internal.ts +218 -0
- package/src/@uikit/package.json +15 -0
- package/src/@uikit/reactRouter/hooks/jBundler_ifBrowser.tsx +59 -0
- package/src/@uikit/reactRouter/hooks/jBundler_ifServer.tsx +51 -0
- package/src/@uikit/reactRouter/index.ts +1 -0
- package/src/@uikit/users/hooks.ts +50 -0
- package/src/@uikit/users/index.ts +1 -0
- package/src/@uikit/variants/index.tsx +20 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as jk_event from "jopi-toolkit/jk_events";
|
|
2
|
+
import type {WebSite, WebSiteImpl} from "jopijs";
|
|
3
|
+
import {UiKitModule} from "./UiKitModule.ts";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Must be called manually from the server-side init to enable UiKit.
|
|
7
|
+
* This will allow replacing the instance of ModuleInitContext
|
|
8
|
+
* by an instance of UiKitModule.
|
|
9
|
+
*/
|
|
10
|
+
export function registerUiKit() {
|
|
11
|
+
// We want to replace the creation of the object ModuleInitContext
|
|
12
|
+
// with our own implementation, which extend the core functionalities.
|
|
13
|
+
//
|
|
14
|
+
jk_event.addListener<WebSite>("jopi.server.install.done", (webSite) => {
|
|
15
|
+
// @ts-ignore It doesn't correctly cast references.
|
|
16
|
+
(webSite as WebSiteImpl).setModuleInitClassInstancier(host => new UiKitModule(host));
|
|
17
|
+
});
|
|
18
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// noinspection JSUnusedGlobalSymbols
|
|
2
|
+
|
|
3
|
+
import React, {useRef} from "react";
|
|
4
|
+
import {useVariant, VariantContext} from "../variants/index.tsx";
|
|
5
|
+
import {
|
|
6
|
+
type JAutoFormFieldProps,
|
|
7
|
+
type JCheckboxFormFieldProps, type JFormMessageProps,
|
|
8
|
+
type JInputFormFieldProps, type JFieldProps,
|
|
9
|
+
type JFormComponentProps,
|
|
10
|
+
type JFormController, type JNumberFormFieldProps, type JFileSelectFieldProps
|
|
11
|
+
} from "./interfaces.ts";
|
|
12
|
+
import {FormContext, JFormControllerImpl} from "./private.ts";
|
|
13
|
+
import {useJForm, useJFormField, UseJFormMessage} from "./hooks.ts";
|
|
14
|
+
|
|
15
|
+
export function JForm({children, className, variants, ...p}: JFormComponentProps & {
|
|
16
|
+
children: React.ReactNode, className?: string, variants?: any
|
|
17
|
+
})
|
|
18
|
+
{
|
|
19
|
+
const formRef = useRef<HTMLFormElement>(null);
|
|
20
|
+
const ref = useRef<JFormControllerImpl>(new JFormControllerImpl(p, formRef));
|
|
21
|
+
|
|
22
|
+
const onSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
|
|
23
|
+
e.preventDefault();
|
|
24
|
+
await ref.current.submit();
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
return <FormContext.Provider value={ref.current}>
|
|
28
|
+
<VariantContext.Provider value={variants}>
|
|
29
|
+
<form ref={formRef} className={className} onSubmit={onSubmit}>{children}</form>
|
|
30
|
+
</VariantContext.Provider>
|
|
31
|
+
</FormContext.Provider>
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function JFormStateListener({custom, ifSubmitted, ifNotSubmitted}: {
|
|
35
|
+
ifSubmitted?: React.ReactNode,
|
|
36
|
+
ifNotSubmitted?: React.ReactNode,
|
|
37
|
+
custom?: (form: JFormController) => React.ReactNode
|
|
38
|
+
}) {
|
|
39
|
+
const form = useJForm();
|
|
40
|
+
|
|
41
|
+
if (form.submitted || form.submitting) {
|
|
42
|
+
if (ifSubmitted) return ifSubmitted;
|
|
43
|
+
} else {
|
|
44
|
+
if (ifNotSubmitted) return ifNotSubmitted;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return custom?.(form);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function renderField(variantName: string|undefined, p: JFieldProps) {
|
|
51
|
+
const field = useJFormField(p.name);
|
|
52
|
+
if (!field) return <div style={{color: "red"}}><strong>Form error: the field '{p.name}' doesn't exist.</strong></div>;
|
|
53
|
+
|
|
54
|
+
p = {...p};
|
|
55
|
+
if (p.title===undefined) p.title = field.title;
|
|
56
|
+
if (p.description===undefined) p.description = field.description;
|
|
57
|
+
if (p.placeholder===undefined) p.placeholder = field.placeholder;
|
|
58
|
+
|
|
59
|
+
if (!variantName) {
|
|
60
|
+
variantName = field.variantName;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const V = useVariant(variantName, p.variant);
|
|
64
|
+
return <V {...p} field={field} />;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function JAutoFormField({variant, ...p}: JAutoFormFieldProps) {
|
|
68
|
+
return renderField(undefined, p);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
//region Form Types
|
|
72
|
+
|
|
73
|
+
export function JFormMessage(p: JFormMessageProps) {
|
|
74
|
+
const message = UseJFormMessage();
|
|
75
|
+
if (!message) return null;
|
|
76
|
+
|
|
77
|
+
const V = useVariant("FormMessage", p.variant);
|
|
78
|
+
return <V {...p} message={message} />;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function JTextFormField({variant, ...p}: JInputFormFieldProps) {
|
|
82
|
+
return renderField("TextFormField", p);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function JNumberFormField({variant, ...p}: JNumberFormFieldProps) {
|
|
86
|
+
return renderField("NumberFormField", p);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function JCheckboxFormField({variant, ...p}: JCheckboxFormFieldProps) {
|
|
90
|
+
return renderField("CheckboxFormField", p);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export function JFileSelectField({variant, ...p}: JFileSelectFieldProps) {
|
|
94
|
+
return renderField("FileSelectField", p);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
//endregion
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import React, {useContext, useEffect} from "react";
|
|
2
|
+
import type {JMessage, JFieldController, JFormController} from "./interfaces.ts";
|
|
3
|
+
import {FormContext, JFormControllerImpl} from "./private.ts";
|
|
4
|
+
|
|
5
|
+
export function useJForm(): JFormController {
|
|
6
|
+
const theForm = useContext(FormContext) as JFormControllerImpl;
|
|
7
|
+
if (!theForm) throw new Error("useJForm must be used within a JForm component.");
|
|
8
|
+
|
|
9
|
+
const [_, setCounter] = React.useState(0);
|
|
10
|
+
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
function eventHandler() {
|
|
13
|
+
// Here use prevCount to always have the update counter value.
|
|
14
|
+
setCounter(prevCount => prevCount+1);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
theForm.addStateChangeListener(eventHandler);
|
|
18
|
+
return () => { theForm.removeStateChangeListener(eventHandler) };
|
|
19
|
+
}, []);
|
|
20
|
+
|
|
21
|
+
return theForm;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function UseJFormMessage(): JMessage|undefined {
|
|
25
|
+
let form = useJForm();
|
|
26
|
+
return form.formMessage
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function useJFormField(name: string): JFieldController {
|
|
30
|
+
const [_, setCounter] = React.useState(0);
|
|
31
|
+
const form = useJForm() as JFormControllerImpl;
|
|
32
|
+
|
|
33
|
+
let thisField = form.getField(name);
|
|
34
|
+
if (!thisField) return undefined as unknown as JFieldController;
|
|
35
|
+
|
|
36
|
+
thisField.onStateChange = () => { setCounter(prev => prev + 1) };
|
|
37
|
+
return thisField;
|
|
38
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import type {UiText} from "../helpers/tools";
|
|
2
|
+
import {type Schema, type ValidationErrors} from "jopi-toolkit/jk_schema";
|
|
3
|
+
import React from "react";
|
|
4
|
+
|
|
5
|
+
//region Core
|
|
6
|
+
|
|
7
|
+
export type SubmitFunction = (params: { data: any, form: JFormController, hasFiles: boolean })
|
|
8
|
+
=> Promise<JMessage|undefined|void> | JMessage | undefined | void;
|
|
9
|
+
|
|
10
|
+
export interface JFormComponentProps {
|
|
11
|
+
schema: Schema;
|
|
12
|
+
action?: string;
|
|
13
|
+
submit?: SubmitFunction
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface JFieldController {
|
|
17
|
+
form: JFormController;
|
|
18
|
+
variantName: string;
|
|
19
|
+
|
|
20
|
+
name: string;
|
|
21
|
+
type: string;
|
|
22
|
+
|
|
23
|
+
error: boolean;
|
|
24
|
+
errorMessage?: string;
|
|
25
|
+
|
|
26
|
+
title?: string;
|
|
27
|
+
description?: string;
|
|
28
|
+
placeholder?: string;
|
|
29
|
+
|
|
30
|
+
value: any;
|
|
31
|
+
oldValue: any;
|
|
32
|
+
onChange: (value: any) => void;
|
|
33
|
+
valueConverter: (value: any, isTyping: boolean) => any;
|
|
34
|
+
|
|
35
|
+
//region Type String
|
|
36
|
+
|
|
37
|
+
minLength?: number;
|
|
38
|
+
errorMessage_minLength?: string;
|
|
39
|
+
|
|
40
|
+
maxLength?: number;
|
|
41
|
+
errorMessage_maxLength?: string;
|
|
42
|
+
|
|
43
|
+
//endregion
|
|
44
|
+
|
|
45
|
+
//region Type Number
|
|
46
|
+
|
|
47
|
+
minValue?: number;
|
|
48
|
+
errorMessage_minValue?: string;
|
|
49
|
+
|
|
50
|
+
maxValue?: number;
|
|
51
|
+
errorMessage_maxValue?: string;
|
|
52
|
+
|
|
53
|
+
allowDecimal?: boolean;
|
|
54
|
+
roundMethod?: "round" | "floor" | "ceil";
|
|
55
|
+
errorMessage_dontAllowDecimal?: string;
|
|
56
|
+
|
|
57
|
+
incrStep?: number;
|
|
58
|
+
|
|
59
|
+
//endregion
|
|
60
|
+
|
|
61
|
+
//region Type File
|
|
62
|
+
|
|
63
|
+
maxFileCount?: number;
|
|
64
|
+
errorMessage_maxFileCount?: string;
|
|
65
|
+
|
|
66
|
+
acceptFileType?: string;
|
|
67
|
+
errorMessage_invalidFileType?: string;
|
|
68
|
+
|
|
69
|
+
maxFileSize?: number;
|
|
70
|
+
errorMessage_maxFileSize?: string;
|
|
71
|
+
|
|
72
|
+
//endregion
|
|
73
|
+
|
|
74
|
+
//region Type Boolean
|
|
75
|
+
|
|
76
|
+
requireTrue?: boolean;
|
|
77
|
+
errorMessage_requireTrue?: string;
|
|
78
|
+
|
|
79
|
+
requireFalse?: boolean;
|
|
80
|
+
errorMessage_requireFalse?: string;
|
|
81
|
+
|
|
82
|
+
//endregion
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export interface JFormController {
|
|
86
|
+
error: boolean;
|
|
87
|
+
submitting: boolean;
|
|
88
|
+
submitted: boolean;
|
|
89
|
+
formMessage?: JMessage;
|
|
90
|
+
|
|
91
|
+
getData<T = any>(): T;
|
|
92
|
+
getFormData(): FormData;
|
|
93
|
+
getSubmitUrl(): string;
|
|
94
|
+
|
|
95
|
+
sendFormData(url?: string): Promise<JMessage>;
|
|
96
|
+
sendJsonData(url?: string): Promise<JMessage>;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface JMessage {
|
|
100
|
+
isOk: boolean;
|
|
101
|
+
isSubmitted: boolean;
|
|
102
|
+
|
|
103
|
+
message?: string;
|
|
104
|
+
code?: string;
|
|
105
|
+
|
|
106
|
+
fieldErrors?: ValidationErrors;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
//endregion
|
|
110
|
+
|
|
111
|
+
//region By type
|
|
112
|
+
|
|
113
|
+
export interface JFieldProps {
|
|
114
|
+
name: string;
|
|
115
|
+
title?: UiText;
|
|
116
|
+
description?: UiText;
|
|
117
|
+
placeholder?: string;
|
|
118
|
+
|
|
119
|
+
variant?: React.FC<unknown>;
|
|
120
|
+
|
|
121
|
+
id?: string;
|
|
122
|
+
className?: string;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export interface JFormMessageProps {
|
|
126
|
+
id?: string;
|
|
127
|
+
className?: string;
|
|
128
|
+
variant?: React.FC<unknown>;
|
|
129
|
+
isBefore?: boolean;
|
|
130
|
+
message?: JMessage;
|
|
131
|
+
|
|
132
|
+
errorMessage?: UiText;
|
|
133
|
+
|
|
134
|
+
// false: allows hiding the submitted message.
|
|
135
|
+
submittedMessage?: UiText|false;
|
|
136
|
+
|
|
137
|
+
// false: allows hiding the message if field errors.
|
|
138
|
+
fieldErrorMessage?: UiText|false;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export interface JInputFormFieldProps extends JFieldProps {
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export interface JCheckboxFormFieldProps extends JFieldProps {
|
|
145
|
+
defaultChecked?: boolean;
|
|
146
|
+
}
|
|
147
|
+
export interface JFileSelectFieldProps extends JFieldProps {
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export interface JNumberFormFieldProps extends JFieldProps {
|
|
151
|
+
minValue?: number;
|
|
152
|
+
maxValue?: number;
|
|
153
|
+
incrStep?: number;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export interface JAutoFormFieldProps extends JInputFormFieldProps, JCheckboxFormFieldProps, JNumberFormFieldProps {
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
//endregion
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import * as jk_schema from "jopi-toolkit/jk_schema";
|
|
3
|
+
import type {
|
|
4
|
+
JMessage,
|
|
5
|
+
JFieldController,
|
|
6
|
+
JFormComponentProps,
|
|
7
|
+
JFormController,
|
|
8
|
+
SubmitFunction
|
|
9
|
+
} from "./interfaces.ts";
|
|
10
|
+
import type {ValidationErrors} from "jopi-toolkit/jk_schema";
|
|
11
|
+
import {sendFormData, sendJsonData} from "../helpers/tools.ts";
|
|
12
|
+
|
|
13
|
+
type Listener = () => void;
|
|
14
|
+
|
|
15
|
+
export const FormContext = React.createContext<JFormController>(undefined as unknown as JFormController);
|
|
16
|
+
|
|
17
|
+
interface JFieldController_Private extends JFieldController {
|
|
18
|
+
onStateChange?: () => void;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export class JFormControllerImpl implements JFormController {
|
|
22
|
+
private readonly fields: Record<string, JFieldController_Private> = {};
|
|
23
|
+
private readonly jsonSchema: jk_schema.SchemaDescriptor;
|
|
24
|
+
private readonly onStateChange: Listener[] = [];
|
|
25
|
+
private readonly submitHandler?: SubmitFunction;
|
|
26
|
+
private autoRevalidate = false;
|
|
27
|
+
private hasFiles = false;
|
|
28
|
+
|
|
29
|
+
error = false;
|
|
30
|
+
submitting = false;
|
|
31
|
+
submitted = false;
|
|
32
|
+
formMessage?: JMessage;
|
|
33
|
+
|
|
34
|
+
constructor(private props: JFormComponentProps, private readonly formRef: React.RefObject<HTMLFormElement|null>) {
|
|
35
|
+
this.jsonSchema = jk_schema.toJson(this.props.schema).desc;
|
|
36
|
+
this.submitHandler = props.submit;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
getData<T = any>(): T {
|
|
40
|
+
let data: any = {};
|
|
41
|
+
|
|
42
|
+
for (let name in this.fields) {
|
|
43
|
+
let field = this.fields[name];
|
|
44
|
+
data[name] = field.valueConverter(field.value, false);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return data as T;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
getFormData(): FormData {
|
|
51
|
+
let form = this.formRef.current!;
|
|
52
|
+
let formData = new FormData(form);
|
|
53
|
+
|
|
54
|
+
let data = this.getData();
|
|
55
|
+
|
|
56
|
+
// Values can have been updated by a normalization step.
|
|
57
|
+
// It's why we inject back the values.
|
|
58
|
+
//
|
|
59
|
+
for (let name in this.fields) {
|
|
60
|
+
let field = this.fields[name];
|
|
61
|
+
let value = data[name];
|
|
62
|
+
|
|
63
|
+
// Special case for files.
|
|
64
|
+
//
|
|
65
|
+
if (field.type === "file") {
|
|
66
|
+
if (field.value instanceof File) {
|
|
67
|
+
formData.set(name, field.value);
|
|
68
|
+
} else if (field.value instanceof Array) {
|
|
69
|
+
// Remove the current value.
|
|
70
|
+
formData.delete(name);
|
|
71
|
+
|
|
72
|
+
// Add each one file of the array.
|
|
73
|
+
for (let i = 0; i < field.value.length; i++) {
|
|
74
|
+
formData.append(name, field.value[i]);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
} else {
|
|
78
|
+
if (value !== undefined && value !== null) {
|
|
79
|
+
formData.set(name, String(value));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return formData;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
getSubmitUrl(): string {
|
|
88
|
+
return this.props.action || window.location.href
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async sendJsonData(url?: string): Promise<JMessage> {
|
|
92
|
+
if (!url) url = this.getSubmitUrl();
|
|
93
|
+
return this.processSendToServerResponse(await sendJsonData(url, this.getData()));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async sendFormData(url?: string): Promise<JMessage> {
|
|
97
|
+
if (!url) url = this.getSubmitUrl();
|
|
98
|
+
return this.processSendToServerResponse(await sendFormData(url, this.getFormData()));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
private processSendToServerResponse(response: Response): JMessage {
|
|
102
|
+
if (response.status === 200) {
|
|
103
|
+
return {isOk: true, isSubmitted: true};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return {
|
|
107
|
+
isOk: false,
|
|
108
|
+
isSubmitted: false,
|
|
109
|
+
message: response.status===500
|
|
110
|
+
? "An error occurred with the server. Please try again later."
|
|
111
|
+
: "Invalid form content.",
|
|
112
|
+
|
|
113
|
+
code: response.status === 500
|
|
114
|
+
? "SERVER_ERROR_500"
|
|
115
|
+
: "SERVER_INVALID_DATA"
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
private setFormMessage(message: JMessage): JMessage {
|
|
120
|
+
this.formMessage = message;
|
|
121
|
+
|
|
122
|
+
if (!message.message && message.fieldErrors && message.fieldErrors.globalError) {
|
|
123
|
+
message.message = message.fieldErrors.globalError;
|
|
124
|
+
message.code = "GLOBAL_ERROR";
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (message.isSubmitted) {
|
|
128
|
+
this.declareState_Submitted();
|
|
129
|
+
} else {
|
|
130
|
+
if (message.isOk) {
|
|
131
|
+
this.declareState_Reset();
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
this.submitted = false;
|
|
135
|
+
this.submitting = false;
|
|
136
|
+
this.declareState_Error()
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return message;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
async submit(): Promise<JMessage|undefined> {
|
|
144
|
+
this.autoRevalidate = true;
|
|
145
|
+
let data = this.getData();
|
|
146
|
+
let fieldErrors = this.validateAux(data);
|
|
147
|
+
|
|
148
|
+
if (fieldErrors) {
|
|
149
|
+
return this.setFormMessage({isOk: false, isSubmitted: false, fieldErrors});
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
this.autoRevalidate = false;
|
|
153
|
+
|
|
154
|
+
let submitHandler = this.submitHandler;
|
|
155
|
+
if (!submitHandler) submitHandler = () => this.sendFormData()
|
|
156
|
+
|
|
157
|
+
this.declareState_Submitting();
|
|
158
|
+
|
|
159
|
+
try {
|
|
160
|
+
let r = submitHandler({data, form: this, hasFiles: this.hasFiles});
|
|
161
|
+
|
|
162
|
+
if (r instanceof Promise) r = await r;
|
|
163
|
+
if (r) return this.setFormMessage(r);
|
|
164
|
+
} catch (e) {
|
|
165
|
+
console.error("Error when submitting form:", e);
|
|
166
|
+
|
|
167
|
+
return this.setFormMessage({
|
|
168
|
+
isOk: false,
|
|
169
|
+
isSubmitted: false,
|
|
170
|
+
message: "An error occurred when submitting form",
|
|
171
|
+
code: "UNKNOWN_SUBMIT_ERROR"
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return this.setFormMessage({isOk: true, isSubmitted: true});
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
validate(): ValidationErrors | undefined {
|
|
179
|
+
let errors = this.validateAux(this.getData());
|
|
180
|
+
|
|
181
|
+
if (errors) {
|
|
182
|
+
this.setFormMessage({isOk: false, isSubmitted: false, fieldErrors: errors});
|
|
183
|
+
} else {
|
|
184
|
+
this.declareState_Reset();
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return errors;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
private validateAux(data: any): ValidationErrors | undefined {
|
|
191
|
+
for (let field of Object.values(this.fields)) {
|
|
192
|
+
field.error = false;
|
|
193
|
+
field.errorMessage = undefined;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const errors = jk_schema.validateSchema(data, this.props.schema);
|
|
197
|
+
|
|
198
|
+
if (errors) {
|
|
199
|
+
if (errors.fields) {
|
|
200
|
+
for (let fieldError of Object.values(errors.fields)) {
|
|
201
|
+
let fieldRef = this.getField(fieldError.fieldName);
|
|
202
|
+
|
|
203
|
+
if (fieldRef) {
|
|
204
|
+
fieldRef.error = true;
|
|
205
|
+
fieldRef.errorMessage = fieldError.message;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
for (let field of Object.values(this.fields)) {
|
|
212
|
+
field.onStateChange?.();
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return errors;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
getField(name: string): JFieldController_Private|undefined {
|
|
219
|
+
let field: JFieldController_Private = this.fields[name];
|
|
220
|
+
if (field) return field;
|
|
221
|
+
|
|
222
|
+
const fieldDef = this.jsonSchema[name];
|
|
223
|
+
if (!fieldDef) return undefined;
|
|
224
|
+
|
|
225
|
+
const form = this;
|
|
226
|
+
const valueConverter = selectValueConverter(fieldDef.type);
|
|
227
|
+
|
|
228
|
+
if (fieldDef.type==="file") {
|
|
229
|
+
this.hasFiles = true;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
this.fields[name] = field = {
|
|
233
|
+
form: this,
|
|
234
|
+
variantName: getVariantName(fieldDef.type),
|
|
235
|
+
|
|
236
|
+
name: name,
|
|
237
|
+
error: false,
|
|
238
|
+
|
|
239
|
+
valueConverter,
|
|
240
|
+
value: fieldDef && fieldDef.default ? fieldDef.default : calcDefault(fieldDef),
|
|
241
|
+
|
|
242
|
+
oldValue: undefined,
|
|
243
|
+
|
|
244
|
+
onChange: (value: any) => {
|
|
245
|
+
if (value!==undefined) value = valueConverter(value, true);
|
|
246
|
+
if (value===field.value) return;
|
|
247
|
+
|
|
248
|
+
field.oldValue = field.value;
|
|
249
|
+
field.value = value;
|
|
250
|
+
|
|
251
|
+
if (form.autoRevalidate) form.validate();
|
|
252
|
+
else if (field.onStateChange) field.onStateChange();
|
|
253
|
+
},
|
|
254
|
+
|
|
255
|
+
...fieldDef
|
|
256
|
+
} as JFieldController_Private;
|
|
257
|
+
|
|
258
|
+
return field;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
private declareState_Submitting() {
|
|
262
|
+
this.submitting = true;
|
|
263
|
+
this.submitted = false;
|
|
264
|
+
this.error = false;
|
|
265
|
+
|
|
266
|
+
this.onStateChange.forEach(l => l());
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
private declareState_Submitted() {
|
|
270
|
+
this.submitting = false;
|
|
271
|
+
this.submitted = true;
|
|
272
|
+
this.error = false;
|
|
273
|
+
|
|
274
|
+
this.onStateChange.forEach(l => l());
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
private declareState_Error(isError = true) {
|
|
278
|
+
// Here we must keep the submitted state.
|
|
279
|
+
this.error = isError;
|
|
280
|
+
|
|
281
|
+
if (!isError) {
|
|
282
|
+
if (this.formMessage && !this.formMessage.isOk) {
|
|
283
|
+
this.formMessage = undefined;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
this.onStateChange.forEach(l => l());
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
private declareState_Reset() {
|
|
291
|
+
this.submitting = false;
|
|
292
|
+
this.submitted = false;
|
|
293
|
+
this.declareState_Error(false);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
addStateChangeListener(l: () => void) {
|
|
297
|
+
if (!this.onStateChange.includes(l)) {
|
|
298
|
+
this.onStateChange.push(l);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
removeStateChangeListener(l: () => void) {
|
|
303
|
+
let idx = this.onStateChange.indexOf(l);
|
|
304
|
+
if (idx!==-1) this.onStateChange.splice(idx, 1);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function calcDefault(fieldDef: jk_schema.SchemaFieldInfos|undefined): any {
|
|
309
|
+
if (!fieldDef) return undefined;
|
|
310
|
+
|
|
311
|
+
if (fieldDef.type === "string") return "";
|
|
312
|
+
if (fieldDef.type === "number") return undefined;
|
|
313
|
+
if (fieldDef.type === "boolean") return false;
|
|
314
|
+
if (fieldDef.type === "object") return {};
|
|
315
|
+
if (fieldDef.type === "array") return [];
|
|
316
|
+
return undefined;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
function getVariantName(fieldType: string): string {
|
|
320
|
+
switch (fieldType) {
|
|
321
|
+
case "string": return "TextFormField";
|
|
322
|
+
case "number": return "NumberFormField";
|
|
323
|
+
case "boolean": return "CheckboxFormField";
|
|
324
|
+
case "file": return "FileSelectField";
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
return "TextFormField";
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
function selectValueConverter(fieldType: string): ((v: any, isTyping: boolean) => any) {
|
|
331
|
+
switch (fieldType) {
|
|
332
|
+
case "string": return (v: any) => {
|
|
333
|
+
return String(v);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
case "number": return (v: any, isTyping: boolean) => {
|
|
337
|
+
if (!isTyping) {
|
|
338
|
+
if (v===undefined) return undefined;
|
|
339
|
+
v = String(v).trim().replaceAll(",", ".");
|
|
340
|
+
if (v === "") return undefined;
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
v = String(v).trim().replaceAll(",", ".");
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
let asNumber = Number(v);
|
|
347
|
+
|
|
348
|
+
// Must avoid blocking if doing something like "+5,3"
|
|
349
|
+
|
|
350
|
+
// Let it return a string.
|
|
351
|
+
// Will send an error of the type "number is required".
|
|
352
|
+
//
|
|
353
|
+
if (isNaN(asNumber)) return v;
|
|
354
|
+
|
|
355
|
+
if (v==="") return undefined;
|
|
356
|
+
return asNumber;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
case "boolean": return (v: any) => {
|
|
360
|
+
return Boolean(v);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
return (v: any) => v;
|
|
365
|
+
}
|