Update ODLUX 20/126920/1
authorAijana Schumann <aijana.schumann@highstreet-technologies.com>
Tue, 1 Feb 2022 12:18:42 +0000 (13:18 +0100)
committerAijana Schumann <aijana.schumann@highstreet-technologies.com>
Tue, 1 Feb 2022 12:18:42 +0000 (13:18 +0100)
Updated to Material-ui 5, updated dashboard view, removed NetworkMap, LinkCalculator and LineOfSightApp, small bugfixes

Issue-ID: CCSDK-3580
Signed-off-by: Aijana Schumann <aijana.schumann@highstreet-technologies.com>
Change-Id: Id0fc148673e23a755cafc2be1c489248c38ff47c

241 files changed:
sdnr/wt/odlux/apps/apiDemo/package.json
sdnr/wt/odlux/apps/apiDemo/pom.xml
sdnr/wt/odlux/apps/apiDemo/src/plugin.tsx
sdnr/wt/odlux/apps/apiDemo/webpack.config.js
sdnr/wt/odlux/apps/app-feature/pom.xml
sdnr/wt/odlux/apps/app-installer/pom.xml
sdnr/wt/odlux/apps/configurationApp/package.json
sdnr/wt/odlux/apps/configurationApp/src/actions/deviceActions.ts
sdnr/wt/odlux/apps/configurationApp/src/components/ifWhenTextInput.tsx
sdnr/wt/odlux/apps/configurationApp/src/components/uiElementBoolean.tsx
sdnr/wt/odlux/apps/configurationApp/src/components/uiElementLeafList.tsx
sdnr/wt/odlux/apps/configurationApp/src/components/uiElementNumber.tsx
sdnr/wt/odlux/apps/configurationApp/src/components/uiElementReference.tsx
sdnr/wt/odlux/apps/configurationApp/src/components/uiElementSelection.tsx
sdnr/wt/odlux/apps/configurationApp/src/components/uiElementString.tsx
sdnr/wt/odlux/apps/configurationApp/src/components/uiElementUnion.tsx
sdnr/wt/odlux/apps/configurationApp/src/pluginConfiguration.tsx
sdnr/wt/odlux/apps/configurationApp/src/services/yangService.ts
sdnr/wt/odlux/apps/configurationApp/src/views/configurationApplication.tsx
sdnr/wt/odlux/apps/configurationApp/webpack.config.js
sdnr/wt/odlux/apps/connectApp/package.json
sdnr/wt/odlux/apps/connectApp/src/actions/networkElementsActions.ts
sdnr/wt/odlux/apps/connectApp/src/components/connectionStatusLog.tsx
sdnr/wt/odlux/apps/connectApp/src/components/dashboardHome.tsx [new file with mode: 0644]
sdnr/wt/odlux/apps/connectApp/src/components/editNetworkElementDialog.tsx
sdnr/wt/odlux/apps/connectApp/src/components/infoNetworkElementDialog.tsx
sdnr/wt/odlux/apps/connectApp/src/components/networkElements.tsx
sdnr/wt/odlux/apps/connectApp/src/components/refreshConnectionStatusLogDialog.tsx
sdnr/wt/odlux/apps/connectApp/src/components/refreshNetworkElementsDialog.tsx
sdnr/wt/odlux/apps/connectApp/src/pluginConnect.tsx
sdnr/wt/odlux/apps/connectApp/src/views/connectView.tsx
sdnr/wt/odlux/apps/connectApp/src2/main/resources/OSGI-INF/blueprint/blueprint.xml
sdnr/wt/odlux/apps/connectApp/webpack.config.js
sdnr/wt/odlux/apps/demoApp/package.json
sdnr/wt/odlux/apps/demoApp/src/components/counter.tsx
sdnr/wt/odlux/apps/demoApp/src/views/authorsList.tsx
sdnr/wt/odlux/apps/demoApp/webpack.config.js
sdnr/wt/odlux/apps/eventLogApp/package.json
sdnr/wt/odlux/apps/eventLogApp/src/components/refreshEventLogDialog.tsx
sdnr/wt/odlux/apps/eventLogApp/src/views/eventLog.tsx
sdnr/wt/odlux/apps/eventLogApp/webpack.config.js
sdnr/wt/odlux/apps/faultApp/package.json
sdnr/wt/odlux/apps/faultApp/src/components/clearStuckAlarmsDialog.tsx
sdnr/wt/odlux/apps/faultApp/src/components/faultStatus.tsx
sdnr/wt/odlux/apps/faultApp/src/components/refreshAlarmLogDialog.tsx
sdnr/wt/odlux/apps/faultApp/src/components/refreshCurrentProblemsDialog.tsx
sdnr/wt/odlux/apps/faultApp/src/views/faultApplication.tsx
sdnr/wt/odlux/apps/faultApp/webpack.config.js
sdnr/wt/odlux/apps/helpApp/package.json
sdnr/wt/odlux/apps/helpApp/src/components/helpStatus.tsx
sdnr/wt/odlux/apps/helpApp/src/components/tocEntry.tsx
sdnr/wt/odlux/apps/helpApp/src/views/helpTocApp.tsx
sdnr/wt/odlux/apps/helpApp/webpack.config.js
sdnr/wt/odlux/apps/inventoryApp/package.json
sdnr/wt/odlux/apps/inventoryApp/src/components/refreshInventoryDialog.tsx
sdnr/wt/odlux/apps/inventoryApp/src/views/dashboard.tsx
sdnr/wt/odlux/apps/inventoryApp/src/views/detail.tsx
sdnr/wt/odlux/apps/inventoryApp/src/views/treeview.tsx
sdnr/wt/odlux/apps/inventoryApp/webpack.config.js
sdnr/wt/odlux/apps/lineOfSightApp/.babelrc [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/package.json [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/pom.xml [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/actions/commonActions.ts [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/actions/mapActions.ts [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/components/ConnectionErrorPoup.tsx [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/components/heightChart.tsx [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/components/map.tsx [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/components/mapContextMenu.tsx [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/components/mapInfo.tsx [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/config.ts [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/handlers/mapHandler.ts [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/handlers/rootHandler.ts [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/hooks/d3.ts [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/index.html [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/model/GPSProfileResult.ts [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/model/Height.tsx [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/model/LatLon.ts [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/pluginLineOfSight.tsx [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/services/heightService.ts [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/styles/index.css [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/styles/mapbox-gl.css [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/utils/map.ts [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/utils/math.ts [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src/views/main.tsx [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src2/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/MyOdluxBundle.java [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src2/main/resources/OSGI-INF/blueprint/blueprint.xml [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/src2/test/resources/test.js [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/tsconfig.json [deleted file]
sdnr/wt/odlux/apps/lineOfSightApp/webpack.config.js [deleted file]
sdnr/wt/odlux/apps/linkCalculationApp/.babelrc [deleted file]
sdnr/wt/odlux/apps/linkCalculationApp/package.json [deleted file]
sdnr/wt/odlux/apps/linkCalculationApp/pom.xml [deleted file]
sdnr/wt/odlux/apps/linkCalculationApp/src/actions/commonLinkCalculationActions.ts [deleted file]
sdnr/wt/odlux/apps/linkCalculationApp/src/components/connectionInfo.tsx [deleted file]
sdnr/wt/odlux/apps/linkCalculationApp/src/handlers/linkCalculationAppRootHandler.ts [deleted file]
sdnr/wt/odlux/apps/linkCalculationApp/src/index.html [deleted file]
sdnr/wt/odlux/apps/linkCalculationApp/src/pluginLinkCalculation.tsx [deleted file]
sdnr/wt/odlux/apps/linkCalculationApp/src/views/Style.scss [deleted file]
sdnr/wt/odlux/apps/linkCalculationApp/src/views/linkCalculationComponent.tsx [deleted file]
sdnr/wt/odlux/apps/linkCalculationApp/src2/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/MyOdluxBundle.java [deleted file]
sdnr/wt/odlux/apps/linkCalculationApp/src2/main/resources/OSGI-INF/blueprint/blueprint.xml [deleted file]
sdnr/wt/odlux/apps/linkCalculationApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java [deleted file]
sdnr/wt/odlux/apps/linkCalculationApp/src2/test/resources/test.js [deleted file]
sdnr/wt/odlux/apps/linkCalculationApp/tsconfig.json [deleted file]
sdnr/wt/odlux/apps/linkCalculationApp/webpack.config.js [deleted file]
sdnr/wt/odlux/apps/maintenanceApp/package.json
sdnr/wt/odlux/apps/maintenanceApp/src/components/editMaintenenceEntryDialog.tsx
sdnr/wt/odlux/apps/maintenanceApp/src/components/refreshMaintenanceEntries.tsx
sdnr/wt/odlux/apps/maintenanceApp/src/views/maintenenceView.tsx
sdnr/wt/odlux/apps/maintenanceApp/webpack.config.js
sdnr/wt/odlux/apps/mediatorApp/package.json
sdnr/wt/odlux/apps/mediatorApp/src/components/editMediatorConfigDialog.tsx
sdnr/wt/odlux/apps/mediatorApp/src/components/editMediatorServerDialog.tsx
sdnr/wt/odlux/apps/mediatorApp/src/components/refreshMediatorDialog.tsx
sdnr/wt/odlux/apps/mediatorApp/src/components/showMeditaorInfoDialog.tsx
sdnr/wt/odlux/apps/mediatorApp/src/views/mediatorApplication.tsx
sdnr/wt/odlux/apps/mediatorApp/src/views/mediatorServerSelection.tsx
sdnr/wt/odlux/apps/mediatorApp/webpack.config.js
sdnr/wt/odlux/apps/minimumApp/package.json
sdnr/wt/odlux/apps/minimumApp/webpack.config.js
sdnr/wt/odlux/apps/networkMapApp/.babelrc [deleted file]
sdnr/wt/odlux/apps/networkMapApp/icons/README.md [deleted file]
sdnr/wt/odlux/apps/networkMapApp/icons/apartment.png [deleted file]
sdnr/wt/odlux/apps/networkMapApp/icons/apartment.png.d.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/icons/customize.png [deleted file]
sdnr/wt/odlux/apps/networkMapApp/icons/customize.png.d.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/icons/datacenter.png [deleted file]
sdnr/wt/odlux/apps/networkMapApp/icons/datacenter.png.d.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/icons/datacenterred.png [deleted file]
sdnr/wt/odlux/apps/networkMapApp/icons/datacenterred.png.d.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/icons/factory.png [deleted file]
sdnr/wt/odlux/apps/networkMapApp/icons/factory.png.d.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/icons/factoryred.png [deleted file]
sdnr/wt/odlux/apps/networkMapApp/icons/factoryred.png.d.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/icons/lamp.png [deleted file]
sdnr/wt/odlux/apps/networkMapApp/icons/lamp.png.d.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/icons/lampred.png [deleted file]
sdnr/wt/odlux/apps/networkMapApp/icons/lampred.png.d.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/package.json [deleted file]
sdnr/wt/odlux/apps/networkMapApp/pom.xml [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/App.tsx [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/actions/connectivityAction.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/actions/detailsAction.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/actions/mapActions.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/actions/popupActions.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/actions/searchAction.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/actions/settingsAction.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/components/customize/customizationView.tsx [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/components/customize/themeElement.tsx [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/components/denseTable.tsx [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/components/details/details.tsx [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/components/details/linkDetails.tsx [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/components/details/siteDetails.tsx [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/components/details/stadokDetailsPopup.tsx [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/components/map/connectionInfo.tsx [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/components/map/iconSwitch.tsx [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/components/map/map.tsx [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/components/map/mapPopup.tsx [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/components/map/searchBar.tsx [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/components/map/statistics.tsx [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/config.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/handlers/connectivityReducer.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/handlers/detailsReducer.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/handlers/mapReducer.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/handlers/popupReducer.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/handlers/rootReducer.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/handlers/searchReducer.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/handlers/settingsReducer.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/index.html [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/model/Feature.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/model/count.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/model/historyEntry.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/model/link.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/model/popupElements.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/model/settings.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/model/site.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/model/stadokOrder.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/model/stadokSite.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/pluginTransport.tsx [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/services/mapImagesService.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/services/settingsService.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/styles/index.css [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/styles/mapbox-gl.css [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/utils/mapLayers.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/utils/mapUtils.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src/utils/utils.ts [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src2/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/MyOdluxBundle.java [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src2/main/resources/OSGI-INF/blueprint/blueprint.xml [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java [deleted file]
sdnr/wt/odlux/apps/networkMapApp/src2/test/resources/test.js [deleted file]
sdnr/wt/odlux/apps/networkMapApp/tsconfig.json [deleted file]
sdnr/wt/odlux/apps/networkMapApp/webpack.config.js [deleted file]
sdnr/wt/odlux/apps/performanceHistoryApp/package.json
sdnr/wt/odlux/apps/performanceHistoryApp/src/actions/deviceListActions.ts
sdnr/wt/odlux/apps/performanceHistoryApp/src/components/chartFilter.tsx
sdnr/wt/odlux/apps/performanceHistoryApp/src/components/ltpSelection.tsx
sdnr/wt/odlux/apps/performanceHistoryApp/src/components/toggleContainer.tsx
sdnr/wt/odlux/apps/performanceHistoryApp/src/views/performanceHistoryApplication.tsx
sdnr/wt/odlux/apps/performanceHistoryApp/webpack.config.js
sdnr/wt/odlux/framework/package.json
sdnr/wt/odlux/framework/pom.xml
sdnr/wt/odlux/framework/src/actions/snackbarActions.ts
sdnr/wt/odlux/framework/src/app.tsx
sdnr/wt/odlux/framework/src/components/errorDisplay.tsx
sdnr/wt/odlux/framework/src/components/logo.tsx
sdnr/wt/odlux/framework/src/components/material-table/columnModel.ts
sdnr/wt/odlux/framework/src/components/material-table/index.tsx
sdnr/wt/odlux/framework/src/components/material-table/tableFilter.tsx
sdnr/wt/odlux/framework/src/components/material-table/tableHead.tsx
sdnr/wt/odlux/framework/src/components/material-table/tableToolbar.tsx
sdnr/wt/odlux/framework/src/components/material-ui/listItemLink.tsx
sdnr/wt/odlux/framework/src/components/material-ui/loader.tsx
sdnr/wt/odlux/framework/src/components/material-ui/panel.tsx
sdnr/wt/odlux/framework/src/components/material-ui/toggleButton.tsx
sdnr/wt/odlux/framework/src/components/material-ui/toggleButtonGroup.tsx
sdnr/wt/odlux/framework/src/components/material-ui/treeView.tsx
sdnr/wt/odlux/framework/src/components/navigationMenu.tsx
sdnr/wt/odlux/framework/src/components/objectDump/index.tsx
sdnr/wt/odlux/framework/src/components/routing/appFrame.tsx
sdnr/wt/odlux/framework/src/components/settings/general.tsx
sdnr/wt/odlux/framework/src/components/titleBar.tsx
sdnr/wt/odlux/framework/src/design/default.ts
sdnr/wt/odlux/framework/src/middleware/navigation.ts
sdnr/wt/odlux/framework/src/models/elasticSearch.ts
sdnr/wt/odlux/framework/src/services/restAccessorService.ts
sdnr/wt/odlux/framework/src/styles/att.ts
sdnr/wt/odlux/framework/src/views/about.tsx
sdnr/wt/odlux/framework/src/views/frame.tsx
sdnr/wt/odlux/framework/src/views/home.tsx
sdnr/wt/odlux/framework/src/views/login.tsx
sdnr/wt/odlux/framework/src/views/settings.tsx
sdnr/wt/odlux/framework/src/views/test.tsx
sdnr/wt/odlux/framework/webpack.config.js
sdnr/wt/odlux/framework/webpack.runner.js
sdnr/wt/odlux/framework/webpack.vendor.js
sdnr/wt/odlux/installer/pom.xml
sdnr/wt/odlux/odlux.properties
sdnr/wt/odlux/package.json
sdnr/wt/odlux/pom.xml
sdnr/wt/odlux/yarn.lock

index af47a02..f01a396 100644 (file)
   "author": "Matthias Fischer",
   "license": "Apache-2.0",
   "dependencies": {
+    "@emotion/react": "^11.7.0",
+    "@emotion/styled": "^11.6.0",
+    "@mui/icons-material": "^5.2.0",
+    "@mui/material": "^5.2.2",
+    "@mui/styles": "^5.2.2",
     "@odlux/framework": "*"
   },
   "peerDependencies": {
-    "@types/react": "17.0.3",
-    "@types/react-dom": "17.0.2",
-    "@types/react-router-dom": "5.1.7",
-    "@material-ui/core": "4.11.4",
-    "@material-ui/icons": "4.11.2",
     "@types/classnames": "2.2.6",
     "@types/flux": "3.1.8",
     "@types/jquery": "3.3.10",
+    "@types/react": "17.0.37",
+    "@types/react-dom": "17.0.11",
+    "@types/react-router-dom": "5.1.7",
     "jquery": "3.3.1",
-    "react": "17.0.1",
-    "react-dom": "17.0.1",
+    "react": "17.0.2",
+    "react-dom": "17.0.2",
     "react-router-dom": "5.2.0"
   }
-}
\ No newline at end of file
+}
index 7791757..f7ed19b 100644 (file)
   ~ ============LICENSE_END=======================================================
   ~
   -->
+
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <parent>
         <groupId>org.onap.ccsdk.parent</groupId>
         <artifactId>binding-parent</artifactId>
-        <version>2.3.2</version>
+        <version>2.2.4</version>
         <relativePath/>
     </parent>
 
index 6790ee9..076eb5c 100644 (file)
@@ -32,7 +32,7 @@ type AppProps = RouteComponentProps & Connect & { modules: Module[], requestModu
 
 const App = (props: AppProps ) => (
   <>
-    <button onClick={ props.requestModules }>Load Modules</button>
+    <button color="inherit" onClick={ props.requestModules }>Load Modules</button>
     <ul>{ props.modules.map((mod, ind) => (<li key={ ind }>{ mod.name }</li>)) }</ul>
   </>
 );
index 1c699e1..6564bef 100644 (file)
@@ -88,7 +88,7 @@ module.exports = (env) => {
         manifest: require(path.resolve(frameworkPath, "app-manifest.json")),
         sourceType: "umd2"
       }),
-      ...(env === "release") ? [
+      ...(env === "release" ? [
         new webpack.DefinePlugin({
           "process.env": {
             NODE_ENV: "'production'",
@@ -106,7 +106,7 @@ module.exports = (env) => {
             from: 'index.html',
             to: distPath
           }]),
-        ]
+        ])
     ],
 
     devServer: {
index 9a16144..ba308cd 100644 (file)
             <artifactId>sdnr-wt-odlux-app-configurationApp</artifactId>
             <version>${project.version}</version>
         </dependency>
-         <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>sdnr-wt-odlux-app-networkMapApp</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>sdnr-wt-odlux-app-linkCalculationApp</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>sdnr-wt-odlux-app-lineOfSightApp</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        
-        
     </dependencies>
 </project>
index ff4b4ff..c27f599 100755 (executable)
             <artifactId>sdnr-wt-odlux-app-configurationApp</artifactId>
             <version>${project.version}</version>
         </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>sdnr-wt-odlux-app-networkMapApp</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>sdnr-wt-odlux-app-linkCalculationApp</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>sdnr-wt-odlux-app-lineOfSightApp</artifactId>
-            <version>${project.version}</version>
-        </dependency>
 
     </dependencies>
 
index 8dd2d04..afd5456 100644 (file)
   "author": "Matthias Fischer",
   "license": "Apache-2.0",
   "dependencies": {
+    "@emotion/react": "^11.7.0",
+    "@emotion/styled": "^11.6.0",
+    "@mui/icons-material": "^5.2.0",
+    "@mui/material": "^5.2.2",
+    "@mui/styles": "^5.2.2",
     "@odlux/framework": "*"
   },
   "peerDependencies": {
-    "@types/react": "17.0.3",
-    "@types/react-dom": "17.0.2",
-    "@types/react-router-dom": "5.1.7",
-    "@material-ui/core": "4.11.4",
-    "@material-ui/icons": "4.11.2",
     "@types/classnames": "2.2.6",
     "@types/flux": "3.1.8",
     "@types/jquery": "3.3.10",
+    "@types/react": "17.0.37",
+    "@types/react-dom": "17.0.11",
+    "@types/react-router-dom": "5.1.7",
     "jquery": "3.3.1",
-    "react": "17.0.1",
-    "react-dom": "17.0.1",
+    "react": "17.0.2",
+    "react-dom": "17.0.2",
     "react-router-dom": "5.2.0"
   }
-}
\ No newline at end of file
+}
index ac8aa0a..0dd42e3 100644 (file)
@@ -1,3 +1,21 @@
+/**
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt odlux
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ */
+
 import { Action } from '../../../../framework/src/flux/action';
 import { Dispatch } from '../../../../framework/src/flux/store';
 import { IApplicationStoreState } from "../../../../framework/src/store/applicationStore";
@@ -9,7 +27,7 @@ import { restService } from "../services/restServices";
 import { YangParser } from "../yang/yangParser";
 import { Module } from "../models/yang";
 import { ViewSpecification, ViewElement, isViewElementReference, isViewElementList, isViewElementObjectOrList, isViewElementRpc, isViewElementChoise, ViewElementChoiseCase, ViewElementString } from "../models/uiModels";
-import { exception } from 'console';
+
 
 export class EnableValueSelector extends Action {
   constructor(public listSpecification: ViewSpecification, public listData: any[], public keyProperty: string, public onValueSelected : (value: any) => void ) {
@@ -570,7 +588,7 @@ export const updateDataActionAsyncCreator = (vPath: string, data: any) => async
     }
 
     if (isNew) {
-      return dispatch(new ReplaceAction(`/configuration/${nodeId}/${vPath.replace(/\[\]$/i, `[${isNew}]`)}`)) // navigate to new element
+      return dispatch(new ReplaceAction(`/configuration/${nodeId}/${vPath.replace(/\[\]$/i, `[${isNew}]`)}`)); // navigate to new element
     }
 
     // create display specification
index 56ec8df..8ce3106 100644 (file)
  */
 
 import { ViewElementBase } from "models/uiModels";
-import { TextField, InputAdornment, Input, Tooltip, Divider, IconButton, InputBase, Paper, makeStyles, Theme, createStyles, FormControl, InputLabel, FormHelperText } from "@material-ui/core";
+import {
+  TextField,
+  InputAdornment,
+  Input,
+  Tooltip,
+  Divider,
+  IconButton,
+  InputBase,
+  Paper,
+  Theme,
+  FormControl,
+  InputLabel,
+  FormHelperText,
+} from "@mui/material";
+import makeStyles from '@mui/styles/makeStyles';
+import createStyles from '@mui/styles/createStyles';
 import * as React from 'react';
 import { faAdjust } from "@fortawesome/free-solid-svg-icons";
 import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
-import { InputProps } from "@material-ui/core/Input";
+import { InputProps } from "@mui/material/Input";
 
 const useStyles = makeStyles((theme: Theme) =>
   createStyles({
@@ -54,7 +69,7 @@ export const IfWhenTextInput = (props: IfwhenProps) => {
 
   const ifFeature = element.ifFeature
     ? (
-        <Tooltip onMouseMove={e => props.onChangeTooltipVisuability(false)} onMouseOut={e => props.onChangeTooltipVisuability(true)} title={element.ifFeature}>
+        <Tooltip disableInteractive onMouseMove={e => props.onChangeTooltipVisuability(false)} onMouseOut={e => props.onChangeTooltipVisuability(true)} title={element.ifFeature}>
           <InputAdornment position="start">
             <FontAwesomeIcon icon={faAdjust} className={classes.iconDark} />
           </InputAdornment>
@@ -64,7 +79,7 @@ export const IfWhenTextInput = (props: IfwhenProps) => {
 
   const whenFeature = element.when
     ? (
-        <Tooltip className={classes.padding} onMouseMove={() => props.onChangeTooltipVisuability(false)} onMouseOut={() => props.onChangeTooltipVisuability(true)} title={element.when}>
+        <Tooltip disableInteractive className={classes.padding} onMouseMove={() => props.onChangeTooltipVisuability(false)} onMouseOut={() => props.onChangeTooltipVisuability(true)} title={element.when}>
           <InputAdornment className={classes.padding} position="end">
             <FontAwesomeIcon icon={faAdjust} className={classes.iconLight}/>
           </InputAdornment>
@@ -73,7 +88,7 @@ export const IfWhenTextInput = (props: IfwhenProps) => {
     : null;
 
   return (
-    <FormControl error={error} style={style}>
+    <FormControl variant="standard" error={error} style={style}>
       <InputLabel htmlFor={id} >{label}</InputLabel>
       <Input id={id} inputProps={{'aria-label': label+'-input'}} endAdornment={<div>{ifFeature}{whenFeature}</div>} {...otherProps}  />
       <FormHelperText>{errorText}</FormHelperText>
index 081ec46..81c9d6d 100644 (file)
@@ -17,7 +17,7 @@
  */
 
 import * as React from "react"
-import { MenuItem, FormHelperText, Select, FormControl, InputLabel } from "@material-ui/core";
+import { MenuItem, FormHelperText, Select, FormControl, InputLabel } from "@mui/material";
 
 import { ViewElementBoolean } from "../models/uiModels";
 import { BaseProps } from "./baseProps";
@@ -32,9 +32,9 @@ export const UiElementBoolean = (props: BooleanInputProps) => {
     const mandetoryError = element.mandatory && value !== 'true' && value !== 'false';
     
     return (!props.readOnly || element.id != null
-        ? (<FormControl style={{ width: 485, marginLeft: 20, marginRight: 20 }}>
+        ? (<FormControl variant="standard" style={{ width: 485, marginLeft: 20, marginRight: 20 }}>
             <InputLabel htmlFor={`select-${element.id}`} >{element.label}</InputLabel>
-            <Select
+            <Select variant="standard"
                 aria-label={element.label+'-selection'}
                 required={!!element.mandatory}
                 error={mandetoryError}
index c705b98..5937ed7 100644 (file)
  */
 
 import * as React from "react"
-import { FormControl, InputLabel, Paper, Chip, FormHelperText, Dialog, DialogTitle, DialogContentText, DialogActions, Button, DialogContent } from "@material-ui/core";
-import { makeStyles } from '@material-ui/core/styles';
-import AddIcon from '@material-ui/icons/Add';
+import { FormControl, InputLabel, Paper, Chip, FormHelperText, Dialog, DialogTitle, DialogContentText, DialogActions, Button, DialogContent } from "@mui/material";
+import makeStyles from '@mui/styles/makeStyles';
+import AddIcon from '@mui/icons-material/Add';
 
+import { Theme } from '@mui/material/styles';
 import { ViewElement } from "../models/uiModels";
 
 import { BaseProps } from "./baseProps";
@@ -29,8 +30,8 @@ type LeafListProps = BaseProps<any []> & {
   getEditorForViewElement:  (uiElement: ViewElement) => (null | React.ComponentType<BaseProps<any>>)  
 };
 
-const useStyles = makeStyles((theme) => {
-  const light = theme.palette.type === 'light';
+const useStyles = makeStyles((theme: Theme) => {
+  const light = theme.palette.mode === 'light';
   const bottomLineColor = light ? 'rgba(0, 0, 0, 0.42)' : 'rgba(255, 255, 255, 0.7)';
 
   return ({
@@ -64,10 +65,10 @@ const useStyles = makeStyles((theme) => {
           }),
           pointerEvents: 'none', // Transparent to the hover style.
         },
-        '&$focused:after': {
+        '&.Mui-focused:after': {
           transform: 'scaleX(1)',
         },
-        '&$error:after': {
+        '&.Mui-error:after': {
           borderBottomColor: theme.palette.error.main,
           transform: 'scaleX(1)', // error is always underlined in red
         },
@@ -91,7 +92,7 @@ const useStyles = makeStyles((theme) => {
             borderBottom: `1px solid ${bottomLineColor}`,
           },
         },
-        '&$disabled:before': {
+        '&.Mui-disabled:before': {
           borderBottomStyle: 'dotted',
         },
       },
@@ -144,7 +145,7 @@ export const UiElementLeafList = (props: LeafListProps) => {
 
   return (
     <>
-      <FormControl style={{ width: 485, marginLeft: 20, marginRight: 20 }}>
+      <FormControl variant="standard" style={{ width: 485, marginLeft: 20, marginRight: 20 }}>
         <InputLabel htmlFor={`list-${element.id}`} shrink={!props.readOnly || !!(inputValue && inputValue.length)} >{element.label}</InputLabel>
         <ul className={`${classes.root} ${classes.underline}`} id={`list-${element.id}`}>
         { !props.readOnly ? <li>
@@ -195,7 +196,7 @@ export const UiElementLeafList = (props: LeafListProps) => {
             /> || null }
           </DialogContent>
           <DialogActions>
-            <Button onClick={ handleClose }> Cancel </Button>
+            <Button color="inherit" onClick={ handleClose }> Cancel </Button>
             <Button disabled={editorValue == null || editorValue === "" } onClick={ onApplyButton } color="secondary"> {editorValueIndex < 0 ? "Add" : "Apply"} </Button>
           </DialogActions>
         </Dialog>
index ac4afc1..c481668 100644 (file)
@@ -17,7 +17,7 @@
  */
 
 import { ViewElementNumber } from "models/uiModels";
-import { Tooltip, InputAdornment } from "@material-ui/core";
+import { Tooltip, InputAdornment } from "@mui/material";
 import * as React from 'react';
 import { BaseProps } from "./baseProps";
 import { IfWhenTextInput } from "./ifWhenTextInput";
@@ -53,7 +53,7 @@ export const UiElementNumber = (props: numberInputProps) => {
   }
 
   return (
-    <Tooltip title={isTooltipVisible ? element.description || '' : ''}>
+    <Tooltip disableInteractive title={isTooltipVisible ? element.description || '' : ''}>
       <IfWhenTextInput element={element} onChangeTooltipVisuability={setTooltipVisibility}
         spellCheck={false} autoFocus margin="dense"
         id={element.id} label={element.label} type="text" value={props.inputValue}
index b7697c8..9e863f0 100644 (file)
  */
 
 import React, { useState } from 'react';
-import { Tooltip, Button, FormControl, Theme, createStyles, makeStyles } from '@material-ui/core';
+import { Tooltip, Button, FormControl, Theme } from '@mui/material';
+
+import createStyles from '@mui/styles/createStyles';
+import makeStyles from '@mui/styles/makeStyles';
 
 import { ViewElement } from '../models/uiModels';
 
@@ -38,8 +41,8 @@ export const UIElementReference: React.FC<UIElementReferenceProps> = (props) =>
   const [disabled, setDisabled] = useState(true);
   const { element } = props;
   return (
-    <FormControl key={element.id} style={{ width: 485, marginLeft: 20, marginRight: 20 }} onMouseDown={(ev) => { ev.preventDefault(); ev.stopPropagation(); ev.button === 1 && setDisabled(!disabled) }}>
-      <Tooltip title={element.description || element.path || ''}>
+    <FormControl variant="standard" key={element.id} style={{ width: 485, marginLeft: 20, marginRight: 20 }} onMouseDown={(ev) => { ev.preventDefault(); ev.stopPropagation(); ev.button === 1 && setDisabled(!disabled) }}>
+      <Tooltip disableInteractive title={element.description || element.path || ''}>
         <Button className={classes.button} aria-label={element.label+'-button'} color="secondary" disabled={props.disabled && disabled} onClick={() => {
           props.onOpenReference(element);
         }}  >{`${element.label}`}</Button>
index 530b0be..7ca9ae3 100644 (file)
@@ -19,7 +19,7 @@
 import * as React from 'react';
 import { BaseProps } from './baseProps';
 import { ViewElementSelection } from '../models/uiModels'
-import { FormControl, InputLabel, Select, FormHelperText, MenuItem, Tooltip } from '@material-ui/core';
+import { FormControl, InputLabel, Select, FormHelperText, MenuItem, Tooltip } from '@mui/material';
 
 type selectionProps = BaseProps;
 
@@ -34,9 +34,9 @@ export const UiElementSelection = (props: selectionProps) => {
     }
 
     return (props.readOnly || props.inputValue != null
-        ? (<FormControl style={{ width: 485, marginLeft: 20, marginRight: 20 }}>
+        ? (<FormControl variant="standard" style={{ width: 485, marginLeft: 20, marginRight: 20 }}>
             <InputLabel htmlFor={`select-${element.id}`} >{element.label}</InputLabel>
-            <Select
+            <Select variant="standard"
                 required={!!element.mandatory}
                 error={!!error}
                 onChange={(e) => { props.onChange(e.target.value as string) }}
@@ -50,7 +50,7 @@ export const UiElementSelection = (props: selectionProps) => {
                 }}
             >
           {element.options.map(option => (
-            <MenuItem key={option.key} value={option.key} aria-label={option.key}><Tooltip title={option.description || '' }><div style={{width:"100%"}}>{option.key}</div></Tooltip></MenuItem>
+            <MenuItem key={option.key} value={option.key} aria-label={option.key}><Tooltip disableInteractive title={option.description || '' }><div style={{width:"100%"}}>{option.key}</div></Tooltip></MenuItem>
           ))}
             </Select>
             <FormHelperText>{error}</FormHelperText>
index f87b94f..4908c41 100644 (file)
@@ -17,7 +17,7 @@
  */
 
 import * as React from "react"
-import { Tooltip, TextField } from "@material-ui/core";
+import { Tooltip, TextField } from "@mui/material";
 import { ViewElementString } from "../models/uiModels";
 import { BaseProps } from "./baseProps";
 import { IfWhenTextInput } from "./ifWhenTextInput";
@@ -68,7 +68,7 @@ export const UiElementString = (props: stringEntryProps) => {
     }
 
     return (
-        <Tooltip title={isTooltipVisible ? element.description || '' : ''}>
+        <Tooltip disableInteractive title={isTooltipVisible ? element.description || '' : ''}>
             <IfWhenTextInput element={element} onChangeTooltipVisuability={setTooltipVisibility}
                 spellCheck={false} autoFocus margin="dense"
                 id={element.id} label={props?.isKey ? "🔑 " + element.label : element.label} type="text" value={props.inputValue}
index 669e393..67cd998 100644 (file)
@@ -18,7 +18,7 @@
 
 import * as React from 'react'
 import { BaseProps } from './baseProps';
-import { Tooltip } from '@material-ui/core';
+import { Tooltip } from '@mui/material';
 import { IfWhenTextInput } from './ifWhenTextInput';
 import { ViewElementUnion, isViewElementString, isViewElementNumber, isViewElementObject, ViewElementNumber } from '../models/uiModels';
 import { checkRange, checkPattern } from './verifyer';
@@ -76,7 +76,7 @@ export const UIElementUnion = (props: UiElementUnionProps) => {
     }
   };
 
-  return <Tooltip title={isTooltipVisible ? element.description || '' : ''}>
+  return <Tooltip disableInteractive title={isTooltipVisible ? element.description || '' : ''}>
     <IfWhenTextInput element={element} onChangeTooltipVisuability={setTooltipVisibility}
       spellCheck={false} autoFocus margin="dense"
       id={element.id} label={props.isKey ? "🔑 " + element.label : element.label} type="text" value={props.inputValue}
index 3b9baa6..e378791 100644 (file)
@@ -63,7 +63,7 @@ const ConfigurationApplicationRouteAdapter = connect(undefined, mapDisp)((props:
           currentNodeId = currentNodeId.replace(/\|dump$/i, '');
         }
         currentVirtualPath = null;
-        currentNodeId && await props.updateNodeId(currentNodeId);
+        currentNodeId && (await props.updateNodeId(currentNodeId));
       }
 
       if (currentVirtualPath !== props.match.params[0]) {
index 3dc3a86..cf4677b 100644 (file)
@@ -31,7 +31,7 @@ class YangService {
     if (cacheHit) return cacheHit;
 
     const res = await fetch(url);
-    const yangFile = res.ok && await res.text();
+    const yangFile = res.ok && (await res.text());
     if (yangFile !== false && yangFile !== null) {
       cache[url] = yangFile;
     }
index b777cdb..2879899 100644 (file)
 import React, { useState } from 'react';
 import { RouteComponentProps, withRouter } from 'react-router-dom';
 
-import { WithStyles, withStyles, createStyles, Theme } from '@material-ui/core/styles';
+import { Theme } from '@mui/material/styles';
+
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
 
 import connect, { IDispatcher, Connect } from "../../../../framework/src/flux/connect";
 import { IApplicationStoreState } from "../../../../framework/src/store/applicationStore";
@@ -33,28 +37,28 @@ import { ViewSpecification, isViewElementString, isViewElementNumber, isViewElem
 
 import { getAccessPolicyByUrl } from "../../../../framework/src/services/restService";
 
-import Fab from '@material-ui/core/Fab';
-import AddIcon from '@material-ui/icons/Add';
-import PostAdd from '@material-ui/icons/PostAdd';
-import ArrowBack from '@material-ui/icons/ArrowBack';
-import RemoveIcon from '@material-ui/icons/RemoveCircleOutline';
-import SaveIcon from '@material-ui/icons/Save';
-import EditIcon from '@material-ui/icons/Edit';
-import Tooltip from "@material-ui/core/Tooltip";
-import FormControl from "@material-ui/core/FormControl";
-import IconButton from "@material-ui/core/IconButton";
-
-import InputLabel from "@material-ui/core/InputLabel";
-import Select from "@material-ui/core/Select";
-import MenuItem from "@material-ui/core/MenuItem";
-import Breadcrumbs from "@material-ui/core/Breadcrumbs";
-import Button from '@material-ui/core/Button';
-import Link from "@material-ui/core/Link";
-import Accordion from '@material-ui/core/Accordion';
-import AccordionSummary from '@material-ui/core/AccordionSummary';
-import AccordionDetails from '@material-ui/core/AccordionDetails';
-import Typography from '@material-ui/core/Typography';
-import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
+import Fab from '@mui/material/Fab';
+import AddIcon from '@mui/icons-material/Add';
+import PostAdd from '@mui/icons-material/PostAdd';
+import ArrowBack from '@mui/icons-material/ArrowBack';
+import RemoveIcon from '@mui/icons-material/RemoveCircleOutline';
+import SaveIcon from '@mui/icons-material/Save';
+import EditIcon from '@mui/icons-material/Edit';
+import Tooltip from "@mui/material/Tooltip";
+import FormControl from "@mui/material/FormControl";
+import IconButton from "@mui/material/IconButton";
+
+import InputLabel from "@mui/material/InputLabel";
+import Select from "@mui/material/Select";
+import MenuItem from "@mui/material/MenuItem";
+import Breadcrumbs from "@mui/material/Breadcrumbs";
+import Button from '@mui/material/Button';
+import Link from "@mui/material/Link";
+import Accordion from '@mui/material/Accordion';
+import AccordionSummary from '@mui/material/AccordionSummary';
+import AccordionDetails from '@mui/material/AccordionDetails';
+import Typography from '@mui/material/Typography';
+import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
 
 
 import { BaseProps } from '../components/baseProps';
@@ -425,9 +429,9 @@ class ConfigurationApplicationComponent extends React.Component<ConfigurationApp
       const subElements = currentCase?.elements;
       return (
         <>
-          <FormControl key={uiElement.id} style={{ width: 485, marginLeft: 20, marginRight: 20 }}>
+          <FormControl variant="standard" key={uiElement.id} style={{ width: 485, marginLeft: 20, marginRight: 20 }}>
             <InputLabel htmlFor={`select-${uiElement.id}`} >{uiElement.label}</InputLabel>
-            <Select
+            <Select variant="standard"
               aria-label={uiElement.label + '-selection'}
               required={!!uiElement.mandatory}
               onChange={(e) => {
@@ -615,15 +619,19 @@ class ConfigurationApplicationComponent extends React.Component<ConfigurationApp
       const confirm = useConfirm();
 
       return (
-        <Tooltip title={"Remove"} >
-          <IconButton disabled={props.disabled} className={classes.button} aria-label="remove-element-button"
+        <Tooltip disableInteractive title={"Remove"} >
+          <IconButton
+            disabled={props.disabled}
+            className={classes.button}
+            aria-label="remove-element-button"
             onClick={async (e) => {
               e.stopPropagation();
               e.preventDefault();
-              confirm({ title: "Do you really want to delete this element ?", description: "This action is permanent!", confirmationButtonProps: { color: "secondary" } })
+              confirm({ title: "Do you really want to delete this element ?", description: "This action is permanent!", confirmationButtonProps: { color: "secondary" }, cancellationButtonProps: { color:"inherit" } })
                 .then(() => removeElement(`${this.props.vPath}[${props.rowData[listKeyProperty]}]`))
                 .then(props.onReload);
-            }} >
+            }}
+            size="large">
             <RemoveIcon />
           </IconButton>
         </Tooltip>
@@ -714,7 +722,7 @@ class ConfigurationApplicationComponent extends React.Component<ConfigurationApp
             </div>
           ) : null
         }
-        <Button onClick={() => {
+        <Button color="inherit" onClick={() => {
           const resultingViewData = inputViewSpecification && this.collectData(inputViewSpecification.elements);
           this.props.executeRpc(this.props.vPath!, resultingViewData);
         }} >Exec</Button>
@@ -738,12 +746,12 @@ class ConfigurationApplicationComponent extends React.Component<ConfigurationApp
       <div className={this.props.classes.header}>
         <div>
           <Breadcrumbs aria-label="breadcrumbs">
-            <Link color="inherit" href="#" aria-label="back-breadcrumb"
+            <Link underline="hover" color="inherit" href="#" aria-label="back-breadcrumb"
               onClick={(ev: React.MouseEvent<HTMLElement>) => {
                 ev.preventDefault();
                 this.props.history.push(lastPath);
               }}>Back</Link>
-            <Link color="inherit" href="#"
+            <Link underline="hover" color="inherit" href="#"
               aria-label={nodeId + '-breadcrumb'}
               onClick={(ev: React.MouseEvent<HTMLElement>) => {
                 ev.preventDefault();
@@ -756,14 +764,14 @@ class ConfigurationApplicationComponent extends React.Component<ConfigurationApp
                 const propTitle = prop.replace(/^[^:]+:/, "");
                 const ret = (
                   <span key={ind}>
-                    <Link color="inherit" href="#"
+                    <Link underline="hover" color="inherit" href="#"
                       aria-label={propTitle + '-breadcrumb'}
                       onClick={(ev: React.MouseEvent<HTMLElement>) => {
                         ev.preventDefault();
                         this.props.history.push(path);
                       }}><span>{propTitle}</span></Link>
                     {
-                      keyPath && <Link color="inherit" href="#"
+                      keyPath && <Link underline="hover" color="inherit" href="#"
                         aria-label={key + '-breadcrumb'}
                         onClick={(ev: React.MouseEvent<HTMLElement>) => {
                           ev.preventDefault();
@@ -781,7 +789,7 @@ class ConfigurationApplicationComponent extends React.Component<ConfigurationApp
         </div>
         {this.state.editMode && (
           <Fab color="secondary" aria-label="back-button" className={this.props.classes.fab} onClick={async () => {
-            this.props.vPath && await this.props.reloadView(this.props.vPath);
+            this.props.vPath && (await this.props.reloadView(this.props.vPath));
             this.setState({ editMode: false });
           }} ><ArrowBack /></Fab>
         ) || null}
index e3f3b6f..5461c14 100644 (file)
@@ -88,7 +88,7 @@ module.exports = (env) => {
         manifest: require(path.resolve(frameworkPath, "app-manifest.json")),
         sourceType: "umd2"
       }),
-      ...(env === "release") ? [
+      ...(env === "release" ? [
         new webpack.DefinePlugin({
           "process.env": {
             NODE_ENV: "'production'",
@@ -106,7 +106,7 @@ module.exports = (env) => {
             from: 'index.html',
             to: distPath
           }]),
-        ]
+        ])
     ],
 
      watchOptions: {
index a6b23df..9ecdaf8 100644 (file)
   "author": "Matthias Fischer",
   "license": "Apache-2.0",
   "dependencies": {
-    "@odlux/framework": "*"
+    "@emotion/react": "^11.7.0",
+    "@emotion/styled": "^11.6.0",
+    "@mui/icons-material": "^5.2.0",
+    "@mui/material": "^5.2.2",
+    "@mui/styles": "^5.2.2",
+    "@odlux/framework": "*",
+    "react-chartjs-2": "2.7.6",
+    "chart.js": "2.8.0"
   },
   "peerDependencies": {
-    "@types/react": "17.0.3",
-    "@types/react-dom": "17.0.2",
-    "@types/react-router-dom": "5.1.7",
-    "@material-ui/core": "4.11.4",
-    "@material-ui/icons": "4.11.2",
     "@types/classnames": "2.2.6",
     "@types/flux": "3.1.8",
     "@types/jquery": "3.3.10",
+    "@types/react": "17.0.37",
+    "@types/react-dom": "17.0.11",
+    "@types/react-router-dom": "5.1.7",
     "jquery": "3.3.1",
-    "react": "17.0.1",
-    "react-dom": "17.0.1",
+    "react": "17.0.2",
+    "react-dom": "17.0.2",
     "react-router-dom": "5.2.0"
   }
-}
\ No newline at end of file
+}
index 1e569a1..041cff9 100644 (file)
@@ -37,7 +37,7 @@ export const addNewNetworkElementAsyncActionCreator = (element: NetworkElementCo
 
 /** Represents an async thunk action creator to edit network element. */
 export const editNetworkElementAsyncActionCreator = (element: UpdateNetworkElement) => async (dispatch: Dispatch) => {
-  const connectionStatus: ConnectionStatus[] = await connectService.getNetworkElementConnectionStatus(element.id).then(ne => (ne)) || [];
+  const connectionStatus: ConnectionStatus[] = (await connectService.getNetworkElementConnectionStatus(element.id).then(ne => (ne))) || [];
   const currentConnectionStatus = connectionStatus[0].status;
   if (currentConnectionStatus === "Disconnected") {
     const res = await connectService.deleteNetworkElement(element);
index 5a5ebcc..a7d96d0 100644 (file)
@@ -19,7 +19,7 @@ import * as React from 'react';
 import connect, { IDispatcher, Connect } from '../../../../framework/src/flux/connect';
 import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
 import { MaterialTable, ColumnType, MaterialTableCtorType } from '../../../../framework/src/components/material-table';
-import  Refresh  from '@material-ui/icons/Refresh';
+import  Refresh  from '@mui/icons-material/Refresh';
 
 import { createConnectionStatusLogActions, createConnectionStatusLogProperties } from '../handlers/connectionStatusLogHandler';
 import { NetworkElementConnectionLog } from '../models/networkElementConnectionLog';
diff --git a/sdnr/wt/odlux/apps/connectApp/src/components/dashboardHome.tsx b/sdnr/wt/odlux/apps/connectApp/src/components/dashboardHome.tsx
new file mode 100644 (file)
index 0000000..683c596
--- /dev/null
@@ -0,0 +1,425 @@
+/**
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt odlux
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ */
+import * as React from 'react';
+
+import { withRouter, RouteComponentProps } from 'react-router-dom';
+import connect, { Connect, IDispatcher } from '../../../../framework/src/flux/connect';;
+import { Theme } from '@mui/material';
+import { WithStyles } from '@mui/styles';
+import createStyles from '@mui/styles/createStyles';
+import withStyles from '@mui/styles/withStyles';
+import { Doughnut } from 'react-chartjs-2';
+import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
+import { NavigateToApplication } from '../../../../framework/src/actions/navigationActions';
+
+const styles = (theme: Theme) => createStyles({
+  pageWidthSettings: {
+    width: '50%',
+    float: 'left'
+  },
+})
+
+const scrollbar = { overflow: "auto", paddingRight: "20px" }
+
+let connectionStatusinitialLoad = true;
+let connectionStatusinitialStateChanged = false;
+let connectionStatusDataLoad: number[] = [0, 0, 0, 0];
+let connectionTotalCount = 0;
+
+let alarmStatusinitialLoad = true;
+let alarmStatusinitialStateChanged = false;
+let alarmStatusDataLoad: number[] = [0, 0, 0, 0];
+let alarmTotalCount = 0;
+
+const mapProps = (state: IApplicationStoreState) => ({
+  connectionStatusCount: state.connect.connectionStatusCount,
+  alarmStatus: state.fault.faultStatus
+});
+
+const mapDispatch = (dispatcher: IDispatcher) => ({
+  navigateToApplication: (applicationName: string, path?: string) => dispatcher.dispatch(new NavigateToApplication(applicationName, path)),
+});
+
+type HomeComponentProps = RouteComponentProps & Connect<typeof mapProps, typeof mapDispatch> & WithStyles<typeof styles>;
+
+class DashboardHome extends React.Component<HomeComponentProps>  {
+  constructor(props: HomeComponentProps) {
+    super(props);
+    this.state = {
+    }
+  }
+
+  render(): JSX.Element {
+    const { classes } = this.props;
+
+    if (!this.props.connectionStatusCount.isLoadingConnectionStatusChart) {
+      connectionStatusDataLoad = [
+        this.props.connectionStatusCount.Connected,
+        this.props.connectionStatusCount.Connecting,
+        this.props.connectionStatusCount.Disconnected,
+        this.props.connectionStatusCount.UnableToConnect
+      ];
+      connectionTotalCount = this.props.connectionStatusCount.Connected + this.props.connectionStatusCount.Connecting
+        + this.props.connectionStatusCount.Disconnected + this.props.connectionStatusCount.UnableToConnect;
+
+    }
+
+    if (!this.props.alarmStatus.isLoadingAlarmStatusChart) {
+      alarmStatusDataLoad = [
+        this.props.alarmStatus.critical,
+        this.props.alarmStatus.major,
+        this.props.alarmStatus.minor,
+        this.props.alarmStatus.warning
+      ];
+      alarmTotalCount = this.props.alarmStatus.critical + this.props.alarmStatus.major
+        + this.props.alarmStatus.minor + this.props.alarmStatus.warning;
+    }
+
+    /** Available Network Connection Status chart data */
+    const connectionStatusData = {
+      labels: ['Connected', 'Connecting', 'Disconnected', 'UnableToConnect'],
+      datasets: [{
+        data: connectionStatusDataLoad,
+        backgroundColor: [
+          'rgb(0, 153, 51)',
+          'rgb(255, 102, 0)',
+          'rgb(191, 191, 191)',
+          'rgb(191, 191, 191)'
+        ]
+      }]
+    };
+
+
+    /** No Devices available */
+    const connectionStatusUnavailableData = {
+      labels: ['No Devices available'],
+      datasets: [{
+        data: [1],
+        backgroundColor: [
+          'rgb(255, 255, 255)'
+        ]
+      }]
+    };
+
+    /** Loading Connection Status chart */
+    const connectionStatusisLoading = {
+      labels: ['Loading chart...'],
+      datasets: [{
+        data: [1],
+        backgroundColor: [
+          'rgb(255, 255, 255)'
+        ]
+      }]
+    };
+
+    /** Loading Alarm Status chart */
+    const alarmStatusisLoading = {
+      labels: ['Loading chart...'],
+      datasets: [{
+        data: [1],
+        backgroundColor: [
+          'rgb(255, 255, 255)'
+        ]
+      }]
+    };
+
+    /** Connection status options */
+    let labels: String[] = ['Connected', 'Connecting', 'Disconnected', 'UnableToConnect'];
+    const connectionStatusOptions = {
+      responsive: true,
+      maintainAspectRatio: false,
+      animation: {
+        duration: 0
+      },
+      plugins: {
+        legend: {
+          display: true,
+          position: 'top'
+        }
+      },
+      onClick: (event: MouseEvent, item: any) => {
+        if (item[0]) {
+          let connectionStatus = labels[item[0]._index] + '';
+          this.props.navigateToApplication("connect", '/connectionStatus/' + connectionStatus);
+        }
+      }
+    }
+
+    /** Connection status unavailable options */
+    const connectionStatusUnavailableOptions = {
+      responsive: true,
+      maintainAspectRatio: false,
+      animation: {
+        duration: 0
+      },
+      plugins: {
+        legend: {
+          display: true,
+          position: 'top'
+        },
+        tooltip: {
+          enabled: false
+        }
+      }
+    }
+
+    /** Add text inside the doughnut chart for Connection Status */
+    const connectionStatusPlugins = [{
+      beforeDraw: function (chart: any) {
+        var width = chart.width,
+          height = chart.height,
+          ctx = chart.ctx;
+        ctx.restore();
+        var fontSize = (height / 480).toFixed(2);
+        ctx.font = fontSize + "em sans-serif";
+        ctx.textBaseline = "top";
+        var text = "Network Connection Status",
+          textX = Math.round((width - ctx.measureText(text).width) / 2),
+          textY = height / 2;
+        ctx.fillText(text, textX, textY);
+        ctx.save();
+      }
+    }]
+
+    /** Alarm status Data */
+    const alarmStatusData = {
+      labels: [
+        'Critical',
+        'Major',
+        'Minor',
+        'Warning'
+      ],
+      datasets: [{
+        data: alarmStatusDataLoad,
+        backgroundColor: [
+          'rgb(240, 25, 10)',
+          'rgb(240, 133, 10)',
+          'rgb(240, 240, 10)',
+          'rgb(46, 115, 176)'
+        ],
+      }]
+    }
+
+    /** No Alarm status available */
+    const alarmStatusUnavailableData = {
+      labels: ['No Alarms available'],
+      datasets: [{
+        data: [1],
+        backgroundColor: [
+          'rgb(0, 153, 51)'
+        ]
+      }]
+    };
+
+    /** Alarm status Options */
+    let alarmLabels: String[] = ['Critical', 'Major', 'Minor', 'Warning'];
+    const alarmStatusOptions = {
+      responsive: true,
+      maintainAspectRatio: false,
+      animation: {
+        duration: 0
+      },
+      plugins: {
+        legend: {
+          display: true,
+          position: 'top'
+        }
+      },
+      onClick: (event: MouseEvent, item: any) => {
+        if (item[0]) {
+          let severity = alarmLabels[item[0].index] + '';
+          this.props.navigateToApplication("fault", '/alarmStatus/' + severity);
+        }
+      },
+    };
+
+    /** Alarm status unavailable options */
+    const alarmStatusUnavailableOptions = {
+      responsive: true,
+      maintainAspectRatio: false,
+      animation: {
+        duration: 0
+      },
+      plugins: {
+        legend: {
+          display: true,
+          position: 'top'
+        },
+        tooltip: {
+          enabled: false
+        }
+      }
+    }
+    /** Add text inside the doughnut chart for Alarm Status */
+    const alarmStatusPlugins = [{
+      beforeDraw: function (chart: any) {
+        var width = chart.width,
+          height = chart.height,
+          ctx = chart.ctx;
+        ctx.restore();
+        var fontSize = (height / 480).toFixed(2);
+        ctx.font = fontSize + "em sans-serif";
+        ctx.textBaseline = "top";
+        var text = "Network Alarm Status",
+          textX = Math.round((width - ctx.measureText(text).width) / 2),
+          textY = height / 2;
+        ctx.fillText(text, textX, textY);
+        ctx.save();
+      }
+    }]
+
+    return (
+      <>
+        <div style={scrollbar} >
+          <h1>Welcome to ODLUX</h1>
+          <div style={{ width: '50%', float: 'left' }}>
+            {this.checkElementsAreLoaded() ?
+              this.checkConnectionStatus() && connectionTotalCount != 0 ?
+                <Doughnut
+                  data={connectionStatusData}
+                  type={Doughnut}
+                  width={500}
+                  height={500}
+                  options={connectionStatusOptions}
+                  plugins={connectionStatusPlugins}
+                />
+                : <Doughnut
+                  data={connectionStatusUnavailableData}
+                  type={Doughnut}
+                  width={500}
+                  height={500}
+                  options={connectionStatusUnavailableOptions}
+                  plugins={connectionStatusPlugins} />
+              : <Doughnut
+                data={connectionStatusisLoading}
+                type={Doughnut}
+                width={500}
+                height={500}
+                options={connectionStatusUnavailableOptions}
+                plugins={connectionStatusPlugins}
+              />
+            }
+          </div>
+          <div style={{ width: '50%', float: 'left' }}>
+            {this.checkAlarmsAreLoaded() ?
+              this.checkAlarmStatus() && alarmTotalCount != 0 ?
+                <Doughnut
+                  data={alarmStatusData}
+                  type={Doughnut}
+                  width={500}
+                  height={500}
+                  options={alarmStatusOptions}
+                  plugins={alarmStatusPlugins}
+                />
+                : <Doughnut
+                  data={alarmStatusUnavailableData}
+                  type={Doughnut}
+                  width={500}
+                  height={500}
+                  options={alarmStatusUnavailableOptions}
+                  plugins={alarmStatusPlugins}
+                />
+              : <Doughnut
+                data={alarmStatusisLoading}
+                type={Doughnut}
+                width={500}
+                height={500}
+                options={alarmStatusUnavailableOptions}
+                plugins={alarmStatusPlugins}
+              />
+            }
+          </div>
+        </div>
+      </>
+    )
+  }
+
+  /** Check if connection status data available */
+  public checkConnectionStatus = () => {
+    let statusCount = this.props.connectionStatusCount;
+    if (statusCount.isLoadingConnectionStatusChart) {
+      return true;
+    }
+    if (statusCount.Connected == 0 && statusCount.Connecting == 0 && statusCount.Disconnected == 0
+      && statusCount.UnableToConnect == 0) {
+      return false;
+    } else {
+      return true;
+    }
+  }
+
+  /** Check if connection status chart data is loaded */
+  public checkElementsAreLoaded = () => {
+    let isLoadingCheck = this.props.connectionStatusCount;
+    if (connectionStatusinitialLoad && !isLoadingCheck.isLoadingConnectionStatusChart) {
+      if (this.checkConnectionStatus()) {
+        connectionStatusinitialLoad = false;
+        return true;
+      }
+      return false;
+    } else if (connectionStatusinitialLoad && isLoadingCheck.isLoadingConnectionStatusChart) {
+      connectionStatusinitialLoad = false;
+      connectionStatusinitialStateChanged = true;
+      return !isLoadingCheck.isLoadingConnectionStatusChart;
+    } else if (connectionStatusinitialStateChanged) {
+      if (!isLoadingCheck.isLoadingConnectionStatusChart) {
+        connectionStatusinitialStateChanged = false;
+      }
+      return !isLoadingCheck.isLoadingConnectionStatusChart;
+    }
+    return true;
+  }
+
+  /** Check if alarms data available */
+  public checkAlarmStatus = () => {
+    let alarmCount = this.props.alarmStatus;
+    if (alarmCount.isLoadingAlarmStatusChart) {
+      return true;
+    }
+    if (alarmCount.critical == 0 && alarmCount.major == 0 && alarmCount.minor == 0 && alarmCount.warning == 0) {
+      return false;
+    }
+    else {
+      return true;
+    }
+  }
+
+  /** Check if alarm status chart data is loaded */
+  public checkAlarmsAreLoaded = () => {
+    let isLoadingCheck = this.props.alarmStatus;
+    if (alarmStatusinitialLoad && !isLoadingCheck.isLoadingAlarmStatusChart) {
+      if (this.checkAlarmStatus()) {
+        alarmStatusinitialLoad = false;
+        return true;
+      }
+      return false;
+    } else if (alarmStatusinitialLoad && isLoadingCheck.isLoadingAlarmStatusChart) {
+      alarmStatusinitialLoad = false;
+      alarmStatusinitialStateChanged = true;
+      return !isLoadingCheck.isLoadingAlarmStatusChart;
+    } else if (alarmStatusinitialStateChanged) {
+      if (!isLoadingCheck.isLoadingAlarmStatusChart) {
+        alarmStatusinitialStateChanged = false;
+      }
+      return !isLoadingCheck.isLoadingAlarmStatusChart;
+    }
+    return true;
+  }
+}
+
+export default (withRouter(connect(mapProps, mapDispatch)(DashboardHome)));
\ No newline at end of file
index 0613039..7324ffa 100644 (file)
  */
 import * as React from 'react';
 
-import Button from '@material-ui/core/Button';
-import TextField from '@material-ui/core/TextField';
-import Dialog from '@material-ui/core/Dialog';
-import DialogActions from '@material-ui/core/DialogActions';
-import DialogContent from '@material-ui/core/DialogContent';
-import DialogContentText from '@material-ui/core/DialogContentText';
-import DialogTitle from '@material-ui/core/DialogTitle';
-import { FormControl, InputLabel, Select, MenuItem, Typography, Radio, RadioGroup, Options, FormLabel, FormControlLabel } from '@material-ui/core';
+import Button from '@mui/material/Button';
+import TextField from '@mui/material/TextField';
+import Dialog from '@mui/material/Dialog';
+import DialogActions from '@mui/material/DialogActions';
+import DialogContent from '@mui/material/DialogContent';
+import DialogContentText from '@mui/material/DialogContentText';
+import DialogTitle from '@mui/material/DialogTitle';
+import { FormControl, InputLabel, Select, MenuItem, Typography, Radio, RadioGroup, Options, FormLabel, FormControlLabel } from '@mui/material';
 import { loadAllTlsKeyListAsync } from '../actions/tlsKeyActions';
 import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
 
@@ -222,32 +222,32 @@ class EditNetworkElementDialogComponent extends React.Component<EditNetworkEleme
           <DialogContentText>
             {setting.dialogDescription}
           </DialogContentText>
-          <TextField disabled={!setting.enableMountIdEditor} spellCheck={false} autoFocus margin="dense" id="name" label="Name" aria-label="name" type="text" fullWidth value={this.state.nodeId} onChange={(event) => { this.setState({ nodeId: event.target.value }); }} />
+          <TextField variant="standard" disabled={!setting.enableMountIdEditor} spellCheck={false} autoFocus margin="dense" id="name" label="Name" aria-label="name" type="text" fullWidth value={this.state.nodeId} onChange={(event) => { this.setState({ nodeId: event.target.value }); }} />
           {!this.state.isNameValid && <Typography variant="body1" color="error">Name cannot be empty.</Typography>}
-          <TextField disabled={!setting.enableMountIdEditor} spellCheck={false} margin="dense" id="ipaddress" label="IP address" aria-label="ip adress" type="text" fullWidth value={this.state.host} onChange={(event) => { this.setState({ host: event.target.value }); }} />
+          <TextField variant="standard" disabled={!setting.enableMountIdEditor} spellCheck={false} margin="dense" id="ipaddress" label="IP address" aria-label="ip adress" type="text" fullWidth value={this.state.host} onChange={(event) => { this.setState({ host: event.target.value }); }} />
           {!this.state.isHostSet && <Typography variant="body1" color="error">IP Adress cannot be empty.</Typography>}
 
-          <TextField disabled={!setting.enableMountIdEditor} spellCheck={false} margin="dense" id="netconfport" label="NetConf port" aria-label="netconf port" type="number" fullWidth value={this.state.port.toString()} onChange={(event) => { this.setState({ port: +event.target.value }); }} />
-          {setting.enableUsernameEditor && <TextField disabled={!setting.enableUsernameEditor} spellCheck={false} margin="dense" id="username" label="Username" aria-label="username" type="text" fullWidth value={this.state.username} onChange={(event) => { this.setState({ username: event.target.value }); }} /> || null}
+          <TextField variant="standard" disabled={!setting.enableMountIdEditor} spellCheck={false} margin="dense" id="netconfport" label="NetConf port" aria-label="netconf port" type="number" fullWidth value={this.state.port.toString()} onChange={(event) => { this.setState({ port: +event.target.value }); }} />
+          {setting.enableUsernameEditor && <TextField variant="standard" disabled={!setting.enableUsernameEditor} spellCheck={false} margin="dense" id="username" label="Username" aria-label="username" type="text" fullWidth value={this.state.username} onChange={(event) => { this.setState({ username: event.target.value }); }} /> || null}
 
           {setting.enableUsernameEditor &&
             <RadioGroup row aria-label="password-tls-key" name="password-tls-key" value={radioSelected}
               onChange={this.handleRadioChange} >
-              <FormControlLabel aria-label="passwordSelection" value='password' control={<Radio />} label="Password" onChange={this.onRadioSelect} />
-              <FormControlLabel aria-label="tlsKeySelection" value='tlsKey' control={<Radio />} label="TlsKey" onChange={this.onRadioSelect} />
+              <FormControlLabel aria-label="passwordSelection" value='password' control={<Radio color="secondary" />} label="Password" onChange={this.onRadioSelect} />
+              <FormControlLabel aria-label="tlsKeySelection" value='tlsKey' control={<Radio color="secondary" />} label="TlsKey" onChange={this.onRadioSelect} />
             </RadioGroup> || null}
 
           {setting.enableUsernameEditor && showPasswordTextField &&
-            <TextField disabled={!setting.enableUsernameEditor || !showPasswordTextField} spellCheck={false} margin="dense"
+            <TextField variant="standard" disabled={!setting.enableUsernameEditor || !showPasswordTextField} spellCheck={false} margin="dense"
               id="password" aria-label="password" type="password" fullWidth value={this.state.password}
               onChange={(event) => { this.setState({ password: event.target.value }); }}
             /> || null}
 
-          <FormControl fullWidth disabled={!setting.enableUsernameEditor}>
+          <FormControl variant="standard" fullWidth disabled={!setting.enableUsernameEditor}>
             {setting.enableUsernameEditor && showTlsDropdown &&
               <div>
                 <InputLabel htmlFor="pass">--Select tls-key--</InputLabel>
-                <Select disabled={!setting.enableUsernameEditor || !showTlsDropdown}
+                <Select variant="standard" disabled={!setting.enableUsernameEditor || !showTlsDropdown}
                   id="tlsKey" aria-label="tlsKey" value={this.state.tlsKey} fullWidth // displayEmpty
                   onChange={(event) => { this.setState({ tlsKey: event.target.value as any }); }}
                   inputProps={{ name: 'tlsKey', id: 'tlsKey' }}  >
@@ -259,9 +259,9 @@ class EditNetworkElementDialogComponent extends React.Component<EditNetworkEleme
             }
           </FormControl>
 
-          <FormControl fullWidth disabled={!setting.enableUsernameEditor}>
+          <FormControl variant="standard" fullWidth disabled={!setting.enableUsernameEditor}>
             <InputLabel htmlFor="active">Required</InputLabel>
-            <Select aria-label="required-selection" value={this.state.isRequired || false} onChange={(event) => {
+            <Select variant="standard" aria-label="required-selection" value={this.state.isRequired || false} onChange={(event) => {
               this.setState({ isRequired: event.target.value as any as boolean });
             }} inputProps={{ name: 'required', id: 'required' }} fullWidth >
               <MenuItem value={true as any as string} aria-label="true">True</MenuItem>
@@ -286,7 +286,7 @@ class EditNetworkElementDialogComponent extends React.Component<EditNetworkEleme
             }
             event.preventDefault();
             event.stopPropagation();
-          }} > {setting.applyButtonText} </Button>
+          }} color="inherit" > {setting.applyButtonText} </Button>
           <Button aria-label="dialog-cancel-button" onClick={(event) => {
             this.onCancel();
             event.preventDefault();
@@ -294,7 +294,7 @@ class EditNetworkElementDialogComponent extends React.Component<EditNetworkEleme
           }} color="secondary"> {setting.cancelButtonText} </Button>
         </DialogActions>
       </Dialog>
-    )
+    );
   }
 
   public renderTlsKeys = () => {
@@ -333,7 +333,8 @@ class EditNetworkElementDialogComponent extends React.Component<EditNetworkEleme
       case EditNetworkElementDialogMode.AddNewNetworkElement:
         element && this.props.addNewNetworkElement(element);
         this.setState({
-          radioSelected: ''
+          radioSelected: '',
+          isPasswordSelected: true,
         });
         break;
       case EditNetworkElementDialogMode.MountNetworkElement:
index aeaaa91..5514fa5 100644 (file)
  */
  import * as React from 'react';
 
- import Button from '@material-ui/core/Button';
- import Dialog from '@material-ui/core/Dialog';
- import DialogActions from '@material-ui/core/DialogActions';
- import DialogTitle from '@material-ui/core/DialogTitle';
+ import Button from '@mui/material/Button';
+ import Dialog from '@mui/material/Dialog';
+ import DialogActions from '@mui/material/DialogActions';
+ import DialogTitle from '@mui/material/DialogTitle';
  import { MaterialTable, ColumnType, MaterialTableCtorType } from '../../../../framework/src/components/material-table';
  import { IDispatcher, connect, Connect } from '../../../../framework/src/flux/connect';
  
index 4a7a0d2..a17a247 100644 (file)
 * ============LICENSE_END==========================================================================
 */
 import * as React from 'react';
-import { Theme, createStyles, withStyles, WithStyles } from '@material-ui/core/styles';
-
-import AddIcon from '@material-ui/icons/Add';
-import Refresh from '@material-ui/icons/Refresh';
-import LinkIcon from '@material-ui/icons/Link';
-import LinkOffIcon from '@material-ui/icons/LinkOff';
-import RemoveIcon from '@material-ui/icons/RemoveCircleOutline';
-import EditIcon from '@material-ui/icons/Edit';
-import Info from '@material-ui/icons/Info';
-import ComputerIcon from '@material-ui/icons/Computer';
-import { MenuItem, Divider, Typography } from '@material-ui/core';
+import { Theme } from '@mui/material/styles';
+
+import { WithStyles } from '@mui/styles';
+import createStyles from '@mui/styles/createStyles';
+import withStyles from '@mui/styles/withStyles';
+
+import AddIcon from '@mui/icons-material/Add';
+import Refresh from '@mui/icons-material/Refresh';
+import LinkIcon from '@mui/icons-material/Link';
+import LinkOffIcon from '@mui/icons-material/LinkOff';
+import RemoveIcon from '@mui/icons-material/RemoveCircleOutline';
+import EditIcon from '@mui/icons-material/Edit';
+import Info from '@mui/icons-material/Info';
+import ComputerIcon from '@mui/icons-material/Computer';
+import { MenuItem, Divider, Typography } from '@mui/material';
 
 import { MaterialTable, ColumnType, MaterialTableCtorType } from '../../../../framework/src/components/material-table';
 import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
@@ -189,39 +193,37 @@ export class NetworkElementsListComponent extends React.Component<NetworkElement
       }
     };
 
-    return (
-      <>
-        <NetworkElementTable stickyHeader tableId="network-element-table" customActionButtons={[refreshNetworkElementsAction, ...canAdd ? [addRequireNetworkElementAction] : []]} columns={[
-          { property: "nodeId", title: "Node Name", type: ColumnType.text },
-          { property: "isRequired", title: "Required", type: ColumnType.boolean },
-          { property: "status", title: "Connection Status", type: ColumnType.text, width:'15%' },
-          { property: "host", title: "Host", type: ColumnType.text },
-          { property: "port", title: "Port", type: ColumnType.numeric },
-          { property: "coreModelCapability", title: "Core Model", type: ColumnType.text },
-          { property: "deviceType", title: "Device Type", type: ColumnType.text },
-          { property: "deviceFunction", title: "Device Function", type: ColumnType.text, width: '15%' }
-        ]} idProperty="id" {...this.props.networkElementsActions} {...this.props.networkElementsProperties} asynchronus createContextMenu={rowData => {
-
-          return this.getContextMenu(rowData);
-        }} >
-        </NetworkElementTable>
-        <EditNetworkElementDialog
-          initialNetworkElement={networkElementToEdit}
-          mode={this.state.networkElementEditorMode}
-          onClose={this.onCloseEditNetworkElementDialog}
-          radioChecked={savedRadio}
-        />
-        <RefreshNetworkElementsDialog
-          mode={this.state.refreshNetworkElementsEditorMode}
-          onClose={this.onCloseRefreshNetworkElementsDialog}
-        />
-        <InfoNetworkElementDialog
-          initialNetworkElement={networkElementToEdit}
-          mode={this.state.infoNetworkElementEditorMode}
-          onClose={this.onCloseInfoNetworkElementDialog}
-        />
-      </>
-    );
+    return <>
+      <NetworkElementTable stickyHeader tableId="network-element-table" customActionButtons={[refreshNetworkElementsAction, ...(canAdd ? [addRequireNetworkElementAction] : [])]} columns={[
+        { property: "nodeId", title: "Node Name", type: ColumnType.text },
+        { property: "isRequired", title: "Required", type: ColumnType.boolean },
+        { property: "status", title: "Connection Status", type: ColumnType.text, width:'15%' },
+        { property: "host", title: "Host", type: ColumnType.text },
+        { property: "port", title: "Port", type: ColumnType.numeric },
+        { property: "coreModelCapability", title: "Core Model", type: ColumnType.text },
+        { property: "deviceType", title: "Device Type", type: ColumnType.text },
+        { property: "deviceFunction", title: "Device Function", type: ColumnType.text, width: '15%' }
+      ]} idProperty="id" {...this.props.networkElementsActions} {...this.props.networkElementsProperties} asynchronus createContextMenu={rowData => {
+
+        return this.getContextMenu(rowData);
+      }} >
+      </NetworkElementTable>
+      <EditNetworkElementDialog
+        initialNetworkElement={networkElementToEdit}
+        mode={this.state.networkElementEditorMode}
+        onClose={this.onCloseEditNetworkElementDialog}
+        radioChecked={savedRadio}
+      />
+      <RefreshNetworkElementsDialog
+        mode={this.state.refreshNetworkElementsEditorMode}
+        onClose={this.onCloseRefreshNetworkElementsDialog}
+      />
+      <InfoNetworkElementDialog
+        initialNetworkElement={networkElementToEdit}
+        mode={this.state.infoNetworkElementEditorMode}
+        onClose={this.onCloseInfoNetworkElementDialog}
+      />
+    </>;
   };
 
   public componentDidMount() {
index 41229ea..c09f59b 100644 (file)
  */
 import * as React from 'react';
 
-import Button from '@material-ui/core/Button';
-import Dialog from '@material-ui/core/Dialog';
-import DialogActions from '@material-ui/core/DialogActions';
-import DialogContent from '@material-ui/core/DialogContent';
-import DialogContentText from '@material-ui/core/DialogContentText';
-import DialogTitle from '@material-ui/core/DialogTitle';
+import Button from '@mui/material/Button';
+import Dialog from '@mui/material/Dialog';
+import DialogActions from '@mui/material/DialogActions';
+import DialogContent from '@mui/material/DialogContent';
+import DialogContentText from '@mui/material/DialogContentText';
+import DialogTitle from '@mui/material/DialogTitle';
 
 import { connectionStatusLogReloadAction } from '../handlers/connectionStatusLogHandler';
 import { IDispatcher, connect, Connect } from '../../../../framework/src/flux/connect';
@@ -94,13 +94,13 @@ class RefreshConnectionStatusLogDialogComponent extends React.Component<RefreshC
         <DialogActions>
           <Button aria-label="dialog-confirm-button" onClick={(event) => {
             this.onRefresh();
-          }} > {setting.applyButtonText} </Button>
+          }} color="inherit" > {setting.applyButtonText} </Button>
           <Button aria-label="dialog-cancel-button" onClick={(event) => {
             this.onCancel();
           }} color="secondary"> {setting.cancelButtonText} </Button>
         </DialogActions>
       </Dialog>
-    )
+    );
   }
 
   private onRefresh = () => {
index a349977..27288fa 100644 (file)
  */
 import * as React from 'react';
 
-import Button from '@material-ui/core/Button';
-import Dialog from '@material-ui/core/Dialog';
-import DialogActions from '@material-ui/core/DialogActions';
-import DialogContent from '@material-ui/core/DialogContent';
-import DialogContentText from '@material-ui/core/DialogContentText';
-import DialogTitle from '@material-ui/core/DialogTitle';
+import Button from '@mui/material/Button';
+import Dialog from '@mui/material/Dialog';
+import DialogActions from '@mui/material/DialogActions';
+import DialogContent from '@mui/material/DialogContent';
+import DialogContentText from '@mui/material/DialogContentText';
+import DialogTitle from '@mui/material/DialogTitle';
 
 import { networkElementsReloadAction } from '../handlers/networkElementsHandler';
 import { IDispatcher, connect, Connect } from '../../../../framework/src/flux/connect';
@@ -94,13 +94,13 @@ class RefreshNetworkElementsDialogComponent extends React.Component<RefreshNetwo
         <DialogActions>
           <Button aria-label="dialog-confirm-button" onClick={(event) => {
             this.onRefresh();
-          }} > {setting.applyButtonText} </Button>
+          }} color="inherit" > {setting.applyButtonText} </Button>
           <Button aria-label="dialog-cancel-button" onClick={(event) => {
             this.onCancel();
           }} color="secondary"> {setting.cancelButtonText} </Button>
         </DialogActions>
       </Dialog>
-    )
+    );
   }
 
   private onRefresh = () => {
index afca746..8376348 100644 (file)
@@ -32,18 +32,19 @@ import { createNetworkElementsActions, createNetworkElementsProperties, networkE
 import connectAppRootHandler from './handlers/connectAppRootHandler';
 import ConnectApplication from './views/connectView';
 import { PanelId } from "./models/panelId";
-import { NetworkElementsList } from './components/networkElements'
+import { NetworkElementsList } from './components/networkElements';
+import DashboardHome from "./components/dashboardHome";
 
 let currentStatus: string | undefined = undefined;
 let refreshInterval: ReturnType<typeof window.setInterval> | null = null;
 
 
 const mapProps = (state: IApplicationStoreState) => ({
-  currentProblemsProperties: createNetworkElementsProperties(state),
+  networkElementDashboardProperties: createNetworkElementsProperties(state),
 });
 
 const mapDisp = (dispatcher: IDispatcher) => ({
-  currentProblemsActions: createNetworkElementsActions(dispatcher.dispatch, true),
+  networkElementsDashboardActions: createNetworkElementsActions(dispatcher.dispatch, true),
   setCurrentPanel: (panelId: PanelId) => dispatcher.dispatch(new SetPanelAction(panelId)),
 });
 
@@ -53,13 +54,13 @@ const ConnectApplicationRouteAdapter = connect(mapProps, mapDisp)((props: RouteC
     window.setTimeout(() => {
       if (currentStatus) {
         props.setCurrentPanel("NetworkElements");
-        props.currentProblemsActions.onFilterChanged("status", currentStatus);
-        if (!props.currentProblemsProperties.showFilter) {
-          props.currentProblemsActions.onToggleFilter(false);
-          props.currentProblemsActions.onRefresh();
+        props.networkElementsDashboardActions.onFilterChanged("status", currentStatus);
+        if (!props.networkElementDashboardProperties.showFilter) {
+          props.networkElementsDashboardActions.onToggleFilter(false);
+          props.networkElementsDashboardActions.onRefresh();
         }
         else
-          props.currentProblemsActions.onRefresh();
+          props.networkElementsDashboardActions.onRefresh();
       }
     });
   }
@@ -83,6 +84,7 @@ export function register() {
     icon: faPlug,
     rootComponent: App,
     rootActionHandler: connectAppRootHandler,
+    dashbaordElement: DashboardHome,
     menuEntry: "Connect"
   });
 
index 34b1b94..e99b6af 100644 (file)
@@ -28,7 +28,7 @@ import { ConnectionStatusLog } from '../components/connectionStatusLog';
 import { setPanelAction, findWebUrisForGuiCutThroughAsyncAction, SetWeburiSearchBusy } from '../actions/commonNetworkElementsActions';
 import { PanelId } from '../models/panelId';
 import { NetworkElementConnection } from 'models/networkElementConnection';
-import { AppBar, Tabs, Tab } from '@material-ui/core';
+import { AppBar, Tabs, Tab } from '@mui/material';
 
 const mapProps = (state: IApplicationStoreState) => ({
   panelId: state.connect.currentOpenPanel,
@@ -96,7 +96,7 @@ class ConnectApplicationComponent extends React.Component<ConnectApplicationComp
 
   };
 
-  private onHandleTabChange = (event: React.ChangeEvent<{}>, newValue: PanelId) => {
+  private onHandleTabChange = (event: React.SyntheticEvent, newValue: PanelId) => {
     this.props.switchActivePanel(newValue);
   }
 
@@ -105,8 +105,8 @@ class ConnectApplicationComponent extends React.Component<ConnectApplicationComp
 
     return (
       <>
-        <AppBar position="static">
-          <Tabs value={activePanelId} onChange={this.onHandleTabChange} aria-label="connect-app-tabs">
+        <AppBar enableColorOnDark position="static">
+          <Tabs indicatorColor="secondary" textColor="inherit" value={activePanelId} onChange={this.onHandleTabChange} aria-label="connect-app-tabs">
             <Tab aria-label="network-elements-list-tab" label="Network Elements" value="NetworkElements" />
             <Tab aria-label="connection-status-log-tab" label="Connection Status Log" value="ConnectionStatusLog" />
           </Tabs>
index 685ea76..295e8f8 100644 (file)
@@ -25,6 +25,6 @@
     <bean id="bundle" init-method="initialize" destroy-method="clean" class="org.onap.ccsdk.features.sdnr.wt.odlux.bundles.MyOdluxBundle">
         <property name="loader" ref="loadersvc"/>
         <property name="bundleName" value="connectApp"/>
-        <property name="index" value="0"/>
+        <property name="index" value="1"/>
     </bean>
 </blueprint>
\ No newline at end of file
index 70ddd49..b283e42 100644 (file)
@@ -87,7 +87,7 @@ module.exports = (env) => {
         manifest: require(path.resolve(frameworkPath, "app-manifest.json")),
         sourceType: "umd2"
       }),
-      ...(env === "release") ? [
+      ...(env === "release" ? [
         new webpack.DefinePlugin({
           "process.env": {
             NODE_ENV: "'production'",
@@ -105,7 +105,7 @@ module.exports = (env) => {
             from: 'index.html',
             to: distPath
           }]),
-        ]
+        ])
     ],
 
     devServer: {
index d523837..951332a 100644 (file)
   "author": "Matthias Fischer",
   "license": "Apache-2.0",
   "dependencies": {
+    "@emotion/react": "^11.7.0",
+    "@emotion/styled": "^11.6.0",
+    "@mui/icons-material": "^5.2.0",
+    "@mui/material": "^5.2.2",
+    "@mui/styles": "^5.2.2",
     "@odlux/framework": "*"
   },
   "peerDependencies": {
-    "@types/react": "17.0.3",
-    "@types/react-dom": "17.0.2",
-    "@types/react-router-dom": "5.1.7",
-    "@material-ui/core": "4.11.4",
-    "@material-ui/icons": "4.11.2",
     "@types/classnames": "2.2.6",
     "@types/flux": "3.1.8",
     "@types/jquery": "3.3.10",
+    "@types/react": "17.0.37",
+    "@types/react-dom": "17.0.11",
+    "@types/react-router-dom": "5.1.7",
     "jquery": "3.3.1",
-    "react": "17.0.1",
-    "react-dom": "17.0.1",
+    "react": "17.0.2",
+    "react-dom": "17.0.2",
     "react-router-dom": "5.2.0"
   }
-}
\ No newline at end of file
+}
index b47fa45..6b960cd 100644 (file)
@@ -28,7 +28,7 @@ export class Counter extends React.Component<{}, { counter: number }> {
   
   render() {
     return (
-      <button onClick={ () => this.setState({ counter: this.state.counter + 1 }) }>{ this.state.counter }</button>
+      <button onClick={ () => this.setState({ counter: this.state.counter + 1 }) } color="inherit">{ this.state.counter }</button>
     )
   }
 }
\ No newline at end of file
index 3d0651b..b56058d 100644 (file)
 import * as React from 'react';
 import { withRouter, RouteComponentProps } from 'react-router-dom';
 
-import Table from '@material-ui/core/Table';
-import TableBody from '@material-ui/core/TableBody';
-import TableCell from '@material-ui/core/TableCell';
-import TableHead from '@material-ui/core/TableHead';
-import TableRow from '@material-ui/core/TableRow';
-import Paper from '@material-ui/core/Paper'; // means border
+import Table from '@mui/material/Table';
+import TableBody from '@mui/material/TableBody';
+import TableCell from '@mui/material/TableCell';
+import TableHead from '@mui/material/TableHead';
+import TableRow from '@mui/material/TableRow';
+import Paper from '@mui/material/Paper'; // means border
 
 import connect from '../../../../framework/src/flux/connect';
 
@@ -42,7 +42,7 @@ class AuthorsListComponent extends React.Component<RouteComponentProps & IAuthor
     const { authors, busy } = this.props;
     return (
       <Paper>
-        <Table >
+        <Table padding="normal" >
           <TableHead>
             <TableRow>
               <TableCell align="right">Id</TableCell>
index 61dd8f6..0476c30 100644 (file)
@@ -84,7 +84,7 @@ module.exports = (env) => {
         manifest: require(path.resolve(frameworkPath, "app-manifest.json")),
         sourceType: "umd2"
       }),
-      ...(env === "release") ? [
+      ...(env === "release" ? [
         new webpack.DefinePlugin({
           "process.env": {
             NODE_ENV: "'production'",
@@ -102,7 +102,7 @@ module.exports = (env) => {
             from: 'index.html',
             to: distPath
           }]),
-        ]
+        ])
     ],
 
     devServer: {
index 52c49b3..fb6cedf 100644 (file)
   "author": "Sai Neetha Phulmali",
   "license": "Apache-2.0",
   "dependencies": {
+    "@emotion/react": "^11.7.0",
+    "@emotion/styled": "^11.6.0",
+    "@mui/icons-material": "^5.2.0",
+    "@mui/material": "^5.2.2",
+    "@mui/styles": "^5.2.2",
     "@odlux/framework": "*"
   },
   "peerDependencies": {
-    "@types/react": "17.0.3",
-    "@types/react-dom": "17.0.2",
-    "@types/react-router-dom": "5.1.7",
-    "@material-ui/core": "4.11.4",
-    "@material-ui/icons": "4.11.2",
     "@types/classnames": "2.2.6",
     "@types/flux": "3.1.8",
     "@types/jquery": "3.3.10",
+    "@types/react": "17.0.37",
+    "@types/react-dom": "17.0.11",
+    "@types/react-router-dom": "5.1.7",
     "jquery": "3.3.1",
-    "react": "17.0.1",
-    "react-dom": "17.0.1",
+    "react": "17.0.2",
+    "react-dom": "17.0.2",
     "react-router-dom": "5.2.0"
   }
-}
\ No newline at end of file
+}
index 7d86e9f..8b5d951 100644 (file)
  */
 import * as React from 'react';
 
-import Button from '@material-ui/core/Button';
-import Dialog from '@material-ui/core/Dialog';
-import DialogActions from '@material-ui/core/DialogActions';
-import DialogContent from '@material-ui/core/DialogContent';
-import DialogContentText from '@material-ui/core/DialogContentText';
-import DialogTitle from '@material-ui/core/DialogTitle';
+import Button from '@mui/material/Button';
+import Dialog from '@mui/material/Dialog';
+import DialogActions from '@mui/material/DialogActions';
+import DialogContent from '@mui/material/DialogContent';
+import DialogContentText from '@mui/material/DialogContentText';
+import DialogTitle from '@mui/material/DialogTitle';
 
 import { eventLogReloadAction } from '../handlers/eventLogHandler';
 import { IDispatcher, connect, Connect } from '../../../../framework/src/flux/connect';
@@ -94,13 +94,13 @@ class RefreshEventLogDialogComponent extends React.Component<RefreshEventLogDial
         <DialogActions>
           <Button aria-label="dialog-confirm-button" onClick={(event) => {
             this.onRefresh();
-          }} > {setting.applyButtonText} </Button>
+          }} color="inherit" > {setting.applyButtonText} </Button>
           <Button aria-label="dialog-cancel-button" onClick={(event) => {
             this.onCancel();
           }} color="secondary"> {setting.cancelButtonText} </Button>
         </DialogActions>
       </Dialog>
-    )
+    );
   }
 
   private onRefresh = () => {
index 0308828..1fc53f2 100644 (file)
@@ -19,7 +19,7 @@ import * as React from "react";
 
 import { Connect, connect, IDispatcher } from '../../../../framework/src/flux/connect';
 import { MaterialTable, MaterialTableCtorType } from '../../../../framework/src/components/material-table';
-import Refresh from '@material-ui/icons/Refresh';
+import Refresh from '@mui/icons-material/Refresh';
 
 import { EventLogType } from '../models/eventLogType';
 import { IApplicationStoreState } from "../../../../framework/src/store/applicationStore";
index a67a340..de309c1 100644 (file)
@@ -86,7 +86,7 @@ module.exports = (env) => {
         manifest: require(path.resolve(frameworkPath, "app-manifest.json")),
         sourceType: "umd2"
       }),
-      ...(env === "release") ? [
+      ...(env === "release" ? [
         new webpack.DefinePlugin({
           "process.env": {
             NODE_ENV: "'production'",
@@ -104,7 +104,7 @@ module.exports = (env) => {
             from: 'index.html',
             to: distPath
           }]),
-        ]
+        ])
     ],
 
     devServer: {
index cb03e49..a5958d8 100644 (file)
   "author": "Matthias Fischer",
   "license": "Apache-2.0",
   "dependencies": {
+    "@emotion/react": "^11.7.0",
+    "@emotion/styled": "^11.6.0",
+    "@mui/icons-material": "^5.2.0",
+    "@mui/material": "^5.2.2",
+    "@mui/styles": "^5.2.2",
     "@odlux/framework": "*"
   },
   "peerDependencies": {
-    "@types/react": "17.0.3",
-    "@types/react-dom": "17.0.2",
-    "@types/react-router-dom": "5.1.7",
-    "@material-ui/core": "4.11.4",
-    "@material-ui/icons": "4.11.2",
     "@types/classnames": "2.2.6",
     "@types/flux": "3.1.8",
     "@types/jquery": "3.3.10",
+    "@types/react": "17.0.37",
+    "@types/react-dom": "17.0.11",
+    "@types/react-router-dom": "5.1.7",
     "jquery": "3.3.1",
-    "react": "17.0.1",
-    "react-dom": "17.0.1",
+    "react": "17.0.2",
+    "react-dom": "17.0.2",
     "react-router-dom": "5.2.0"
   }
-}
\ No newline at end of file
+}
index 5155d26..463c207 100644 (file)
@@ -17,7 +17,7 @@
  */
 
 import * as React from 'react'
-import { DialogContent, DialogActions, Button, Dialog, DialogTitle, DialogContentText } from '@material-ui/core';
+import { DialogContent, DialogActions, Button, Dialog, DialogTitle, DialogContentText } from '@mui/material';
 import { currentProblemsReloadAction } from '../handlers/currentProblemsHandler';
 import { clearStuckAlarmAsyncAction } from '../actions/clearStuckAlarmsAction';
 import connect, { IDispatcher, Connect } from '../../../../framework/src/flux/connect';
@@ -117,13 +117,13 @@ class ClearStuckAlarmsDialogComponent extends React.Component<clearStuckAlarmsPr
                     {
                         this.state.clearAlarmsSuccessful &&
                         <>
-                            <Button onClick={this.onRefresh}>Yes</Button>
-                            <Button onClick={this.onClose}>No</Button>
+                            <Button color="inherit" onClick={this.onRefresh}>Yes</Button>
+                            <Button color="inherit" onClick={this.onClose}>No</Button>
                         </>
                     }
 
                     {
-                        !this.state.clearAlarmsSuccessful && <Button onClick={this.onOk}>Ok</Button>
+                        !this.state.clearAlarmsSuccessful && <Button color="inherit" onClick={this.onOk}>Ok</Button>
                     }
                 </DialogActions>
             </Dialog>
index b711b03..7820dfd 100644 (file)
  */
 import * as React from 'react';
 
-import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/styles';
+import { Theme } from '@mui/material/styles';
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
 import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';  // select app icon
 
 import connect, { Connect } from '../../../../framework/src/flux/connect';
 import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
 
-import Typography from '@material-ui/core/Typography';
+import Typography from '@mui/material/Typography';
 import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
 
 const styles = (theme: Theme) => createStyles({
index 1d1b34c..8c639ee 100644 (file)
  */
 import * as React from 'react';
 
-import Button from '@material-ui/core/Button';
-import Dialog from '@material-ui/core/Dialog';
-import DialogActions from '@material-ui/core/DialogActions';
-import DialogContent from '@material-ui/core/DialogContent';
-import DialogContentText from '@material-ui/core/DialogContentText';
-import DialogTitle from '@material-ui/core/DialogTitle';
+import Button from '@mui/material/Button';
+import Dialog from '@mui/material/Dialog';
+import DialogActions from '@mui/material/DialogActions';
+import DialogContent from '@mui/material/DialogContent';
+import DialogContentText from '@mui/material/DialogContentText';
+import DialogTitle from '@mui/material/DialogTitle';
 
 import { alarmLogEntriesReloadAction } from '../handlers/alarmLogEntriesHandler';
 import { IDispatcher, connect, Connect } from '../../../../framework/src/flux/connect';
@@ -94,13 +94,13 @@ class RefreshAlarmLogDialogComponent extends React.Component<RefreshAlarmLogDial
         <DialogActions>
           <Button aria-label="dialog-confirm-button" onClick={(event) => {
             this.onRefresh();
-          }} > {setting.applyButtonText} </Button>
+          }} color="inherit" > {setting.applyButtonText} </Button>
           <Button aria-label="dialog-cancel-button" onClick={(event) => {
             this.onCancel();
           }} color="secondary"> {setting.cancelButtonText} </Button>
         </DialogActions>
       </Dialog>
-    )
+    );
   }
 
   private onRefresh = () => {
index c497220..e501ec0 100644 (file)
  */
 import * as React from 'react';
 
-import Button from '@material-ui/core/Button';
-import Dialog from '@material-ui/core/Dialog';
-import DialogActions from '@material-ui/core/DialogActions';
-import DialogContent from '@material-ui/core/DialogContent';
-import DialogContentText from '@material-ui/core/DialogContentText';
-import DialogTitle from '@material-ui/core/DialogTitle';
+import Button from '@mui/material/Button';
+import Dialog from '@mui/material/Dialog';
+import DialogActions from '@mui/material/DialogActions';
+import DialogContent from '@mui/material/DialogContent';
+import DialogContentText from '@mui/material/DialogContentText';
+import DialogTitle from '@mui/material/DialogTitle';
 
 import { currentProblemsReloadAction } from '../handlers/currentProblemsHandler';
 import { IDispatcher, connect, Connect } from '../../../../framework/src/flux/connect';
@@ -94,13 +94,13 @@ class RefreshCurrentProblemsDialogComponent extends React.Component<RefreshCurre
                 <DialogActions>
                     <Button aria-label="dialog-confirm-button" onClick={(event) => {
                         this.onRefresh();
-                    }} > {setting.applyButtonText} </Button>
+                    }} color="inherit" > {setting.applyButtonText} </Button>
                     <Button aria-label="dialog-cancel-button" onClick={(event) => {
                         this.onCancel();
                     }} color="secondary"> {setting.cancelButtonText} </Button>
                 </DialogActions>
             </Dialog>
-        )
+        );
     }
 
     private onRefresh = () => {
index 0fc7b39..456e05e 100644 (file)
@@ -34,9 +34,9 @@ import { PanelId } from '../models/panelId';
 import { createCurrentProblemsProperties, createCurrentProblemsActions, currentProblemsReloadAction } from '../handlers/currentProblemsHandler';
 import { createAlarmLogEntriesProperties, createAlarmLogEntriesActions, alarmLogEntriesReloadAction } from '../handlers/alarmLogEntriesHandler';
 import { setPanelAction } from '../actions/panelChangeActions';
-import { Tooltip, IconButton, AppBar, Tabs, Tab } from '@material-ui/core';
-import Sync from '@material-ui/icons/Sync';
-import Refresh from '@material-ui/icons/Refresh';
+import { Tooltip, IconButton, AppBar, Tabs, Tab } from '@mui/material';
+import Sync from '@mui/icons-material/Sync';
+import Refresh from '@mui/icons-material/Refresh';
 
 import ClearStuckAlarmsDialog, { ClearStuckAlarmsDialogMode } from '../components/clearStuckAlarmsDialog';
 import RefreshAlarmLogDialog, { RefreshAlarmLogDialogMode } from '../components/refreshAlarmLogDialog';
@@ -99,7 +99,7 @@ class FaultApplicationComponent extends React.Component<FaultApplicationComponen
     this.setState({ clearAlarmDialogMode: ClearStuckAlarmsDialogMode.Show, stuckAlarms: stuckAlarms })
   }
 
-  private onHandleTabChange = (event: React.ChangeEvent<{}>, newValue: PanelId) => {
+  private onHandleTabChange = (event: React.SyntheticEvent, newValue: PanelId) => {
     this.onToggleTabs(newValue);
   }
 
@@ -162,8 +162,8 @@ class FaultApplicationComponent extends React.Component<FaultApplicationComponen
 
     return (
       <>
-        <AppBar position="static" >
-          <Tabs value={activePanelId} onChange={this.onHandleTabChange} aria-label="fault-tabs">
+        <AppBar enableColorOnDark position="static" >
+          <Tabs indicatorColor="secondary" textColor="inherit" value={activePanelId} onChange={this.onHandleTabChange} aria-label="fault-tabs">
             <Tab aria-label="current-problem-list-tab" label="Current Problem List" value="CurrentProblem" />
             <Tab aria-label="alarm-notifications-list-tab" label={`Alarm Notifications (${this.props.faultNotifications.faults.length})`} value="AlarmNotifications" />
             <Tab aria-label="alarm-log-tab" label="Alarm Log" value="AlarmLog" />
index da092d0..d34d31c 100644 (file)
@@ -84,7 +84,7 @@ module.exports = (env) => {
         manifest: require(path.resolve(frameworkPath, "app-manifest.json")),
         sourceType: "umd2"
       }),
-      ...(env === "release") ? [
+      ...(env === "release" ? [
         new webpack.DefinePlugin({
           "process.env": {
             NODE_ENV: "'production'",
@@ -102,7 +102,7 @@ module.exports = (env) => {
             from: 'index.html',
             to: distPath
           }]),
-        ]
+        ])
     ],
 
     devServer: {
index 51e383b..5bcfdce 100644 (file)
   "author": "Matthias Fischer",
   "license": "Apache-2.0",
   "dependencies": {
+    "@emotion/react": "^11.7.0",
+    "@emotion/styled": "^11.6.0",
+    "@mui/icons-material": "^5.2.0",
+    "@mui/material": "^5.2.2",
+    "@mui/styles": "^5.2.2",
     "@odlux/framework": "*",
-    "marked": "0.6.0",
+    "@types/highlight.js": "9.12.3",
     "@types/marked": "0.6.0",
+    "github-markdown-css": "2.10.0",
     "highlight.js": "9.13.1",
-    "@types/highlight.js": "9.12.3",
-    "github-markdown-css": "2.10.0"
+    "marked": "0.6.0"
   },
   "peerDependencies": {
-    "@types/react": "17.0.3",
-    "@types/react-dom": "17.0.2",
-    "@types/react-router-dom": "5.1.7",
-    "@material-ui/core": "4.11.4",
-    "@material-ui/icons": "4.11.2",
     "@types/classnames": "2.2.6",
     "@types/flux": "3.1.8",
     "@types/jquery": "3.3.10",
+    "@types/react": "17.0.37",
+    "@types/react-dom": "17.0.11",
+    "@types/react-router-dom": "5.1.7",
     "jquery": "3.3.1",
-    "react": "17.0.1",
-    "react-dom": "17.0.1",
+    "react": "17.0.2",
+    "react-dom": "17.0.2",
     "react-router-dom": "5.2.0"
   }
-}
\ No newline at end of file
+}
index 1409357..fd4cd3f 100644 (file)
  */
 import * as React from 'react';
 
-import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/styles';
+import { Theme } from '@mui/material/styles';
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
 import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';  // select app icon
 
 import connect, { Connect } from '../../../../framework/src/flux/connect';
 import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
 
-import Typography from '@material-ui/core/Typography';
+import Typography from '@mui/material/Typography';
 import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
 import { faQuestionCircle } from '@fortawesome/free-solid-svg-icons';
 import { withRouter, RouteComponentProps } from 'react-router';
index fc7b8df..295b3ca 100644 (file)
 
 import * as React from "react"
 import { TocTreeNode } from "../models/tocNode"
-import { Typography, Link, makeStyles, Theme, createStyles } from "@material-ui/core"
+import { Typography, Link, Theme } from "@mui/material";
+
+import makeStyles from '@mui/styles/makeStyles';
+import createStyles from '@mui/styles/createStyles';
 
 const useStyles = makeStyles((theme: Theme) =>
     createStyles({
@@ -57,7 +60,7 @@ const TocEntry: React.FunctionComponent<tocEntryProps> = (props) => {
     return (<div>
         {
             areNodesEmpty ? <Typography variant="h6">
-                <Link onClick={(event: any) => navigate(event, props.overviewUri)} className={classes.link}> {props.label}</Link>
+                <Link underline="hover" onClick={(event: any) => navigate(event, props.overviewUri)} className={classes.link}> {props.label}</Link>
             </Typography> :
                 <>
                     <Typography variant="h6">
@@ -65,11 +68,11 @@ const TocEntry: React.FunctionComponent<tocEntryProps> = (props) => {
                     </Typography>
                     <div className={classes.container}>
                         <Typography variant="body1">
-                            <Link onClick={(event: any) => navigate(event, props.overviewUri)} className={classes.sublink}>Overview</Link>
+                            <Link underline="hover" onClick={(event: any) => navigate(event, props.overviewUri)} className={classes.sublink}>Overview</Link>
                         </Typography>
                         {props.nodes !== undefined && props.nodes.map((item, index) =>
                             <Typography variant="body1" key={index + 'x' + item.id}>
-                                <Link onClick={(event: any) => navigate(event, item.uri)} className={classes.sublink}>{item.label}</Link>
+                                <Link underline="hover" onClick={(event: any) => navigate(event, item.uri)} className={classes.sublink}>{item.label}</Link>
                             </Typography>
                         )}
                     </div>
index 65d4609..2d8b036 100644 (file)
@@ -23,7 +23,7 @@ import * as React from 'react'
 import { FunctionComponent } from "react";
 import { IApplicationStoreState } from "../../../../framework/src/store/applicationStore";
 import TocEntry from "../components/tocEntry";
-import { Typography } from "@material-ui/core";
+import { Typography } from "@mui/material";
 
 const mapProps = (state: IApplicationStoreState) => ({
     helpToc: state.help.toc,
index 14ab528..963a99e 100644 (file)
@@ -103,7 +103,7 @@ module.exports = (env) => {
         manifest: require(path.resolve(frameworkPath, "app-manifest.json")),
         sourceType: "umd2"
       }),
-      ...(env === "release") ? [
+      ...(env === "release" ? [
         new webpack.DefinePlugin({
           "process.env": {
             NODE_ENV: "'production'",
@@ -121,7 +121,7 @@ module.exports = (env) => {
             from: 'index.html',
             to: distPath
           }]),
-        ]
+        ])
     ],
     devServer: {
       public: "http://localhost:3100",
index e78f3ac..5e37c52 100644 (file)
   "author": "Matthias Fischer",
   "license": "Apache-2.0",
   "dependencies": {
+    "@emotion/react": "^11.7.0",
+    "@emotion/styled": "^11.6.0",
+    "@mui/icons-material": "^5.2.0",
+    "@mui/material": "^5.2.2",
+    "@mui/styles": "^5.2.2",
     "@odlux/framework": "*"
   },
   "peerDependencies": {
-    "@types/react": "17.0.3",
-    "@types/react-dom": "17.0.2",
-    "@types/react-router-dom": "5.1.7",
-    "@material-ui/core": "4.11.4",
-    "@material-ui/icons": "4.11.2",
     "@types/classnames": "2.2.6",
     "@types/flux": "3.1.8",
     "@types/jquery": "3.3.10",
+    "@types/react": "17.0.37",
+    "@types/react-dom": "17.0.11",
+    "@types/react-router-dom": "5.1.7",
     "jquery": "3.3.1",
-    "react": "17.0.1",
-    "react-dom": "17.0.1",
+    "react": "17.0.2",
+    "react-dom": "17.0.2",
     "react-router-dom": "5.2.0"
   }
-}
\ No newline at end of file
+}
index d2efb4e..04658a3 100644 (file)
  */
 import * as React from 'react';
 
-import Button from '@material-ui/core/Button';
-import Dialog from '@material-ui/core/Dialog';
-import DialogActions from '@material-ui/core/DialogActions';
-import DialogContent from '@material-ui/core/DialogContent';
-import DialogContentText from '@material-ui/core/DialogContentText';
-import DialogTitle from '@material-ui/core/DialogTitle';
+import Button from '@mui/material/Button';
+import Dialog from '@mui/material/Dialog';
+import DialogActions from '@mui/material/DialogActions';
+import DialogContent from '@mui/material/DialogContent';
+import DialogContentText from '@mui/material/DialogContentText';
+import DialogTitle from '@mui/material/DialogTitle';
 
 import { inventoryElementsReloadAction } from '../handlers/inventoryElementsHandler';
 import { IDispatcher, connect, Connect } from '../../../../framework/src/flux/connect';
@@ -94,13 +94,13 @@ class RefreshInventoryDialogComponent extends React.Component<RefreshInventoryDi
         <DialogActions>
           <Button aria-label="dialog-confirm-button" onClick={(event) => {
             this.onRefresh();
-          }} > {setting.applyButtonText} </Button>
+          }} color="inherit" > {setting.applyButtonText} </Button>
           <Button aria-label="dialog-cancel-button" onClick={(event) => {
             this.onCancel();
           }} color="secondary"> {setting.cancelButtonText} </Button>
         </DialogActions>
       </Dialog>
-    )
+    );
   }
 
   private onRefresh = () => {
index 0a1bea0..284f702 100644 (file)
@@ -22,8 +22,8 @@ import { RouteComponentProps, withRouter } from 'react-router-dom';
 import connect, { IDispatcher, Connect } from "../../../../framework/src/flux/connect";
 import { IApplicationStoreState } from "../../../../framework/src/store/applicationStore";
 import { MaterialTable, MaterialTableCtorType, ColumnType } from "../../../../framework/src/components/material-table";
-import { AppBar, Tabs, Tab, MenuItem, Typography } from "@material-ui/core";
-import Refresh from '@material-ui/icons/Refresh';
+import { AppBar, Tabs, Tab, MenuItem, Typography } from "@mui/material";
+import Refresh from '@mui/icons-material/Refresh';
 import { PanelId } from "../models/panelId";
 import { setPanelAction } from "../actions/panelActions";
 
@@ -77,7 +77,7 @@ class DashboardSelectorComponent extends React.Component<DashboardComponentProps
     };
   }
 
-  private onHandleTabChange = (event: React.ChangeEvent<{}>, newValue: PanelId) => {
+  private onHandleTabChange = (event: React.SyntheticEvent, newValue: PanelId) => {
     this.onTogglePanel(newValue);
   }
 
@@ -133,8 +133,8 @@ class DashboardSelectorComponent extends React.Component<DashboardComponentProps
     const { panelId: activePanelId } = this.props;
     return (
       <>
-        <AppBar position="static">
-          <Tabs value={activePanelId} onChange={this.onHandleTabChange} aria-label="inventory-app-tabs">
+        <AppBar enableColorOnDark position="static">
+          <Tabs indicatorColor="secondary" textColor="inherit" value={activePanelId} onChange={this.onHandleTabChange} aria-label="inventory-app-tabs">
             <Tab label="Table View" value="InventoryElementsTable" aria-label="table-tab" />
             <Tab label="Tree view" value="TreeviewTable" aria-label="treeview-tab" />
           </Tabs>
index f03b30c..2526639 100644 (file)
 import * as React from "react";
 import { withRouter, RouteComponentProps } from 'react-router-dom';
 
-import Button from '@material-ui/core/Button';
-import { WithStyles, withStyles, createStyles, Theme } from '@material-ui/core/styles'; // infra for styling
+import Button from '@mui/material/Button';
+import { Theme } from '@mui/material/styles'; // infra for styling
+
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
 
 const styles = (theme: Theme) => createStyles({
   warnButton: {
@@ -34,7 +38,7 @@ export const Detail = withStyles( styles )( withRouter( (props: DetailProps) =>
     <h1>Detail {props.match.params.id}</h1>
     <p>This are the information about {props.staticContext}.</p>
     <Button color={"secondary"} variant={"contained"}>Start</Button>
-    <Button className={ props.classes.warnButton } variant={"contained"}>Stop</Button>
+    <Button color="inherit" className={ props.classes.warnButton } variant={"contained"}>Stop</Button>
   </div>
 )));
 
index cfcfd3f..b0e962d 100644 (file)
  * ============LICENSE_END==========================================================================
  */
 import * as React from "react";
-import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/styles';
+import { Theme } from '@mui/material/styles';
+
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
 
 import { renderObject } from '../../../../framework/src/components/objectDump';
 import { Connect, connect, IDispatcher } from '../../../../framework/src/flux/connect';
@@ -24,8 +28,8 @@ import { TreeView, TreeViewCtorType, SearchMode } from '../../../../framework/sr
 
 import { IApplicationStoreState } from "../../../../framework/src/store/applicationStore";
 
-import Breadcrumbs from '@material-ui/core/Breadcrumbs';
-import Link from '@material-ui/core/Link';
+import Breadcrumbs from '@mui/material/Breadcrumbs';
+import Link from '@mui/material/Link';
 
 import { updateInventoryTreeAsyncAction, selectInventoryNodeAsyncAction, UpdateSelectedNodeAction, UpdateExpandedNodesAction, setSearchTermAction } from "../actions/inventoryTreeActions";
 import { TreeDemoItem } from "../models/inventory";
@@ -41,11 +45,11 @@ const styles = (theme: Theme) => createStyles({
   tree: {
     flex: "1 0 0%",
     minWidth: "250px",
-    padding: `0px ${theme.spacing(1)}px`
+    padding: `0px ${theme.spacing(1)}`
   },
   details: {
     flex: "5 0 0%",
-    padding: `0px ${theme.spacing(1)}px`
+    padding: `0px ${theme.spacing(1)}`
   }
 });
 
@@ -108,12 +112,12 @@ class DashboardComponent extends React.Component<TreeviewComponentProps, Treevie
       <div style={scrollbar} >
         <div >
           <Breadcrumbs aria-label="breadcrumbs">
-            <Link color="inherit" href="#" aria-label="back-breadcrumb"
+            <Link underline="hover" color="inherit" href="#" aria-label="back-breadcrumb"
               onClick={(event: React.MouseEvent<HTMLElement>) => {
                 event.preventDefault();
                 this.props.history.push(filteredDashboardPath);
               }}>Back</Link>
-            <Link color="inherit" href="#"
+            <Link underline="hover" color="inherit" href="#"
               aria-label={this.props.match.params.mountId + '-breadcrumb'}
               onClick={(event: React.MouseEvent<HTMLElement>) => {
                 event.preventDefault();
index 3668cf0..403cc53 100644 (file)
@@ -86,7 +86,7 @@ module.exports = (env) => {
         manifest: require(path.resolve(frameworkPath, "app-manifest.json")),
         sourceType: "umd2"
       }),
-      ...(env === "release") ? [
+      ...(env === "release" ? [
         new webpack.DefinePlugin({
           "process.env": {
             NODE_ENV: "'production'",
@@ -104,7 +104,7 @@ module.exports = (env) => {
             from: 'index.html',
             to: distPath
           }]),
-        ]
+        ])
     ],
 
     devServer: {
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/.babelrc b/sdnr/wt/odlux/apps/lineOfSightApp/.babelrc
deleted file mode 100644 (file)
index 3d8cd12..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "presets": [
-    ["@babel/preset-react"],
-    ["@babel/preset-env", {
-      "targets": {
-        "chrome": "66"
-      },
-      "spec": true,
-      "loose": false,
-      "modules": false,
-      "debug": false,
-      "useBuiltIns": "usage",
-      "forceAllTransforms": true
-    }]
-  ],
-  "plugins": []
-}
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/package.json b/sdnr/wt/odlux/apps/lineOfSightApp/package.json
deleted file mode 100644 (file)
index dbba7ec..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-{
-  "name": "@odlux/line-of-sight-app",
-  "version": "0.1.0",
-  "description": "A react based modular UI to display event log from a database.",
-  "main": "index.js",
-  "scripts": {
-    "start": "webpack-dev-server --env debug",
-    "build": "webpack --env release --config webpack.config.js",
-    "build:dev": "webpack --env debug --config webpack.config.js"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://git.mfico.de/highstreet-technologies/odlux.git"
-  },
-  "keywords": [
-    "reactjs",
-    "redux",
-    "ui",
-    "framework"
-  ],
-  "author": "Aijana Schumann",
-  "license": "Apache-2.0",
-  "dependencies": {
-    "@odlux/framework": "*",
-    "@types/d3": "^6.7.0",
-    "@types/mapbox-gl": "^1.10.2",
-    "@types/node": "^12.0.0",
-    "d3": "^7.0.0",
-    "d3-polygon": "^3.0.1",
-    "mapbox-gl": "^1.11.0",
-    "object.values": "^1.1.1"
-  },
-  "peerDependencies": {
-    "@material-ui/core": "4.11.4",
-    "@material-ui/icons": "4.11.2",
-    "@types/classnames": "2.2.6",
-    "@types/flux": "3.1.8",
-    "@types/jquery": "3.3.10",
-    "@types/react": "17.0.3",
-    "@types/react-dom": "17.0.2",
-    "@types/react-router-dom": "5.1.7",
-    "jquery": "3.3.1",
-    "react": "17.0.1",
-    "react-dom": "17.0.1",
-    "react-router-dom": "5.2.0"
-  }
-}
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/pom.xml b/sdnr/wt/odlux/apps/lineOfSightApp/pom.xml
deleted file mode 100644 (file)
index 717bb9b..0000000
+++ /dev/null
@@ -1,159 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ ============LICENSE_START=======================================================
-  ~ ONAP : ccsdk features
-  ~ ================================================================================
-  ~ Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
-  ~ ================================================================================
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  ~ ============LICENSE_END=======================================================
-  ~
-  -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.onap.ccsdk.parent</groupId>
-        <artifactId>binding-parent</artifactId>
-        <version>2.3.2</version>
-        <relativePath/>
-    </parent>
-
-    <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
-    <artifactId>sdnr-wt-odlux-app-lineOfSightApp</artifactId>
-    <version>1.3.0-SNAPSHOT</version>
-    <packaging>bundle</packaging>
-
-    <name>ccsdk-features :: ${project.artifactId}</name>
-    <licenses>
-        <license>
-            <name>Apache License, Version 2.0</name>
-            <url>http://www.apache.org/licenses/LICENSE-2.0</url>
-        </license>
-    </licenses>
-
-    <properties>
-        <maven.javadoc.skip>true</maven.javadoc.skip>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>sdnr-wt-odlux-core-model</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>sdnr-wt-odlux-core-provider</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <sourceDirectory>src2/main/java</sourceDirectory>
-        <resources>
-            <resource>
-                <directory>dist</directory>
-                <targetPath>odlux</targetPath>
-            </resource>
-            <resource>
-                <directory>src2/main/resources</directory>
-            </resource>
-            <resource>
-                <directory>src2/test/resources</directory>
-            </resource>
-        </resources>
-        <plugins>
-            <plugin>
-                <artifactId>maven-clean-plugin</artifactId>
-                <configuration>
-                    <filesets>
-                        <fileset>
-                            <directory>dist</directory>
-                            <followSymlinks>false</followSymlinks>
-                        </fileset>
-                        <fileset>
-                            <directory>node</directory>
-                            <followSymlinks>false</followSymlinks>
-                        </fileset>
-                        <fileset>
-                            <directory>node_modules</directory>
-                            <followSymlinks>false</followSymlinks>
-                        </fileset>
-                        <fileset>
-                            <directory>../node_modules</directory>
-                            <followSymlinks>false</followSymlinks>
-                        </fileset>
-                        <!-- eclipse bug build bin folder in basedir -->
-                        <fileset>
-                            <directory>bin</directory>
-                            <followSymlinks>false</followSymlinks>
-                        </fileset>
-                    </filesets>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>build-helper-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>add-test-source</id>
-                        <phase>generate-test-sources</phase>
-                        <goals>
-                            <goal>add-test-source</goal>
-                        </goals>
-                        <configuration>
-                            <sources>
-                                <source>src2/test/java</source>
-                            </sources>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>de.jacks-it-lab</groupId>
-                <artifactId>frontend-maven-plugin</artifactId>
-                <version>1.7.2</version>
-                <executions>
-                    <execution>
-                        <id>install node and yarn</id>
-                        <goals>
-                            <goal>install-node-and-yarn</goal>
-                        </goals>
-                        <!-- optional: default phase is "generate-resources" -->
-                        <phase>initialize</phase>
-                        <configuration>
-                            <nodeVersion>v12.13.0</nodeVersion>
-                            <yarnVersion>v1.22.10</yarnVersion>
-                        </configuration>
-                    </execution>
-                    <execution>
-                        <id>yarn build</id>
-                        <goals>
-                            <goal>yarn</goal>
-                        </goals>
-                        <configuration>
-                            <arguments>run build</arguments>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/actions/commonActions.ts b/sdnr/wt/odlux/apps/lineOfSightApp/src/actions/commonActions.ts
deleted file mode 100644 (file)
index 3cc8ea4..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
- import { Height } from "model/Height";
-import { isNumber } from "../utils/math";
-import { Action } from "../../../../framework/src/flux/action";
- import { Dispatch } from "../../../../framework/src/flux/store";
- import { IApplicationStoreState } from "../../../../framework/src/store/applicationStore";
- import { LatLon } from "../model/LatLon";
-
- export class SetPassedInValuesAction extends Action{
-     constructor(public start: LatLon, public end: LatLon, public center: LatLon, public heightA : Height |null, public heightB: Height |null){
-         super();
-     }
- }
-
- export class SetReachableAction extends Action{
-     constructor(public reachable: boolean | null){
-         super();
-     }
- }
-
- export const SetPassedInValues = (values: (string|null)[]) => (dispatcher: Dispatch) =>{
-
-     const start: LatLon = {latitude: Number(values[0]), longitude: Number(values[1])}
-     const end: LatLon = {latitude: Number(values[2]), longitude: Number(values[3])};
-     const midpoint = calculateMidPoint(start.latitude, start.longitude, end.latitude, end.longitude);
-     const center: LatLon = {latitude: midpoint[1], longitude: midpoint[0]};
-     const heightA: Height | null = isNumber(values[4]) && isNumber(values[5]) ? {amsl:+values[4]!, antennaHeight: +values[5]!} : null;
-     const heightB: Height | null = isNumber(values[6]) && isNumber(values[7]) ? {amsl:+values[6]!, antennaHeight: +values[7]!} : null;
-
-
-    dispatcher(new SetPassedInValuesAction(start, end, center, heightA, heightB));
- }
-
- //taken from https://www.movable-type.co.uk/scripts/latlong.html
-const calculateMidPoint = (lat1: number, lon1: number, lat2: number, lon2: number) =>{
-
-    const dLon = degrees_to_radians(lon2 - lon1);
-
-    //convert to radians
-    lat1 = degrees_to_radians(lat1);
-    lat2 = degrees_to_radians(lat2);
-    lon1 = degrees_to_radians(lon1);
-
-    const Bx = Math.cos(lat2) * Math.cos(dLon);
-    const By = Math.cos(lat2) * Math.sin(dLon);
-    const lat3 = Math.atan2(Math.sin(lat1) + Math.sin(lat2), Math.sqrt((Math.cos(lat1) + Bx) * (Math.cos(lat1) + Bx) + By * By));
-    const lon3 = lon1 + Math.atan2(By, Math.cos(lat1) + Bx);
-
-    return [radians_to_degrees(lon3), radians_to_degrees(lat3)];
-}
-
-const degrees_to_radians = (degrees: number) =>
-{
-return degrees * (Math.PI/180);
-}
-
-const radians_to_degrees = (radians:number) =>{
-    
-    var pi = Math.PI;
-    return radians * (180/pi);
-}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/actions/mapActions.ts b/sdnr/wt/odlux/apps/lineOfSightApp/src/actions/mapActions.ts
deleted file mode 100644 (file)
index 37ef5ee..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { LatLon } from "../model/LatLon";
-import { Action } from "../../../../framework/src/flux/action";
-import { Height } from "model/Height";
-
-export class SetChartAction extends Action{
-    constructor(public startPoint: LatLon, public endPoint: LatLon, public heightA: Height, public heightB: Height){
-        super();
-    }
-}
-
-export class SetStartPointAction extends Action{
-    constructor(public startPoint: LatLon|null){
-        super();
-    }
-}
-
-export class SetEndpointAction extends Action{
-    constructor(public endPoint: LatLon|null){
-        super();
-    }
-}
-
-export class SetHeightA extends Action{
-    constructor(public height: Height){
-        super();
-    }
-}
-
-export class SetHeightB extends Action{
-    constructor(public height: Height){
-        super();
-    }
-}
-
-export class ClearSavedChartAction extends Action{
-    constructor(){
-        super();
-    }
-}
-
-export class SetMapCenterAction extends Action{
-    /**
-     *
-     */
-    constructor(public point: LatLon, public zoom: number) {
-        super();
-        
-    }
-}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/components/ConnectionErrorPoup.tsx b/sdnr/wt/odlux/apps/lineOfSightApp/src/components/ConnectionErrorPoup.tsx
deleted file mode 100644 (file)
index 7d9339f..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { faExclamationTriangle } from "@fortawesome/free-solid-svg-icons"
-import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"
-import { Paper, Typography } from "@material-ui/core"
-import * as React from "react"
-
-type props = { reachable: boolean|null};
-
-
-const ConnectionErrorPoup: React.FunctionComponent<props> = (props) => {
-
-    return (props.reachable === false ?  
-    <Paper style={{padding:5, position: 'absolute', top: 160, width: 230, left:"40%",  zIndex:1}}>
-        <div style={{display: 'flex', flexDirection: 'column'}}>
-        <div style={{'alignSelf': 'center', marginBottom:5}}> <Typography> <FontAwesomeIcon icon={faExclamationTriangle} /> Connection Error</Typography></div>
-         <Typography>Service unavailable</Typography>
-        </div>
-    </Paper> : null
-)
-
-}
-
-export default ConnectionErrorPoup;
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/components/heightChart.tsx b/sdnr/wt/odlux/apps/lineOfSightApp/src/components/heightChart.tsx
deleted file mode 100644 (file)
index 3030fe7..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import * as React from 'react';
-
-import type { FC } from 'react';
-import * as d3 from 'd3';
-
-import { useD3 } from "../hooks/d3";
-import { GPSProfileResult } from "../model/GPSProfileResult";
-import { max } from '../utils/math';
-
-type HeightMapProps = {
-  data: GPSProfileResult[];
-  dataMin: GPSProfileResult;
-  dataMax: GPSProfileResult;
-  width: number;
-  height: number;
-  heightPosA: number;
-  heightPosB: number;
-}
-
-const HeightChart: FC<HeightMapProps> = (props) => {
-  const { data, dataMin, dataMax, heightPosA, heightPosB } = props;
-  let ref: React.RefObject<SVGSVGElement>
-
-  const drawSvg = () => {
-    ref = useD3(
-      (svg) => {
-        const margin = 100;
-        const width = Number(svg.attr("width")) - margin;
-        const height = Number(svg.attr("height")) - margin;
-
-        // Add X axis
-        const x = d3.scaleBand()
-          .range([0, width])
-          .domain(data.map(d => (`${d.gps.latitude},${d.gps.latitude}`)))
-          .padding(0.2);
-
-        const maxHeight = max([dataMax.height, heightPosA, heightPosB], d => d)
-
-        // Add Y axis
-        const y = d3.scaleLinear()
-          .domain([dataMin.height, maxHeight])
-          .range([height, 0]);
-
-        svg.append("g")
-          .attr('transform', `translate(${margin / 2}, ${margin / 2})`)
-          .call(d3.axisLeft(y));
-
-        // Bars
-        svg.selectAll("myBar")
-          .data(data)
-          .join("rect")
-          .attr('transform', `translate(${margin / 2}, ${margin / 2})`)
-          .attr("x", d => x(`${d.gps.latitude},${d.gps.latitude}`) || '')
-          .attr("y", d => y(d.height))
-          .attr("width", x.bandwidth())
-          .attr("fill", "#69b3a2b0")
-          .attr("height", d => height - y(d.height)) // always equal to 0
-
-        const firstX = `${data[0].gps.latitude},${data[0].gps.latitude}`
-        const lastX = `${data[data.length - 1].gps.latitude},${data[data.length - 1].gps.latitude}`;
-
-        //add line
-        const x1 = x(firstX)!;
-        const x2 = x(lastX)!;
-
-        svg.append("line")
-          .attr('transform', `translate(${margin / 2}, ${margin / 2})`)
-          .attr("x1", x1)
-          .attr("y1", y(props.heightPosA))
-          .attr("x2", x2)
-          .attr("y2", y(props.heightPosB)) 
-
-          .style("stroke", "#88A")
-          .attr("stroke-width", "3px")
-
-        //append circle on start and end 
-
-        svg.append("circle")
-          .attr('transform', `translate(${margin / 2}, ${margin / 2})`)
-          .attr('cx', x1)
-          .attr('cy', y(props.heightPosA))
-          .attr('r', 10)
-          .attr('stroke', '#223b53')
-          .attr('fill', '#225ba3');
-
-        svg.append("circle")
-          .attr('transform', `translate(${margin / 2}, ${margin / 2})`)
-          .attr('cx', x2)
-          .attr('cy', y(props.heightPosB))
-          .attr('r', 10)
-          .attr('stroke', '#223b53')
-          .attr('fill', '#225ba3');
-      },
-      [data]
-    );
-  }
-
-  drawSvg();
-
-
-
-  return (
-    <svg ref={ref!} width={props.width} height={props.height} />
-
-  );
-}
-
-export { HeightChart };
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/components/map.tsx b/sdnr/wt/odlux/apps/lineOfSightApp/src/components/map.tsx
deleted file mode 100644 (file)
index 6f29d59..0000000
+++ /dev/null
@@ -1,329 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import * as React from 'react'
-import * as mapboxgl from 'mapbox-gl';
-import { render } from 'react-dom';
-import { RouteComponentProps, withRouter } from 'react-router-dom';
-import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
-import connect, { Connect, IDispatcher } from '../../../../framework/src/flux/connect';
-import { OSM_STYLE, URL_BASEPATH } from '../config';
-import { GPSProfileResult } from '../model/GPSProfileResult';
-import MapContextMenu from './mapContextMenu';
-import { getGPSProfile } from '../services/heightService';
-import { max, min } from '../utils/math';
-import { HeightChart } from './heightChart';
-import { makeStyles } from '@material-ui/core';
-import { ClearSavedChartAction, SetChartAction, SetEndpointAction, SetHeightA, SetHeightB, SetMapCenterAction, SetStartPointAction } from '../actions/mapActions';
-import { LatLon } from '../model/LatLon';
-import MapInfo from './mapInfo';
-import { Height } from 'model/Height';
-import { PictureAsPdf } from '@material-ui/icons';
-import ConnectionErrorPoup from './ConnectionErrorPoup';
-import { addBaseLayer, addBaseSource, addPoint } from '../utils/map';
-import { SetReachableAction } from '../actions/commonActions';
-
-import 'mapbox-gl/dist/mapbox-gl.css';
-
-type mapProps = RouteComponentProps & Connect<typeof mapStateToProps, typeof mapDispatchToProps>;
-
-const mapStateToProps = (state: IApplicationStoreState) => ({
-    center: state.lineOfSight.map.center,
-    zoom: state.lineOfSight.map.zoom,
-    start: state.lineOfSight.map.start,
-    end: state.lineOfSight.map.end,
-    heightA: state.lineOfSight.map.heightA,
-    heightB: state.lineOfSight.map.heightB,
-    ready: state.lineOfSight.map.ready
-});
-
-const mapDispatchToProps = (dispatcher: IDispatcher) => ({
-  ClearChartAction: () => dispatcher.dispatch(new ClearSavedChartAction),
-  SetMapPosition: (point: LatLon, zoom: number) => dispatcher.dispatch(new SetMapCenterAction(point, zoom)),
-  SetHeightStart: (height: Height) => dispatcher.dispatch(new SetHeightA(height)),
-  SetHeightEnd: (height: Height) => dispatcher.dispatch(new SetHeightB(height)),
-  setStartPosition: (position: LatLon|null) => dispatcher.dispatch(new SetStartPointAction(position)),
-  setEndPosition: (position: LatLon|null) => dispatcher.dispatch(new SetEndpointAction(position)),
-  setReachable : (reachable: boolean |null) => dispatcher.dispatch(new SetReachableAction(reachable)),
-
-  
-
-})
-
-
-let map: mapboxgl.Map;
-
-const styles = makeStyles({
-    chart: {
-        position: "absolute",
-        top: 0,
-        bottom: 0,
-        left: 0,
-        right: 0
-      
-    }
-  });
-
-
-const Map: React.FC<mapProps> = (props) => {
-
-  //const [start, setStart] = React.useState<mapboxgl.LngLat| undefined>();
-  //const [end, setEnd] = React.useState<mapboxgl.LngLat| undefined>();
-  const [data, setData] = React.useState<GPSProfileResult[] | number>(Number.NaN);
-  const [dataMin, setDataMin] = React.useState<GPSProfileResult|undefined>();
-  const [dataMax, setDataMax] = React.useState<GPSProfileResult|undefined>();
-  const [isMapLoaded, setMapLoaded] = React.useState<boolean>(false);
-
-
-const mapRef = React.useRef<{ map: mapboxgl.Map | null }>({ map: null });
-const mapContainerRef = React.useRef<HTMLDivElement>(null);
-
-
-
-const classes = styles();
-
-const heightA = props.heightA !== null ? props.heightA.amsl +  props.heightA.antennaHeight : 0;
-const heightB = props.heightB !== null ? props.heightB.amsl +  props.heightB.antennaHeight : 0;
-
-const {start, end} = props;
-
-const handleResize = () =>{
-
-    if (map) {
-        // wait a moment until resizing actually happened
-        window.setTimeout(() => map.resize(), 500);
-    }
-
-}
-
-//on mount
-React.useEffect(()=>{
-
-    window.addEventListener("menu-resized", handleResize);
-    
-   
-    return () =>{
-      console.log("unmount")
-        window.removeEventListener("menu-resized", handleResize);
-
-        const center = mapRef.current.map?.getCenter();
-        const mapZoom = mapRef.current.map?.getZoom();
-        if(center){
-          props.SetMapPosition({latitude: center.lat, longitude:center.lng}, mapZoom!);
-        }
-
-        props.setReachable(null);
-    }
-
-},[]);
-
-
-    React.useEffect(()=>{
-
-        if(props.ready){
-            setupMap();
-        }
-
-    },[props.ready]);
-
-    React.useEffect(() => {
-        if (props.ready && isMapLoaded) {
-          drawChart();
-          updateLosUrl();
-        }
-
-      }, [start, end, isMapLoaded]);
-
-    const drawChart = () =>{
-      if(start && end){
-
-        addBaseSource(map, 'route');
-        addBaseLayer(map, 'route');
-
-        const json = `{
-          "type": "Feature",
-          "properties": {},
-          "geometry": {
-            "type": "LineString",
-            "coordinates": [
-              [${start.longitude}, ${start.latitude}],
-              [${end.longitude}, ${end.latitude}]
-            ]}
-          }`;
-         
-          
-  
-        (map.getSource("route") as mapboxgl.GeoJSONSource).setData(JSON.parse(json));
-          
-  
-        getGPSProfile({ latitude: start.latitude, longitude: start.longitude }, { latitude: end.latitude, longitude: end.longitude }).then(data => {
-          if (Array.isArray(data)) {
-            setDataMin(min(data, d => d.height));
-            setDataMax(max(data, d => d.height));
-          }
-          setData(data);
-        });
-      } 
-      else if (start || end){
-
-        const point = start!==null ? start: end!;
-        addBaseSource(map, 'route');
-        addBaseLayer(map, 'route');
-        addPoint(map, point);
-
-      }
-      else {
-        //delete layers and source
-        //used instead of clearing source data because it has better performance 
-        //(setting data to empty results in a noticable lag of line being cleared)
-        mapRef.current.map?.getLayer('line') && mapRef.current.map?.removeLayer('line') && mapRef.current.map?.removeLayer('points') && mapRef.current.map?.removeSource('route');
-      
-      }
-    }
-
-    const updateLosUrl = () =>{
-
-      if(start && end){
-        
-        const locationPart = `lat1=${start.latitude}&lon1=${start.longitude}&lat2=${end.latitude}&lon2=${end.longitude}`;
-
-        let heightPart = '';
-
-        if(props.heightA && props.heightB){
-        heightPart = `&amslA=${props.heightA.amsl}&antennaHeightA=${props.heightA.antennaHeight}&amslB=${props.heightB.amsl}&antennaHeightB=${props.heightB.antennaHeight}`;
-          
-        }
-          
-        props.history.replace(`/${URL_BASEPATH}/los?${locationPart}${heightPart}`)
-            
-      }else if(!start && !end){
-        props.history.replace(`/${URL_BASEPATH}`);
-      }
-    }
-
-    
-    const updateHeightA = (value:number, value2: number) =>{
-      props.SetHeightStart({amsl: value, antennaHeight: value2});
-    }
-
-    const updateHeightB = (value:number, value2: number) =>{
-      props.SetHeightEnd({amsl: value, antennaHeight: value2});
-    }
-
-    const OnEndPosition = (position: mapboxgl.LngLat) =>{
-      props.setEndPosition({latitude: position.lat, longitude: position.lng})
-    }
-
-    const OnStartPosition = (position: mapboxgl.LngLat) =>{
-      props.setStartPosition({latitude: position.lat, longitude: position.lng})
-    }
-    
-
-    const setupMap = () => {
-
-        let lat = props.center.latitude
-        let lon = props.center.longitude;
-        let zoom = props.zoom;
-
-        map = new mapboxgl.Map({
-            container: mapContainerRef.current!,
-            style: OSM_STYLE as any,
-            center: [lon, lat],
-            zoom: zoom,
-            accessToken: ''
-        });
-
-        mapRef.current.map = map;
-
-        map.on('load', (ev) => {
-
-            map.setMaxZoom(18);
-            setMapLoaded(true);
-           
-            //add source, layer
-
-            addBaseSource(map, 'route');
-            addBaseLayer(map, 'route');
-
-            });
-
-            let currentPopup: mapboxgl.Popup | null = null;
-            map.on('contextmenu', (e) => {
-
-              if (currentPopup)
-                currentPopup.remove();
-
-                //change height if start/end changes
-                //???  -> show value? / reset after chart display?
-          
-                const popupNode = document.createElement("div");
-                render(
-                  <MapContextMenu pos={e.lngLat}
-                    onStart={(p) => { OnStartPosition(p); if (currentPopup) currentPopup.remove(); }}
-                    onEnd={(p) => { OnEndPosition(p); if (currentPopup) currentPopup.remove(); }}
-                    onHeightA={(p,p1)=> updateHeightA(p, p1)}
-                    onHeightB={(p, p1)=> updateHeightB(p, p1)} />,
-                  popupNode);
-          
-                currentPopup = new mapboxgl.Popup()
-                  .setLngLat(e.lngLat)
-                  .setDOMContent(popupNode)
-                  .addTo(map);
-              });
-
-            map.on('moveend', mapMoveEnd);
-               
-        };
-
-        const mapMoveEnd = () =>{
-        const mapZoom = Number(map.getZoom().toFixed(2));
-        const lat = Number(map.getCenter().lat.toFixed(4));
-        const lon = Number(map.getCenter().lng.toFixed(4));
-
-        props.SetMapPosition({latitude: lat, longitude: lon}, mapZoom);
-        
-        }
-    
-
-
-    return <>
-    <div id="map" style={{ width: "100%", height:'100%', position: 'relative' }} ref={mapContainerRef} >
-    <MapInfo minHeight={dataMin} maxHeight={dataMax}  />
-    <ConnectionErrorPoup reachable={props.ready} />
-    
-    {typeof data === "object"
-        ? (
-          < div className={classes.chart} onClick={() => {
-            setData(Number.NaN);
-            setDataMax(undefined);
-            setDataMin(undefined);
-            props.ClearChartAction();
-          }}>
-            <HeightChart heightPosA={heightA} heightPosB={heightB} width={mapContainerRef.current?.clientWidth!} height={mapContainerRef.current?.clientHeight!} data={data} dataMin={dataMin!} dataMax={dataMax!} />
-          </div>
-        )
-        : null
-      }
-
-        </div>
-        </>
-}
-
-export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Map));
-
-
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/components/mapContextMenu.tsx b/sdnr/wt/odlux/apps/lineOfSightApp/src/components/mapContextMenu.tsx
deleted file mode 100644 (file)
index 0fc51ca..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { Button, InputAdornment, makeStyles, TextField, Tooltip } from "@material-ui/core";
-import * as React from "react";
-import { FC, useEffect, useState } from "react";
-import { getGPSHeight } from "../services/heightService";
-
-type MapContextMenuProps = {
-    pos: mapboxgl.LngLat;
-    onStart: (pos: mapboxgl.LngLat) => void;
-    onEnd: (pos: mapboxgl.LngLat) => void;
-    onHeightA: (height: number, antennaHeight: number) => void;
-    onHeightB: (height: number, antennaHeight: number) => void;
-
-  }
-
-  const styles = makeStyles({
-    flexContainer: {display: "flex", flexDirection:"row"},
-    textField:{width:60},
-    button:{marginRight:5, marginTop:5, flexGrow:2}
-  });
-  
-  const MapContextMenu: FC<MapContextMenuProps> = (props) => {
-    const { pos, onStart, onEnd } = props;
-    const [height, setHeight] = useState<number | undefined>(undefined);
-    const [value1, setValue1] = useState<string>('');
-    const [value2, setValue2] = useState<string>('');
-
-    const classes = styles();
-  
-    useEffect(() => {
-      getGPSHeight({ longitude: pos.lng, latitude: pos.lat }).then(setHeight);
-    }, [pos.lat, pos.lng]);
-
-    const handleChangeHeight = (e:React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>, id: "heightA"|"heightB") =>{
-      
-      //sanitize non numbers
-      const onlyNums = e.target.value.replace(/[^0-9]/g, '');
-      
-      if(id==="heightA"){
-        setValue1(onlyNums);
-      }else{
-        setValue2(onlyNums);
-      }
-    }
-  
-    return (
-      <div>
-        <div>Height: {height} m</div>
-        <div>
-        <div className={classes.flexContainer}>
-          <Button className={classes.button} variant="contained" onClick={() => { onStart(pos); props.onHeightA(height!,+value1); }}>Start</Button>
-          <Tooltip title="Please add the antenna height in meters above sea level.">
-          <TextField className={classes.textField} value={value1} onChange={(e)=>handleChangeHeight(e,"heightA")} InputProps={{endAdornment: <InputAdornment position="start">m</InputAdornment>}}/>
-          </Tooltip>
-          </div>
-        <div className={classes.flexContainer}>
-          <Button className={classes.button} variant="contained" onClick={() => { onEnd(pos); props.onHeightB(height!,+value2);}}>End</Button>
-          <Tooltip title="Please add the antenna height in meters above sea level.">
-          <TextField className={classes.textField} value={value2} onChange={(e)=>handleChangeHeight(e,"heightB")} InputProps={{endAdornment: <InputAdornment position="start">m</InputAdornment>}}/>
-          </Tooltip>
-          </div>
-        </div>
-        
-      </div>
-    );
-  };
-  
-
-  export default MapContextMenu;
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/components/mapInfo.tsx b/sdnr/wt/odlux/apps/lineOfSightApp/src/components/mapInfo.tsx
deleted file mode 100644 (file)
index 43a6e47..0000000
+++ /dev/null
@@ -1,171 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { Accordion, AccordionDetails, AccordionSummary, makeStyles, Paper, Typography } from '@material-ui/core';
-import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
-import { GPSProfileResult } from '../model/GPSProfileResult';
-import * as React from 'react';
-import { calculateDistanceInMeter } from '../utils/map';
-import connect, { Connect, IDispatcher } from '../../../../framework/src/flux/connect';
-import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
-
-const mapStateToProps = (state: IApplicationStoreState) => ({
-    center: state.lineOfSight.map.center,
-    zoom: state.lineOfSight.map.zoom,
-    start: state.lineOfSight.map.start,
-    end: state.lineOfSight.map.end,
-    heightA: state.lineOfSight.map.heightA,
-    heightB: state.lineOfSight.map.heightB,
-});
-
-const mapDispatchToProps = (dispatcher: IDispatcher) => ({
-  
-
-})
-
-type props =  Connect<typeof mapStateToProps, typeof mapDispatchToProps> & {
-    minHeight: GPSProfileResult | undefined;
-    maxHeight: GPSProfileResult | undefined;
-};
-
-const styles = (props: any) => makeStyles({
-    accordion: {padding: 5, position: 'absolute', top: 10, width: props.width, marginLeft: 10, zIndex:1},
-    container: { display: 'flex', flexDirection: "column", marginLeft:10, padding: 5 },
-    caption:{width:'40%'},
-    subTitleRow:{ width: '60%'},
-    titleRowElement:{width: '40%', fontWeight: "bold"},
-    secondRow:{width:'25%'},
-    thirdRow:{width:'20%'}
-  });
-
-const MapInfo: React.FC<props> = (props) =>{
-
-    const [expanded, setExpanded] = React.useState(false);
-    const [width, setWidth] = React.useState(470);
-    const [length, setLength] = React.useState<string | undefined>();
-
-    const classes = styles({width: width})(); 
-
-    const {start, end, center, zoom, heightA, heightB, minHeight, maxHeight} = props;
-
-    React.useEffect(()=>{
-
-        if(start && end){
-            setLength(calculateDistanceInMeter(start.latitude, start.longitude, end.latitude, end.longitude).toFixed(3))
-
-        }else{
-            setLength(undefined)
-        }
-
-    }, [start, end])
-
-    const handleChange = (event: any, isExpanded: boolean) => {
-        setExpanded(isExpanded);
-      };
-
-   
-
-
-    return <Accordion className={classes.accordion} expanded={expanded} onChange={handleChange}>
-    <AccordionSummary
-      expandIcon={<ExpandMoreIcon />}
-      aria-controls="panel1a-content"
-      id="panel1a-header"
-    >
-      <Typography >Map Info</Typography>
-    </AccordionSummary>
-    <AccordionDetails className={classes.container}>
-
-    
-    <Typography style={{ fontWeight: "bold", flex: "1" }} >Map Center</Typography>
-    
-    <div >
-        <div style={{ display: 'flex', flexDirection: "row" }}> 
-        <Typography className={classes.caption}> Longitude</Typography><Typography>{center.longitude}</Typography></div>
-        <div style={{ display: 'flex', flexDirection: "row" }}> 
-        <Typography className={classes.caption}> Latitude</Typography><Typography>{center.latitude}</Typography></div>
-        <div style={{ display: 'flex', flexDirection: "row" }}> 
-        <Typography className={classes.caption}> Zoom</Typography><Typography> {zoom}</Typography></div>
-        
-    </div>
-    <Typography style={{ fontWeight: "bold", flex: "1", marginTop:5 }} >Link</Typography>
-    
-    <div>
-    <div style={{ display: 'flex', flexDirection: "row", marginLeft:"38%" }}> 
-    <Typography className={classes.titleRowElement}> Start</Typography>
-    <Typography className={classes.titleRowElement}> End</Typography>
-    </div>
-
-    <div style={{ display: 'flex', flexDirection: "row" }}> 
-    
-    <Typography className={classes.caption}> Longitude</Typography>
-    <Typography className={classes.secondRow}> {start?.longitude.toFixed(3)}</Typography>
-    <Typography className={classes.secondRow}> {end?.longitude.toFixed(3)}</Typography></div>
-
-    
-    <div style={{ display: 'flex', flexDirection: "row" }}> 
-    
-    <Typography className={classes.caption}> Latitude</Typography>
-    <Typography className={classes.secondRow}> {start?.latitude.toFixed(3)}</Typography>
-    <Typography className={classes.secondRow}> {end?.latitude.toFixed(3)}</Typography></div>
-
-    
-
-    <div style={{ display: 'flex', flexDirection: "row" }}> 
-    
-    <Typography className={classes.caption}> Meassured height [m]</Typography>
-    <Typography className={classes.secondRow}> {heightA?.amsl}</Typography>
-    <Typography className={classes.secondRow}> {heightB?.amsl}</Typography>
-    </div>
-
-    <div style={{ display: 'flex', flexDirection: "row" }}> 
-    
-    <Typography className={classes.caption}> Antenna height [m] </Typography>
-    <Typography className={classes.secondRow}> {heightA?.antennaHeight}</Typography>
-    <Typography className={classes.secondRow}> {heightB?.antennaHeight}</Typography>
-    </div>
-
-    <div style={{ display: 'flex', flexDirection: "row" }}> 
-    
-    <Typography className={classes.caption}> Length [m]</Typography>
-    <Typography className={classes.secondRow}> {length}</Typography>
-  
-    </div>
-
-    <div style={{ display: 'flex', flexDirection: "row" }}> 
-    
-    <Typography className={classes.caption}> Max height @ position </Typography>
-    <Typography className={classes.thirdRow}> {maxHeight? maxHeight.height+' m': ''}</Typography>
-    <Typography className={classes.thirdRow}> {maxHeight?.gps.longitude.toFixed(3)}</Typography>
-    <Typography className={classes.thirdRow}> {maxHeight?.gps.latitude.toFixed(3)}</Typography>
-    </div>
-
-    <div style={{ display: 'flex', flexDirection: "row" }}> 
-    
-    <Typography className={classes.caption}> Min height @ position</Typography>
-    <Typography className={classes.thirdRow}> {minHeight? minHeight.height +' m': ''}</Typography>
-    <Typography className={classes.thirdRow}> {minHeight?.gps.longitude.toFixed(3)}</Typography>
-    <Typography className={classes.thirdRow}> {minHeight?.gps.latitude.toFixed(3)}</Typography>
-    </div>
-
-    </div>
-</AccordionDetails>
-</Accordion>
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(MapInfo);
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/config.ts b/sdnr/wt/odlux/apps/lineOfSightApp/src/config.ts
deleted file mode 100644 (file)
index bc1e1ff..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-export const URL_BASEPATH="lineOfSight";
-
-export const TERRAIN_URL="/terrain"; //http://10.20.11.163:5200  /terrain
-
-export const TILE_URL="/tiles"; //http://tile.openstreetmap.org  /tiles
-
-
-export const OSM_STYLE = {
-    'version': 8,
-    'sources': {
-        'raster-tiles': {
-            'type': 'raster',
-            'tiles': [
-                TILE_URL+'/{z}/{x}/{y}.png'
-            ],
-            'tileSize': 256,
-            'attribution':
-                '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
-        }
-    },
-    'layers': [
-        {
-            'id': 'simple-tiles',
-            'type': 'raster',
-            'source': 'raster-tiles',
-            'minZoom': 0,
-            'maxZoom': 18
-        }
-    ]
-};
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/handlers/mapHandler.ts b/sdnr/wt/odlux/apps/lineOfSightApp/src/handlers/mapHandler.ts
deleted file mode 100644 (file)
index 6d11977..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
- import { LatLon } from "../model/LatLon";
-import { IActionHandler } from "../../../../framework/src/flux/action";
-import { SetPassedInValuesAction, SetReachableAction } from "../actions/commonActions";
-import { ClearSavedChartAction, SetChartAction, SetEndpointAction, SetHeightA, SetHeightB, SetMapCenterAction, SetStartPointAction } from "../actions/mapActions";
-import { Height } from "model/Height";
-import { isNullOrUndefined } from "util";
-
- export interface IMap {
-   center: LatLon;
-   zoom: number;
-   start: LatLon |null;
-   heightA: Height | null;
-   end: LatLon|null;
-   heightB: Height | null;
-   ready: boolean |null;
- }
- const initialState: IMap = {
-    center: {latitude:52.4003, longitude:13.0584},
-    zoom: 12,
-    start: null,
-    end: null,
-    ready: null,
-    heightA: null,
-    heightB: null
-
- }
- export const mapHandler: IActionHandler<IMap> = (state = initialState, action) => {
-   if (action instanceof SetPassedInValuesAction) {
-     state = { ...state, start: action.start, end: action.end, center: action.center, heightA: action.heightA, heightB: action.heightB };
-   }
-   else if(action instanceof SetReachableAction){
-    state = { ...state, ready: action.reachable };
-     
-   }else if(action instanceof SetChartAction){
-     state = {...state, start:action.startPoint, end: action.endPoint, heightA: action.heightA, heightB: action.heightB}
-   }
-   else if(action instanceof SetStartPointAction){
-    state = {...state, start:action.startPoint}
-
-   }
-   else if(action instanceof SetEndpointAction){
-    state = {...state, end:action.endPoint}
-
-   }
-   else if(action instanceof SetHeightA){
-    state = {...state, heightA:action.height}
-
-   }
-   else if(action instanceof SetHeightB){
-    state = {...state, heightB:action.height}
-
-   }
-   else if(action instanceof ClearSavedChartAction){
-     state= {...state, start: null, end: null, heightA:null, heightB: null}
-   }else if(action instanceof SetMapCenterAction){
-     state={...state, zoom: action.zoom,center:action.point}
-   }
-   return state;
- }
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/handlers/rootHandler.ts b/sdnr/wt/odlux/apps/lineOfSightApp/src/handlers/rootHandler.ts
deleted file mode 100644 (file)
index e7d58c4..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
-* ============LICENSE_START========================================================================
-* ONAP : ccsdk feature sdnr wt odlux
-* =================================================================================================
-* Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
-* =================================================================================================
-* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
-* in compliance with the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software distributed under the License
-* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
-* or implied. See the License for the specific language governing permissions and limitations under
-* the License.
-* ============LICENSE_END==========================================================================
-*/
-// main state handler
-
-import { combineActionHandler } from '../../../../framework/src/flux/middleware';
-
-// ** do not remove **
-import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
-import { IActionHandler } from '../../../../framework/src/flux/action';
-
-
-import { IMap, mapHandler } from './mapHandler';
-
-export interface ILineOfSightAppStateState {
-  map: IMap;
-}
-
-
-
-
-declare module '../../../../framework/src/store/applicationStore' {
-  interface IApplicationStoreState {
-    lineOfSight: ILineOfSightAppStateState;
-  }
-}
-
-const actionHandlers = {
-  map: mapHandler,
-};
-
-export const lineofSightRootHandler = combineActionHandler<ILineOfSightAppStateState>(actionHandlers);
-export default lineofSightRootHandler;
-
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/hooks/d3.ts b/sdnr/wt/odlux/apps/lineOfSightApp/src/hooks/d3.ts
deleted file mode 100644 (file)
index dfebe86..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-/* eslint-disable react-hooks/exhaustive-deps */
-import { useEffect, useRef } from 'react';
-import type { DependencyList } from 'react';
-
-import * as d3 from 'd3';
-
-
-type SelectionType =  d3.Selection<SVGSVGElement, d3.BaseType, null, undefined>;
-
-export const useD3 = (renderChartFn: (selection: SelectionType) => void, dependencies: DependencyList) => {
-  const ref = useRef<SVGSVGElement>(null);
-
-  useEffect(() => {
-    if (ref.current) renderChartFn(d3.select(ref.current)); 
-    return () => { };
-  }, dependencies); 
-  
-  return ref;
-}
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/index.html b/sdnr/wt/odlux/apps/lineOfSightApp/src/index.html
deleted file mode 100644 (file)
index 6c1478e..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  <meta http-equiv="X-UA-Compatible" content="ie=edge">
-  <!-- <link rel="stylesheet" href="./vendor.css" > -->
-  <title>LineOfSightApp</title>
-</head>
-
-<body>
-  <div id="app"></div>
-  <script type="text/javascript" src="./require.js"></script>
-  <script type="text/javascript" src="./config.js"></script>
-  
-  <script>
-    // run the application
-    require(["app","connectApp","faultApp", "networkMapApp", "lineOfSightApp", "linkCalculationApp"], function (app, connectApp, faultApp, networkMapApp, lineOfSightApp, linkCalculationApp) {
-      connectApp.register();
-      faultApp.register();
-      //configurationApp.register();
-      //linkCalculationApp.register();
-      networkMapApp.register();
-      lineOfSightApp.register();
-      app("./app.tsx").runApplication();
-    });
-  </script>
-</body>
-
-</html>
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/model/GPSProfileResult.ts b/sdnr/wt/odlux/apps/lineOfSightApp/src/model/GPSProfileResult.ts
deleted file mode 100644 (file)
index 567946b..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-export type GPSProfileResult = { height: number, gps: { latitude: number, longitude: number }, band: string, zone: number, easting: number, northing: number };
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/model/Height.tsx b/sdnr/wt/odlux/apps/lineOfSightApp/src/model/Height.tsx
deleted file mode 100644 (file)
index 7014095..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-export type Height = {
-    amsl: number;
-    antennaHeight: number;
-}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/model/LatLon.ts b/sdnr/wt/odlux/apps/lineOfSightApp/src/model/LatLon.ts
deleted file mode 100644 (file)
index a447aa5..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-export type LatLon ={
-    latitude: number,
-    longitude: number
-}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/pluginLineOfSight.tsx b/sdnr/wt/odlux/apps/lineOfSightApp/src/pluginLineOfSight.tsx
deleted file mode 100644 (file)
index b193cfb..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-// app configuration and main entry point for the app
-
-import * as React from "react";
-import { faRoute } from '@fortawesome/free-solid-svg-icons'; // select app icon
-import applicationManager from '../../../framework/src/services/applicationManager';
-
-
-import { lineofSightRootHandler } from './handlers/rootHandler';
-import MainView from "./views/main";
-import applicationApi from "../../../framework/src/services/applicationApi";
-
-import { Redirect, Route, RouteComponentProps, Switch, useLocation, withRouter } from "react-router-dom";
-import connect, { Connect, IDispatcher } from "../../../framework/src/flux/connect";
-import { IApplicationStoreState } from "../../../framework/src/store/applicationStore";
-import { SetPassedInValues, SetReachableAction } from "./actions/commonActions";
-import { TERRAIN_URL, TILE_URL } from "./config";
-import { isNumber } from "./utils/math";
-
-const mapProps = (state: IApplicationStoreState) => ({
-});
-
-const mapDisp = (dispatcher: IDispatcher) => ({
-  setPassedInValues: (values: (string | null)[]) => dispatcher.dispatch(SetPassedInValues(values)),
-  setReachable: (reachable: boolean) => dispatcher.dispatch(new SetReachableAction(reachable))
-
-});
-
-let lastSearch = "";
-
-const useQuery = () => {
-  return new URLSearchParams(useLocation().search);
-}
-
-
-const LineOfSightApplicationRouteAdapter = connect(mapProps, mapDisp)((props: RouteComponentProps<{ mountId?: string }> & Connect<typeof mapProps, typeof mapDisp>) => {
-
-  let query = useQuery();
-
-  // called when component finshed mounting
-  React.useEffect(() => {
-    extractAndDispatchUrlValues(props.location.search);
-
-    //check tiles/terrain connectivity
-    tryCheckConnection();
-
-  }, []);
-
-
-  const extractAndDispatchUrlValues = (url: string) => {
-
-    if (lastSearch !== url) {
-      lastSearch = url;
-
-      //if mandatory values aren't there, do nothing
-      if (areMandatoryParamsPresent(query)) {
-        const values = extractValuesFromURL(query);
-        props.setPassedInValues(values);
-      }
-    }
-  }
-
-  const tryCheckConnection =() =>{
-    const terrain = fetch(`${TERRAIN_URL}/`);
-    const tiles = fetch(`${TILE_URL}/10/0/0.png`);
-
-    Promise.all([terrain, tiles])
-      .then((result) => {
-        props.setReachable(true);
-
-    })
-    .catch(error=>{
-      console.error("services not reachable.");
-      console.error(error);
-      props.setReachable(false);
-
-      })
-
-  }
-
-  /***
-   * 
-   * Checks if lat1, lon1, lat2, lon2 were passed in as url parameters
-   */
-  const areMandatoryParamsPresent = (query: URLSearchParams) => {
-
-    return isNumber(query.get("lat1")) && isNumber(query.get("lon1")) && isNumber(query.get("lat2")) && isNumber(query.get("lon2"))
-
-  }
-
-  const extractValuesFromURL = (query: URLSearchParams) => { 
-
-    return [query.get("lat1"), query.get("lon1"), query.get("lat2"), query.get("lon2"), query.get("amslA"), query.get("antennaHeightA"), query.get("amslB"), query.get("antennaHeightB")]
-  }
-
-  return (
-    <MainView />
-  );
-});
-
-
-const LoSRouterApp = withRouter(connect(mapProps, mapDisp)((props: RouteComponentProps & Connect<typeof mapProps, typeof mapDisp>) => {
-
-  return (
-    <Switch>
-      <Route path={`${props.match.path}`} component={LineOfSightApplicationRouteAdapter} />
-      <Redirect to={`${props.match.path}`} />
-    </Switch>
-  )
-}));
-
-export function register() {
-  applicationManager.registerApplication({
-    name: "lineOfSight", // used as name of state as well
-    icon: faRoute,
-    rootActionHandler: lineofSightRootHandler,
-    rootComponent: LoSRouterApp,
-    menuEntry: "Line of Sight"
-  });
-}
-
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/services/heightService.ts b/sdnr/wt/odlux/apps/lineOfSightApp/src/services/heightService.ts
deleted file mode 100644 (file)
index 8b05358..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { GPSProfileResult } from "../model/GPSProfileResult";
-import { TERRAIN_URL } from "../config";
-import { LatLon } from "../model/LatLon";
-
-export const apiUrlBase="api/Query";
-
-export const getGPSProfile = async (start: LatLon, end: LatLon) => {
-  const url = `${TERRAIN_URL}/${apiUrlBase}/GPSProfileRecords`;
-
-  const result = await fetch(url, {
-    method: "POST",
-    body: JSON.stringify({ start, end }),
-    headers: {
-      'Content-Type': 'application/json'
-      // 'Content-Type': 'application/x-www-form-urlencoded',
-    },
-  });
-  if (result.ok) {
-    const data = await result.json() as GPSProfileResult[];
-    return data;
-  }
-
-  return Number.NaN;
-}
-
-export const getGPSHeight = async (gpsCoord: LatLon) => {
-  const url = `${TERRAIN_URL}/${apiUrlBase}/GPSHeight`;
-
-  const result = await fetch(url, {
-    method: "POST",
-    body: JSON.stringify(gpsCoord),
-    headers: {
-      'Content-Type': 'application/json'
-      // 'Content-Type': 'application/x-www-form-urlencoded',
-    },
-  });
-  if (result.ok) {
-    const data = await result.json() as { height: number };
-    return data.height;
-  }else{
-    return undefined;
-  }
-}
-
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/styles/index.css b/sdnr/wt/odlux/apps/lineOfSightApp/src/styles/index.css
deleted file mode 100644 (file)
index ec2585e..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-body {
-  margin: 0;
-  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
-    'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
-    sans-serif;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-
-code {
-  font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
-    monospace;
-}
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/styles/mapbox-gl.css b/sdnr/wt/odlux/apps/lineOfSightApp/src/styles/mapbox-gl.css
deleted file mode 100644 (file)
index 03c479a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.mapboxgl-map{font:12px/20px Helvetica Neue,Arial,Helvetica,sans-serif;overflow:hidden;position:relative;-webkit-tap-highlight-color:rgba(0,0,0,0);text-align:left}.mapboxgl-map:-webkit-full-screen{width:100%;height:100%}.mapboxgl-canary{background-color:salmon}.mapboxgl-canvas-container.mapboxgl-interactive,.mapboxgl-ctrl-group button.mapboxgl-ctrl-compass{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.mapboxgl-canvas-container.mapboxgl-interactive.mapboxgl-track-pointer{cursor:pointer}.mapboxgl-canvas-container.mapboxgl-interactive:active,.mapboxgl-ctrl-group button.mapboxgl-ctrl-compass:active{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate,.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate .mapboxgl-canvas{touch-action:pan-x pan-y}.mapboxgl-canvas-container.mapboxgl-touch-drag-pan,.mapboxgl-canvas-container.mapboxgl-touch-drag-pan .mapboxgl-canvas{touch-action:pinch-zoom}.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan,.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan .mapboxgl-canvas{touch-action:none}.mapboxgl-ctrl-bottom-left,.mapboxgl-ctrl-bottom-right,.mapboxgl-ctrl-top-left,.mapboxgl-ctrl-top-right{position:absolute;pointer-events:none;z-index:2}.mapboxgl-ctrl-top-left{top:0;left:0}.mapboxgl-ctrl-top-right{top:0;right:0}.mapboxgl-ctrl-bottom-left{bottom:0;left:0}.mapboxgl-ctrl-bottom-right{right:0;bottom:0}.mapboxgl-ctrl{clear:both;pointer-events:auto;transform:translate(0)}.mapboxgl-ctrl-top-left .mapboxgl-ctrl{margin:10px 0 0 10px;float:left}.mapboxgl-ctrl-top-right .mapboxgl-ctrl{margin:10px 10px 0 0;float:right}.mapboxgl-ctrl-bottom-left .mapboxgl-ctrl{margin:0 0 10px 10px;float:left}.mapboxgl-ctrl-bottom-right .mapboxgl-ctrl{margin:0 10px 10px 0;float:right}.mapboxgl-ctrl-group{border-radius:4px;background:#fff}.mapboxgl-ctrl-group:not(:empty){-moz-box-shadow:0 0 2px rgba(0,0,0,.1);-webkit-box-shadow:0 0 2px rgba(0,0,0,.1);box-shadow:0 0 0 2px rgba(0,0,0,.1)}@media (-ms-high-contrast:active){.mapboxgl-ctrl-group:not(:empty){box-shadow:0 0 0 2px ButtonText}}.mapboxgl-ctrl-group button{width:29px;height:29px;display:block;padding:0;outline:none;border:0;box-sizing:border-box;background-color:transparent;cursor:pointer}.mapboxgl-ctrl-group button+button{border-top:1px solid #ddd}.mapboxgl-ctrl button .mapboxgl-ctrl-icon{display:block;width:100%;height:100%;background-repeat:no-repeat;background-position:50%}@media (-ms-high-contrast:active){.mapboxgl-ctrl-icon{background-color:transparent}.mapboxgl-ctrl-group button+button{border-top:1px solid ButtonText}}.mapboxgl-ctrl button::-moz-focus-inner{border:0;padding:0}.mapboxgl-ctrl-group button:focus{box-shadow:0 0 2px 2px #0096ff}.mapboxgl-ctrl button:disabled{cursor:not-allowed}.mapboxgl-ctrl button:disabled .mapboxgl-ctrl-icon{opacity:.25}.mapboxgl-ctrl button:not(:disabled):hover{background-color:rgba(0,0,0,.05)}.mapboxgl-ctrl-group button:focus:focus-visible{box-shadow:0 0 2px 2px #0096ff}.mapboxgl-ctrl-group button:focus:not(:focus-visible){box-shadow:none}.mapboxgl-ctrl-group button:focus:first-child{border-radius:4px 4px 0 0}.mapboxgl-ctrl-group button:focus:last-child{border-radius:0 0 4px 4px}.mapboxgl-ctrl-group button:focus:only-child{border-radius:inherit}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E")}}.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E")}}.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath d='M10.5 16l4 8 4-8h-8z' fill='%23ccc'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath d='M10.5 16l4 8 4-8h-8z' fill='%23999'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath d='M10.5 16l4 8 4-8h-8z' fill='%23ccc'/%3E%3C/svg%3E")}}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23aaa'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath d='M14 5l1 1-9 9-1-1 9-9z' fill='red'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e58978'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e54e33'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-waiting .mapboxgl-ctrl-icon{-webkit-animation:mapboxgl-spin 2s linear infinite;-moz-animation:mapboxgl-spin 2s infinite linear;-o-animation:mapboxgl-spin 2s infinite linear;-ms-animation:mapboxgl-spin 2s infinite linear;animation:mapboxgl-spin 2s linear infinite}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23999'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath d='M14 5l1 1-9 9-1-1 9-9z' fill='red'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e58978'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e54e33'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23666'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath d='M14 5l1 1-9 9-1-1 9-9z' fill='red'/%3E%3C/svg%3E")}}@-webkit-keyframes mapboxgl-spin{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(1turn)}}@-moz-keyframes mapboxgl-spin{0%{-moz-transform:rotate(0deg)}to{-moz-transform:rotate(1turn)}}@-o-keyframes mapboxgl-spin{0%{-o-transform:rotate(0deg)}to{-o-transform:rotate(1turn)}}@-ms-keyframes mapboxgl-spin{0%{-ms-transform:rotate(0deg)}to{-ms-transform:rotate(1turn)}}@keyframes mapboxgl-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}a.mapboxgl-ctrl-logo{width:88px;height:23px;margin:0 0 -4px -4px;display:block;background-repeat:no-repeat;cursor:pointer;overflow:hidden;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='88' height='23' viewBox='0 0 88 23' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd'%3E%3Cdefs%3E%3Cpath id='a' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='b' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='c'%3E%3Crect width='100%25' height='100%25' fill='%23fff'/%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/mask%3E%3Cg opacity='.3' stroke='%23000' stroke-width='3'%3E%3Ccircle mask='url(%23c)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23b' mask='url(%23c)'/%3E%3C/g%3E%3Cg opacity='.9' fill='%23fff'%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/g%3E%3C/svg%3E")}a.mapboxgl-ctrl-logo.mapboxgl-compact{width:23px}@media (-ms-high-contrast:active){a.mapboxgl-ctrl-logo{background-color:transparent;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='88' height='23' viewBox='0 0 88 23' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd'%3E%3Cdefs%3E%3Cpath id='a' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='b' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='c'%3E%3Crect width='100%25' height='100%25' fill='%23fff'/%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/mask%3E%3Cg stroke='%23000' stroke-width='3'%3E%3Ccircle mask='url(%23c)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23b' mask='url(%23c)'/%3E%3C/g%3E%3Cg fill='%23fff'%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/g%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){a.mapboxgl-ctrl-logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='88' height='23' viewBox='0 0 88 23' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd'%3E%3Cdefs%3E%3Cpath id='a' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='b' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='c'%3E%3Crect width='100%25' height='100%25' fill='%23fff'/%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/mask%3E%3Cg stroke='%23fff' stroke-width='3' fill='%23fff'%3E%3Ccircle mask='url(%23c)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23b' mask='url(%23c)'/%3E%3C/g%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/svg%3E")}}.mapboxgl-ctrl.mapboxgl-ctrl-attrib{padding:0 5px;background-color:hsla(0,0%,100%,.5);margin:0}@media screen{.mapboxgl-ctrl-attrib.mapboxgl-compact{min-height:20px;padding:0;margin:10px;position:relative;background-color:#fff;border-radius:3px 12px 12px 3px}.mapboxgl-ctrl-attrib.mapboxgl-compact:hover{padding:2px 24px 2px 4px;visibility:visible;margin-top:6px}.mapboxgl-ctrl-bottom-left>.mapboxgl-ctrl-attrib.mapboxgl-compact:hover,.mapboxgl-ctrl-top-left>.mapboxgl-ctrl-attrib.mapboxgl-compact:hover{padding:2px 4px 2px 24px;border-radius:12px 3px 3px 12px}.mapboxgl-ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-inner{display:none}.mapboxgl-ctrl-attrib.mapboxgl-compact:hover .mapboxgl-ctrl-attrib-inner{display:block}.mapboxgl-ctrl-attrib.mapboxgl-compact:after{content:"";cursor:pointer;position:absolute;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' height='24' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd'%3E%3Cpath d='M4 10a6 6 0 1012 0 6 6 0 10-12 0m5-3a1 1 0 102 0 1 1 0 10-2 0m0 3a1 1 0 112 0v3a1 1 0 11-2 0'/%3E%3C/svg%3E");background-color:hsla(0,0%,100%,.5);width:24px;height:24px;box-sizing:border-box;border-radius:12px}.mapboxgl-ctrl-bottom-right>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{bottom:0;right:0}.mapboxgl-ctrl-top-right>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{top:0;right:0}.mapboxgl-ctrl-top-left>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{top:0;left:0}.mapboxgl-ctrl-bottom-left>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{bottom:0;left:0}}@media screen and (-ms-high-contrast:active){.mapboxgl-ctrl-attrib.mapboxgl-compact:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' height='24' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd' fill='%23fff'%3E%3Cpath d='M4 10a6 6 0 1012 0 6 6 0 10-12 0m5-3a1 1 0 102 0 1 1 0 10-2 0m0 3a1 1 0 112 0v3a1 1 0 11-2 0'/%3E%3C/svg%3E")}}@media screen and (-ms-high-contrast:black-on-white){.mapboxgl-ctrl-attrib.mapboxgl-compact:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' height='24' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd'%3E%3Cpath d='M4 10a6 6 0 1012 0 6 6 0 10-12 0m5-3a1 1 0 102 0 1 1 0 10-2 0m0 3a1 1 0 112 0v3a1 1 0 11-2 0'/%3E%3C/svg%3E")}}.mapboxgl-ctrl-attrib a{color:rgba(0,0,0,.75);text-decoration:none}.mapboxgl-ctrl-attrib a:hover{color:inherit;text-decoration:underline}.mapboxgl-ctrl-attrib .mapbox-improve-map{font-weight:700;margin-left:2px}.mapboxgl-attrib-empty{display:none}.mapboxgl-ctrl-scale{background-color:hsla(0,0%,100%,.75);font-size:10px;border:2px solid #333;border-top:#333;padding:0 5px;color:#333;box-sizing:border-box}.mapboxgl-popup{position:absolute;top:0;left:0;display:-webkit-flex;display:flex;will-change:transform;pointer-events:none}.mapboxgl-popup-anchor-top,.mapboxgl-popup-anchor-top-left,.mapboxgl-popup-anchor-top-right{-webkit-flex-direction:column;flex-direction:column}.mapboxgl-popup-anchor-bottom,.mapboxgl-popup-anchor-bottom-left,.mapboxgl-popup-anchor-bottom-right{-webkit-flex-direction:column-reverse;flex-direction:column-reverse}.mapboxgl-popup-anchor-left{-webkit-flex-direction:row;flex-direction:row}.mapboxgl-popup-anchor-right{-webkit-flex-direction:row-reverse;flex-direction:row-reverse}.mapboxgl-popup-tip{width:0;height:0;border:10px solid transparent;z-index:1}.mapboxgl-popup-anchor-top .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-top:none;border-bottom-color:#fff}.mapboxgl-popup-anchor-top-left .mapboxgl-popup-tip{-webkit-align-self:flex-start;align-self:flex-start;border-top:none;border-left:none;border-bottom-color:#fff}.mapboxgl-popup-anchor-top-right .mapboxgl-popup-tip{-webkit-align-self:flex-end;align-self:flex-end;border-top:none;border-right:none;border-bottom-color:#fff}.mapboxgl-popup-anchor-bottom .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-bottom:none;border-top-color:#fff}.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-tip{-webkit-align-self:flex-start;align-self:flex-start;border-bottom:none;border-left:none;border-top-color:#fff}.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-tip{-webkit-align-self:flex-end;align-self:flex-end;border-bottom:none;border-right:none;border-top-color:#fff}.mapboxgl-popup-anchor-left .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-left:none;border-right-color:#fff}.mapboxgl-popup-anchor-right .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-right:none;border-left-color:#fff}.mapboxgl-popup-close-button{position:absolute;right:0;top:0;border:0;border-radius:0 3px 0 0;cursor:pointer;background-color:transparent}.mapboxgl-popup-close-button:hover{background-color:rgba(0,0,0,.05)}.mapboxgl-popup-content{position:relative;background:#fff;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.1);padding:10px 10px 15px;pointer-events:auto}.mapboxgl-popup-anchor-top-left .mapboxgl-popup-content{border-top-left-radius:0}.mapboxgl-popup-anchor-top-right .mapboxgl-popup-content{border-top-right-radius:0}.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-content{border-bottom-left-radius:0}.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-content{border-bottom-right-radius:0}.mapboxgl-popup-track-pointer{display:none}.mapboxgl-popup-track-pointer *{pointer-events:none;user-select:none}.mapboxgl-map:hover .mapboxgl-popup-track-pointer{display:flex}.mapboxgl-map:active .mapboxgl-popup-track-pointer{display:none}.mapboxgl-marker{position:absolute;top:0;left:0;will-change:transform}.mapboxgl-user-location-dot,.mapboxgl-user-location-dot:before{background-color:#1da1f2;width:15px;height:15px;border-radius:50%}.mapboxgl-user-location-dot:before{content:"";position:absolute;-webkit-animation:mapboxgl-user-location-dot-pulse 2s infinite;-moz-animation:mapboxgl-user-location-dot-pulse 2s infinite;-ms-animation:mapboxgl-user-location-dot-pulse 2s infinite;animation:mapboxgl-user-location-dot-pulse 2s infinite}.mapboxgl-user-location-dot:after{border-radius:50%;border:2px solid #fff;content:"";height:19px;left:-2px;position:absolute;top:-2px;width:19px;box-sizing:border-box;box-shadow:0 0 3px rgba(0,0,0,.35)}@-webkit-keyframes mapboxgl-user-location-dot-pulse{0%{-webkit-transform:scale(1);opacity:1}70%{-webkit-transform:scale(3);opacity:0}to{-webkit-transform:scale(1);opacity:0}}@-ms-keyframes mapboxgl-user-location-dot-pulse{0%{-ms-transform:scale(1);opacity:1}70%{-ms-transform:scale(3);opacity:0}to{-ms-transform:scale(1);opacity:0}}@keyframes mapboxgl-user-location-dot-pulse{0%{transform:scale(1);opacity:1}70%{transform:scale(3);opacity:0}to{transform:scale(1);opacity:0}}.mapboxgl-user-location-dot-stale{background-color:#aaa}.mapboxgl-user-location-dot-stale:after{display:none}.mapboxgl-user-location-accuracy-circle{background-color:rgba(29,161,242,.2);width:1px;height:1px;border-radius:100%}.mapboxgl-crosshair,.mapboxgl-crosshair .mapboxgl-interactive,.mapboxgl-crosshair .mapboxgl-interactive:active{cursor:crosshair}.mapboxgl-boxzoom{position:absolute;top:0;left:0;width:0;height:0;background:#fff;border:2px dotted #202020;opacity:.5}@media print{.mapbox-improve-map{display:none}}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/utils/map.ts b/sdnr/wt/odlux/apps/lineOfSightApp/src/utils/map.ts
deleted file mode 100644 (file)
index abdd27e..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import * as mapboxgl from "mapbox-gl";
-import { LatLon } from "../model/LatLon";
-
-
-export const addBaseSource = (map : mapboxgl.Map, name: string) =>{
-
-  if(!map.getSource(name))
-
-    map.addSource(name, {
-        type: 'geojson',
-        data: { type: "FeatureCollection", features: [] }
-    });
-
-}
-
-export const addPoint = (map : mapboxgl.Map, point: LatLon) =>{
-  const json = `{
-    "type": "Feature",
-    "properties": {},
-    "geometry": {
-      "type": "Point",
-      "coordinates": 
-        [${point.longitude}, ${point.latitude}]
-      }
-    }`;
-    
-    
-      (map.getSource("route") as mapboxgl.GeoJSONSource).setData(JSON.parse(json));
-}
-
-export const addBaseLayer = (map: mapboxgl.Map, sourceName: string) =>{
-
-  if(!map.getLayer('line'))
-    map.addLayer({
-        'id': 'line',
-        'type': 'line',
-        'source': sourceName,
-        'layout': {
-          'line-join': 'round',
-          'line-cap': 'round'
-        },
-        'paint': {
-          'line-color': '#88A',
-          'line-width': 6,
-          'line-opacity': 0.75
-        }
-      });
-
-      if(!map.getLayer('points'))
-      map.addLayer({
-        id: 'points',
-        type: 'circle',
-        source: sourceName,
-        paint: {
-          'circle-radius': 5,
-          'circle-color': '#223b53',
-          'circle-stroke-color': '#225ba3',
-          'circle-stroke-width': 3,
-          'circle-opacity': 0.5
-        }
-      });
-}
-
-export const calculateDistanceInMeter = (lat1: number, lon1: number, lat2: number, lon2: number) => {
-    const lonRad1 = toRad(lon1);
-    const latRad1 = toRad(lat1);
-    const lonRad2 = toRad(lon2);
-    const latRad2 = toRad(lat2);
-  
-    const dLon = lonRad2 - lonRad1;
-    const dLat = latRad2 - latRad1;
-    const a = Math.pow(Math.sin(dLat / 2), 2) +
-        Math.cos(latRad1) * Math.cos(latRad2) *
-        Math.pow(Math.sin(dLon / 2), 2);
-  
-    const c = 2 * Math.asin(Math.sqrt(a));
-  
-    return 6378 * c;
-  
-  }
-  
-  function toRad(value: number) {
-    return (value * Math.PI) / 180;
-  }
-  
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/utils/math.ts b/sdnr/wt/odlux/apps/lineOfSightApp/src/utils/math.ts
deleted file mode 100644 (file)
index 9e0447b..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-export const max = <T,>(a: T[], p: (v: T) => Number) => a.reduce<T>((m, x) => p(m) > p(x) ? m : x, a[0]);
-export const min = <T,>(a: T[], p: (v: T) => Number) => a.reduce<T>((m, x) => p(m) < p(x) ? m : x, a[0]);
-
-export const isNumber = (value: string|null) =>{
-
-    if(!value){
-      return false;
-    }else{
-      const num = Number(value);
-      return !isNaN(num);
-    }
-  }
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src/views/main.tsx b/sdnr/wt/odlux/apps/lineOfSightApp/src/views/main.tsx
deleted file mode 100644 (file)
index bbe6f34..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import * as React from 'react';
-import  Map from '../components/map';
-
-function MainView() {
-  return (
-    <div className="App" style={{height:"100%"}}>
-     <Map />
-    </div>
-  );
-}
-
-export default MainView;
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src2/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/MyOdluxBundle.java b/sdnr/wt/odlux/apps/lineOfSightApp/src2/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/MyOdluxBundle.java
deleted file mode 100644 (file)
index 43b072c..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt
- * =================================================================================================
- * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-package org.onap.ccsdk.features.sdnr.wt.odlux.bundles;
-
-import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundle;
-import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleLoader;
-
-public class MyOdluxBundle extends OdluxBundle {
-
-    @Override
-    public void initialize() {
-        super.initialize();
-    }
-
-    @Override
-    public void clean() {
-        super.clean();
-    }
-
-    @Override
-    public String getResourceFileContent(String filename) {
-        return super.getResourceFileContent(filename);
-    }
-
-    @Override
-    public boolean hasResource(String filename) {
-        return super.hasResource(filename);
-    }
-
-    @Override
-    public void setBundleName(String bundleName) {
-        super.setBundleName(bundleName);
-    }
-
-    @Override
-    public void setLoader(OdluxBundleLoader loader) {
-        super.setLoader(loader);
-    }
-
-    @Override
-    public String getBundleName() {
-        return super.getBundleName();
-    }
-
-    @Override
-    public OdluxBundleLoader getLoader() {
-        return super.getLoader();
-    }
-
-    public MyOdluxBundle() {
-        super();
-    }
-}
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src2/main/resources/OSGI-INF/blueprint/blueprint.xml b/sdnr/wt/odlux/apps/lineOfSightApp/src2/main/resources/OSGI-INF/blueprint/blueprint.xml
deleted file mode 100644 (file)
index 982379d..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-    <reference id="loadersvc" availability="mandatory" activation="eager" interface="org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleLoader"/>
-
-    <bean id="bundle" init-method="initialize" destroy-method="clean" class="org.onap.ccsdk.features.sdnr.wt.odlux.bundles.MyOdluxBundle">
-        <property name="loader" ref="loadersvc"/>
-        <property name="bundleName" value="lineOfSightApp"/>
-        <property name="index" value="130"/>
-    </bean>
-</blueprint>
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java b/sdnr/wt/odlux/apps/lineOfSightApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java
deleted file mode 100644 (file)
index c319bb1..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt
- * =================================================================================================
- * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-package org.onap.ccsdk.features.sdnr.wt.odlux.bundles.test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import org.junit.Test;
-import org.onap.ccsdk.features.sdnr.wt.odlux.OdluxBundleLoaderImpl;
-import org.onap.ccsdk.features.sdnr.wt.odlux.bundles.MyOdluxBundle;
-
-public class TestBundleRes {
-
-    @Test
-    public void test() {
-        OdluxBundleLoaderImpl loader = OdluxBundleLoaderImpl.getInstance();
-        MyOdluxBundle b = new MyOdluxBundle();
-        b.setLoader(loader);
-        b.setIndex(0);
-        b.setBundleName("abc");
-        b.initialize();
-        assertTrue(loader.getNumberOfBundles()==1);
-        assertNotNull(b.getLoader());
-        assertEquals("abc",b.getBundleName());
-        assertTrue(b.hasResource("test.js"));
-        assertNotNull(b.getResourceFileContent("test.js"));
-        b.clean();
-        assertTrue(loader.getNumberOfBundles()==0);
-    }
-
-}
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/src2/test/resources/test.js b/sdnr/wt/odlux/apps/lineOfSightApp/src2/test/resources/test.js
deleted file mode 100644 (file)
index b47fdc3..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-asdac sad 
-as
-d 
-sad
- sadfa
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/tsconfig.json b/sdnr/wt/odlux/apps/lineOfSightApp/tsconfig.json
deleted file mode 100644 (file)
index a66b5d8..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-{
-  "compilerOptions": {
-    "baseUrl": "./src",
-    "outDir": "./dist",
-    "sourceMap": true,
-    "forceConsistentCasingInFileNames": true,
-    "allowSyntheticDefaultImports": false,
-    "allowUnreachableCode": false,
-    "allowUnusedLabels": false,
-    "noFallthroughCasesInSwitch": true,
-    "noImplicitAny": true,
-    "noImplicitReturns": true,
-    "noImplicitThis": true,
-    "strictNullChecks": true,
-    "pretty": true,
-    "newLine": "LF",
-    "module": "es2015",
-    "target": "es2016",
-    "moduleResolution": "node",
-    "experimentalDecorators": true,
-    "jsx": "preserve",
-    "lib": [
-      "dom",
-      "es2015",
-      "es2016"
-    ],
-    "types": [
-      "prop-types",
-      "react",
-      "react-dom"
-    ]
-  },
-  "exclude": [
-    "dist",
-    "node_modules"
-  ]
-}
diff --git a/sdnr/wt/odlux/apps/lineOfSightApp/webpack.config.js b/sdnr/wt/odlux/apps/lineOfSightApp/webpack.config.js
deleted file mode 100644 (file)
index 54ba1b4..0000000
+++ /dev/null
@@ -1,211 +0,0 @@
-/**
- * Webpack 4 configuration file
- * see https://webpack.js.org/configuration/
- * see https://webpack.js.org/configuration/dev-server/
- */
-
-"use strict";
-
-const path = require("path");
-const webpack = require("webpack");
-const CopyWebpackPlugin = require("copy-webpack-plugin");
-const TerserPlugin = require('terser-webpack-plugin');
-
-// const __dirname = (path => path.replace(/^([a-z]\:)/, c => c.toUpperCase()))(process.__dirname());
-
-module.exports = (env) => {
-  const distPath = path.resolve(__dirname, env === "release" ? "." : "../..", "dist");
-  const frameworkPath = path.resolve(__dirname, env === "release" ? "../../framework" : "../..", "dist");
-  return [{
-    name: "App",
-
-    mode: "none", //disable default behavior
-
-    target: "web",
-
-    context: path.resolve(__dirname, "src"),
-
-    entry: {
-      lineOfSightApp: ["./pluginLineOfSight.tsx"]
-    },
-
-    devtool: env === "release" ? false : "source-map",
-
-    resolve: {
-      extensions: [".ts", ".tsx", ".js", ".jsx"]
-    },
-
-    output: {
-      path: distPath,
-      filename: "[name].js",
-      library: "[name]",
-      libraryTarget: "umd2",
-      chunkFilename: "[name].js"
-    },
-    module: {
-      rules: [{
-        test: /\.tsx?$/,
-        exclude: /node_modules/,
-        use: [{
-          loader: "babel-loader"
-        }, {
-          loader: "ts-loader"
-        }]
-      }, {
-        test: /\.jsx?$/,
-        exclude: /node_modules/,
-        use: [{
-          loader: "babel-loader"
-        }]
-      },
-       {
-        test: /\.(png|gif|jpg|svg)$/,
-        use: [{
-          loader: 'url-loader',
-          options: {
-            limit: 10000,
-            name: './icons/[hash].[ext]'
-          }
-        }]
-      },
-      {
-        test: /\.css$/i,
-        use: ["style-loader", "css-loader"],
-      },
-    ]
-    },
-
-    optimization: {
-      noEmitOnErrors: true,
-      namedModules: env !== "release",
-      minimize: env === "release",
-      minimizer: env !== "release" ? [] : [new TerserPlugin({
-        terserOptions: {
-          warnings: false, // false, true, "verbose"
-          compress: {
-            drop_console: true,
-            drop_debugger: true,
-          }
-        }
-      })],
-    },
-
-    plugins: [
-      new webpack.DllReferencePlugin({
-        context: path.resolve(__dirname, "../../framework/src"),
-        manifest: require(path.resolve(frameworkPath, "vendor-manifest.json")),
-        sourceType: "umd2"
-      }),
-      new webpack.DllReferencePlugin({
-        context: path.resolve(__dirname, "../../framework/src"),
-        manifest: require(path.resolve(frameworkPath, "app-manifest.json")),
-        sourceType: "umd2"
-      }),
-      ...(env === "release") ? [
-        new webpack.DefinePlugin({
-          "process.env": {
-            NODE_ENV: "'production'",
-            VERSION: JSON.stringify(require("./package.json").version)
-          }
-        }),
-      ] : [
-          new webpack.DefinePlugin({
-            "process.env": {
-              NODE_ENV: "'development'",
-              VERSION: JSON.stringify(require("./package.json").version)
-            }
-          }),
-          new CopyWebpackPlugin([{
-            from: 'index.html',
-            to: distPath
-          }]),
-        ]
-    ],
-
-    devServer: {
-      public: "http://localhost:3100",
-      contentBase: frameworkPath,
-
-      compress: true,
-      headers: {
-        "Access-Control-Allow-Origin": "*"
-      },
-      host: "0.0.0.0",
-      port: 3100,
-      disableHostCheck: true,
-      historyApiFallback: true,
-      inline: true,
-      hot: false,
-      quiet: false,
-      stats: {
-        colors: true
-      },
-      proxy: {
-        "/yang-schema/": {
-          target: "http://sdnr:8181",
-          secure: false
-        },  
-        "/userdata": {
-          target: "http://sdnr:8181",
-          secure: false
-        },  
-        "/userdata/": {
-          target: "http://sdnr:8181",
-          secure: false
-        }, 
-        "/oauth2/": {
-          target: "http://sdnr:8181",
-          secure: false
-        },
-        "/database/": {
-          target: "http://sdnr:8181",
-          secure: false
-        },
-        "/restconf/": {
-          target: "http://sdnr:8181",
-          secure: false
-        },
-        "/rests/": {
-          target: "http://sdnr:8181",
-          secure: false
-        },
-        "/topology/": {
-          target: "http://localhost:3002",
-          secure: false
-        },
-        "/sitedoc/": {
-          target: "http://10.20.35.184:3002",
-          secure: false,
-          pathRewrite(pathname) {
-            return pathname.replace(/^\/sitedoc/, '/topology/stadok')
-          }
-        },
-        "/terrain/": {
-          target: "http://10.20.11.163:5200",
-          secure: false,
-          pathRewrite(pathname) {
-            return pathname.replace(/^\/terrain/, '/')
-          }
-        },
-        "/tiles/": {
-          target: "http://tile.openstreetmap.org",
-          secure: false,
-          pathRewrite(pathname) {
-            return pathname.replace(/^\/tiles/, '')
-          }
-        },
-        "/help/": {
-          target: "http://sdnr:8181",
-          secure: false
-        },
-        "/websocket": {
-          target: "http://sdnr:8181",
-          ws: true,
-          changeOrigin: true,
-          secure: false
-        }
-      }
-
-    }
-  }];
-}
diff --git a/sdnr/wt/odlux/apps/linkCalculationApp/.babelrc b/sdnr/wt/odlux/apps/linkCalculationApp/.babelrc
deleted file mode 100644 (file)
index 3d8cd12..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "presets": [
-    ["@babel/preset-react"],
-    ["@babel/preset-env", {
-      "targets": {
-        "chrome": "66"
-      },
-      "spec": true,
-      "loose": false,
-      "modules": false,
-      "debug": false,
-      "useBuiltIns": "usage",
-      "forceAllTransforms": true
-    }]
-  ],
-  "plugins": []
-}
diff --git a/sdnr/wt/odlux/apps/linkCalculationApp/package.json b/sdnr/wt/odlux/apps/linkCalculationApp/package.json
deleted file mode 100644 (file)
index c03afe1..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-{
-  "name": "@odlux/linkcalculation-app",
-  "version": "0.1.0",
-  "description": "A react based modular UI to do link analysis.",
-  "main": "index.js",
-  "scripts": {
-    "start": "webpack-dev-server --env debug",
-    "build": "webpack --env release --config webpack.config.js",
-    "build:dev": "webpack --env debug --config webpack.config.js"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://git.mfico.de/highstreet-technologies/odlux.git"
-  },
-  "keywords": [
-    "reactjs",
-    "redux",
-    "ui",
-    "framework"
-  ],
-  "author": "Mohammad Boroon",
-  "license": "Apache-2.0",
-  "dependencies": {
-    "@odlux/framework": "*",
-    "formik": "^2.1.5",
-    "yup": "^0.29.3"
-  },
-  "peerDependencies": {
-    "@types/react": "17.0.3",
-    "@types/react-dom": "17.0.2",
-    "@types/react-router-dom": "5.1.7",
-    "@material-ui/core": "4.11.4",
-    "@material-ui/icons": "4.11.2",
-    "@types/classnames": "2.2.6",
-    "@types/flux": "3.1.8",
-    "@types/jquery": "3.3.10",
-    "jquery": "3.3.1",
-    "react": "17.0.1",
-    "react-dom": "17.0.1",
-    "react-router-dom": "5.2.0"
-  },
-  "devDependencies": {
-    "@types/yup": "^0.29.7",
-    "node-sass": "^4.14.1",
-    "sass": "^1.26.11",
-    "sass-loader": "^10.0.2",
-    "webpack": "^4.44.2"
-  }
-}
diff --git a/sdnr/wt/odlux/apps/linkCalculationApp/pom.xml b/sdnr/wt/odlux/apps/linkCalculationApp/pom.xml
deleted file mode 100644 (file)
index 606eb24..0000000
+++ /dev/null
@@ -1,159 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ ============LICENSE_START=======================================================
-  ~ ONAP : ccsdk features
-  ~ ================================================================================
-  ~ Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
-  ~ ================================================================================
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  ~ ============LICENSE_END=======================================================
-  ~
-  -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.onap.ccsdk.parent</groupId>
-        <artifactId>binding-parent</artifactId>
-        <version>2.3.2</version>
-        <relativePath/>
-    </parent>
-
-    <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
-    <artifactId>sdnr-wt-odlux-app-linkCalculationApp</artifactId>
-    <version>1.3.0-SNAPSHOT</version>
-    <packaging>bundle</packaging>
-
-    <name>ccsdk-features :: ${project.artifactId}</name>
-    <licenses>
-        <license>
-            <name>Apache License, Version 2.0</name>
-            <url>http://www.apache.org/licenses/LICENSE-2.0</url>
-        </license>
-    </licenses>
-
-    <properties>
-        <maven.javadoc.skip>true</maven.javadoc.skip>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>sdnr-wt-odlux-core-model</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>sdnr-wt-odlux-core-provider</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <sourceDirectory>src2/main/java</sourceDirectory>
-        <resources>
-            <resource>
-                <directory>dist</directory>
-                <targetPath>odlux</targetPath>
-            </resource>
-            <resource>
-                <directory>src2/main/resources</directory>
-            </resource>
-            <resource>
-                <directory>src2/test/resources</directory>
-            </resource>
-        </resources>
-        <plugins>
-            <plugin>
-                <artifactId>maven-clean-plugin</artifactId>
-                <configuration>
-                    <filesets>
-                        <fileset>
-                            <directory>dist</directory>
-                            <followSymlinks>false</followSymlinks>
-                        </fileset>
-                        <fileset>
-                            <directory>node</directory>
-                            <followSymlinks>false</followSymlinks>
-                        </fileset>
-                        <fileset>
-                            <directory>node_modules</directory>
-                            <followSymlinks>false</followSymlinks>
-                        </fileset>
-                        <fileset>
-                            <directory>../node_modules</directory>
-                            <followSymlinks>false</followSymlinks>
-                        </fileset>
-                        <!-- eclipse bug build bin folder in basedir -->
-                        <fileset>
-                            <directory>bin</directory>
-                            <followSymlinks>false</followSymlinks>
-                        </fileset>
-                    </filesets>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>build-helper-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>add-test-source</id>
-                        <phase>generate-test-sources</phase>
-                        <goals>
-                            <goal>add-test-source</goal>
-                        </goals>
-                        <configuration>
-                            <sources>
-                                <source>src2/test/java</source>
-                            </sources>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>de.jacks-it-lab</groupId>
-                <artifactId>frontend-maven-plugin</artifactId>
-                <version>1.7.2</version>
-                <executions>
-                    <execution>
-                        <id>install node and yarn</id>
-                        <goals>
-                            <goal>install-node-and-yarn</goal>
-                        </goals>
-                        <!-- optional: default phase is "generate-resources" -->
-                        <phase>initialize</phase>
-                        <configuration>
-                            <nodeVersion>v12.13.0</nodeVersion>
-                            <yarnVersion>v1.22.10</yarnVersion>
-                        </configuration>
-                    </execution>
-                    <execution>
-                        <id>yarn build</id>
-                        <goals>
-                            <goal>yarn</goal>
-                        </goals>
-                        <configuration>
-                            <arguments>run build</arguments>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/sdnr/wt/odlux/apps/linkCalculationApp/src/actions/commonLinkCalculationActions.ts b/sdnr/wt/odlux/apps/linkCalculationApp/src/actions/commonLinkCalculationActions.ts
deleted file mode 100644 (file)
index d499ec2..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { Action } from "../../../../framework/src/flux/action";
-import { Dispatch } from "../../../../framework/src/flux/store";
-import { IApplicationStoreState } from "../../../../framework/src/store/applicationStore";
-
-
-export class UpdateLinkIdAction extends Action {
-    constructor(public linkId: string) {
-        super();
-    }
-}
-
-export class UpdateFrequencyAction extends Action {
-    constructor(public frequency: number) {
-        super();
-    }
-}
-export class UpdateSiteAction extends Action {
-    constructor(
-        public siteA?: any,
-        public siteB?: any
-    ) {
-        super();
-    }
-}
-export class UpdateRainAttAction extends Action {
-
-    constructor(public rainAtt: number) {
-        super();
-    }
-}
-export class UpdateRainValAction extends Action {
-    constructor(public rainVal: number) {
-        super();
-    }
-}
-
-export class updateHideForm extends Action {
-    constructor(public formView: boolean) {
-        super();
-    }
-}
-export class UpdateDistanceAction extends Action {
-    constructor(public distance: number) {
-        super();
-    }
-}
-
-export class UpdateFslCalculation extends Action {
-    constructor(public fsl: number) {
-        super();
-    }
-}
-
-
-export class UpdateLatLonAction extends Action {
-    constructor(
-        public Lat1: number,
-        public Lon1: number,
-        public Lat2: number,
-        public Lon2: number
-    ) {
-        super();
-
-    }
-}
-export class UpdatePolAction extends Action {
-    constructor(public polarization: string) {
-        super();
-    }
-}
-export class isCalculationServerReachableAction extends Action {
-    constructor(public reachable: boolean) {
-        super();
-    }
-}
-export class updateAltitudeAction extends Action {
-    constructor(
-        public amslA: number,
-        public aglA: number,
-        public amslB: number,
-        public aglB: number
-    ) {
-        super();
-    }
-}
-export class UpdateAbsorptionLossAction extends Action {
-    constructor(
-        public absorptionOxygen: number,
-        public absorptionWater: number,
-
-    ) {
-        super();
-    }
-}
-export class UpdateWorstMonthRainAction extends Action {
-    constructor(public month: string) {
-        super();
-    }
-}
-
-
-export class UpdateAntennaGainAction extends Action {
-    constructor(public antennaGainA: number, public antennaGainB: number) {
-        super();
-    }
-}
-export class updateAntennaNameAction extends Action {
-    constructor(public antennaNameA: string, public antennaNameB: string) {
-        super();
-    }
-}
-export class UpdateTxPowerAction extends Action {
-    constructor(public txPowerA: string | null, public txPowerB: string | null) {
-        super();
-    }
-}
-export class UpdateRxSensitivityAction extends Action {
-    constructor(public rxSensitivityA: string | null, public rxSensitivityB: string | null) {
-        super();
-    }
-}
-export class UpdateWaveguideLossAction extends Action {
-    constructor(public waveguideLossA: number, public waveguideLossB: number) {
-        super();
-    }
-}
-
-export class UpdateEIRPAction extends Action {
-    constructor(public eirpA: number, public eirpB: number) {
-        super();
-    }
-}
-export class UpdateRxPowerAction extends Action {
-    constructor(public rxPowerA: number, public rxPowerB: number) {
-        super();
-    }
-}
-export class UpdateSomAction extends Action {
-    constructor(public somA: number, public somB:number) {
-        super();
-    }
-}
diff --git a/sdnr/wt/odlux/apps/linkCalculationApp/src/components/connectionInfo.tsx b/sdnr/wt/odlux/apps/linkCalculationApp/src/components/connectionInfo.tsx
deleted file mode 100644 (file)
index e6d82e2..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import * as React from 'react'
-
-import { IApplicationStoreState } from "../../../../framework/src/store/applicationStore";
-import connect, { IDispatcher, Connect } from "../../../../framework/src/flux/connect";
-import { Paper, Typography } from "@material-ui/core";
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
-
-
-type props = Connect<typeof mapStateToProps, typeof mapDispatchToProps>;
-
-const ConnectionInfo: React.FunctionComponent<props> = (props) => {
-
-    return (
-        (props.isCalculationServerReachable === false)?  <Paper style={{padding:5, width: 230, position:"absolute", top:"40%", left:"40%"}}>
-        <div style={{display: 'flex', flexDirection: 'column'}}>
-        <div style={{'alignSelf': 'center', marginBottom:5}}> <Typography> <FontAwesomeIcon icon={faExclamationTriangle} /> Connection Error</Typography></div>
-        {props.isCalculationServerReachable === false && <Typography> Calculation data can't be loaded.</Typography>}
-        </div>
-    </Paper> : null
-        
-)}
-
-const mapStateToProps = (state: IApplicationStoreState) => ({
-    isCalculationServerReachable: state.linkCalculation.calculations.reachable
-});
-
-
-
-const mapDispatchToProps = (dispatcher: IDispatcher) => ({
-
-    //zoomToSearchResult: (lat: number, lon: number) => dispatcher.dispatch(new ZoomToSearchResultAction(lat, lon))
-
-});;
-
-
-export default connect(mapStateToProps,mapDispatchToProps)(ConnectionInfo)
-
diff --git a/sdnr/wt/odlux/apps/linkCalculationApp/src/handlers/linkCalculationAppRootHandler.ts b/sdnr/wt/odlux/apps/linkCalculationApp/src/handlers/linkCalculationAppRootHandler.ts
deleted file mode 100644 (file)
index 01512eb..0000000
+++ /dev/null
@@ -1,199 +0,0 @@
-/**
-* ============LICENSE_START========================================================================
-* ONAP : ccsdk feature sdnr wt odlux
-* =================================================================================================
-* Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
-* =================================================================================================
-* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
-* in compliance with the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software distributed under the License
-* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
-* or implied. See the License for the specific language governing permissions and limitations under
-* the License.
-* ============LICENSE_END==========================================================================
-*/
-
-import { combineActionHandler } from '../../../../framework/src/flux/middleware';
-
-// ** do not remove **
-import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
-import { IActionHandler } from '../../../../framework/src/flux/action';;
-import { UpdateLinkIdAction, UpdateFrequencyAction , UpdateLatLonAction, UpdateRainAttAction, UpdateRainValAction, updateHideForm, UpdateFslCalculation, UpdateSiteAction, UpdateDistanceAction, isCalculationServerReachableAction, UpdatePolAction, updateAltitudeAction, UpdateAbsorptionLossAction, UpdateWorstMonthRainAction, UpdateEIRPAction, UpdateAntennaGainAction, UpdateTxPowerAction, UpdateRxSensitivityAction, updateAntennaNameAction, UpdateWaveguideLossAction, UpdateRxPowerAction, UpdateSomAction} from '../actions/commonLinkCalculationActions';
-
-declare module '../../../../framework/src/store/applicationStore' {
-  interface IApplicationStoreState {
-    linkCalculation: ICalculationsState;
-  }
-}
-
-type ICalculationsState = {
-  calculations:ILinkCalculationAppStateState
-}
-
-export type ILinkCalculationAppStateState= {
-  linkId: string | null,
-  frequency: number,
-  formView:boolean,
-  fsl:number,
-  distance:number,
-  Lat1: number,
-  Lon1: number,
-  Lat2: number, 
-  Lon2: number,
-  rainVal : number,
-  rainAtt : number,
-  siteA: string,
-  siteB: string,
-  reachable: boolean,
-  polarization : string | null,
-  amslA: number, 
-  amslB:number, 
-  aglA: number, 
-  aglB:number,
-  absorptionWater:number,
-  absorptionOxygen: number,
-  month: string, 
-  eirpA: number, 
-  eirpB: number, 
-  antennaGainA: number,
-  antennaGainB :number,
-  antennaNameA: string,
-  antennaNameB:string,
-  systemOperatingMarginA : number,
-  systemOperatingMarginB : number,
-  txPowerA : string,
-  txPowerB: string,
-  rxSensitivityA : string,
-  rxSensitivityB: string, 
-  waveguideLossA : number, 
-  waveguideLossB: number,
-  rxPowerA :number, 
-  rxPowerB: number
-}
-
-const initialState: ILinkCalculationAppStateState ={
-  linkId: null,
-  frequency: 0,
-  Lat1: 0,
-  Lon1: 0,
-  Lat2: 0,
-  Lon2: 0,
-  formView : false,
-  fsl:0,
-  distance:0,
-  siteA : '',
-  siteB: '',
-  rainVal : 0,
-  rainAtt: 0,
-  reachable : true,
-  polarization : 'Horizontal',
-  amslA: 0, 
-  amslB:0, 
-  aglA: 0, 
-  aglB:0,
-  absorptionWater:0,
-  absorptionOxygen: 0,
-  month: '', 
-  eirpA: 0, 
-  eirpB: 0, 
-  antennaGainA :0,
-  antennaGainB :0,
-  antennaNameA: '',
-  antennaNameB:'',
-  systemOperatingMarginA : 0,
-  systemOperatingMarginB : 0,
-  txPowerA : '0',
-  txPowerB: '0', 
-  rxSensitivityA: '0',
-  rxSensitivityB: '0', 
-  waveguideLossA : 0,
-  waveguideLossB: 0, 
-  rxPowerA : 0,
-  rxPowerB: 0
-}
-
-export const LinkCalculationHandler: IActionHandler<ILinkCalculationAppStateState> = (state=initialState, action) => {
-    
-  if(action instanceof UpdateLinkIdAction){
-      state = Object.assign({}, state, {linkId:action.linkId})
-  } 
-  else if(action instanceof updateHideForm){
-
-    state = Object.assign({}, state, {formView:action.formView})
-  }
-  else if (action instanceof UpdateDistanceAction){
-    state = Object.assign({}, state, {distance:action.distance})
-  }
-  else if (action instanceof UpdateFrequencyAction){
-    state = Object.assign({}, state, {frequency:action.frequency})
-  }
-  else if (action instanceof UpdateFslCalculation){
-  state = Object.assign({}, state, {fsl:action.fsl})
-  }
-  else if (action instanceof UpdateLatLonAction){
-    state = Object.assign({}, state, {Lat1:action.Lat1, Lon1:action.Lon1, Lat2:action.Lat2, Lon2:action.Lon2})
-  }
-  else if (action instanceof UpdateRainAttAction){
-    state = Object.assign({}, state, {rainAtt:action.rainAtt})
-  }
-  else if (action instanceof UpdateRainValAction){
-    state = Object.assign({}, state, {rainVal:action.rainVal})
-  }
-  else if (action instanceof UpdateSiteAction){
-    state = Object.assign({}, state, {siteA:action.siteA, siteB:action.siteB})
-  }
-  else if(action instanceof isCalculationServerReachableAction){
-    state = Object.assign({}, state, { reachable: action.reachable });
-  }
-  else if (action instanceof UpdatePolAction){
-    state = Object.assign({}, state, {polarization: action.polarization})
-  }
-  else if (action instanceof updateAltitudeAction){
-    state = Object.assign({}, state, {amslA:action.amslA, amslB:action.amslA, aglA:action.aglA, aglB:action.aglB})
-  }
-  else if (action instanceof UpdateAbsorptionLossAction){
-    state = Object.assign({}, state, {absorptionOxygen:action.absorptionOxygen, absorptionWater:action.absorptionWater})
-  }
-  else if (action instanceof UpdateWorstMonthRainAction){
-    state = Object.assign({}, state, {month:action.month})
-  }
-  
-  else if (action instanceof UpdateAntennaGainAction){
-    state = Object.assign({}, state, {antennaGainA:action.antennaGainA,antennaGainB:action.antennaGainB})
-  }
-  else if (action instanceof updateAntennaNameAction){
-    state = Object.assign({}, state, {antennaNameA:action.antennaNameA, antennaNameB: action.antennaNameB})
-  }
-  else if (action instanceof UpdateTxPowerAction){
-    state = Object.assign({}, state, {txPowerA:action.txPowerA == null ? state.txPowerA : action.txPowerA , txPowerB: action.txPowerB == null? state.txPowerB : action.txPowerB})
-  }
-  else if (action instanceof UpdateRxSensitivityAction){
-    state = Object.assign({}, state, {rxSensitivityA:action.rxSensitivityA == null ? state.rxSensitivityA : action.rxSensitivityA , rxSensitivityB: action.rxSensitivityB == null? state.rxSensitivityB : action.rxSensitivityB})
-  }
-  else if (action instanceof UpdateWaveguideLossAction){
-    state = Object.assign({}, state, {waveguideLossA:action.waveguideLossA, waveguideLossB: action.waveguideLossB})
-  }
-  else if (action instanceof UpdateEIRPAction){
-    state = Object.assign({}, state, {eirpA:action.eirpA, eirpB:action.eirpB})
-  }
-  else if (action instanceof UpdateRxPowerAction){
-    state = Object.assign({}, state, {rxPowerA:action.rxPowerA, rxPowerB:action.rxPowerB})
-  }
-  else if (action instanceof UpdateSomAction){
-    state = Object.assign({}, state, {systemOperatingMarginA:action.somA , systemOperatingMarginB :action.somB})
-  }
-  
-
-  return state
-}
-
-const actionHandlers = {
-  calculations: LinkCalculationHandler
-}
-
-export const LinkCalculationAppRootHandler = combineActionHandler<ICalculationsState>(actionHandlers); 
-export default LinkCalculationAppRootHandler;
-
diff --git a/sdnr/wt/odlux/apps/linkCalculationApp/src/index.html b/sdnr/wt/odlux/apps/linkCalculationApp/src/index.html
deleted file mode 100644 (file)
index edcbd25..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  <meta http-equiv="X-UA-Compatible" content="ie=edge">
-  <!-- <link rel="stylesheet" href="./vendor.css" > -->
-  <title>Link Calculation App</title>
-</head>
-
-<body>
-  <div id="app"></div>
-  <script type="text/javascript" src="./require.js"></script>
-  <script type="text/javascript" src="./config.js"></script>
-  <script>
-    // run the application
-    require(["app","connectApp", "linkCalculationApp", "networkMapApp" , "lineOfSightApp"], function (app, connectApp, linkCalculationApp,networkMapApp, lineOfSightApp) {
-      connectApp.register();
-      linkCalculationApp.register();
-      networkMapApp.register();
-      lineOfSightApp.register();
-      app("./app.tsx").runApplication();
-    });
-  </script>
-</body>
-
-</html>
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/linkCalculationApp/src/pluginLinkCalculation.tsx b/sdnr/wt/odlux/apps/linkCalculationApp/src/pluginLinkCalculation.tsx
deleted file mode 100644 (file)
index a15bf03..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-/**
-* ============LICENSE_START========================================================================
-* ONAP : ccsdk feature sdnr wt odlux
-* =================================================================================================
-* Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
-* =================================================================================================
-* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
-* in compliance with the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software distributed under the License
-* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
-* or implied. See the License for the specific language governing permissions and limitations under
-* the License.
-* ============LICENSE_END==========================================================================
-*/
-
-// app configuration and main entry point for the app
-
-import * as React from "react";
-import { withRouter, RouteComponentProps, Route, Switch, Redirect } from 'react-router-dom';
-
-import { faBookOpen } from '@fortawesome/free-solid-svg-icons'; // select app icon
-import applicationManager from '../../../framework/src/services/applicationManager';
-
-import LinkCalculation from './views/linkCalculationComponent';
-import LinkCalculationAppRootHandler from './handlers/linkCalculationAppRootHandler';
-import connect, { Connect, IDispatcher } from '../../../framework/src/flux/connect';
-import { IApplicationStoreState } from "../../../framework/src/store/applicationStore";
-import { UpdateLinkIdAction, UpdateLatLonAction, updateHideForm, UpdateSiteAction, UpdateDistanceAction, isCalculationServerReachableAction, updateAltitudeAction, updateAntennaNameAction, UpdateAntennaGainAction, UpdateWaveguideLossAction } from "./actions/commonLinkCalculationActions";
-
-
-let currentLinkId: string | null = null;
-let lastUrl: string = "/linkCalculation";
-
-const mapProps = (state: IApplicationStoreState) => ({
-  reachable: state.linkCalculation.calculations.reachable
-});
-
-const mapDisp = (dispatcher: IDispatcher) => ({
-  updateLinkId: (mountId: string) => dispatcher.dispatch(new UpdateLinkIdAction(mountId)),
-
-  updateSiteName: (siteNameA?: any, siteNameB?: any) => {
-    dispatcher.dispatch(new UpdateSiteAction(siteNameA, siteNameB))
-  },
-  updateDistance: (distance: number) => {
-    dispatcher.dispatch(new UpdateDistanceAction(distance))
-  },
-  updateLatLon: (Lat1: number, Lon1: number, Lat2: number, Lon2: number) => {
-
-    dispatcher.dispatch(new UpdateLatLonAction(Lat1, Lon1, Lat2, Lon2))
-    dispatcher.dispatch(new updateHideForm(true))
-  },
-  updateAltitude: (amslA: number, aglA: number, amslB: number, aglB: number) => {
-    dispatcher.dispatch(new updateAltitudeAction(amslA, aglA, amslB, aglB))
-  },
-  updateAntennaName: (antennaNameA: string, antennaNameB: string) => {
-    dispatcher.dispatch(new updateAntennaNameAction(antennaNameA, antennaNameB))
-  },
-  updateAntennaGainAction: (antennaGainA: number, antennaGainB: number) => {
-    dispatcher.dispatch(new UpdateAntennaGainAction(antennaGainA, antennaGainB))
-  },
-  updateWaveguideLossAction: (waveguideLossA: number, waveguideLossB: number) => {
-    dispatcher.dispatch(new UpdateWaveguideLossAction(waveguideLossA, waveguideLossB))
-  }
-});
-
-
-const LinkCalculationRouteAdapter = connect(mapProps, mapDisp)((props: RouteComponentProps<{ mountId?: string }> & Connect<typeof mapProps, typeof mapDisp>) => {
-  let linkId: string = "";
-
-  // called when component finshed mounting
-  React.useEffect(() => {
-
-    lastUrl = props.location.pathname;
-    linkId = getLinkId(lastUrl);
-
-    const data = props.location.search
-
-
-
-    if (data !== undefined && data.length > 0) {
-
-
-      const lat1 = data.split('&')[0].split('=')[1]
-      const lon1 = data.split('&')[1].split('=')[1]
-      const lat2 = data.split('&')[2].split('=')[1]
-      const lon2 = data.split('&')[3].split('=')[1]
-
-      const siteNameA = data.split('&')[4].split('=')[1]
-      const siteNameB = data.split('&')[5].split('=')[1]
-
-      const distance = data.split('&')[8].split('=')[1]
-
-      const amslA = data.split('&')[9].split('=')[1]
-      const aglA = data.split('&')[10].split('=')[1]
-
-      const amslB = data.split('&')[11].split('=')[1]
-      const aglB = data.split('&')[12].split('=')[1]
-
-      const antennaNameA = data.split('&')[13].split('=')[1].replace("%20", " ")
-      const antennaGainA = data.split('&')[14].split('=')[1]
-      const waveguideLossA = data.split('&')[15].split('=')[1]
-      const antennaNameB = data.split('&')[16].split('=')[1].replace("%20", " ")
-      const antennaGainB = data.split('&')[17].split('=')[1]
-      const waveguideLossB = data.split('&')[18].split('=')[1]
-
-
-      if (siteNameA !== null && siteNameB !== null) {
-        props.updateSiteName(String(siteNameA), String(siteNameB))
-      }
-
-      if (Number(distance) !== null) {
-        props.updateDistance(Number(distance))
-      }
-      if (Number(lat1) >= -90 && Number(lat2) >= -90 && Number(lat1) <= 90 && Number(lat2) <= 90 && Number(lon1) >= -180 && Number(lon2) >= -180 && Number(lon1) <= 180 && Number(lon2) <= 180) {
-        props.updateLatLon(Number(lat1), Number(lon1), Number(lat2), Number(lon2))
-      }
-      if (Number(amslA)> 0 && Number(amslB)> 0) {
-        if (Number(aglA)>= Number(amslA) && Number(aglB)>= Number(amslB)) {
-          props.updateAltitude(Number(amslA), Number(aglA), Number(amslB), Number(aglB))
-        }
-      }
-      if (antennaNameA && antennaNameB.length) {
-        props.updateAntennaName(String(antennaNameA), String(antennaNameB))
-      }
-      if (Number(antennaGainA) > 0 && Number(antennaGainA) > 0) {
-        props.updateAntennaGainAction(Number(antennaGainA), Number(antennaGainB))
-      }
-      if(Number(waveguideLossA) !== null, Number(waveguideLossB) !== null){
-        props.updateWaveguideLossAction(Number(waveguideLossA),Number(waveguideLossB) )
-      }
-    }
-
-
-    if (currentLinkId !== linkId) { // new element is loaded
-      currentLinkId = linkId;
-      props.updateLinkId(currentLinkId);
-    }
-  }, []);
-
-  // called when component gets updated
-  React.useEffect(() => {
-
-    lastUrl = props.location.pathname;
-    linkId = getLinkId(lastUrl);
-
-    if (currentLinkId !== linkId) {
-      currentLinkId = linkId;
-      props.updateLinkId(currentLinkId);
-    }
-  });
-
-  const getLinkId = (lastUrl: string) => {
-    let index = lastUrl.lastIndexOf("linkCalculation/");
-    if (index >= 0) {
-      linkId = lastUrl.substr(index + 16);
-    } else {
-      linkId = "";
-    }
-
-    return linkId;
-  }
-
-
-  return (
-    <LinkCalculation />
-  );
-});
-
-const App = withRouter((props: RouteComponentProps) => {
-  props.history.action = "POP";
-  return (
-    <Switch>
-      <Route path={`${props.match.path}/:linkId`} component={LinkCalculationRouteAdapter} />
-      <Route path={`${props.match.path}`} component={LinkCalculationRouteAdapter} />
-      <Redirect to={`${props.match.path}`} />
-    </Switch>
-  )
-});
-
-export function register() {
-  applicationManager.registerApplication({
-    name: "linkCalculation",
-    icon: faBookOpen,
-    rootActionHandler: LinkCalculationAppRootHandler,
-    rootComponent: App,
-    menuEntry: "Link Calculation"
-  });
-}
-
diff --git a/sdnr/wt/odlux/apps/linkCalculationApp/src/views/Style.scss b/sdnr/wt/odlux/apps/linkCalculationApp/src/views/Style.scss
deleted file mode 100644 (file)
index e4b0c77..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-// .parent{
-    
-//     display: flex;
-//     justify-content: space-evenly;
-//     margin: auto;
-    
-
-//}
-.input {
-    width: 150px;
-    box-sizing: border-box;
-    // margin-bottom: 5px;
-
-}
-.error {
-    border: 1px solid red;
-    width: 150px;
-    box-sizing: border-box;
-}
-
-.container1{
-  margin-bottom: 15px;
-
-}
-
-.container1 div{
-  display:flex;
-  flex-direction: row;
-
-  width:100%;
-  padding-top: 2px;
-}
-
-.container1 div div{
-  width:50%;
-  border-bottom-style: solid;
-  border-bottom-width: thin;
-  border-color: silver;
-}
-
-.firstBox div:first-child{
-  margin-left: 33.5%;
-}
-
-// .container-1 {
-//   width: 80%;
-//   justify-content: center;
-//   align-items: baseline;;
-//     display: flex;
-//     flex-direction: row;
-//     align-content: space-between;
-//     padding: 20px 40px;
-//     border-radius: 10px;
-//     // box-shadow: 0px 10px 50px #555;
-//     background-color: #ffffff;
-//     // padding-top: 10px;
-   
-// }
-
-  // .column1 {
-  //   flex-direction: column;
-  //   width: 30%;
-  //   align-items: flex-end;;
-  //   // padding: 2em;
-    
-  // }
-  // .column1 div {
-  //   margin-top: 10px;
-  //   // align-items: space-between;
-  //   // flex-wrap: wrap;
-  //   border-bottom-style: solid;
-  //   border-bottom-width: thin;
-  //   border-color: silver;
-  // }
-  // .middlecolumn{
-    
-  //   flex-direction: column;
-  //   flex-grow: 1;
-  //   // padding: 10px 10px;
-  // }
-
-  // .middlecolumn div{
-  //   margin-top: 10px;
-  //   border-bottom-style: solid;
-  //   border-bottom-width: thin;
-  //   border-color: silver;
-  //   }
-
-  // .column2 {
-  //   margin-left: 200px;
-  // }
-  // .column2 div{
-  //   margin-top: 10px;
-   
-  // }
-
-  .antennaContainer{
-   margin-bottom: 15px;
-    background-color: rgb(184, 181, 181);
-
-  }
-  .antennaContainer  div {
-    display:flex;
-    flex-direction: row;
-  
-    width:100%;
-    padding-top: 2px;
-}
-.antennaContainer  div div{
-
-  width:50%;
-
-}
-.antennaFont{
-  font-family: "Lucida Console";
-}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/linkCalculationApp/src/views/linkCalculationComponent.tsx b/sdnr/wt/odlux/apps/linkCalculationApp/src/views/linkCalculationComponent.tsx
deleted file mode 100644 (file)
index e3eaa6b..0000000
+++ /dev/null
@@ -1,579 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import * as React from "react";
-
-import { Connect, connect, IDispatcher } from '../../../../framework/src/flux/connect';
-import { MaterialTable, MaterialTableCtorType } from '../../../../framework/src/components/material-table';
-import { TextField, Tabs, Tab, Typography, AppBar, Button, Tooltip, Checkbox, Table, TableCell, TableHead, TableRow, TableBody, Paper } from '@material-ui/core';
-import './Style.scss'
-
-import { IApplicationStoreState } from "../../../../framework/src/store/applicationStore";
-import { UpdateFrequencyAction, UpdateLatLonAction, UpdateRainAttAction, UpdateRainValAction, UpdateFslCalculation, isCalculationServerReachableAction, UpdatePolAction, UpdateDistanceAction, updateAltitudeAction, UpdateAbsorptionLossAction, UpdateWorstMonthRainAction, UpdateTxPowerAction, UpdateRxSensitivityAction, UpdateEIRPAction, UpdateRxPowerAction, UpdateSomAction } from "../actions/commonLinkCalculationActions";
-import { faPlaneArrival, faAlignCenter } from "@fortawesome/free-solid-svg-icons";
-import ConnectionInfo from '../components/connectionInfo'
-import { red } from "@material-ui/core/colors";
-import { Dvr } from "@material-ui/icons";
-
-
-
-const mapProps = (state: IApplicationStoreState) => ({
-  linkId: state.linkCalculation.calculations.linkId,
-  frequency: state.linkCalculation.calculations.frequency,
-  lat1: state.linkCalculation.calculations.Lat1,
-  lon1: state.linkCalculation.calculations.Lon1,
-  lat2: state.linkCalculation.calculations.Lat2,
-  lon2: state.linkCalculation.calculations.Lon2,
-  rainAtt: state.linkCalculation.calculations.rainAtt,
-  rainVal: state.linkCalculation.calculations.rainVal,
-  formView: state.linkCalculation.calculations.formView,
-  fsl: state.linkCalculation.calculations.fsl,
-  siteA: state.linkCalculation.calculations.siteA,
-  siteB: state.linkCalculation.calculations.siteB,
-  distance: state.linkCalculation.calculations.distance,
-  reachable: state.linkCalculation.calculations.reachable,
-  polarization: state.linkCalculation.calculations.polarization,
-  amslA: state.linkCalculation.calculations.amslA,
-  amslB: state.linkCalculation.calculations.amslB,
-  aglA: state.linkCalculation.calculations.aglA,
-  aglB: state.linkCalculation.calculations.aglB,
-  absorptionOxygen: state.linkCalculation.calculations.absorptionOxygen,
-  absorptionWater: state.linkCalculation.calculations.absorptionWater,
-  month: state.linkCalculation.calculations.month,
-  eirpA: state.linkCalculation.calculations.eirpA,
-  eirpB: state.linkCalculation.calculations.eirpB,
-  antennaGainA: state.linkCalculation.calculations.antennaGainA,
-  antennaGainB: state.linkCalculation.calculations.antennaGainB,
-  antennaNameA: state.linkCalculation.calculations.antennaNameA,
-  antennaNameB: state.linkCalculation.calculations.antennaNameB,
-  systemOperatingMarginA: state.linkCalculation.calculations.systemOperatingMarginA,
-  systemOperatingMarginB: state.linkCalculation.calculations.systemOperatingMarginB,
-  waveguideLossA: state.linkCalculation.calculations.waveguideLossA,
-  waveguideLossB: state.linkCalculation.calculations.waveguideLossB,
-  rxPowerA: state.linkCalculation.calculations.rxPowerA,
-  rxPowerB: state.linkCalculation.calculations.rxPowerB,
-  txPowerA: state.linkCalculation.calculations.txPowerA,
-  txPowerB: state.linkCalculation.calculations.txPowerB,
-  rxSensitivityA: state.linkCalculation.calculations.rxSensitivityA,
-  rxSensitivityB: state.linkCalculation.calculations.rxSensitivityB
-
-});
-
-const BASE_URL = "/topology/linkcalculator"
-
-const mapDispatch = (dispatcher: IDispatcher) => ({
-
-  updateFrequency: (frequency: number) => {
-
-    dispatcher.dispatch(new UpdateFrequencyAction(frequency))
-  },
-  updateLatLon: (Lat1: number, Lon1: number, Lat2: number, Lon2: number) => {
-    dispatcher.dispatch(new UpdateLatLonAction(Lat1, Lon1, Lat2, Lon2))
-  },
-
-  updateRainValue: (rainVal: number) => {
-    dispatcher.dispatch(new UpdateRainValAction(rainVal))
-  },
-
-  UpdateRainAtt: (rainAtt: number) => {
-    dispatcher.dispatch(new UpdateRainAttAction(rainAtt))
-  },
-
-  specificRain: (rainAtt: number) => {
-    dispatcher.dispatch(new UpdateRainAttAction(rainAtt))
-
-  },
-
-  FSL: (free: number) => {
-    dispatcher.dispatch(new UpdateFslCalculation(free))
-  },
-
-  UpdateConectivity: (reachable: boolean) => {
-    dispatcher.dispatch(new isCalculationServerReachableAction(reachable))
-  },
-
-  updatePolarization: (polarization: any) => {
-    dispatcher.dispatch(new UpdatePolAction(polarization))
-  },
-
-  updateAutoDistance: (distance: number) => {
-    dispatcher.dispatch(new UpdateDistanceAction(distance))
-  },
-  UpdateAbsorption: (OxLoss: number, WaterLoss: number) => {
-    dispatcher.dispatch(new UpdateAbsorptionLossAction(OxLoss, WaterLoss))
-  },
-  UpdateWorstMonthRain: (month: string) => {
-    dispatcher.dispatch(new UpdateWorstMonthRainAction(month))
-  },
-  UpdateEIRP: (eirpA: number, eirpB: number) => {
-    dispatcher.dispatch(new UpdateEIRPAction(eirpA, eirpB))
-  },
-  UpdateRxPower: (rxPowerA: number, rxPowerB: number) => {
-    dispatcher.dispatch(new UpdateRxPowerAction(rxPowerA, rxPowerB))
-  },
-  UpdateSom: (somA: number, somB: number) => {
-    dispatcher.dispatch(new UpdateSomAction(somA, somB))
-  },
-
-  UpdateTxPower: (txPowerA: string | null, txPowerB: string | null) => {
-    dispatcher.dispatch(new UpdateTxPowerAction(txPowerA, txPowerB))
-  },
-  UpdateRxSensitivity: (rxSensitivityA: string | null, rxSensitivityB: string | null) => {
-    dispatcher.dispatch(new UpdateRxSensitivityAction(rxSensitivityA, rxSensitivityB))
-  }
-});
-
-
-type linkCalculationProps = Connect<typeof mapProps, typeof mapDispatch>;
-
-interface initialState {
-  rainMethodDisplay: boolean,
-  absorptionMethod: string;
-  horizontalBoxChecked: boolean,
-  latitude1Error: string,
-  longitude1Error: string
-  latitude2Error: string,
-  longitude2Error: string,
-  frequencyError: string,
-  rainMethodError: string,
-  antennaTypeError: string,
-  attenuationMethodError: string,
-  worstmonth: boolean,
-  showWM: string,
-  rainMethodErrorState: string
-}
-
-class LinkCalculation extends React.Component<linkCalculationProps, initialState> {
-  constructor(props: any) {
-    super(props);
-    this.state = {
-      rainMethodDisplay: false,
-      horizontalBoxChecked: true,
-      absorptionMethod: '0',
-      latitude1Error: '',
-      longitude1Error: '',
-      latitude2Error: '',
-      longitude2Error: '',
-      frequencyError: '',
-      rainMethodError: '',
-      attenuationMethodError: '',
-      antennaTypeError: '',
-      worstmonth: false,
-      showWM: '',
-      rainMethodErrorState: '0'
-    };
-  }
-
-  updateAutoDistance = async (lat1: number, lon1: number, lat2: number, lon2: number) => {
-    const result = await fetch(BASE_URL + '/distance/' + lat1 + ',' + lon1 + ',' + lat2 + ',' + lon2)
-    const json = await result.json()
-    return json.distanceInKm
-  }
-
-  updateLatLon = (e: any) => {
-
-    e.target.id == 'Lat1' ? this.props.updateLatLon(e.target.value, this.props.lon1, this.props.lat2, this.props.lon2) : null
-    e.target.id == 'Lon1' ? this.props.updateLatLon(this.props.lat1, e.target.value, this.props.lat2, this.props.lon2) : null
-    e.target.id == 'Lat2' ? this.props.updateLatLon(this.props.lat1, this.props.lon1, e.target.value, this.props.lon2) : null
-    e.target.id == 'Lon2' ? this.props.updateLatLon(this.props.lat1, e.target.value, this.props.lat2, e.target.value) : null
-
-
-  }
-
-  updatePoli = (val: string) => {
-
-    this.setState({ horizontalBoxChecked: !this.state.horizontalBoxChecked });
-    this.props.updatePolarization(val);
-
-  }
-
-  LatLonToDMS = (value: number, isLon: boolean = false) => {
-    const absoluteValue = Math.abs(value);
-    const d = Math.floor(absoluteValue);
-    const m = Math.floor((absoluteValue - d) * 60);
-    const s = (absoluteValue - d - m / 60) * 3600;
-    const dms = `${d}° ${m}' ${s.toFixed(2)}"`;
-
-    const sign = Math.sign(value);
-
-    if (isLon) {
-      return (sign === -1 || sign === -0) ? dms + " W" : dms + " E";
-    } else {
-      return (sign === -1 || sign === -0) ? dms + " S" : dms + " N";
-    }
-  }
-
-  rainAttCal = (lat1: any, lon1: any, lat2: any, lon2: any, frequency: any, distance: number, polarization: string, worstmonth: boolean) => {
-    if (!worstmonth) {
-      fetch(BASE_URL + '/rain/annual/' + lat1 + ',' + lon1 + ',' + lat2 + ',' + lon2 + '/' + frequency + '/' + distance + '/' + polarization.toUpperCase())
-        .then(res => res.json())
-        .then(result => { this.props.UpdateRainAtt(result.rainAttenuation); this.props.updateRainValue(result.rainFall.rainrate) })
-    }
-    else {
-      fetch(BASE_URL + '/rain/worstmonth/' + lat1 + ',' + lon1 + ',' + lat2 + ',' + lon2 + '/' + frequency + '/' + distance + '/' + polarization.toUpperCase())
-        .then(res => res.json())
-        .then(result => { this.props.UpdateRainAtt(result.rainAttenuation); this.props.updateRainValue(result.rainFall.rainrate); this.props.UpdateWorstMonthRain(result.rainFall.period); this.setState({ showWM: '- Wm is : ' }) })
-    }
-  }
-
-
-  manualRain = (rainfall: number, frequency: number, distance: number, polarization: string) => {
-    fetch(BASE_URL + '/rain/' + rainfall + '/' + frequency + '/' + distance + '/' + polarization.toUpperCase())
-      .then(res => res.json())
-      .then(result => { this.props.specificRain(result.rainAttenuation) })
-  }
-
-
-  FSL = (distance: number, frequency: number) => {
-    fetch(BASE_URL + '/fsl/' + distance + '/' + frequency)
-      .then(res => res.json())
-      .then(result => { this.props.FSL(result.fspl) })
-  }
-
-  AbsorptionAtt = (lat1: number, lon1: number, lat2: number, lon2: number, distance: number, frequency: number, worstmonth: boolean, absorptionMethod: string) => {
-    if (!worstmonth) {
-      fetch(BASE_URL + '/absorption/annual/' + lat1 + ',' + lon1 + ',' + lat2 + ',' + lon2 + '/' + distance + '/' + frequency + '/' + absorptionMethod)
-        .then(res => res.json())
-        .then(result => { this.props.UpdateAbsorption(result.oxygenLoss, result.waterLoss) })
-    }
-    else {
-      fetch(BASE_URL + '/absorption/annual/' + lat1 + ',' + lon1 + ',' + lat2 + ',' + lon2 + '/' + distance + '/' + frequency + '/' + absorptionMethod)
-        .then(res => res.json())
-        .then(result => { this.props.UpdateAbsorption(result.oxygenLoss, result.waterLoss) })
-    }
-  }
-
-  linkBudget = (lat1: number, lon1: number, lat2: number, lon2: number, distance: number, frequency: number, absorptionMethod: string, polarization: string, antennaGainA: number, antennaGainB: number, waveguideLossA: number, waveguideLossB: number, transmissionPowerA: number, transmissionPowerB: number, rxSensitivityA: number, rxSensitivityB: number) => {
-    fetch(BASE_URL + '/linkbudget/' + lat1 + ',' + lon1 + ',' + lat2 + ',' + lon2 + '/' + distance + '/' + frequency + '/' + absorptionMethod + '/' + polarization.toUpperCase() + '/' + antennaGainA + '/' + antennaGainB + '/' + waveguideLossA + '/' + waveguideLossB + '/' + transmissionPowerA + '/' + transmissionPowerB + '/' + rxSensitivityA + '/' + rxSensitivityB)
-      .then(res => res.json())
-      .then(result => { this.props.UpdateEIRP(result.eirpA, result.eirpB); this.props.UpdateRxPower(result.receivedPowerA, result.receivedPowerB); this.props.UpdateSom(result.systemOperatingMarginA, result.systemOperatingMarginA) })
-  }
-
-  formValid = () => {
-
-    this.props.lat1 === 0 ? this.setState({ latitude1Error: 'Enter a number between -90 to 90' }) : null
-    this.props.lat2 === 0 ? this.setState({ latitude2Error: 'Enter a number between -90 to 90' }) : null
-    this.props.lon1 === 0 ? this.setState({ longitude1Error: 'Enter a number between -180 to 180' }) : null
-    this.props.lon2 === 0 ? this.setState({ longitude2Error: 'Enter a number between -180 to 180' }) : null
-    this.props.frequency === 0 ? this.setState({ frequencyError: 'Select a frequency' }) : this.setState({ frequencyError: '' })
-
-    // this.state.rainMethodDisplay === null && this.props.rainVal === 0 ? this.setState({ rainMethodError: 'Select the rain method' }) : this.setState({ rainMethodError: '' })
-
-    this.state.rainMethodErrorState === '0' ? this.setState({ rainMethodError: 'Select the rain method' }) : this.setState({ rainMethodError: '' })
-
-    this.state.absorptionMethod === '0' ? this.setState({ attenuationMethodError: 'Select the attenuation method' }) : this.setState({ attenuationMethodError: '' })
-    console.log(this.state);
-    console.log(this.props.lat1 !== 0 && this.props.lat2 !== 0 && this.props.lon1 !== 0 && this.props.lon2 !== 0 && this.props.frequency !== 0 && this.state.rainMethodError === '' && this.state.attenuationMethodError === '');
-
-    return this.props.lat1 !== 0 && this.props.lat2 !== 0 && this.props.lon1 !== 0 && this.props.lon2 !== 0 && this.props.frequency !== 0 && this.state.rainMethodError === '' && this.state.attenuationMethodError === '';
-
-  }
-
-
-
-  buttonHandler = async () => {
-
-    if (this.formValid()) {
-
-      this.props.updateAutoDistance(await this.updateAutoDistance(this.props.lat1, this.props.lon1, this.props.lat2, this.props.lon2))
-      this.FSL(this.props.distance, this.props.frequency)
-
-      if (this.state.worstmonth === false) {
-        this.setState({ showWM: ' ' })
-        this.props.UpdateWorstMonthRain('')
-        this.AbsorptionAtt(this.props.lat1, this.props.lon1, this.props.lat2, this.props.lon2, this.props.distance, this.props.frequency, this.state.worstmonth, this.state.absorptionMethod)
-        this.linkBudget(this.props.lat1, this.props.lon1, this.props.lat2, this.props.lon2, this.props.distance, this.props.frequency, this.state.absorptionMethod, this.props.polarization!, this.props.antennaGainA, this.props.antennaGainB, this.props.waveguideLossA, this.props.waveguideLossB, Number(this.props.txPowerA), Number(this.props.txPowerB), Number(this.props.rxSensitivityA), Number(this.props.rxSensitivityB))
-
-        if (this.state.rainMethodDisplay === true) {
-
-          this.manualRain(this.props.rainVal, this.props.frequency, this.props.distance, this.props.polarization!);
-        }
-        else {
-          this.rainAttCal(this.props.lat1, this.props.lon1, this.props.lat2, this.props.lon2, this.props.frequency, this.props.distance, this.props.polarization!, this.state.worstmonth);
-        }
-      }
-      else {
-        this.AbsorptionAtt(this.props.lat1, this.props.lon1, this.props.lat2, this.props.lon2, this.props.distance, this.props.frequency, this.state.worstmonth, this.state.absorptionMethod)
-        this.rainAttCal(this.props.lat1, this.props.lon1, this.props.lat2, this.props.lon2, this.props.frequency, this.props.distance, this.props.polarization!, this.state.worstmonth);
-      }
-    }
-    else console.log('form is not valid')
-
-  }
-
-  componentDidMount = () => {
-    fetch(BASE_URL + '/fsl/1/1')
-      .then(res => { if (res.ok) { this.props.UpdateConectivity(true) } else { this.props.UpdateConectivity(false) } })
-      .catch(res => { this.props.UpdateConectivity(false) })
-  }
-
-  handleChange = (e: any) => {
-
-    switch (e.target.id) {
-      case 'Lat1': if (e.target.value > 90 || e.target.value < -90) { this.setState({ latitude1Error: 'Enter a number between -90 to 90' }) }
-      else {
-        this.updateLatLon(e)
-        this.setState({ latitude1Error: '' })
-      }
-        break;
-      case 'Lat2': if (e.target.value > 90 || e.target.value < -90) { this.setState({ latitude2Error: 'Enter a number between -90 to 90' }) }
-      else {
-        this.updateLatLon(e)
-        this.setState({ latitude2Error: '' })
-      }
-        break;
-      case 'Lon1': if (e.target.value > 180 || e.target.value < -180) { this.setState({ longitude1Error: 'Enter a number between -180 to 180' }) }
-      else {
-        this.updateLatLon(e)
-        this.setState({ longitude1Error: '' })
-      }
-        break;
-      case 'Lon2': if (e.target.value > 180 || e.target.value < -180) { this.setState({ longitude2Error: 'Enter a number between -180 to 180' }) }
-      else {
-        this.updateLatLon(e)
-        this.setState({ longitude2Error: '' })
-      }
-        break;
-
-    }
-  }
-
-  render() {
-    return (
-
-      <div >
-
-        {!this.props.formView &&
-
-          <div className='container1'>
-            <div className='firstBox'>
-              <div>SiteA</div>
-              <div>SiteB</div>
-            </div>
-
-            <div className='firstBox'>
-              <div>
-                <form >
-                  <label>Latitude:  <input aria-label="site-a-latitude-input" className={this.state.latitude1Error.length > 0 ? 'error' : 'input'} id='Lat1' type='number' onChange={(e: any) => { this.handleChange(e) }} /></label>
-                  <div style={{ fontSize: 12, color: 'red' }}> {this.state.latitude1Error}  </div>
-                </form></div>
-              <div>
-                <form>
-                  <label>Latitude: <input aria-label="site-b-latitude-input" className={this.state.latitude2Error.length > 0 ? 'error' : 'input'} id='Lat2' type='number' onChange={(e: any) => { this.handleChange(e) }} /></label><div style={{ fontSize: 12, color: 'red' }}> {this.state.latitude2Error} </div>
-                </form></div>
-            </div>
-
-            <div className='firstBox'>
-              <div>
-                <form><label>Longitude: <input aria-label="site-a-longitude-input" className={this.state.longitude1Error.length > 0 ? 'error' : 'input'} id='Lon1' type='number' onChange={(e: any) => this.handleChange(e)} /></label><div style={{ fontSize: 12, color: 'red' }}> {this.state.longitude1Error} </div>
-                </form></div>
-              <div>
-                <form><label>Longitude: <input aria-label="site-b-longitude-input" className={this.state.longitude2Error.length > 0 ? 'error' : 'input'} id='Lon2' type='number' onChange={(e: any) => { this.handleChange(e) }} /></label><div style={{ fontSize: 12, color: 'red' }}> {this.state.longitude2Error} </div></form>
-              </div>
-            </div>
-
-
-
-          </div>
-        }
-
-
-        <div className='container1'>
-          <div >{<form><input aria-label="annual" type='checkbox' id='Annual' value="Annual" checked={this.state.worstmonth === false} onClick={(e: any) => this.setState({ worstmonth: false })}></input>Annual
-                      <input aria-label="worst-month" style={{ marginLeft: 10 }} type='checkbox' id='Worst Month' value="Worst" checked={this.state.worstmonth === true} onClick={(e: any) => this.setState({ worstmonth: true })}></input>WM</form>}
-          </div>
-          <div className='firstBox'>
-            <div>Site A</div>
-            <div>Site B</div>
-          </div>
-          {/* <div>&nbsp;</div> */}
-          <div>
-            {(this.props.siteA.length > 0 || this.props.siteB.length > 0) && <div >Site Name</div>}
-            <div>  {this.props.siteA}</div>
-            <div>  {this.props.siteB}</div>
-          </div>
-          <div>
-            <div>Latitude</div>
-            <div aria-label="site-a-latitude-dms"> {this.props.lat1 && this.LatLonToDMS(this.props.lat1)}</div>
-            <div aria-label="site-b-latitude-dms"> {this.props.lat2 && this.LatLonToDMS(this.props.lat2)}</div>
-
-          </div>
-          <div>
-            <div>Longitude</div>
-            <div aria-label="site-a-longitude-dms">{this.props.lon1 && this.LatLonToDMS(this.props.lon1)}</div>
-            <div aria-label="site-b-longitude-dms">{this.props.lon2 && this.LatLonToDMS(this.props.lon2)}</div>
-          </div>
-          <div>
-            <div>Azimuth</div>
-            <div>0</div>
-            <div>0</div>
-          </div>
-          <div>
-            <div>Average Mean Sea Level</div>
-            <div aria-label="site-a-amsl">{this.props.amslA.toFixed(2)} m</div>
-            <div aria-label="site-b-amsl">{this.props.amslB.toFixed(2)} m</div>
-          </div>
-          <div>
-            <div>Antenna Height Above Ground</div>
-            <div aria-label="site-a-antenna-amsl">{this.props.aglA.toFixed(2)} m</div>
-            <div aria-label="site-b-antenna-amsl">{this.props.aglB.toFixed(2)} m</div>
-          </div>
-          <div>
-            <div >Distance</div>
-            <div aria-label="distance-between-sites">{this.props.distance?.toFixed(3)} km</div>
-          </div>
-          <div>
-            <div >Polarization</div>
-            <div >{<form><input aria-label="polarization-horizontal" type='checkbox' id='Horizontal' value="Horizontal" checked={this.props.polarization === 'Horizontal'} onClick={(e: any) => this.props.updatePolarization(e.target.value)}></input>Horizontal
-                      <input aria-label="polarization-vertical" style={{ marginLeft: 10 }} type='checkbox' id='Vertical' value="Vertical" checked={this.props.polarization === 'Vertical'} onClick={(e: any) => { this.props.updatePolarization(e.target.value) }}></input>Vertical</form>}</div>
-          </div>
-          <div>
-            <div style={{ marginTop: 5 }}>Frequency</div>
-            <div style={{ marginTop: 5 }}> {<select aria-label="select-frequency-in-ghz" className={this.state.frequencyError.length > 0 ? 'error' : 'input'} onChange={(e) => { this.props.updateFrequency(Number(e.target.value)); e.target.value === '0' ? this.setState({ frequencyError: 'select a frequency' }) : this.setState({ frequencyError: '' }) }}>
-
-              <option value='0' aria-label="none-value" >Select Freq</option>
-              <option value='7' aria-label="7" >7 GHz</option>
-              <option value='11' aria-label="11" >11 GHz</option>
-              <option value='15' aria-label="15" >15 GHz</option>
-              <option value='23' aria-label="23">23 GHz</option>
-              <option value='26' aria-label="26">26 GHz</option>
-              <option value='28' aria-label="28">28 GHz</option>
-              <option value='38' aria-label="38">38 GHz</option>
-              <option value='42' aria-label="42">42 GHz</option>
-              <option value='80' aria-label="80">80 GHz</option>
-            </select>} <div style={{ fontSize: 12, color: 'red' }}>  {this.state.frequencyError} </div> </div>
-          </div>
-          <div>
-            <div>Free Space Loss</div>
-            <div aria-label="fspl-value">{this.props.fsl.toFixed(3)} dB</div>
-          </div>
-          <div>
-            <div>Rain Model</div>
-            <div> {<select aria-label="select-rain-method" className={this.state.rainMethodError.length > 0 ? 'error' : 'input'} onChange={(e) => {if (e.target.value !== '') { this.setState({ rainMethodErrorState: e.target.value, rainMethodError: '' }) }; e.target.value === 'itu' ? this.setState({ rainMethodDisplay: false }) : this.setState({ rainMethodDisplay: true }) }}>
-              <option value='0' aria-label="none-value" >Select Rain Method</option>
-              <option value='itu' aria-label="itur8377">ITU-R P.837-7</option>
-              <option value='manual' aria-label="manual-entry">Specific Rain</option>
-            </select>} <div style={{ fontSize: 12, color: 'red' }}>{this.state.rainMethodError}</div>
-            </div>
-          </div>
-          <div>
-            <div>Rainfall Rate</div>
-            <div> {<form><input aria-label="rain-value" type="number" style={{ width: 70, height: 15, fontSize: 14 }} onChange={(e) => { this.props.updateRainValue(Number(e.target.value)) }}
-              value={this.props.rainVal} disabled={this.state.rainMethodDisplay === false ? true : false}>
-            </input>  mm/hr  {this.state.showWM} {this.props.month}</form>} </div>
-          </div>
-          <div>
-            <div>Rain Loss</div>
-            <div aria-label="rain-attenuation-value">{this.props.rainAtt.toFixed(3)} dB</div>
-          </div>
-          <div>
-            <div>Absorption Model</div>
-            <div> {<select aria-label="select-absorption-method" className={this.state.attenuationMethodError.length > 0 ? 'error' : 'input'} onChange={(e) => { if (e.target.value !== '') { this.setState({ absorptionMethod: e.target.value, attenuationMethodError: '' }) } }}>
-              <option value='0' aria-label="none-value" >Select Absorption Method</option>
-              <option value='ITURP67612' aria-label="iturp67612" >ITU-R P.676-12</option>
-              <option value='ITURP67611' aria-label="iturp67611"  >ITU-R P.676-11</option>
-              <option value='ITURP67610' aria-label="iturp67610" >ITU-R P.676-10</option>
-            </select>} <div style={{ fontSize: 12, color: 'red' }}>{this.state.attenuationMethodError}</div>
-            </div>
-          </div>
-          <div>
-            <div>Oxygen Specific Attenuation</div>
-            <div aria-label="absorption-oxygen-value">{this.props.absorptionOxygen.toFixed(3)} dB</div>
-          </div>
-          <div>
-            <div>Water Vapor Specific Attenuation</div>
-            <div aria-label="absorption-water-value">{this.props.absorptionWater.toFixed(3)} dB</div>
-          </div>
-          <div>
-            <div>System Operating Margin</div>
-            <div aria-label="system-operating-margin">{this.props.systemOperatingMarginA.toFixed(3)} dB</div>
-            <div aria-label="system-operating-margin">{this.props.systemOperatingMarginB.toFixed(3)} dB</div>
-          </div>
-          <div>
-            <div>Radio Transmitted Power</div>
-            <div> {<form><input aria-label="site-a-transmitted-power" type="number" style={{ width: 70, height: 15, fontSize: 14 }} onChange={(e) => { if (e.target.value !== '') this.props.UpdateTxPower(e.target.value, null) }}
-            >
-            </input> dBm </form>} </div>
-            <div> {<form><input aria-label="site-b-transmitted-power" type="number" style={{ width: 70, height: 15, fontSize: 14 }} onChange={(e) => { if (e.target.value !== '') this.props.UpdateTxPower(null, e.target.value) }}
-            >
-            </input>  dBm  </form>} </div>
-          </div>
-          <div>
-            <div>RF Receiver Sensitivity</div>
-            <div> {<form><input aria-label="site-a-receiver-sensitivity" type="number" style={{ width: 70, height: 15, fontSize: 14 }} onChange={(e) => { if (e.target.value !== '') this.props.UpdateRxSensitivity(e.target.value, null) }}
-            >
-            </input> dBm </form>} </div>
-            <div> {<form><input aria-label="site-b-receiver-sensitivity" type="number" style={{ width: 70, height: 15, fontSize: 14 }} onChange={(e) => { if (e.target.value !== '') this.props.UpdateRxSensitivity(null, e.target.value) }}
-            >
-            </input>  dBm  </form>} </div>
-          </div>
-          <div>
-            <div>Rx power</div>
-            <div aria-label="site-a-effective-isotropic-radiated-power">{this.props.rxPowerA.toFixed(3)} dBm</div>
-            <div aria-label="site-b-effective-isotropic-radiated-power">{this.props.rxPowerB.toFixed(3)} dBm</div>
-          </div>
-        </div>
-        <div className='antennaContainer'>
-          <div>
-            <div></div>
-            <div className='antennaFont'>Antenna Settings</div>
-          </div>
-
-          <div>
-            <div>Antenna</div>
-            <div aria-label="site-a-amsl">{this.props.antennaNameA} </div>
-            <div aria-label="site-b-amsl">{this.props.antennaNameB}</div>
-          </div>
-
-
-          <div>
-            <div>EIRP</div>
-            <div aria-label="site-a-effective-isotropic-radiated-power">{this.props.eirpA.toFixed(3)} dBm</div>
-            <div aria-label="site-b-effective-isotropic-radiated-power">{this.props.eirpB.toFixed(3)} dBm</div>
-          </div>
-
-          <div>
-            <div>Gain</div>
-            <div aria-label="site-a-antenna-gain" > {this.props.antennaGainA} dBi</div>
-            <div aria-label="site-b-antenna-gain">{this.props.antennaGainB} dBi</div>
-          </div>
-          <div>
-            <div>Waveguide Loss</div>
-            <div aria-label="site-a-waveguide-loss" > {this.props.waveguideLossA} dB</div>
-            <div aria-label="site-b-waveguide-loss">{this.props.waveguideLossB} dB</div>
-          </div>
-
-          <div>
-            <div></div>
-            <div>{<button aria-label="calculate-button" style={{ color: '#222', fontFamily: 'Arial', boxAlign: 'center', display: 'inline-block', insetInlineStart: '20', alignSelf: 'center' }}
-              onClick={(e) => this.buttonHandler()} >Calculate</button>} </div>
-          </div>
-        </div>
-
-
-        <ConnectionInfo />
-
-
-      </div>
-
-    )
-  }
-
-}
-
-export default connect(mapProps, mapDispatch)(LinkCalculation);
diff --git a/sdnr/wt/odlux/apps/linkCalculationApp/src2/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/MyOdluxBundle.java b/sdnr/wt/odlux/apps/linkCalculationApp/src2/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/MyOdluxBundle.java
deleted file mode 100644 (file)
index 43b072c..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt
- * =================================================================================================
- * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-package org.onap.ccsdk.features.sdnr.wt.odlux.bundles;
-
-import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundle;
-import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleLoader;
-
-public class MyOdluxBundle extends OdluxBundle {
-
-    @Override
-    public void initialize() {
-        super.initialize();
-    }
-
-    @Override
-    public void clean() {
-        super.clean();
-    }
-
-    @Override
-    public String getResourceFileContent(String filename) {
-        return super.getResourceFileContent(filename);
-    }
-
-    @Override
-    public boolean hasResource(String filename) {
-        return super.hasResource(filename);
-    }
-
-    @Override
-    public void setBundleName(String bundleName) {
-        super.setBundleName(bundleName);
-    }
-
-    @Override
-    public void setLoader(OdluxBundleLoader loader) {
-        super.setLoader(loader);
-    }
-
-    @Override
-    public String getBundleName() {
-        return super.getBundleName();
-    }
-
-    @Override
-    public OdluxBundleLoader getLoader() {
-        return super.getLoader();
-    }
-
-    public MyOdluxBundle() {
-        super();
-    }
-}
diff --git a/sdnr/wt/odlux/apps/linkCalculationApp/src2/main/resources/OSGI-INF/blueprint/blueprint.xml b/sdnr/wt/odlux/apps/linkCalculationApp/src2/main/resources/OSGI-INF/blueprint/blueprint.xml
deleted file mode 100644 (file)
index 8eb652e..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-    <reference id="loadersvc" availability="mandatory" activation="eager" interface="org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleLoader"/>
-
-    <bean id="bundle" init-method="initialize" destroy-method="clean" class="org.onap.ccsdk.features.sdnr.wt.odlux.bundles.MyOdluxBundle">
-        <property name="loader" ref="loadersvc"/>
-        <property name="bundleName" value="linkCalculationApp"/>
-        <property name="index" value="120"/>
-    </bean>
-</blueprint>
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/linkCalculationApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java b/sdnr/wt/odlux/apps/linkCalculationApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java
deleted file mode 100644 (file)
index c319bb1..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt
- * =================================================================================================
- * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-package org.onap.ccsdk.features.sdnr.wt.odlux.bundles.test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import org.junit.Test;
-import org.onap.ccsdk.features.sdnr.wt.odlux.OdluxBundleLoaderImpl;
-import org.onap.ccsdk.features.sdnr.wt.odlux.bundles.MyOdluxBundle;
-
-public class TestBundleRes {
-
-    @Test
-    public void test() {
-        OdluxBundleLoaderImpl loader = OdluxBundleLoaderImpl.getInstance();
-        MyOdluxBundle b = new MyOdluxBundle();
-        b.setLoader(loader);
-        b.setIndex(0);
-        b.setBundleName("abc");
-        b.initialize();
-        assertTrue(loader.getNumberOfBundles()==1);
-        assertNotNull(b.getLoader());
-        assertEquals("abc",b.getBundleName());
-        assertTrue(b.hasResource("test.js"));
-        assertNotNull(b.getResourceFileContent("test.js"));
-        b.clean();
-        assertTrue(loader.getNumberOfBundles()==0);
-    }
-
-}
diff --git a/sdnr/wt/odlux/apps/linkCalculationApp/src2/test/resources/test.js b/sdnr/wt/odlux/apps/linkCalculationApp/src2/test/resources/test.js
deleted file mode 100644 (file)
index b47fdc3..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-asdac sad 
-as
-d 
-sad
- sadfa
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/linkCalculationApp/tsconfig.json b/sdnr/wt/odlux/apps/linkCalculationApp/tsconfig.json
deleted file mode 100644 (file)
index a66b5d8..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-{
-  "compilerOptions": {
-    "baseUrl": "./src",
-    "outDir": "./dist",
-    "sourceMap": true,
-    "forceConsistentCasingInFileNames": true,
-    "allowSyntheticDefaultImports": false,
-    "allowUnreachableCode": false,
-    "allowUnusedLabels": false,
-    "noFallthroughCasesInSwitch": true,
-    "noImplicitAny": true,
-    "noImplicitReturns": true,
-    "noImplicitThis": true,
-    "strictNullChecks": true,
-    "pretty": true,
-    "newLine": "LF",
-    "module": "es2015",
-    "target": "es2016",
-    "moduleResolution": "node",
-    "experimentalDecorators": true,
-    "jsx": "preserve",
-    "lib": [
-      "dom",
-      "es2015",
-      "es2016"
-    ],
-    "types": [
-      "prop-types",
-      "react",
-      "react-dom"
-    ]
-  },
-  "exclude": [
-    "dist",
-    "node_modules"
-  ]
-}
diff --git a/sdnr/wt/odlux/apps/linkCalculationApp/webpack.config.js b/sdnr/wt/odlux/apps/linkCalculationApp/webpack.config.js
deleted file mode 100644 (file)
index 55d98b4..0000000
+++ /dev/null
@@ -1,187 +0,0 @@
-/**
- * Webpack 4 configuration file
- * see https://webpack.js.org/configuration/
- * see https://webpack.js.org/configuration/dev-server/
- */
-
-"use strict";
-
-const path = require("path");
-const webpack = require("webpack");
-const CopyWebpackPlugin = require("copy-webpack-plugin");
-const TerserPlugin = require('terser-webpack-plugin');
-
-// const __dirname = (path => path.replace(/^([a-z]\:)/, c => c.toUpperCase()))(process.__dirname());
-
-module.exports = (env) => {
-  const distPath = path.resolve(__dirname, env === "release" ? "." : "../..", "dist");
-  const frameworkPath = path.resolve(__dirname, env === "release" ? "../../framework" : "../..", "dist");
-  return [{
-    name: "App",
-
-    mode: "none", //disable default behavior
-
-    target: "web",
-
-    context: path.resolve(__dirname, "src"),
-
-    entry: {
-      linkCalculationApp: ["./pluginLinkCalculation.tsx"]
-    },
-
-    devtool: env === "release" ? false : "source-map",
-
-    resolve: {
-      extensions: [".ts", ".tsx", ".js", ".jsx"]
-    },
-
-    output: {
-      path: distPath,
-      filename: "[name].js",
-      library: "[name]",
-      libraryTarget: "umd2",
-      chunkFilename: "[name].js"
-    },
-    module: {
-      rules: [{
-        test: /\.tsx?$/,
-        exclude: /node_modules/,
-        use: [{
-          loader: "babel-loader"
-        }, {
-          loader: "ts-loader"          
-        }]
-      }, {
-        test: /\.jsx?$/,
-        exclude: /node_modules/,
-        use: [{
-          loader: "babel-loader"
-        }]
-      },{
-        test: /\.scss$/,  
-        include: /node_modules/,  
-        use: ['style-loader', 'css-loader', 'sass-loader'],
-      },{
-        test: /\.s[ac]ss$/i,
-        use: [
-          // Creates `style` nodes from JS strings
-          'style-loader',
-          // Translates CSS into CommonJS
-          'css-loader',
-          // Compiles Sass to CSS
-          'sass-loader',
-        ],
-      }]
-    },
-
-    optimization: {
-      noEmitOnErrors: true,
-      namedModules: env !== "release",
-      minimize: env === "release",
-      minimizer: env !== "release" ? [] : [new TerserPlugin({
-        terserOptions: {
-          warnings: false, // false, true, "verbose"
-          compress: {
-            drop_console: true,
-            drop_debugger: true,
-          }
-        }
-      })],
-    },
-
-    plugins: [
-      new webpack.DllReferencePlugin({
-        context: path.resolve(__dirname, "../../framework/src"),
-        manifest: require(path.resolve(frameworkPath, "vendor-manifest.json")),
-        sourceType: "umd2"
-      }),
-      new webpack.DllReferencePlugin({
-        context: path.resolve(__dirname, "../../framework/src"),
-        manifest: require(path.resolve(frameworkPath, "app-manifest.json")),
-        sourceType: "umd2"
-      }),
-      ...(env === "release") ? [
-        new webpack.DefinePlugin({
-          "process.env": {
-            NODE_ENV: "'production'",
-            VERSION: JSON.stringify(require("./package.json").version)
-          }
-        }),
-      ] : [
-          new webpack.DefinePlugin({
-            "process.env": {
-              NODE_ENV: "'development'",
-              VERSION: JSON.stringify(require("./package.json").version)
-            }
-          }),
-          new CopyWebpackPlugin([{
-            from: 'index.html',
-            to: distPath
-          }]),
-        ]
-    ],
-
-    devServer: {
-      public: "http://localhost:3100",
-      contentBase: frameworkPath,
-
-      compress: true,
-      headers: {
-        "Access-Control-Allow-Origin": "*"
-      },
-      host: "0.0.0.0",
-      port: 3100,
-      disableHostCheck: true,
-      historyApiFallback: true,
-      inline: true,
-      hot: false,
-      quiet: false,
-      stats: {
-        colors: true
-      },
-      proxy: {
-        "/oauth2/": {
-          target: "http://sdnr:8181",
-          secure: false
-        },
-        "/database/": {
-          target: "http://sdnr:8181",
-          secure: false
-        },
-        "/rests/": {
-          target: "http://sdnr:8181",
-          secure: false
-        },
-        "/topology/": {
-          target: "http://localhost:3002",
-          secure: false
-        },
-        "/help/": {
-          target: "http://sdnr:8181",
-          secure: false
-        },
-        "/websocket/": {
-          target: "http://sdnr:8181",
-          ws: true,
-          changeOrigin: true,
-          secure: false
-        },
-        "/terrain": {
-          target: "http://10.20.11.163:5200",
-          secure: false,
-          pathRewrite(pathname) {
-            return pathname.replace(/^\/terrain/, '')
-          }
-        },
-        "/terrain/": {
-          target: "http://10.20.11.163:5200",
-          secure: false,
-          pathRewrite(pathname) {
-            return pathname.replace(/^\/terrain/, '/')
-          }
-        }
-      }
-
-    }
-  }];
-}
index 939044e..dd678d6 100644 (file)
   "author": "Matthias Fischer",
   "license": "Apache-2.0",
   "dependencies": {
-    "@odlux/framework": "*",
-    "@odlux/connect-app": "*"
+    "@emotion/react": "^11.7.0",
+    "@emotion/styled": "^11.6.0",
+    "@mui/icons-material": "^5.2.0",
+    "@mui/material": "^5.2.2",
+    "@mui/styles": "^5.2.2",
+    "@odlux/connect-app": "*",
+    "@odlux/framework": "*"
   },
   "peerDependencies": {
-    "@types/react": "17.0.3",
-    "@types/react-dom": "17.0.2",
-    "@types/react-router-dom": "5.1.7",
-    "@material-ui/core": "4.11.4",
-    "@material-ui/icons": "4.11.2",
     "@types/classnames": "2.2.6",
     "@types/flux": "3.1.8",
     "@types/jquery": "3.3.10",
+    "@types/react": "17.0.37",
+    "@types/react-dom": "17.0.11",
+    "@types/react-router-dom": "5.1.7",
     "jquery": "3.3.1",
-    "react": "17.0.1",
-    "react-dom": "17.0.1",
+    "react": "17.0.2",
+    "react-dom": "17.0.2",
     "react-router-dom": "5.2.0"
   }
-}
\ No newline at end of file
+}
index 5ffd987..8292892 100644 (file)
  */
 import * as React from 'react';
 
-import Button from '@material-ui/core/Button';
-import TextField from '@material-ui/core/TextField';
-import Dialog from '@material-ui/core/Dialog';
-import DialogActions from '@material-ui/core/DialogActions';
-import DialogContent from '@material-ui/core/DialogContent';
-import DialogContentText from '@material-ui/core/DialogContentText';
-import DialogTitle from '@material-ui/core/DialogTitle';
+import Button from '@mui/material/Button';
+import TextField from '@mui/material/TextField';
+import Dialog from '@mui/material/Dialog';
+import DialogActions from '@mui/material/DialogActions';
+import DialogContent from '@mui/material/DialogContent';
+import DialogContentText from '@mui/material/DialogContentText';
+import DialogTitle from '@mui/material/DialogTitle';
 
 import { IDispatcher, connect, Connect } from '../../../../framework/src/flux/connect';
 
@@ -33,7 +33,7 @@ import {
 } from '../actions/maintenenceActions';
 
 import { MaintenenceEntry } from '../models/maintenenceEntryType';
-import { FormControl, InputLabel, Select, MenuItem, Typography } from '@material-ui/core';
+import { FormControl, InputLabel, Select, MenuItem, Typography } from '@mui/material';
 
 export enum EditMaintenenceEntryDialogMode {
   None = "none",
@@ -122,13 +122,13 @@ class EditMaintenenceEntryDIalogComponent extends React.Component<EditMaintenenc
           <DialogContentText>
             {setting.dialogDescription}
           </DialogContentText>
-          <TextField disabled={!setting.enableMountIdEditor} spellCheck={false} autoFocus margin="dense" id="name" label="Name" type="text" fullWidth value={this.state.nodeId} onChange={(event) => { this.setState({ nodeId: event.target.value }); }} />
+          <TextField variant="standard"  disabled={!setting.enableMountIdEditor} spellCheck={false} autoFocus margin="dense" id="name" label="Name" type="text" fullWidth value={this.state.nodeId} onChange={(event) => { this.setState({ nodeId: event.target.value }); }} />
           {this.state.isErrorVisible && <Typography variant="body1" color="error" >Name must not be empty.</Typography>}
-          <TextField disabled={!setting.enableTimeEditor} spellCheck={false} autoFocus margin="dense" id="start" label="Start (Local DateTime)" type="datetime-local" fullWidth value={this.state.start} onChange={(event) => { this.setState({ start: event.target.value }); }} />
-          <TextField disabled={!setting.enableTimeEditor} spellCheck={false} autoFocus margin="dense" id="end" label="End (Local DateTime)" type="datetime-local" fullWidth value={this.state.end} onChange={(event) => { this.setState({ end: event.target.value }); }} />
-          <FormControl fullWidth disabled={!setting.enableTimeEditor}>
+          <TextField variant="standard"  disabled={!setting.enableTimeEditor} spellCheck={false} autoFocus margin="dense" id="start" label="Start (Local DateTime)" type="datetime-local" fullWidth value={this.state.start} onChange={(event) => { this.setState({ start: event.target.value }); }} />
+          <TextField variant="standard"  disabled={!setting.enableTimeEditor} spellCheck={false} autoFocus margin="dense" id="end" label="End (Local DateTime)" type="datetime-local" fullWidth value={this.state.end} onChange={(event) => { this.setState({ end: event.target.value }); }} />
+          <FormControl variant="standard" fullWidth disabled={!setting.enableTimeEditor}>
             <InputLabel htmlFor="active">Active</InputLabel>
-            <Select value={this.state.active || false} onChange={(event) => {
+            <Select variant="standard" value={this.state.active || false} onChange={(event) => {
               this.setState({ active: event.target.value as any as boolean });
             }} inputProps={{ name: 'active', id: 'active' }} fullWidth >
               <MenuItem value={true as any as string}>active</MenuItem>
@@ -155,7 +155,7 @@ class EditMaintenenceEntryDIalogComponent extends React.Component<EditMaintenenc
 
             event.preventDefault();
             event.stopPropagation();
-          }} > {setting.applyButtonText} </Button>
+          }} color="inherit" > {setting.applyButtonText} </Button>
           <Button onClick={(event) => {
             this.onCancel();
             event.preventDefault();
index 1a00c70..c66b6f4 100644 (file)
  */
 import * as React from 'react';
 
-import Button from '@material-ui/core/Button';
-import Dialog from '@material-ui/core/Dialog';
-import DialogActions from '@material-ui/core/DialogActions';
-import DialogContent from '@material-ui/core/DialogContent';
-import DialogContentText from '@material-ui/core/DialogContentText';
-import DialogTitle from '@material-ui/core/DialogTitle';
+import Button from '@mui/material/Button';
+import Dialog from '@mui/material/Dialog';
+import DialogActions from '@mui/material/DialogActions';
+import DialogContent from '@mui/material/DialogContent';
+import DialogContentText from '@mui/material/DialogContentText';
+import DialogTitle from '@mui/material/DialogTitle';
 
 import { IDispatcher, connect, Connect } from '../../../../framework/src/flux/connect';
 
@@ -94,13 +94,13 @@ class RefreshMaintenanceEntriesDialogComponent extends React.Component<RefreshMa
         <DialogActions>
           <Button aria-label="dialog-confirm-button" onClick={(event) => {
             this.onRefresh();
-          }} > {setting.applyButtonText} </Button>
+          }} color="inherit" > {setting.applyButtonText} </Button>
           <Button aria-label="dialog-cancel-button" onClick={(event) => {
             this.onCancel();
           }} color="secondary"> {setting.cancelButtonText} </Button>
         </DialogActions>
       </Dialog>
-    )
+    );
   }
 
   private onRefresh = () => {
index 0be28b7..d040e3d 100644 (file)
  */
 import * as React from 'react';
 
-import { Theme, createStyles, WithStyles, withStyles, Tooltip } from '@material-ui/core';
+import { Theme, Tooltip } from '@mui/material';
+
+import { WithStyles } from '@mui/styles';
+import createStyles from '@mui/styles/createStyles';
+import withStyles from '@mui/styles/withStyles';
 
 import { faBan } from '@fortawesome/free-solid-svg-icons';
 import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
 
-import AddIcon from '@material-ui/icons/Add';
-import EditIcon from '@material-ui/icons/Edit';
-import RemoveIcon from '@material-ui/icons/RemoveCircleOutline';
-import Refresh from '@material-ui/icons/Refresh';
-import { MenuItem, Divider, Typography } from '@material-ui/core';
+import AddIcon from '@mui/icons-material/Add';
+import EditIcon from '@mui/icons-material/Edit';
+import RemoveIcon from '@mui/icons-material/RemoveCircleOutline';
+import Refresh from '@mui/icons-material/Refresh';
+import { MenuItem, Divider, Typography } from '@mui/material';
 
 import connect, { IDispatcher, Connect } from '../../../../framework/src/flux/connect';
 import MaterialTable, { MaterialTableCtorType, ColumnType } from '../../../../framework/src/components/material-table';
@@ -212,9 +216,7 @@ class MaintenenceViewComponent extends React.Component<MaintenenceViewComponentP
     this.setState({
       maintenenceEntryToEdit: {
         ...entry,
-        ...(entry.start && endTime)
-          ? { start: convertToLocaleString(entry.start), end: convertToLocaleString(entry.end) }
-          : { start: convertToLocaleString(startTime), end: convertToLocaleString(endTime) }
+        ...(entry.start && endTime ? { start: convertToLocaleString(entry.start), end: convertToLocaleString(entry.end) } : { start: convertToLocaleString(startTime), end: convertToLocaleString(endTime) })
       },
       maintenenceEntryEditorMode: EditMaintenenceEntryDialogMode.EditMaintenenceEntry
     });
@@ -228,9 +230,7 @@ class MaintenenceViewComponent extends React.Component<MaintenenceViewComponentP
     this.setState({
       maintenenceEntryToEdit: {
         ...entry,
-        ...(entry.start && endTime)
-          ? { start: convertToLocaleString(entry.start), end: convertToLocaleString(entry.end) }
-          : { start: convertToLocaleString(startTime), end: convertToLocaleString(endTime) }
+        ...(entry.start && endTime ? { start: convertToLocaleString(entry.start), end: convertToLocaleString(entry.end) } : { start: convertToLocaleString(startTime), end: convertToLocaleString(endTime) })
       },
       maintenenceEntryEditorMode: EditMaintenenceEntryDialogMode.RemoveMaintenenceEntry
     });
index eb6f785..da5cf58 100644 (file)
@@ -86,7 +86,7 @@ module.exports = (env) => {
         manifest: require(path.resolve(frameworkPath, "app-manifest.json")),
         sourceType: "umd2"
       }),
-      ...(env === "release") ? [
+      ...(env === "release" ? [
         new webpack.DefinePlugin({
           "process.env": {
             NODE_ENV: "'production'",
@@ -104,7 +104,7 @@ module.exports = (env) => {
             from: 'index.html',
             to: distPath
           }]),
-        ]
+        ])
     ],
 
     devServer: {
index 74fdd33..867a879 100644 (file)
   "author": "Matthias Fischer",
   "license": "Apache-2.0",
   "dependencies": {
+    "@emotion/react": "^11.7.0",
+    "@emotion/styled": "^11.6.0",
+    "@mui/icons-material": "^5.2.0",
+    "@mui/material": "^5.2.2",
+    "@mui/styles": "^5.2.2",
     "@odlux/framework": "*"
   },
   "peerDependencies": {
     "@fortawesome/free-solid-svg-icons": "5.6.3",
-    "@types/react": "17.0.3",
-    "@types/react-dom": "17.0.2",
-    "@types/react-router-dom": "5.1.7",
-    "@material-ui/core": "4.11.4",
-    "@material-ui/icons": "4.11.2",
     "@types/classnames": "2.2.6",
     "@types/flux": "3.1.8",
     "@types/jquery": "3.3.10",
+    "@types/react": "17.0.37",
+    "@types/react-dom": "17.0.11",
+    "@types/react-router-dom": "5.1.7",
     "jquery": "3.3.1",
-    "react": "17.0.1",
-    "react-dom": "17.0.1",
+    "react": "17.0.2",
+    "react-dom": "17.0.2",
     "react-router-dom": "5.2.0"
   }
-}
\ No newline at end of file
+}
index bcbcccc..34ffc5e 100644 (file)
  * ============LICENSE_END==========================================================================
  */
 import * as React from 'react';
-import { Theme, createStyles, WithStyles, withStyles, Typography, FormControlLabel, Checkbox } from '@material-ui/core';
+import { Theme, Typography, FormControlLabel, Checkbox } from '@mui/material';
 
-import Button from '@material-ui/core/Button';
-import TextField from '@material-ui/core/TextField';
-import Select from '@material-ui/core/Select';
-import Dialog from '@material-ui/core/Dialog';
-import DialogActions from '@material-ui/core/DialogActions';
-import DialogContent from '@material-ui/core/DialogContent';
-import DialogContentText from '@material-ui/core/DialogContentText';
-import DialogTitle from '@material-ui/core/DialogTitle';
+import { WithStyles } from '@mui/styles';
+import createStyles from '@mui/styles/createStyles';
+import withStyles from '@mui/styles/withStyles';
 
-import Tabs from '@material-ui/core/Tabs';
-import Tab from '@material-ui/core/Tab';
+import Button from '@mui/material/Button';
+import TextField from '@mui/material/TextField';
+import Select from '@mui/material/Select';
+import Dialog from '@mui/material/Dialog';
+import DialogActions from '@mui/material/DialogActions';
+import DialogContent from '@mui/material/DialogContent';
+import DialogContentText from '@mui/material/DialogContentText';
+import DialogTitle from '@mui/material/DialogTitle';
 
-import Fab from '@material-ui/core/Fab';
-import AddIcon from '@material-ui/icons/Add';
-import DeleteIcon from '@material-ui/icons/Delete';
-import IconButton from '@material-ui/core/IconButton';
+import Tabs from '@mui/material/Tabs';
+import Tab from '@mui/material/Tab';
+
+import Fab from '@mui/material/Fab';
+import AddIcon from '@mui/icons-material/Add';
+import DeleteIcon from '@mui/icons-material/Delete';
+import IconButton from '@mui/material/IconButton';
 
 import { addMediatorConfigAsyncActionCreator, updateMediatorConfigAsyncActionCreator, removeMediatorConfigAsyncActionCreator } from '../actions/mediatorConfigActions';
 import { MediatorConfig, ODLConfig } from '../models/mediatorServer';
-import FormControl from '@material-ui/core/FormControl';
-import InputLabel from '@material-ui/core/InputLabel';
-import MenuItem from '@material-ui/core/MenuItem';
+import FormControl from '@mui/material/FormControl';
+import InputLabel from '@mui/material/InputLabel';
+import MenuItem from '@mui/material/MenuItem';
 
 import { Panel } from '../../../../framework/src/components/material-ui/panel';
 
@@ -202,10 +206,10 @@ class EditMediatorConfigDialogComponent extends React.Component<EditMediatorConf
             <Tab label="ODL AutoConnect" />
           </Tabs>
           {this.state.activeTab === 0 ? <TabContainer >
-            <TextField disabled={setting.readonly || setting.readonlyName} spellCheck={false} autoFocus margin="dense" id="name" label="Name" type="text" fullWidth value={this.state.Name} onChange={(event) => { this.setState({ Name: event.target.value }); }} />
-            <FormControl fullWidth disabled={setting.readonly}>
+            <TextField variant="standard" disabled={setting.readonly || setting.readonlyName} spellCheck={false} autoFocus margin="dense" id="name" label="Name" type="text" fullWidth value={this.state.Name} onChange={(event) => { this.setState({ Name: event.target.value }); }} />
+            <FormControl variant="standard" fullWidth disabled={setting.readonly}>
               <InputLabel htmlFor="deviceType">Device</InputLabel>
-              <Select value={this.state.DeviceType} onChange={(event, value) => {
+              <Select variant="standard" value={this.state.DeviceType} onChange={(event, value) => {
                 const device = this.props.supportedDevices.find(device => device.id === event.target.value);
                 if (device) {
                   this.setState({
@@ -223,46 +227,48 @@ class EditMediatorConfigDialogComponent extends React.Component<EditMediatorConf
                 {this.props.supportedDevices.map(device => (<MenuItem key={device.id} value={device.id} >{`${device.vendor} - ${device.device} (${device.version || '0.0.0'}) `}</MenuItem>))}
               </Select>
             </FormControl>
-            <TextField disabled={setting.readonly} spellCheck={false} autoFocus margin="dense" id="ipAddress" label="Device IP" type="text" fullWidth value={this.state.DeviceIp} onChange={(event) => { this.setState({ DeviceIp: event.target.value }); }} />
-            <TextField disabled={setting.readonly} spellCheck={false} autoFocus margin="dense" id="devicePort" label="Device SNMP Port" type="number" fullWidth value={this.state.DevicePort || ""} onChange={(event) => { this.setState({ DevicePort: +event.target.value }); }} />
-            <TextField disabled={setting.readonly} spellCheck={false} autoFocus margin="dense" id="trapsPort" label="TrapsPort" type="number" fullWidth value={this.state.TrapPort || ""} onChange={(event) => { this.setState({ TrapPort: +event.target.value }); }} />
-            <TextField disabled={setting.readonly} spellCheck={false} autoFocus margin="dense" id="ncUser" label="Netconf User" type="text" fullWidth value={this.state.NcUsername} onChange={(event) => { this.setState({ NcUsername: event.target.value }); }} />
-            <TextField disabled={setting.readonly} spellCheck={false} autoFocus margin="dense" id="ncPassword" label="Netconf Password" type="password" fullWidth value={this.state.NcPassword} onChange={(event) => { this.setState({ NcPassword: event.target.value }); }} />
-            <TextField disabled={setting.readonly} spellCheck={false} autoFocus margin="dense" id="ncPort" label="Netconf Port" type="number" fullWidth value={this.state.NcPort || ""} onChange={(event) => { this.setState({ NcPort: +event.target.value }); }} />
+            <TextField variant="standard" disabled={setting.readonly} spellCheck={false} autoFocus margin="dense" id="ipAddress" label="Device IP" type="text" fullWidth value={this.state.DeviceIp} onChange={(event) => { this.setState({ DeviceIp: event.target.value }); }} />
+            <TextField variant="standard" disabled={setting.readonly} spellCheck={false} autoFocus margin="dense" id="devicePort" label="Device SNMP Port" type="number" fullWidth value={this.state.DevicePort || ""} onChange={(event) => { this.setState({ DevicePort: +event.target.value }); }} />
+            <TextField variant="standard" disabled={setting.readonly} spellCheck={false} autoFocus margin="dense" id="trapsPort" label="TrapsPort" type="number" fullWidth value={this.state.TrapPort || ""} onChange={(event) => { this.setState({ TrapPort: +event.target.value }); }} />
+            <TextField variant="standard" disabled={setting.readonly} spellCheck={false} autoFocus margin="dense" id="ncUser" label="Netconf User" type="text" fullWidth value={this.state.NcUsername} onChange={(event) => { this.setState({ NcUsername: event.target.value }); }} />
+            <TextField variant="standard" disabled={setting.readonly} spellCheck={false} autoFocus margin="dense" id="ncPassword" label="Netconf Password" type="password" fullWidth value={this.state.NcPassword} onChange={(event) => { this.setState({ NcPassword: event.target.value }); }} />
+            <TextField variant="standard" disabled={setting.readonly} spellCheck={false} autoFocus margin="dense" id="ncPort" label="Netconf Port" type="number" fullWidth value={this.state.NcPort || ""} onChange={(event) => { this.setState({ NcPort: +event.target.value }); }} />
           </TabContainer> : null}
           {this.state.activeTab === 1 ? <TabContainer >
             {this.state.ODLConfig && this.state.ODLConfig.length > 0
               ? this.state.ODLConfig.map((cfg, ind) => {
                 const panelId = `panel-${ind}`;
-                const deleteButton = (<IconButton onClick={() => {
-                  this.setState({
-                    ODLConfig: [
-                      ...this.state.ODLConfig.slice(0, ind),
-                      ...this.state.ODLConfig.slice(ind + 1)
-                    ]
-                  });
-                }} ><DeleteIcon /></IconButton>)
+                const deleteButton = (<IconButton
+                  onClick={() => {
+                    this.setState({
+                      ODLConfig: [
+                        ...this.state.ODLConfig.slice(0, ind),
+                        ...this.state.ODLConfig.slice(ind + 1)
+                      ]
+                    });
+                  }}
+                  size="large"><DeleteIcon /></IconButton>)
                 return (
                   <Panel title={cfg.Server && `${cfg.User ? `${cfg.User}@` : ''}${cfg.Protocol}://${cfg.Server}:${cfg.Port}` || "new odl config"} key={panelId} panelId={panelId} activePanel={this.state.activeOdlConfig} customActionButtons={[deleteButton]}
                     onToggle={(id) => { this.setState({ activeOdlConfig: (this.state.activeOdlConfig === id) ? "" : (id || "") }); console.log("activeOdlConfig " + id); this.hideHostnameErrormessage(id) }} >
                     <div className={classes.alignInOneLine}>
-                      <FormControl className={classes.left} margin={"dense"} >
+                      <FormControl variant="standard" className={classes.left} margin={"dense"} >
                         <InputLabel htmlFor={`protocol-${ind}`}>Protocoll</InputLabel>
-                        <Select value={cfg.Protocol} onChange={(e, v) => this.odlConfigValueChangeHandlerCreator(ind, "Protocol", e => v)} inputProps={{ name: `protocol-${ind}`, id: `protocol-${ind}` }} fullWidth >
+                        <Select variant="standard"  value={cfg.Protocol} onChange={(e, v) => this.odlConfigValueChangeHandlerCreator(ind, "Protocol", e => v)} inputProps={{ name: `protocol-${ind}`, id: `protocol-${ind}` }} fullWidth >
                           <MenuItem value={"http"}>http</MenuItem>
                           <MenuItem value={"https"}>https</MenuItem>
                         </Select>
                       </FormControl>
-                      <TextField className={classes.left} spellCheck={false} margin="dense" id="hostname" label="Hostname" type="text" value={cfg.Server} onChange={this.odlConfigValueChangeHandlerCreator(ind, "Server", e => e.target.value)} />
-                      <TextField className={classes.right} style={{ maxWidth: "65px" }} spellCheck={false} margin="dense" id="port" label="Port" type="number" value={cfg.Port || ""} onChange={this.odlConfigValueChangeHandlerCreator(ind, "Port", e => +e.target.value)} />
+                      <TextField variant="standard" className={classes.left} spellCheck={false} margin="dense" id="hostname" label="Hostname" type="text" value={cfg.Server} onChange={this.odlConfigValueChangeHandlerCreator(ind, "Server", e => e.target.value)} />
+                      <TextField variant="standard" className={classes.right} style={{ maxWidth: "65px" }} spellCheck={false} margin="dense" id="port" label="Port" type="number" value={cfg.Port || ""} onChange={this.odlConfigValueChangeHandlerCreator(ind, "Port", e => +e.target.value)} />
                     </div>
                     {
                       this.state.isOdlConfigHostnameEmpty &&
                       <Typography component={"div"} className={classes.left} color="error" gutterBottom>Please add a hostname.</Typography>
                     }
                     <div className={classes.alignInOneLine}>
-                      <TextField className={classes.left} spellCheck={false} margin="dense" id="username" label="Username" type="text" value={cfg.User} onChange={this.odlConfigValueChangeHandlerCreator(ind, "User", e => e.target.value)} />
-                      <TextField className={classes.right} spellCheck={false} margin="dense" id="password" label="Password" type="password" value={cfg.Password} onChange={this.odlConfigValueChangeHandlerCreator(ind, "Password", e => e.target.value)} />
+                      <TextField variant="standard" className={classes.left} spellCheck={false} margin="dense" id="username" label="Username" type="text" value={cfg.User} onChange={this.odlConfigValueChangeHandlerCreator(ind, "User", e => e.target.value)} />
+                      <TextField variant="standard" className={classes.right} spellCheck={false} margin="dense" id="password" label="Password" type="password" value={cfg.Password} onChange={this.odlConfigValueChangeHandlerCreator(ind, "Password", e => e.target.value)} />
                     </div>
                     <div className={classes.alignInOneLine}>
                       <FormControlLabel className={classes.right} control={<Checkbox checked={cfg.Trustall} onChange={this.odlConfigValueChangeHandlerCreator(ind, "Trustall", e => e.target.checked)} />} label="Trustall" />
@@ -288,7 +294,7 @@ class EditMediatorConfigDialogComponent extends React.Component<EditMediatorConf
 
         </DialogContent>
         <DialogActions>
-          <Button onClick={(event) => { this.addConfig(event) }} > {setting.applyButtonText} </Button>
+          <Button color="inherit" onClick={(event) => { this.addConfig(event) }} > {setting.applyButtonText} </Button>
           <Button onClick={(event) => {
             this.onCancel();
             event.preventDefault();
@@ -297,7 +303,7 @@ class EditMediatorConfigDialogComponent extends React.Component<EditMediatorConf
           }} color="secondary"> {setting.cancelButtonText} </Button>
         </DialogActions>
       </Dialog>
-    )
+    );
   }
 
   private addConfig = (event: any) => {
index d520db4..c8b1587 100644 (file)
  */
 import * as React from 'react';
 
-import Button from '@material-ui/core/Button';
-import TextField from '@material-ui/core/TextField';
-import Dialog from '@material-ui/core/Dialog';
-import DialogActions from '@material-ui/core/DialogActions';
-import DialogContent from '@material-ui/core/DialogContent';
-import DialogContentText from '@material-ui/core/DialogContentText';
-import DialogTitle from '@material-ui/core/DialogTitle';
+import Button from '@mui/material/Button';
+import TextField from '@mui/material/TextField';
+import Dialog from '@mui/material/Dialog';
+import DialogActions from '@mui/material/DialogActions';
+import DialogContent from '@mui/material/DialogContent';
+import DialogContentText from '@mui/material/DialogContentText';
+import DialogTitle from '@mui/material/DialogTitle';
 
 import { IDispatcher, connect, Connect } from '../../../../framework/src/flux/connect';
 
 import { addAvaliableMediatorServerAsyncActionCreator, removeAvaliableMediatorServerAsyncActionCreator, updateAvaliableMediatorServerAsyncActionCreator } from '../actions/avaliableMediatorServersActions';
 import { MediatorServer } from '../models/mediatorServer';
-import { Typography } from '@material-ui/core';
+import { Typography } from '@mui/material';
 
 export enum EditMediatorServerDialogMode {
   None = "none",
@@ -151,8 +151,8 @@ class EditMediatorServerDialogComponent extends React.Component<EditMediatorServ
             {setting.dialogDescription}
           </DialogContentText>
           {/* <TextField disabled spellCheck={false} autoFocus margin="dense" id="id" label="Id" type="text" fullWidth value={ this.state._id } onChange={(event)=>{ this.setState({_id: event.target.value}); } } /> */}
-          <TextField disabled={setting.readonly} spellCheck={false} margin="dense" id="name" label="Name" type="text" fullWidth value={this.state.name} onChange={(event) => { this.setState({ name: event.target.value }); }} />
-          <TextField disabled={setting.readonly} spellCheck={false} margin="dense" id="url" label="Url" type="text" fullWidth value={this.state.url} onChange={(event) => { this.setState({ url: event.target.value }); }} />
+          <TextField variant="standard" disabled={setting.readonly} spellCheck={false} margin="dense" id="name" label="Name" type="text" fullWidth value={this.state.name} onChange={(event) => { this.setState({ name: event.target.value }); }} />
+          <TextField variant="standard" disabled={setting.readonly} spellCheck={false} margin="dense" id="url" label="Url" type="text" fullWidth value={this.state.url} onChange={(event) => { this.setState({ url: event.target.value }); }} />
 
           <Typography id="errorMessage" component={"div"} color="error">{this.state.errorMessage.map((error, index) => <div key={index}>{error}</div>)}</Typography>
 
@@ -174,7 +174,7 @@ class EditMediatorServerDialogComponent extends React.Component<EditMediatorServ
 
             event.preventDefault();
             event.stopPropagation();
-          }} > {setting.applyButtonText} </Button>
+          }} color="inherit" > {setting.applyButtonText} </Button>
           <Button onClick={(event) => {
             this.onCancel();
             this.setState({ errorMessage: [] });
index af94f5a..db1ef87 100644 (file)
  */
 import * as React from 'react';
 
-import Button from '@material-ui/core/Button';
-import Dialog from '@material-ui/core/Dialog';
-import DialogActions from '@material-ui/core/DialogActions';
-import DialogContent from '@material-ui/core/DialogContent';
-import DialogContentText from '@material-ui/core/DialogContentText';
-import DialogTitle from '@material-ui/core/DialogTitle';
+import Button from '@mui/material/Button';
+import Dialog from '@mui/material/Dialog';
+import DialogActions from '@mui/material/DialogActions';
+import DialogContent from '@mui/material/DialogContent';
+import DialogContentText from '@mui/material/DialogContentText';
+import DialogTitle from '@mui/material/DialogTitle';
 
 import { avaliableMediatorServersReloadAction } from '../handlers/avaliableMediatorServersHandler';
 import { IDispatcher, connect, Connect } from '../../../../framework/src/flux/connect';
@@ -94,13 +94,13 @@ class RefreshMediatorDialogComponent extends React.Component<RefreshMediatorDial
         <DialogActions>
           <Button aria-label="dialog-confirm-button" onClick={(event) => {
             this.onRefresh();
-          }} > {setting.applyButtonText} </Button>
+          }} color="inherit" > {setting.applyButtonText} </Button>
           <Button aria-label="dialog-cancel-button" onClick={(event) => {
             this.onCancel();
           }} color="secondary"> {setting.cancelButtonText} </Button>
         </DialogActions>
       </Dialog>
-    )
+    );
   }
 
   private onRefresh = () => {
index fd8a249..2b91079 100644 (file)
@@ -17,7 +17,7 @@
  */
 
 import * as React from 'react'
-import { Dialog, DialogTitle, DialogContent, DialogActions, TextField, DialogContentText, Checkbox, Button, FormControlLabel, FormGroup } from '@material-ui/core';
+import { Dialog, DialogTitle, DialogContent, DialogActions, TextField, DialogContentText, Checkbox, Button, FormControlLabel, FormGroup } from '@mui/material';
 import { IApplicationState } from '../../../../framework/src/handlers/applicationStateHandler';
 import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
 import connect, { Connect } from '../../../../framework/src/flux/connect';
@@ -73,11 +73,11 @@ class ShowMediatorInfoDialogComponent extends React.Component<ShowMediatorInfoDi
             <Dialog open={this.props.mode !== MediatorInfoDialogMode.None} onBackdropClick={this.props.onClose} >
                 <DialogTitle>{this.props.config.Name}</DialogTitle>
                 <DialogContent>
-                    <TextField disabled margin="dense" id="deviceIp" label="Device IP" fullWidth defaultValue={this.props.config.DeviceIp} />
-                    <TextField disabled margin="dense" id="deviceport" label="Device Port" fullWidth defaultValue={this.props.config.DevicePort} />
-                    <TextField disabled margin="dense" id="status" label="Status" fullWidth defaultValue={this.state.status} />
-                    <TextField disabled margin="dense" id="deviceType" label="Device Type" fullWidth defaultValue={this.state.devicetype} />
-                    <TextField disabled margin="dense" id="ncPort" label="Netconf Port" fullWidth defaultValue={this.props.config.NcPort} />
+                    <TextField variant="standard" disabled margin="dense" id="deviceIp" label="Device IP" fullWidth defaultValue={this.props.config.DeviceIp} />
+                    <TextField variant="standard" disabled margin="dense" id="deviceport" label="Device Port" fullWidth defaultValue={this.props.config.DevicePort} />
+                    <TextField variant="standard" disabled margin="dense" id="status" label="Status" fullWidth defaultValue={this.state.status} />
+                    <TextField variant="standard" disabled margin="dense" id="deviceType" label="Device Type" fullWidth defaultValue={this.state.devicetype} />
+                    <TextField variant="standard" disabled margin="dense" id="ncPort" label="Netconf Port" fullWidth defaultValue={this.props.config.NcPort} />
                     <FormGroup>
                         <FormControlLabel control={<Checkbox disabled defaultChecked={this.props.config.IsNCConnected}></Checkbox>} label="Netconf Connection" />
                         <FormControlLabel control={<Checkbox disabled defaultChecked={this.props.config.IsNeConnected}></Checkbox>} label="Network Element Connection" />
@@ -86,8 +86,8 @@ class ShowMediatorInfoDialogComponent extends React.Component<ShowMediatorInfoDi
                     {
                         this.props.config.ODLConfig.map((element, index) =>
                             <Panel title={"ODL config " + (this.props.config.ODLConfig.length > 1 ? index + 1 : '')} key={index} panelId={'panel-' + index} activePanel={this.state.activeOdlConfig} onToggle={(id: string) => { this.setState({ activeOdlConfig: (this.state.activeOdlConfig === id) ? "" : (id || "") }); }}>
-                                <TextField disabled margin="dense" defaultValue={element.Protocol + '://' + element.Server} label="Server" />
-                                <TextField disabled margin="dense" defaultValue={element.Port} label="Port" />
+                                <TextField variant="standard" disabled margin="dense" defaultValue={element.Protocol + '://' + element.Server} label="Server" />
+                                <TextField variant="standard" disabled margin="dense" defaultValue={element.Port} label="Port" />
                                 <FormControlLabel control={<Checkbox disabled checked={element.Trustall} />} label="Trustall" />
                             </Panel>
                         )
@@ -95,7 +95,7 @@ class ShowMediatorInfoDialogComponent extends React.Component<ShowMediatorInfoDi
 
                 </DialogContent>
                 <DialogActions>
-                    <Button onClick={this.onClose}>Close</Button>
+                    <Button onClick={this.onClose} color="inherit">Close</Button>
                 </DialogActions>
             </Dialog>
         )
index fbf6d57..da0ffa0 100644 (file)
  * ============LICENSE_END==========================================================================
  */
 import * as React from 'react';
-import { Theme, createStyles, WithStyles, withStyles, Tooltip } from '@material-ui/core';
+import { Theme, Tooltip } from '@mui/material';
 
-import AddIcon from '@material-ui/icons/Add';
-import IconButton from '@material-ui/core/IconButton';
-import EditIcon from '@material-ui/icons/Edit';
-import DeleteIcon from '@material-ui/icons/Delete';
-import InfoIcon from '@material-ui/icons/Info';
-import StartIcon from '@material-ui/icons/PlayArrow';
-import StopIcon from '@material-ui/icons/Stop';
+import { WithStyles } from '@mui/styles';
+import createStyles from '@mui/styles/createStyles';
+import withStyles from '@mui/styles/withStyles';
 
-import CircularProgress from '@material-ui/core/CircularProgress'
+import AddIcon from '@mui/icons-material/Add';
+import IconButton from '@mui/material/IconButton';
+import EditIcon from '@mui/icons-material/Edit';
+import DeleteIcon from '@mui/icons-material/Delete';
+import InfoIcon from '@mui/icons-material/Info';
+import StartIcon from '@mui/icons-material/PlayArrow';
+import StopIcon from '@mui/icons-material/Stop';
+
+import CircularProgress from '@mui/material/CircularProgress'
 
 import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
 import connect, { Connect, IDispatcher } from '../../../../framework/src/flux/connect';
@@ -130,23 +134,34 @@ class MediatorApplicationComponent extends React.Component<MediatorApplicationCo
     const renderActions = (rowData: MediatorConfigResponse) => (
       <>
         <div className={classes.spacer}>
-          <Tooltip title={"Start"} >
-            <IconButton disabled={rowData[BusySymbol]} className={classes.button}>
+          <Tooltip disableInteractive title={"Start"} >
+            <IconButton disabled={rowData[BusySymbol]} className={classes.button} size="large">
               <StartIcon onClick={(event) => { event.preventDefault(); event.stopPropagation(); this.props.startMediator(rowData.Name); }} />
             </IconButton>
           </Tooltip>
-          <Tooltip title={"Stop"} >
-            <IconButton disabled={rowData[BusySymbol]} className={classes.button}>
+          <Tooltip disableInteractive title={"Stop"} >
+            <IconButton disabled={rowData[BusySymbol]} className={classes.button} size="large">
               <StopIcon onClick={(event) => { event.preventDefault(); event.stopPropagation(); this.props.stopMediator(rowData.Name); }} />
             </IconButton>
           </Tooltip>
         </div>
         <div className={classes.spacer}>
-          <Tooltip title={"Info"} ><IconButton className={classes.button} onClick={(event) => { this.onOpenInfoDialog(event, rowData) }}><InfoIcon /></IconButton></Tooltip>
+          <Tooltip disableInteractive title={"Info"} ><IconButton
+            className={classes.button}
+            onClick={(event) => { this.onOpenInfoDialog(event, rowData) }}
+            size="large"><InfoIcon /></IconButton></Tooltip>
         </div>
         <div className={classes.spacer}>
-          {process.env.NODE_ENV === "development" ? <Tooltip title={"Edit"} ><IconButton disabled={rowData[BusySymbol]} className={classes.button} onClick={event => this.onOpenEditConfigurationDialog(event, rowData)}><EditIcon /></IconButton></Tooltip> : null}
-          <Tooltip title={"Remove"} ><IconButton disabled={rowData[BusySymbol]} className={classes.button} onClick={event => this.onOpenRemoveConfigutationDialog(event, rowData)}><DeleteIcon /></IconButton></Tooltip>
+          {process.env.NODE_ENV === "development" ? <Tooltip disableInteractive title={"Edit"} ><IconButton
+            disabled={rowData[BusySymbol]}
+            className={classes.button}
+            onClick={event => this.onOpenEditConfigurationDialog(event, rowData)}
+            size="large"><EditIcon /></IconButton></Tooltip> : null}
+          <Tooltip disableInteractive title={"Remove"} ><IconButton
+            disabled={rowData[BusySymbol]}
+            className={classes.button}
+            onClick={event => this.onOpenRemoveConfigutationDialog(event, rowData)}
+            size="large"><DeleteIcon /></IconButton></Tooltip>
         </div>
       </>
     );
index be1ecc7..c44e2cc 100644 (file)
  * ============LICENSE_END==========================================================================
  */
 import * as React from 'react';
-import { WithStyles, withStyles, createStyles, Theme, Tooltip } from '@material-ui/core';
+import { Theme, Tooltip } from '@mui/material';
 
-import AddIcon from '@material-ui/icons/Add';
-import IconButton from '@material-ui/core/IconButton';
-import EditIcon from '@material-ui/icons/Edit';
-import DeleteIcon from '@material-ui/icons/Delete';
-import Refresh from '@material-ui/icons/Refresh';
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
+
+import AddIcon from '@mui/icons-material/Add';
+import IconButton from '@mui/material/IconButton';
+import EditIcon from '@mui/icons-material/Edit';
+import DeleteIcon from '@mui/icons-material/Delete';
+import Refresh from '@mui/icons-material/Refresh';
 
 import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
 import connect, { IDispatcher, Connect } from '../../../../framework/src/flux/connect';
@@ -105,31 +109,35 @@ class MediatorServerSelectionComponent extends React.Component<MediatorServerSel
         });
       }
     };
-    return (
-      <>
-        <MediatorServersTable stickyHeader title={"Mediator"} customActionButtons={[refreshMediatorAction, addMediatorServerActionButton]} idProperty={"id"}
-          {...this.props.mediatorServersActions} {...this.props.mediatorServersProperties} columns={[
-            { property: "name", title: "Name", type: ColumnType.text },
-            { property: "url", title: "Url", type: ColumnType.text },
-            {
-              property: "actions", title: "Actions", type: ColumnType.custom, customControl: ({ rowData }) => (
-                <div className={classes.spacer}>
-                  <Tooltip title={"Edit"} ><IconButton className={classes.button} onClick={event => { this.onEditMediatorServer(event, rowData); }}><EditIcon /></IconButton></Tooltip>
-                  <Tooltip title={"Remove"} ><IconButton className={classes.button} onClick={event => { this.onRemoveMediatorServer(event, rowData); }}><DeleteIcon /></IconButton></Tooltip>
-                </div>
-              )
-            }
-          ]} onHandleClick={this.onSelectMediatorServer} />
-        <EditMediatorServerDialog
-          mediatorServer={this.state.mediatorServerToEdit}
-          mode={this.state.mediatorServerEditorMode}
-          onClose={this.onCloseEditMediatorServerDialog} />
-        <RefreshMediatorDialog
-          mode={this.state.refreshMediatorEditorMode}
-          onClose={this.onCloseRefreshMediatorDialog}
-        />
-      </>
-    );
+    return <>
+      <MediatorServersTable stickyHeader title={"Mediator"} customActionButtons={[refreshMediatorAction, addMediatorServerActionButton]} idProperty={"id"}
+        {...this.props.mediatorServersActions} {...this.props.mediatorServersProperties} columns={[
+          { property: "name", title: "Name", type: ColumnType.text },
+          { property: "url", title: "Url", type: ColumnType.text },
+          {
+            property: "actions", title: "Actions", type: ColumnType.custom, customControl: ({ rowData }) => (
+              <div className={classes.spacer}>
+                <Tooltip disableInteractive title={"Edit"} ><IconButton
+                  className={classes.button}
+                  onClick={event => { this.onEditMediatorServer(event, rowData); }}
+                  size="large"><EditIcon /></IconButton></Tooltip>
+                <Tooltip disableInteractive title={"Remove"} ><IconButton
+                  className={classes.button}
+                  onClick={event => { this.onRemoveMediatorServer(event, rowData); }}
+                  size="large"><DeleteIcon /></IconButton></Tooltip>
+              </div>
+            )
+          }
+        ]} onHandleClick={this.onSelectMediatorServer} />
+      <EditMediatorServerDialog
+        mediatorServer={this.state.mediatorServerToEdit}
+        mode={this.state.mediatorServerEditorMode}
+        onClose={this.onCloseEditMediatorServerDialog} />
+      <RefreshMediatorDialog
+        mode={this.state.refreshMediatorEditorMode}
+        onClose={this.onCloseRefreshMediatorDialog}
+      />
+    </>;
   }
 
   public componentDidMount() {
index 94943ec..f626632 100644 (file)
@@ -86,7 +86,7 @@ module.exports = (env) => {
         manifest: require(path.resolve(frameworkPath, "app-manifest.json")),
         sourceType: "umd2"
       }),
-      ...(env === "release") ? [
+      ...(env === "release" ? [
         new webpack.DefinePlugin({
           "process.env": {
             NODE_ENV: "'production'",
@@ -104,7 +104,7 @@ module.exports = (env) => {
             from: 'index.html',
             to: distPath
           }]),
-        ]
+        ])
     ],
 
     devServer: {
index 6c41933..2c88f30 100644 (file)
   "author": "Matthias Fischer",
   "license": "Apache-2.0",
   "dependencies": {
+    "@emotion/react": "^11.7.0",
+    "@emotion/styled": "^11.6.0",
+    "@mui/icons-material": "^5.2.0",
+    "@mui/material": "^5.2.2",
+    "@mui/styles": "^5.2.2",
     "@odlux/framework": "*"
   },
   "peerDependencies": {
-    "@types/react": "17.0.3",
-    "@types/react-dom": "17.0.2",
-    "@types/react-router-dom": "5.1.7",
-    "@material-ui/core": "4.11.4",
-    "@material-ui/icons": "4.11.2",
     "@types/classnames": "2.2.6",
     "@types/flux": "3.1.8",
     "@types/jquery": "3.3.10",
+    "@types/react": "17.0.37",
+    "@types/react-dom": "17.0.11",
+    "@types/react-router-dom": "5.1.7",
     "jquery": "3.3.1",
-    "react": "17.0.1",
-    "react-dom": "17.0.1",
+    "react": "17.0.2",
+    "react-dom": "17.0.2",
     "react-router-dom": "5.2.0"
   }
-}
\ No newline at end of file
+}
index 64a5344..50b24e7 100644 (file)
@@ -86,7 +86,7 @@ module.exports = (env) => {
         manifest: require(path.resolve(frameworkPath, "app-manifest.json")),
         sourceType: "umd2"
       }),
-      ...(env === "release") ? [
+      ...(env === "release" ? [
         new webpack.DefinePlugin({
           "process.env": {
             NODE_ENV: "'production'",
@@ -104,7 +104,7 @@ module.exports = (env) => {
             from: 'index.html',
             to: distPath
           }]),
-        ]
+        ])
     ],
 
     devServer: {
diff --git a/sdnr/wt/odlux/apps/networkMapApp/.babelrc b/sdnr/wt/odlux/apps/networkMapApp/.babelrc
deleted file mode 100644 (file)
index 3d8cd12..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "presets": [
-    ["@babel/preset-react"],
-    ["@babel/preset-env", {
-      "targets": {
-        "chrome": "66"
-      },
-      "spec": true,
-      "loose": false,
-      "modules": false,
-      "debug": false,
-      "useBuiltIns": "usage",
-      "forceAllTransforms": true
-    }]
-  ],
-  "plugins": []
-}
diff --git a/sdnr/wt/odlux/apps/networkMapApp/icons/README.md b/sdnr/wt/odlux/apps/networkMapApp/icons/README.md
deleted file mode 100644 (file)
index b26fbc2..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-Copyright of icons is as followes:
-
-<!--
- * ============LICENSE_START========================================================================
- * apartment.png - Material Icons
- * =================================================================================================
- * Copyright (C) 2020 Google. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
- -->
-datacenter.png and lamp.png 
-
-Taken from MS Word
-
-According to https://support.microsoft.com/en-us/office/insert-icons-in-microsoft-office-e2459f17-3996-4795-996e-b9a13486fa79 (date: October 9th, 2019)
-"These icons are free to use; there's no royalty or copyright."
-
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/icons/apartment.png b/sdnr/wt/odlux/apps/networkMapApp/icons/apartment.png
deleted file mode 100644 (file)
index d4a1c5e..0000000
Binary files a/sdnr/wt/odlux/apps/networkMapApp/icons/apartment.png and /dev/null differ
diff --git a/sdnr/wt/odlux/apps/networkMapApp/icons/apartment.png.d.ts b/sdnr/wt/odlux/apps/networkMapApp/icons/apartment.png.d.ts
deleted file mode 100644 (file)
index bf398f5..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const apartment: string;
-export default apartment;
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/icons/customize.png b/sdnr/wt/odlux/apps/networkMapApp/icons/customize.png
deleted file mode 100644 (file)
index 91dbf68..0000000
Binary files a/sdnr/wt/odlux/apps/networkMapApp/icons/customize.png and /dev/null differ
diff --git a/sdnr/wt/odlux/apps/networkMapApp/icons/customize.png.d.ts b/sdnr/wt/odlux/apps/networkMapApp/icons/customize.png.d.ts
deleted file mode 100644 (file)
index 7bcffb2..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const customize: string;
-export default customize;
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/icons/datacenter.png b/sdnr/wt/odlux/apps/networkMapApp/icons/datacenter.png
deleted file mode 100644 (file)
index eb2a627..0000000
Binary files a/sdnr/wt/odlux/apps/networkMapApp/icons/datacenter.png and /dev/null differ
diff --git a/sdnr/wt/odlux/apps/networkMapApp/icons/datacenter.png.d.ts b/sdnr/wt/odlux/apps/networkMapApp/icons/datacenter.png.d.ts
deleted file mode 100644 (file)
index a58a9f5..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const datacenter: string;
-export default datacenter;
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/icons/datacenterred.png b/sdnr/wt/odlux/apps/networkMapApp/icons/datacenterred.png
deleted file mode 100644 (file)
index 5d5a6c5..0000000
Binary files a/sdnr/wt/odlux/apps/networkMapApp/icons/datacenterred.png and /dev/null differ
diff --git a/sdnr/wt/odlux/apps/networkMapApp/icons/datacenterred.png.d.ts b/sdnr/wt/odlux/apps/networkMapApp/icons/datacenterred.png.d.ts
deleted file mode 100644 (file)
index 33f3061..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const datacenterred: string;
-export default datacenterred;
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/icons/factory.png b/sdnr/wt/odlux/apps/networkMapApp/icons/factory.png
deleted file mode 100644 (file)
index a38781b..0000000
Binary files a/sdnr/wt/odlux/apps/networkMapApp/icons/factory.png and /dev/null differ
diff --git a/sdnr/wt/odlux/apps/networkMapApp/icons/factory.png.d.ts b/sdnr/wt/odlux/apps/networkMapApp/icons/factory.png.d.ts
deleted file mode 100644 (file)
index b5c4f19..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const factory: string;
-export default factory;
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/icons/factoryred.png b/sdnr/wt/odlux/apps/networkMapApp/icons/factoryred.png
deleted file mode 100644 (file)
index 959603a..0000000
Binary files a/sdnr/wt/odlux/apps/networkMapApp/icons/factoryred.png and /dev/null differ
diff --git a/sdnr/wt/odlux/apps/networkMapApp/icons/factoryred.png.d.ts b/sdnr/wt/odlux/apps/networkMapApp/icons/factoryred.png.d.ts
deleted file mode 100644 (file)
index 1fac0a9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const factoryRed: string;
-export default factoryRed;
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/icons/lamp.png b/sdnr/wt/odlux/apps/networkMapApp/icons/lamp.png
deleted file mode 100644 (file)
index f5ea001..0000000
Binary files a/sdnr/wt/odlux/apps/networkMapApp/icons/lamp.png and /dev/null differ
diff --git a/sdnr/wt/odlux/apps/networkMapApp/icons/lamp.png.d.ts b/sdnr/wt/odlux/apps/networkMapApp/icons/lamp.png.d.ts
deleted file mode 100644 (file)
index 9634b12..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const lamp: string;
-export default lamp;
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/icons/lampred.png b/sdnr/wt/odlux/apps/networkMapApp/icons/lampred.png
deleted file mode 100644 (file)
index 4678ce9..0000000
Binary files a/sdnr/wt/odlux/apps/networkMapApp/icons/lampred.png and /dev/null differ
diff --git a/sdnr/wt/odlux/apps/networkMapApp/icons/lampred.png.d.ts b/sdnr/wt/odlux/apps/networkMapApp/icons/lampred.png.d.ts
deleted file mode 100644 (file)
index 12a8f91..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const lampred: string;
-export default lampred;
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/package.json b/sdnr/wt/odlux/apps/networkMapApp/package.json
deleted file mode 100644 (file)
index 1605370..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  "name": "@odlux/transport-app",
-  "version": "0.1.0",
-  "description": "A react based modular UI to display event log from a database.",
-  "main": "index.js",
-  "scripts": {
-    "start": "webpack-dev-server --env debug",
-    "build": "webpack --env release --config webpack.config.js",
-    "build:dev": "webpack --env debug --config webpack.config.js"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://git.mfico.de/highstreet-technologies/odlux.git"
-  },
-  "keywords": [
-    "reactjs",
-    "redux",
-    "ui",
-    "framework"
-  ],
-  "author": "Aijana Schumann",
-  "license": "Apache-2.0",
-  "dependencies": {
-    "@odlux/framework": "*",
-    "@types/mapbox-gl": "^1.10.2",
-    "mapbox-gl": "^1.11.0",
-    "object.values": "^1.1.1"
-  },
-  "peerDependencies": {
-    "@types/react": "17.0.3",
-    "@types/react-dom": "17.0.2",
-    "@types/react-router-dom": "5.1.7",
-    "@material-ui/core": "4.11.4",
-    "@material-ui/icons": "4.11.2",
-    "@types/classnames": "2.2.6",
-    "@types/flux": "3.1.8",
-    "@types/jquery": "3.3.10",
-    "jquery": "3.3.1",
-    "react": "17.0.1",
-    "react-dom": "17.0.1",
-    "react-router-dom": "5.2.0"
-    
-  }
-}
diff --git a/sdnr/wt/odlux/apps/networkMapApp/pom.xml b/sdnr/wt/odlux/apps/networkMapApp/pom.xml
deleted file mode 100644 (file)
index b034978..0000000
+++ /dev/null
@@ -1,159 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ ============LICENSE_START=======================================================
-  ~ ONAP : ccsdk features
-  ~ ================================================================================
-  ~ Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
-  ~ ================================================================================
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  ~ ============LICENSE_END=======================================================
-  ~
-  -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.onap.ccsdk.parent</groupId>
-        <artifactId>binding-parent</artifactId>
-        <version>2.3.2</version>
-        <relativePath/>
-    </parent>
-
-    <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
-    <artifactId>sdnr-wt-odlux-app-networkMapApp</artifactId>
-    <version>1.3.0-SNAPSHOT</version>
-    <packaging>bundle</packaging>
-
-    <name>ccsdk-features :: ${project.artifactId}</name>
-    <licenses>
-        <license>
-            <name>Apache License, Version 2.0</name>
-            <url>http://www.apache.org/licenses/LICENSE-2.0</url>
-        </license>
-    </licenses>
-
-    <properties>
-        <maven.javadoc.skip>true</maven.javadoc.skip>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>sdnr-wt-odlux-core-model</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>sdnr-wt-odlux-core-provider</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <sourceDirectory>src2/main/java</sourceDirectory>
-        <resources>
-            <resource>
-                <directory>dist</directory>
-                <targetPath>odlux</targetPath>
-            </resource>
-            <resource>
-                <directory>src2/main/resources</directory>
-            </resource>
-            <resource>
-                <directory>src2/test/resources</directory>
-            </resource>
-        </resources>
-        <plugins>
-            <plugin>
-                <artifactId>maven-clean-plugin</artifactId>
-                <configuration>
-                    <filesets>
-                        <fileset>
-                            <directory>dist</directory>
-                            <followSymlinks>false</followSymlinks>
-                        </fileset>
-                        <fileset>
-                            <directory>node</directory>
-                            <followSymlinks>false</followSymlinks>
-                        </fileset>
-                        <fileset>
-                            <directory>node_modules</directory>
-                            <followSymlinks>false</followSymlinks>
-                        </fileset>
-                        <fileset>
-                            <directory>../node_modules</directory>
-                            <followSymlinks>false</followSymlinks>
-                        </fileset>
-                        <!-- eclipse bug build bin folder in basedir -->
-                        <fileset>
-                            <directory>bin</directory>
-                            <followSymlinks>false</followSymlinks>
-                        </fileset>
-                    </filesets>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>build-helper-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>add-test-source</id>
-                        <phase>generate-test-sources</phase>
-                        <goals>
-                            <goal>add-test-source</goal>
-                        </goals>
-                        <configuration>
-                            <sources>
-                                <source>src2/test/java</source>
-                            </sources>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>de.jacks-it-lab</groupId>
-                <artifactId>frontend-maven-plugin</artifactId>
-                <version>1.7.2</version>
-                <executions>
-                    <execution>
-                        <id>install node and yarn</id>
-                        <goals>
-                            <goal>install-node-and-yarn</goal>
-                        </goals>
-                        <!-- optional: default phase is "generate-resources" -->
-                        <phase>initialize</phase>
-                        <configuration>
-                            <nodeVersion>v12.13.0</nodeVersion>
-                            <yarnVersion>v1.22.10</yarnVersion>
-                        </configuration>
-                    </execution>
-                    <execution>
-                        <id>yarn build</id>
-                        <goals>
-                            <goal>yarn</goal>
-                        </goals>
-                        <configuration>
-                            <arguments>run build</arguments>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/App.tsx b/sdnr/wt/odlux/apps/networkMapApp/src/App.tsx
deleted file mode 100644 (file)
index 5840d18..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import * as React from 'react';
-import  Map from './components/map/map'
-import Details from './components/details/details'
-
-function MainView() {
-  return (
-    <div className="App" style={{display: 'flex', flexDirection:'row', flexGrow:1, height:"100%"}}>
-     <Map />
-     <Details />
-    </div>
-  );
-}
-
-export default MainView;
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/actions/connectivityAction.ts b/sdnr/wt/odlux/apps/networkMapApp/src/actions/connectivityAction.ts
deleted file mode 100644 (file)
index 63f52c8..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { Action } from "../../../../framework/src/flux/action";
-import { Dispatch } from "../../../../framework/src/flux/store";
-import { IApplicationStoreState } from "../../../../framework/src/store/applicationStore";
-
-
-export class IsTopologyServerReachableAction extends Action{
-    constructor(public reachable: boolean){
-        super();
-    }
-}
-
-export class IsTileServerReachableAction extends Action{
-    constructor(public reachable: boolean){
-        super();
-    }
-}
-
-export class IsBusycheckingConnectivityAction extends Action{
-    constructor(public isBusy: boolean){
-        super();
-    }
-}
-
-export const verifyResponse = (response: Response) =>{
-
-    if(response.ok){
-        return response
-    }else{
-        throw Error(`Connection Error: ${response.status} | ${response.statusText} | ${response.url}`)
-    }
-}
-
-export const handleConnectionError = (error: Error) => (dispatcher: Dispatch, getState: () => IApplicationStoreState)=>{
-    const {network:{connectivity: {isToplogyServerAvailable}}} = getState();
-    if(isToplogyServerAvailable){
-       dispatcher(new IsTopologyServerReachableAction(false))
-    }
-}
-
-export const setTileServerReachableAction = (isReachable: boolean) => (dispatcher: Dispatch, getState: () => IApplicationStoreState)=>{
-    const {network:{connectivity: {isTileServerAvailable}}} = getState();
-    if(isReachable !== isTileServerAvailable){
-       dispatcher(new IsTileServerReachableAction(isReachable))
-    }
-}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/actions/detailsAction.ts b/sdnr/wt/odlux/apps/networkMapApp/src/actions/detailsAction.ts
deleted file mode 100644 (file)
index a9bea4f..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { Action } from '../../../../framework/src/flux/action';
-import { requestRest } from '../../../../framework/src/services/restService';
-
-
-import { Site, Device } from "../model/site";
-import { link } from '../model/link';
-import { HistoryEntry } from "../model/historyEntry";
-import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
-import { Dispatch } from '../../../../framework/src/flux/store';
-import { SITEDOC_URL } from '../config';
-
-export class SelectSiteAction extends Action {
-  constructor(public site: Site){
-    super()
-  }
-}
-
-export class SelectLinkAction extends Action {
- constructor(public link: link){
-   super();
- }
-}
-
-export class ClearDetailsAction extends Action{
-  constructor(){
-    super();
-  }
-}
-
-export class AddToHistoryAction extends Action {
- constructor(public entry: HistoryEntry){
-   super();
- }
-}
-
-export class ClearHistoryAction extends Action {
-  constructor(){
-    super();
-  }
-}
-
-export class IsBusyCheckingDeviceListAction extends Action{
-  constructor(public isBusy: boolean){
-    super();
-  }
-}
-
-export class FinishedLoadingDeviceListAction extends Action{
-  constructor(public devices: Device[]){
-    super();
-  }
-}
-
-export class ClearLoadedDevicesAction extends Action{
-  constructor(){
-    super();
-  }
-}
-
-export class InitializeLoadedDevicesAction extends Action{
-  constructor(public devices: Device[]){
-    super();
-  }
-}
-
-export class IsSitedocReachableAction extends Action{
-  constructor(public isReachable: boolean){
-    super();
-  }
-}
-
-let running=false;
-
-export const UpdateDetailsView = (nodeId: string) =>(dispatcher: Dispatch, getState: () => IApplicationStoreState) =>{
-  const {network:{details:{checkedDevices}}} = getState();
-  if(checkedDevices!==null){
-    const index = checkedDevices.findIndex(item=>item.name===nodeId)
-    if(index!==-1)
-     requestRest<any>("/rests/operational/network-topology:network-topology/topology/topology-netconf/node/"+nodeId, { method: "GET" })
-     .then(result =>{
-      if(result!==null){
-        checkedDevices[index].status = result.node[0]["netconf-node-topology:connection-status"];
-
-      }else{
-        checkedDevices[index].status = "Not connected";
-      }
-      dispatcher(new FinishedLoadingDeviceListAction(checkedDevices));
-
-     });
-  }
-}
-
-export const CheckDeviceList = (list: Device[]) => async (dispatcher: Dispatch, getState: () => IApplicationStoreState) =>{
-if(running) return;
-running=true;
-  dispatcher(new IsBusyCheckingDeviceListAction(true));
-
-  const promises = list.map((device)=>{
-    if(device.name){
-      return requestRest<any>("/rests/data/network-topology:network-topology/topology=topology-netconf/node="+device.name, { method: "GET" })
-    }else{
-      return device;
-    }
-
-  })
-
-  Promise.all(promises).then((result)=>{
-    running=false;
-    
-
-    result.forEach((res: any, index)=>{
-     if(res !==null && res["network-topology:node"]){
-      list[index].status = res["network-topology:node"][0]["netconf-node-topology:connection-status"];
-     }else{
-      list[index].status = "Not connected";
-     }
-    });
-
-    dispatcher(new FinishedLoadingDeviceListAction(list));
-    dispatcher(new IsBusyCheckingDeviceListAction(false));
-
-  })
-  .catch(err=>{
-    console.error(err);
-
-  dispatcher(new IsBusyCheckingDeviceListAction(false));
-
-  });
-}
-
-export const checkSitedockReachablity = () => async (dispatcher: Dispatch, getState: () => IApplicationStoreState) =>{
-  console.log("searching for sitedoc server...")
-  requestRest<any>(SITEDOC_URL+'/app/versioninfo').then(response =>{
-    console.log(response);
-    if(response){
-     
-        dispatcher(new IsSitedocReachableAction(true));
-      
-    }else{
-      dispatcher(new IsSitedocReachableAction(false));
-    }
-  })
-}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/actions/mapActions.ts b/sdnr/wt/odlux/apps/networkMapApp/src/actions/mapActions.ts
deleted file mode 100644 (file)
index 9830c06..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { Action } from '../../../../framework/src/flux/action';
-import { Dispatch } from '../../../../framework/src/flux/store';
-
-
-import { link } from "../model/link";
-import { Site } from "../model/site";
-import { Feature } from '../model/Feature';
-import { URL_API } from '../config';
-
-
-export class HighlightLinkAction extends Action{
-    constructor(public link: link){
-        super();
-    }
-}
-
-export class HighlightSiteAction extends Action{
-    constructor(public site: Site){
-        super();
-    }
-}
-
-export class RemoveHighlightingAction extends Action {
-   constructor(){
-       super();
-   }
-}
-
-export class ZoomToSearchResultAction extends Action{
-    constructor(public lat: number, public lon: number){
-        super();
-    }
-}
-
-export class AddAlarmAction extends Action{
-    constructor(public site: Site){
-        super();
-    }
-}
-
-export class SetCoordinatesAction extends Action{
-    constructor(public lat: number, public lon: number, public zoom: number){
-        super();
-    }
-}
-
-export class SetStatistics extends Action{
-    constructor(public siteCount: string, public linkCount: string){
-        super();
-    }
-}
-
-export class SetIconSwitchAction extends Action{
-    constructor(public enable:boolean){
-        super();
-    }
-}
-
-export const findSiteToAlarm = (alarmedNodeId: string) => (dispatcher: Dispatch) =>{
-    //TODO: fix!
-    fetch(URL_API+"/sites/devices/"+alarmedNodeId)
-    .then(res => res.json())
-    .then(result=>{
-        dispatcher(new AddAlarmAction(result));
-    });
-}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/actions/popupActions.ts b/sdnr/wt/odlux/apps/networkMapApp/src/actions/popupActions.ts
deleted file mode 100644 (file)
index a8c54d4..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { PopupElement } from '../model/popupElements';
-import { Action } from '../../../../framework/src/flux/action';
-
-export class SetPopupPositionAction extends Action {
-    constructor(public top: number, public left: number){
-        super()
-    }
-}
-
-export class SelectMultipleLinksAction extends Action {
-    constructor(public elements: PopupElement[]) {
-        super();
-    }
-}
-
-
-
-export class SelectMultipleSitesAction extends Action {
-    constructor(public elements: PopupElement[]) {
-       super();
-    }
-}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/actions/searchAction.ts b/sdnr/wt/odlux/apps/networkMapApp/src/actions/searchAction.ts
deleted file mode 100644 (file)
index a553319..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { Action } from '../../../../framework/src/flux/action';
-
-export class SetSearchValueAction extends Action{
-    constructor(public value: string){
-        super();
-    }
-}
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/actions/settingsAction.ts b/sdnr/wt/odlux/apps/networkMapApp/src/actions/settingsAction.ts
deleted file mode 100644 (file)
index 5b89823..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { NetworkMapSettings, NetworkMapThemes, NetworkSettings } from '../model/settings';
-import { Action } from '../../../../framework/src/flux/action';
-import { Dispatch } from '../../../../framework/src/flux/store';
-import { settingsService } from '../services/settingsService';
-
-export class SetMapSettingsAction extends Action{
-
-    constructor(public settings:NetworkMapSettings) {
-        super();
-    }
-}
-
-export class SetThemeSettingsAction extends Action{
-
-    constructor(public settings:NetworkMapThemes) {
-        super();
-    }
-}
-
-export class SetSettingsAction extends Action{
-
-    constructor(public settings:NetworkSettings) {
-        super();
-    }
-}
-
-export class SetBusyLoadingAction extends Action{
-   
-    constructor(public busy: boolean) {
-        super();
-        
-    }
-}
-
-
-export const getSettings = () => async (dispatcher: Dispatch) => {
-    dispatcher(new SetBusyLoadingAction(true));
-    console.log("getting settings in action..")
- settingsService.getMapSettings().then(result =>{
-     if(result){
-         if(result.networkMap && result.networkMapThemes){
-            const mapSettings : NetworkSettings = { networkMap: result.networkMap, networkMapThemes: result.networkMapThemes}
-            dispatcher(new SetSettingsAction(mapSettings));
-         }else if(result.networkMap){
-            dispatcher(new SetMapSettingsAction(result));
-         }else if(result.networkMapThemes){
-             dispatcher(new SetThemeSettingsAction(result));
-         }
-    }
-    else{
-        console.warn("settings couldn't be loaded.");
-    }
-    dispatcher(new SetBusyLoadingAction(false));
- });
-}
-
-export const updateSettings = (mapSettings: NetworkMapSettings) => async (dispatcher: Dispatch) =>{
-
-    const result = await settingsService.updateMapSettings(mapSettings);
-    console.log("update settings");
-    dispatcher(new SetMapSettingsAction(mapSettings));
-
-    console.log(result);
-    if(result){
-    }
-
-}
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/components/customize/customizationView.tsx b/sdnr/wt/odlux/apps/networkMapApp/src/components/customize/customizationView.tsx
deleted file mode 100644 (file)
index 82e7b79..0000000
+++ /dev/null
@@ -1,291 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { Button, Grid, InputLabel, makeStyles, MenuItem, Select, Slider, TextField, Typography } from '@material-ui/core';
-import { NetworkMapSettings, ThemeElement } from '../../model/settings';
-import * as React from 'react'
-import connect, { Connect, IDispatcher } from '../../../../../framework/src/flux/connect';
-import { IApplicationStoreState } from '../../../../../framework/src/store/applicationStore';
-import { updateSettings } from '../../actions/settingsAction';
-import ThemeEntry from './themeElement'
-import * as mapboxgl from 'mapbox-gl';
-import { OSM_STYLE } from '../../config';
-import mapLayerService from '../../utils/mapLayers';
-import { requestRest } from '../../../../../framework/src/services/restService';
-import { NavigateToApplication } from '../../../../../framework/src/actions/navigationActions';
-
-type props = Connect<typeof mapProps, typeof mapDispatch>;
-let map: mapboxgl.Map;
-let myMapRef = React.createRef<HTMLDivElement>();
-const default_boundingbox = "12.882544785787754,52.21421979821472,13.775455214211949,52.80406241672602";
-
-
-const mapProps = (state: IApplicationStoreState) => ({
-  settings: state.network.settings,
-});
-
-const mapDispatch = (dispatcher: IDispatcher) => ({
-  updateSettings: (mapSettings: NetworkMapSettings) => dispatcher.dispatch(updateSettings(mapSettings)),
-  navigateToApplication: (applicationName: string) => dispatcher.dispatch(new NavigateToApplication(applicationName)),
-
-
-});
-
-const styles = makeStyles({
-  sectionMargin: {
-    marginTop: "30px",
-    marginBottom: "15px"
-  },
-  elementMargin: {
-
-    marginLeft: "10px"
-  }
-});
-
-const CustomizationView: React.FunctionComponent<props> = (props) => {
-
-  const [opacity, setOpacity] = React.useState(Number(props.settings.mapSettings?.networkMap.tileOpacity) || 100);
-  const [theme, setTheme] = React.useState(props.settings.mapSettings?.networkMap.styling.theme || '');
-  const [latitude, setLatitude] = React.useState<number>(Number(props.settings.mapSettings?.networkMap.startupPosition.latitude)|| 52.5);
-  const [longitude, setLongitude] = React.useState<number>(Number(props.settings.mapSettings?.networkMap.startupPosition.longitude)|| 13.35);
-  const [zoom, setZoom] = React.useState<number>(Number(props.settings.mapSettings?.networkMap.startupPosition.zoom) || 10);
-
-
-  //used to make opacity available within the map event-listeners
-  //(hook state values are snapshotted at initalization and not updated afterwards, thus use a ref here)
-  const myOpacityRef = React.useRef(opacity);
-  const setOpacityState = (data:any) => {
-    myOpacityRef.current = data;
-    setOpacity(data);
-  };
-
-  const classes = styles();
-  const currentTheme = props.settings.themes.networkMapThemes.themes.find(el => el.key === theme);
-
-
-  React.useEffect(() => {
-    mapLayerService.settings = props.settings.themes;
-
-    map = new mapboxgl.Map({
-      container: myMapRef.current!,
-      style: OSM_STYLE as any,
-      center: [longitude, latitude],
-      zoom: zoom,
-      accessToken: ''
-    });
-
-    map.on('load', (ev) => {
-
-      mapLayerService.addBaseSources(map, null, null);
-      if(props.settings.mapSettings?.networkMap.styling.theme !== theme){
-        mapLayerService.addBaseLayers(map, currentTheme);
-
-      }else{
-        mapLayerService.addBaseLayers(map);
-      }
-
-      mapLayerService.changeMapOpacity(map, myOpacityRef.current);
-
-      getData();
-    });
-
-    map.on('moveend', () => {
-      const center = map.getCenter();
-      setZoom(Number(map.getZoom().toFixed(4)));
-      setLatitude(Number(center.lat.toFixed(4)));
-      setLongitude(Number(center.lng.toFixed(4)));
-    });
-
-  }, []);
-
-  React.useEffect(() => {
-    recenterMap();
-  }, [latitude, longitude, zoom]);
-
-  const setState = () => {
-    if (props.settings.mapSettings?.networkMap.styling) {
-      setTheme(props.settings.mapSettings.networkMap.styling.theme);
-      mapLayerService.changeTheme(map, props.settings.mapSettings.networkMap.styling.theme);
-    }
-
-    const propOpacity = props.settings.mapSettings?.networkMap.tileOpacity;
-    if (propOpacity) {
-      setOpacityState(propOpacity);
-    }
-  }
-
-  React.useEffect(() => {
-    setState();
-  }, [props.settings.mapSettings]);
-
-  const onOpacityChange = (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>, newValue: number) => {
-    setOpacity(newValue);
-    mapLayerService.changeMapOpacity(map, newValue);
-
-  };
-
-  const onChangeTheme = (e: any) => {
-
-    const newTheme = e.target.value;
-    setTheme(newTheme);
-    mapLayerService.changeTheme(map, newTheme);
-  }
-
-  const onCancel = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
-    e.preventDefault();
-    props.navigateToApplication("network");
-  }
-
-  const onSaveSettings = async (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
-    e.preventDefault();
-
-    const updatedSettings: NetworkMapSettings = {
-      networkMap: {
-        tileOpacity: opacity.toString(),
-        styling: { theme: theme },
-        startupPosition: {
-          latitude: latitude.toString(),
-          longitude: longitude.toString(),
-          zoom: zoom.toString()
-        }
-      }
-    };
-
-    console.log(updatedSettings);
-    
-    await props.updateSettings(updatedSettings)
-    props.navigateToApplication("network");
-
-  }
-
-  const recenterMap = () => {
-
-    if (!isNaN(latitude) && !isNaN(longitude) && !isNaN(zoom))
-
-      map.flyTo({
-        center: [
-          longitude,
-          latitude
-        ], zoom: zoom,
-        essential: false
-      });
-  }
-
-
-
-  const getData = () => {
-
-    //get data of boundingbox from networkmap
-
-    const links = requestRest<any>("/topology/network/links/geojson/" + default_boundingbox);
-    const sites = requestRest<any>("/topology/network/sites/geojson/" + default_boundingbox);
-
-    Promise.all([links, sites]).then(results => {
-      if (map.getSource('lines')) {
-        (map.getSource('lines') as mapboxgl.GeoJSONSource).setData(results[0]);
-      }
-
-      if (map.getSource('points')) {
-        (map.getSource('points') as mapboxgl.GeoJSONSource).setData(results[1]);
-      }
-
-      if (map.getSource('selectedPoints')) {
-        (map.getSource('selectedPoints') as mapboxgl.GeoJSONSource).setData(results[1].features[0]);
-      }
-    });
-  }
-
-  /**
-   * Style property names to readable text
-   * @param text propretyName
-   * @returns readable text
-   */
-  const styleText = (text: string) => {
-    const textParts = text.split(/(?=[A-Z])/); //split on uppercase character
-    const newText = textParts.join(" ");
-    return newText.charAt(0).toUpperCase() + newText.slice(1);
-  }
-
-
-  return (<>
-    <h3>Settings</h3>
-    <div style={{ display: 'flex', flexDirection: 'row', flexGrow: 1, height: "100%", position: 'relative' }}>
-      <div style={{ width: "60%", flexDirection: 'column', position:'relative' }}>
-        <Typography variant="body1" style={{ fontWeight: "bold" }} gutterBottom>Startup Position</Typography>
-        <div style={{ display: 'flex', flexDirection: 'row' }}>
-          <TextField type="number" value={latitude} onChange={(e) => setLatitude(e.target.value as any)} style={{ marginLeft: 10 }} label="Latitude" />
-          <TextField type="number" value={longitude} onChange={(e) => setLongitude(e.target.value as any)} style={{ marginLeft: 5 }} label="Longitude" />
-          <TextField type="number" value={zoom} onChange={(e) => setZoom(e.target.value as any)} style={{ marginLeft: 5 }} label="Zoom" />
-        </div>
-
-        <Typography className={classes.sectionMargin} variant="body1" style={{ fontWeight: "bold" }} gutterBottom>
-          Tile Opacity
-        </Typography>
-        <Grid className={classes.elementMargin} container spacing={2} style={{ width: '50%' }}>
-          <Grid item>0</Grid>
-          <Grid item xs>
-            <Slider color="secondary" min={0} max={100} value={opacity} onChange={onOpacityChange} aria-labelledby="continuous-slider" />
-          </Grid>
-          <Grid item>100</Grid>
-        </Grid>
-
-        <Typography className={classes.sectionMargin} variant="body1" style={{ fontWeight: "bold" }} gutterBottom>
-          Style of properties
-      </Typography>
-        <InputLabel id="theme-select-label">Theme</InputLabel>
-        <Select
-          className={classes.elementMargin}
-          value={theme}
-          onChange={onChangeTheme}
-          labelId="theme-select-label"
-          style={{ marginLeft: 10 }}>
-          {
-            props.settings.themes.networkMapThemes.themes.map(el => <MenuItem value={el.key}>{el.key}</MenuItem>)
-          }
-
-        </Select>
-
-        {
-          currentTheme && <div style={{ marginLeft: 60 }}>
-            { //skip the 'key' (theme name) entry
-              Object.keys(currentTheme).slice(1).map(el => <ThemeEntry text={styleText(el)} color={(currentTheme as any)[el]} />)
-            }
-          </div>
-        }
-
-
-        <div className={classes.sectionMargin} style={{ position: 'absolute', right: 0, top: '60%' }}>
-          <Button className={classes.elementMargin} variant="contained"
-            color="primary" onClick={onCancel}>Cancel</Button>
-
-          <Button className={classes.elementMargin} variant="contained"
-            color="secondary" onClick={onSaveSettings}>Save</Button>
-        </div>
-      </div>
-      <div id="map" ref={myMapRef} style={{ width: "35%", height: "50%" }}>
-
-      </div>
-    </div>
-
-  </>)
-
-}
-
-export default connect(mapProps, mapDispatch)(CustomizationView);
-
-
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/components/customize/themeElement.tsx b/sdnr/wt/odlux/apps/networkMapApp/src/components/customize/themeElement.tsx
deleted file mode 100644 (file)
index c991aaf..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { Typography } from '@material-ui/core';
-import * as React from 'react'
-
-
-type props={
-    color: string,
-    text: string
-};
-
-const ThemeEntry = (props: props) =>{
-
-    var circleStyle = {
-        padding:10,
-        margin:20,
-        backgroundColor: props.color,
-        borderRadius: "50%",
-        width:10,
-        height:10,
-        left:0,
-        top:0};
-
-        return <div style={{display: 'flex', flexDirection:'row'}}>
-            <div style={circleStyle} />
-            <Typography variant="body1" style={{marginTop:24}}>{props.text}</Typography>
-            </div>
-
-}
-
-export default ThemeEntry;
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/components/denseTable.tsx b/sdnr/wt/odlux/apps/networkMapApp/src/components/denseTable.tsx
deleted file mode 100644 (file)
index e04fda5..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import * as React from 'react';
-import Table from '@material-ui/core/Table';
-import TableBody from '@material-ui/core/TableBody';
-import TableCell from '@material-ui/core/TableCell';
-import TableContainer from '@material-ui/core/TableContainer';
-import TableHead from '@material-ui/core/TableHead';
-import TableRow from '@material-ui/core/TableRow';
-import Paper from '@material-ui/core/Paper';
-import { makeStyles, Button, Tooltip } from '@material-ui/core';
-
-type props = { headers: string[], 
-    height: number, 
-    navigate?(applicationName: string, path?: string): void, 
-    onLinkClick?(id: string): void, data: any[], 
-    hover: boolean, 
-    ariaLabelRow: string, 
-    ariaLabelColumn?: string[], 
-    verticalTable?: boolean, 
-    onClick?(id: string): void, 
-    actions?: boolean };
-
-
-const styles = makeStyles({
-    container: {
-        overflow: "auto"
-    },
-    button: {
-        margin: 0,
-        padding: "6px 6px",
-        minWidth: 'unset'
-    }
-
-});
-
-
-const DenseTable: React.FunctionComponent<props> = (props) => {
-
-    const classes = styles();
-
-    const handleClick = (event: any, id: string) => {
-        event.preventDefault();
-        props.onClick !== undefined && props.onClick(id);
-
-    }
-
-    const handleHover = (event: any, id: string) => {
-        event.preventDefault();
-
-    }
-
-    return (
-        <Paper style={{ borderRadius: "0px" }}>
-            <div style={{ height: props.height, overflow: "auto" }}>
-                <Table stickyHeader size="small" aria-label="a dense table" >
-                    <TableHead>
-                        <TableRow>
-                            {
-                                props.headers.map((data) => {
-                                    return <TableCell>{data}</TableCell>
-                                })
-                            }
-                        </TableRow>
-                    </TableHead>
-                    <TableBody>
-                        {props.data.map((row, index) => {
-                            var values = Object.keys(row).map(function (e) { return row[e]; });
-                            return (
-                                <TableRow aria-label={props.ariaLabelRow} key={index} hover={props.hover} onMouseOver={e => handleHover(e, row.name)} onClick={e => handleClick(e, row.name)}>
-
-                                    {
-                                        values.map((data: any, i) => {
-                                            if (data !== undefined) {
-
-                                                if (!props.verticalTable) {
-                                                    const ariaLabel = props.ariaLabelColumn === undefined ? props.headers[i].toLowerCase() : props.ariaLabelColumn[i]; 
-                                                    if (ariaLabel.length > 0) {
-                                                        return <TableCell aria-label={ariaLabel}>{data}</TableCell>
-                                                    } else {
-                                                        return <TableCell>{data}</TableCell>
-                                                    }
-                                                }
-                                                else {
-                                                    // skip adding aria label to 'header' column
-                                                    if (i === 0) {
-                                                        return <TableCell>{data}</TableCell>
-                                                    } else {
-                                                        const ariaLabel = props.ariaLabelColumn === undefined ? props.headers[index].toLowerCase() : props.ariaLabelColumn[index]; 
-                                                        return <TableCell aria-label={ariaLabel}>{data}</TableCell>
-                                                    }
-                                                }
-                                            }
-                                            else
-                                                return null;
-                                        })
-                                    }
-                                    {
-
-                                        props.actions && <TableCell >
-                                            <div style={{ display: "flex" }}>
-                                                <Tooltip title="Configure">
-                                                    <Button className={classes.button} disabled={row.status !== "connected"} onClick={(e: any) => { e.preventDefault(); e.stopPropagation(); props.navigate && props.navigate("configuration", row.simulatorId ? row.simulatorId : row.name) }}>C</Button>
-                                                </Tooltip>
-                                                <Tooltip title="Fault">
-                                                    <Button className={classes.button} disabled={row.status !== "connected"} onClick={(e: any) => { e.preventDefault(); e.stopPropagation(); props.navigate && props.navigate("fault", row.simulatorId ? row.simulatorId : row.name) }}>F</Button>
-                                                </Tooltip>
-                                            </div>
-                                        </TableCell>
-                                    }
-                                </TableRow>)
-                        })
-                        }
-
-                    </TableBody>
-                </Table>
-            </div>
-        </Paper>
-    );
-
-}
-
-export default DenseTable;
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/components/details/details.tsx b/sdnr/wt/odlux/apps/networkMapApp/src/components/details/details.tsx
deleted file mode 100644 (file)
index 2540b20..0000000
+++ /dev/null
@@ -1,204 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import * as React from 'react'
-
-import connect, { IDispatcher, Connect } from '../../../../../framework/src/flux/connect';
-
-import { Site, Device } from '../../model/site';
-import Typography from '@material-ui/core/Typography';
-import { link } from '../../model/link';
-import { Breadcrumbs, Link, Paper } from '@material-ui/core';
-import SiteDetails from './siteDetails';
-import LinkDetails from './linkDetails';
-import { URL_API, URL_BASEPATH } from '../../config';
-import { SelectSiteAction, SelectLinkAction, AddToHistoryAction, ClearHistoryAction, CheckDeviceList, ClearDetailsAction } from '../../actions/detailsAction';
-import { HistoryEntry } from '../../model/historyEntry';
-import { HighlightLinkAction, HighlightSiteAction, RemoveHighlightingAction } from '../../actions/mapActions';
-import { isSite } from '../../utils/utils';
-import { IApplicationStoreState } from '../../../../../framework/src/store/applicationStore';
-import { NavigateToApplication } from '../../../../../framework/src/actions/navigationActions';
-import { RouteComponentProps, withRouter } from 'react-router-dom';
-
-
-const Details: React.FunctionComponent<porps> = (props) => {
-
-    const [message, setMessage] = React.useState("No data selected.");
-
-
-    //on mount
-    React.useEffect(() => {
-        const detailsId = getDetailsIdFromUrl();
-        if (detailsId !== null && props.data?.name !== detailsId) {
-            loadDetailsData(detailsId)
-        }
-
-    }, []);
-
-    // if url changed, load details data
-    React.useEffect(() => {
-        const detailsId = getDetailsIdFromUrl();
-        if (detailsId !== null && props.data?.name !== detailsId) {
-            loadDetailsData(detailsId)
-        }
-        else if(detailsId===null){
-            setMessage("No data selected.");
-            props.clearDetails();
-            props.undoMapSelection();
-        }
-
-    }, [props.location.pathname]);
-
-    //update url if new element loaded
-    React.useEffect(() => {
-        if (props.data !== null) {
-            const currentUrl = window.location.href;
-            const parts = currentUrl.split(URL_BASEPATH);
-            const detailsPath = parts[1].split("/details/");
-            props.history.replace(`/${URL_BASEPATH}${detailsPath[0]}/details/${props.data.name}`)
-        }
-
-    }, [props.data])
-
-    const onLinkClick = async (id: string) => {
-        const result = await fetch(`${URL_API}/links/${id}`);
-        if(result.ok){
-            const resultAsJson = await result.json();
-            const link = resultAsJson as link;
-            props.selectLink(link);
-            props.addHistory({ id: props.data!.name, data: props.data! });
-            props.highlightLink(link);
-
-        }
-    }
-
-    const backClick = (e: any) => {
-        if (isSite(props.breadcrumbs[0].data)) {
-            props.selectSite(props.breadcrumbs[0].data)
-            props.highlightSite(props.breadcrumbs[0].data);
-
-        } else {
-            props.selectLink(props.breadcrumbs[0].data);
-            props.highlightLink(props.breadcrumbs[0].data);
-
-        }
-
-        props.clearHistory();
-        e.preventDefault();
-    }
-
-    const createDetailPanel = (data: Site | link) => {
-        if (isSite(data)) {
-            return <SiteDetails  site={data} onLinkClick={onLinkClick} />
-        } else {
-            return <LinkDetails link={data} />
-        }
-    }
-
-    const getDetailsIdFromUrl = () =>{
-        const currentUrl = window.location.href;
-        const parts = currentUrl.split(URL_BASEPATH);
-        const detailsPath = parts[1].split("/details/")
-        return detailsPath[1] ? detailsPath[1] : null;
-    }
-
-    const loadDetailsData = (id: string) =>{
-
-        fetch(`${URL_API}/links/${id}`)
-                .then(res => {
-                    if (res.ok)
-                        return res.json()
-                    else
-                        return Promise.reject()
-
-                })
-                .then(result => {
-                    props.selectLink(result)
-                    props.highlightLink(result);
-
-                })
-                .catch(error => {
-
-                    fetch(`${URL_API}/sites/name/${id}`)
-                        .then(res => {
-                            if (res.ok)
-                                return res.json()
-                            else return Promise.reject();
-                        })
-                        .then(result => { 
-                            props.selectSite(result); 
-                            props.highlightSite(result);
-                         })
-                        .catch(error =>{
-                            setMessage("No element with name " + id + " found");
-                            props.clearDetails();
-                            props.undoMapSelection();
-                        });
-                })
-    }
-
-    const panelId = props.data!== null ? (isSite(props.data) ? 'site-details-panel' : 'link-details-panel' ): 'details-panel';
-
-    return (<div style={{ width: '30%', background: "#bbbdbf", padding: "20px", alignSelf:"stretch" }}>
-        <Paper style={{ height:"100%"}} id={panelId} aria-label={panelId}  >
-            {
-                props.breadcrumbs.length > 0 &&
-                <Breadcrumbs style={{ marginLeft: "15px", marginTop: "5px" }} aria-label="breadcrumbs-navigation">
-                    <Link aria-label="parent-element" color="inherit" href="/" onClick={backClick}>
-                        {props.breadcrumbs[0].id}
-                    </Link>
-                    <Link aria-label="child-element" color="textSecondary">
-                        {props.data?.name}
-                    </Link>
-                </Breadcrumbs>
-            }
-            {
-                props.data !== null ?
-                    createDetailPanel(props.data)
-                    : <Typography aria-label="details-panel-alt-message" style={{ marginTop: "5px" }} align="center" variant="body1">{message}</Typography>
-
-            }
-        </Paper>
-    </div>)
-}
-
-type porps = RouteComponentProps & Connect<typeof mapStateToProps, typeof mapDispatchToProps>;
-
-//select always via details?
-const mapStateToProps = (state: IApplicationStoreState) => ({
-    data: state.network.details?.data,
-    breadcrumbs: state.network.details.history,
-    updatedDevices: state.network.details.checkedDevices
-});
-
-const mapDispatchToProps = (dispatcher: IDispatcher) => ({
-    selectSite: (site: Site) => dispatcher.dispatch(new SelectSiteAction(site)),
-    selectLink: (link: link) => dispatcher.dispatch(new SelectLinkAction(link)),
-    clearDetails: () => dispatcher.dispatch(new ClearDetailsAction()),
-    addHistory: (newEntry: HistoryEntry) => dispatcher.dispatch(new AddToHistoryAction(newEntry)),
-    clearHistory: () => dispatcher.dispatch(new ClearHistoryAction()),
-    highlightLink: (link: link) => dispatcher.dispatch(new HighlightLinkAction(link)),
-    highlightSite: (site: Site) => dispatcher.dispatch(new HighlightSiteAction(site)),
-    loadDevices: async (networkElements: Device[]) => { await dispatcher.dispatch(CheckDeviceList(networkElements)) },
-    navigateToApplication: (applicationName: string, path?: string) => dispatcher.dispatch(new NavigateToApplication(applicationName, path, "test3")),
-    undoMapSelection: () => dispatcher.dispatch(new RemoveHighlightingAction())
-
-})
-
-
-export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Details));
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/components/details/linkDetails.tsx b/sdnr/wt/odlux/apps/networkMapApp/src/components/details/linkDetails.tsx
deleted file mode 100644 (file)
index 96727cc..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import * as React from 'react';
-
-import { link } from '../../model/link';
-import { TextField, Tabs, Tab, Typography, AppBar, Button, Link } from '@material-ui/core';
-import DenseTable from '../denseTable';
-import { LatLonToDMS } from '../../utils/mapUtils';
-
-type panelId = "siteA" | "siteB";
-type props = { link: link };
-
-const LinkDetails: React.FunctionComponent<props> = (props) => {
-
-    const [value, setValue] = React.useState<panelId>("siteA");
-    const [height, setHeight] = React.useState(330);
-
-    const handleResize = () =>{
-        const el = document.getElementById('link-details-panel')?.getBoundingClientRect();
-        const el2 = document.getElementById('site-tabs')?.getBoundingClientRect();
-
-        if(el && el2){
-            if(props.link.type==="microwave")
-              setHeight(el!.height - el2!.y -50);
-            else
-              setHeight(el!.height - el2!.y +20);
-
-        }
-    }
-
-    //on mount
-    React.useEffect(()=>{
-        handleResize();
-
-        //window.addEventListener("resize", handleResize);
-    },[]);
-
-    React.useEffect(()=>{
-        handleResize();
-    }, [props.link])
-
-    const onHandleTabChange = (event: React.ChangeEvent<{}>, newValue: panelId) => {
-        setValue(newValue);
-    }
-
-    const onCalculateLinkClick = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) =>{
-       e.preventDefault();
-       const siteA= props.link.locationA;
-       const siteB =props.link.locationB;
-       const nameA = props.link.siteA;
-       const nameB = props.link.siteB;
-       const distance = props.link.length > 0 ? props.link.length : props.link.calculatedLength;
-       const azimuthA = props.link.azimuthA;
-       const azimuthB = props.link.azimuthB;
-       const antennaA = props.link.locationA.antenna;
-       const antennaB = props.link.locationB.antenna;
-
-       
-       let antennaData = "";
-       if(antennaA!==null && antennaB!==null){
-           antennaData = `&antennaNameA=${antennaA.name}&antennaGainA=${antennaA.gain}&waveguideLossA=${antennaA.waveguideLossIndB}&antennaNameB=${antennaB.name}&antennaGainB=${antennaB.gain}&waveguideLossB=${antennaB.waveguideLossIndB}`;
-       }
-       
-
-       
-       const baseUrl = window.location.pathname.split('#')[0];
-       window.open(`${baseUrl}#/linkCalculation?lat1=${siteA.lat}&lon1=${siteA.lon}&lat2=${siteB.lat}&lon2=${siteB.lon}&siteA=${nameA}&siteB=${nameB}&azimuthA=${azimuthA}&azimuthB=${azimuthB}&distance=${distance}&amslSiteA=${siteA.amsl}&AGLsiteA=${siteA.antennaHeight}&amslSiteB=${siteB.amsl}&AGLsiteB=${siteB.antennaHeight}${antennaData}`)
-
-    }
-
-    const onLineofSightClick = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) =>{
-        e.preventDefault();
-
-        const siteA= props.link.locationA;
-        const siteB =props.link.locationB;
-
-        //TODO: add check if available
-        let heightPart = `&amslA=${siteA.amsl}&antennaHeightA=${siteA.antennaHeight}&amslB=${siteB.amsl}&antennaHeightB=${siteB.antennaHeight}`;
-        
-
-        const baseUrl = window.location.pathname.split('#')[0];
-        window.open(`${baseUrl}#/lineofsight/los?lat1=${siteA.lat}&lon1=${siteA.lon}&lat2=${siteB.lat}&lon2=${siteB.lon}${heightPart}`);
-    }
-
-    const data = [
-
-   {name:"Site Name", val1: props.link.siteA, val2: props.link.siteB},
-    {name:"Latitude", val1: LatLonToDMS(props.link.locationA.lat), val2: LatLonToDMS(props.link.locationB.lat)},
-    {name:"Longitude", val1: LatLonToDMS(props.link.locationA.lon, true), val2: LatLonToDMS(props.link.locationB.lon, true)},
-    props.link.azimuthA!= null && props.link.azimuthB != null && {name:"Azimuth in Â°", val1: props.link.azimuthA.toFixed(2), val2: props.link.azimuthB.toFixed(2)}
-];
-
-    return (<div style={{ paddingLeft: "15px", paddingRight: "15px", paddingTop: "0px", display: 'flex', flexDirection: 'column' }}>
-        <h2>{props.link.name}</h2>
-        <TextField inputProps={{ 'aria-label': 'operator' }} disabled style={{ marginTop: "5px" }} value="Unkown" label="Operator" />
-        <TextField inputProps={{ 'aria-label': 'type' }} disabled style={{ marginTop: "5px" }} value={props.link.type} label="Type" />
-        <TextField inputProps={{ 'aria-label': 'planned-distance-in-km' }} disabled style={{ marginTop: "5px" }} value={props.link.length.toFixed(2)} label="Distance planned in km" />
-        <TextField inputProps={{ 'aria-label': 'calculated-distance-in-km' }} disabled style={{ marginTop: "5px" }} value={props.link.calculatedLength.toFixed(2)} label="Distance calculated in km" />
-
-        <AppBar position="static" id="site-tabs" style={{ marginTop: "20px", background: '#2E3B55' }}>
-            <Typography aria-label="details-of-link-sites" style={{ margin:"5px"}}>SITE DETAILS</Typography>
-        </AppBar>
-        <DenseTable ariaLabelRow="site-information-table-entry" ariaLabelColumn={["site-name", "latitude", "longitude", "azimuth"]} verticalTable height={height} hover={false} headers={["", "Site A", "Site B"]} data={data} />
-        {
-            props.link.type==="microwave" &&<> 
-            <Button style={{marginTop:20}} fullWidth variant="contained" color="primary" onClick={onCalculateLinkClick}>Calculate link</Button> 
-            <Button style={{marginTop:20}} fullWidth variant="contained" color="primary" onClick={onLineofSightClick}>Line of Sight</Button> 
-            
-            </>
-        }
-    </div>)
-}
-
-export default LinkDetails;
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/components/details/siteDetails.tsx b/sdnr/wt/odlux/apps/networkMapApp/src/components/details/siteDetails.tsx
deleted file mode 100644 (file)
index 7f0c1c9..0000000
+++ /dev/null
@@ -1,248 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import * as React from 'react';
-import { TextField, Tabs, Tab, Typography, AppBar, Button, Tooltip } from '@material-ui/core';
-
-
-import MaterialTable, { ColumnModel, ColumnType, MaterialTableCtorType } from "../../../../../framework/src/components/material-table";
-
-
-import { Site, Device, Address } from '../../model/site';
-import DenseTable from '../denseTable';
-import { LatLonToDMS } from '../../utils/mapUtils';
-import { CheckDeviceList, InitializeLoadedDevicesAction } from '../../actions/detailsAction';
-import { NavigateToApplication } from '../../../../../framework/src/actions/navigationActions';
-import connect, { Connect, IDispatcher } from '../../../../../framework/src/flux/connect';
-import { IApplicationStoreState } from '../../../../../framework/src/store/applicationStore';
-import StadokSite from '../../model/stadokSite';
-import { requestRest } from '../../../../../framework/src/services/restService';
-import StadokDetailsPopup from './stadokDetailsPopup';
-
-type linkRow = { name: string, azimuth?: string}
-type deviceRow = { id: string;type: string,name: string,manufacturer: string,owner: string,status?: string,port: number[]}
-
-
-type panelId="links" | "nodes";
-type siteDetailProps = {
-    site: Site, 
-    onLinkClick(id: string): void, 
-} & props;
-
-type props =  Connect<typeof mapStateToProps, typeof mapDispatchToProps>;
-
-
-const SiteDetails: React.FunctionComponent<siteDetailProps> = (props) => {
-
-    const [value, setValue] = React.useState<panelId>("links");
-    const [height, setHeight] = React.useState(330);
-    const [openPopup, setOpenPopup] = React.useState(false);
-    const [staSite, setStaSite] = React.useState<StadokSite|null>(null);
-
-    const handleResize = () =>{
-        const el = document.getElementById('site-details-panel')?.getBoundingClientRect();
-        const el2 = document.getElementById('site-tabs')?.getBoundingClientRect();
-
-        if(el && el2){
-            setHeight(el!.height - el2!.y +20);
-        }
-        
-    }
-
-    //on mount
-    React.useEffect(()=>{
-        handleResize();
-
-        window.addEventListener("resize", ()=>{console.log("really got resized.")});
-    },[]);
-
-    // on update
-    React.useEffect(()=>{
-        
-        if(props.site.devices!== null && props.site.devices.length>0){
-            props.initializeDevices(props.site.devices);
-            props.loadDevices(props.site.devices);
-        }
-      
-        handleResize();
-
-    }, [props.site]);
-
-    const onHandleTabChange = (event: React.ChangeEvent<{}>, newValue: panelId) => {
-        setValue(newValue);
-    }
-
-    const getFurtherInformation = (url: string) =>{
-
-        const request = requestRest<StadokSite>(url, { method: "GET"});
-
-        request.then(result =>{
-            if(result){
-                setStaSite(result);
-                setOpenPopup(true);
-            }else{
-                console.error(result);
-            }
-          
-
-        });
-    }
-
-    const closePopup = () =>{
-        setOpenPopup(false);
-    }
-
-    //prepare link table
-
-    let hasAzimuth = false;
-    const linkRows: linkRow[] = props.site.links?.map(link=> 
-        { 
-            if(link.azimuthB!==null){
-                hasAzimuth=true;
-            return {name: link.name, azimuth: link.azimuthB.toFixed(2) }    
-
-        }else{
-            return {name: link.name }    
-        }   
-    });
-       
-    const linkTableHeader = hasAzimuth ?  ["Link Name", "Azimuth in Â°"] : ["Link Name"];
-
-    //prepare device table
-    const deviceRows : deviceRow[] = props.updatedDevices?.map(device=>{
-            return{ 
-                id: device.id,
-                name: device.name,
-                type: device.type,
-                status: device.status,
-                manufacturer: device.manufacturer,
-                owner: device.owner,
-                port: device.port
-            }
-        });
-    
-
-    const adressString = props.site.address == null ? null : buildAdress(props.site.address);
-
-
-    return (<div  style={{ padding: '15px', display: "flex", flexDirection:"column", minWidth:0, minHeight:0 }}>
-        <h2 >{props.site.name}</h2>
-        {
-            props.site.operator !== '' && props.site.operator !== null ?
-                <TextField inputProps={{ 'aria-label': 'operator' }} disabled={true} value={props.site.operator} label="Operator" /> :
-                <TextField inputProps={{ 'aria-label': 'operator' }} disabled={true} value="Unkown" label="Operator" style={{ marginTop: "5px" }} />
-        }
-        {
-            props.site.type !== undefined && props.site.type.length > 0 &&
-            <TextField inputProps={{ 'aria-label': 'type' }} disabled={true} value={props.site.type} label="Type" style={{ marginTop: "5px" }} />
-        }
-        {
-            adressString !== null && 
-            <TextField inputProps={{ 'aria-label': 'adress' }} disabled={true} value={adressString} label="Address" style={{ marginTop: "5px" }} />
-        }
-        {
-            props.site.heightAmslInMeters !== undefined && props.site.heightAmslInMeters > 0 &&
-            <TextField inputProps={{ 'aria-label': 'amsl-in-meters' }} disabled={true} value={props.site.heightAmslInMeters} label="AMSL in meters" style={{ marginTop: "5px" }} />
-        }
-        {
-            props.site.antennaHeightAmslInMeters !== undefined && props.site.antennaHeightAmslInMeters > 0 &&
-            <TextField inputProps={{ 'aria-label': 'antenna-above-ground-in-meters' }} disabled={true} value={props.site.antennaHeightAmslInMeters} label="Atenna above ground in meters" style={{ marginTop: "5px" }} />
-        }
-         
-        <TextField inputProps={{ 'aria-label': 'latitude' }} style={{ marginTop: "5px" }} disabled={true} value={LatLonToDMS(props.site.location.lat)} label="Latitude" />
-        <TextField inputProps={{ 'aria-label': 'longitude' }} style={{ marginTop: "5px" }} disabled={true} value={LatLonToDMS(props.site.location.lon, true)} label="Longitude" />
-
-        <AppBar position="static" style={{ marginTop: "5px", background: '#2E3B55' }}>
-            <Tabs id="site-tabs" value={value} onChange={onHandleTabChange} aria-label="simple tabs example">
-                <Tab label="Links" value="links" />
-                <Tab label="Nodes" value="nodes" />
-            </Tabs>
-        </AppBar>
-        {
-            value === "links" &&
-            <>
-                {
-                    props.site.links==null &&
-                    <Typography aria-label="no-links-available" variant="body1" style={{ marginTop: '10px' }}>No links available.</Typography>
-                }
-               
-                {
-                    props.site.links?.length > 0 &&
-                    <DenseTable ariaLabelRow="available-links-table" ariaLabelColumn={["link-name", "azimuth"]} height={height} hover={true} headers={linkTableHeader}  data={linkRows} onClick={props.onLinkClick}  ></DenseTable>
-                }
-
-            </>
-
-        }
-        {
-            value === "nodes" &&
-            <>
-                {
-                    props.site.devices === null &&
-                    <Typography aria-label="no-nodes-avilable" variant="body1" style={{ marginTop: '10px' }}>No nodes available.</Typography>
-                }
-
-                {
-                    props.site.devices?.length>0 && props.updatedDevices !== null &&
-                    <DenseTable ariaLabelRow="available-nodes-table" ariaLabelColumn={["id","name","type","status", "manufacturer","owner", "ports", "actions"]} navigate={props.navigateToApplication} height={height} hover={false} headers={["ID","Name","Type","Status", "Manufacturer","Owner", "Ports", "Actions"]} actions={true} data={deviceRows!} />
-                }
-            </>
-        }
-        {
-       props.isSitedocReachable && props.site.furtherInformation!==null && props.site.furtherInformation.length>0 &&
-    <Button  style={{marginTop:20}} fullWidth variant="contained" color="primary" onClick={e => getFurtherInformation(props.site.furtherInformation) }>Further information available</Button>
-        }
-
-        {
-            staSite !== null && openPopup && <StadokDetailsPopup site={staSite} onClose={closePopup} open={true} />
-        }
-       
-    </div>
-    )
-}
-
-const buildAdress = (adress: Address) =>{
-
-    switch(adress.country){
-        case "de":
-            return `${adress.streetAndNr}, ${adress.zipCode!== null? adress.zipCode : ''} ${adress.city}`
-        
-        case "us": 
-        return `${adress.streetAndNr}, ${adress.city} ${adress.zipCode!== null? adress.zipCode : ''}`
-
-        default:
-            console.log("address formatting for country {"+adress.country+"} not recognized, defaulting.");
-            return `${adress.streetAndNr}, ${adress.zipCode!== null? adress.zipCode : ''} ${adress.city}`
-    }
-
-    
-}
-
-const mapStateToProps = (state: IApplicationStoreState) => ({
-    updatedDevices: state.network.details.checkedDevices,
-    isSitedocReachable: state.network.details.isSitedocReachable
-});
-
-const mapDispatchToProps = (dispatcher: IDispatcher) => ({
-    initializeDevices: (devices: Device[]) => {dispatcher.dispatch(new InitializeLoadedDevicesAction(devices))},
-    loadDevices: async (networkElements: Device[]) => { await dispatcher.dispatch(CheckDeviceList(networkElements)) },
-    navigateToApplication: (applicationName: string, path?: string) => dispatcher.dispatch(new NavigateToApplication(applicationName, path, "test3")),
-
-})
-
-export default connect(mapStateToProps, mapDispatchToProps)(SiteDetails);
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/components/details/stadokDetailsPopup.tsx b/sdnr/wt/odlux/apps/networkMapApp/src/components/details/stadokDetailsPopup.tsx
deleted file mode 100644 (file)
index 4f3235d..0000000
+++ /dev/null
@@ -1,274 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import * as React from 'react';
-
-import MuiDialogTitle from '@material-ui/core/DialogTitle';
-import { AppBar, Dialog, DialogContent, IconButton, Tab, Tabs, TextField, Typography } from '@material-ui/core';
-import CloseIcon from '@material-ui/icons/Close';
-import { withStyles, WithStyles, createStyles, Theme, makeStyles } from '@material-ui/core/styles';
-
-
-import StadokSite from '../../model/stadokSite';
-import { LatLonToDMS } from '../../utils/mapUtils';
-import DenseTable from '../../components/denseTable';
-import { requestRest } from '../../../../../framework/src/services/restService';
-import { OrderToDisplay, StadokOrder } from '../../model/stadokOrder';
-import { CSSProperties } from '@material-ui/core/styles/withStyles';
-import { SITEDOC_URL } from '../../config';
-
-
-type props = { site: StadokSite; onClose(): void; open:boolean };
-
-const styles = (theme: Theme) => createStyles({
-  root: {
-    margin: 0,
-    padding: theme.spacing(2),
-  },
-  closeButton: {
-    position: 'absolute',
-    right: theme.spacing(1),
-    top: theme.spacing(1),
-    color: theme.palette.grey[500],
-  },
-});
-
-const useStyles = makeStyles({
-  largeImage:{cursor:'pointer', width:300},
-  smallImage:{cursor:'pointer', width: 50, marginTop:'10px', marginLeft:'10px'}
-});
-
-const StadokDetailsPopup: React.FunctionComponent<props> = (props) => {
-  const classes = useStyles();
-
-  const [open, setOpen] = React.useState(props.open);
-  const [value, setValue] = React.useState("devices");
-  const [orders, setOrders] = React.useState<OrderToDisplay[]|null>(null);
-
-  const DialogTitle = withStyles(styles)((props: any) => {
-    const { children, classes, onClose, ...other } = props;
-    return (
-      <MuiDialogTitle disableTypography className={classes.root} {...other}>
-        <Typography variant="h6">{children}</Typography>
-        {onClose ? (
-          <IconButton aria-label="close" style={{position: 'absolute', top:0, right:0, color: 'black'}} onClick={onClose}>
-            <CloseIcon />
-          </IconButton>
-        ) : null}
-      </MuiDialogTitle>
-    );
-  });
-
-  const getContacts = (site: StadokSite) =>{
-    const contacts = [];
-
-    if(site.createdBy){
-      contacts.push({h: "Site Creator",col1: site.createdBy.firstName, col2: site.createdBy.lastName, col3: site.createdBy.email, col4: site.createdBy.telephoneNumber });
-    }
-  
-    if(site.contacts.manager){
-      contacts.push({h: "Manager",col1: site.contacts.manager.firstName, col2: site.contacts.manager.lastName, col3: site.contacts.manager.email, col4: site.contacts.manager.telephoneNumber });
-    }
-  
-    if(site.contacts.owner){
-      contacts.push({h: "Owner",col1: site.contacts.owner.firstName, col2: site.contacts.owner.lastName, col3: site.contacts.owner.email, col4: site.contacts.owner.telephoneNumber });
-    }
-    return contacts;
-  }
-
-  const onClose = () =>{
-   // setOpen(false);
-     props.onClose()
-  }
-
-  //todo: use a set 'panelId' -> which values are allowed
-  const onHandleTabChange = (event: React.ChangeEvent<{}>, newValue: string) => {
-    setValue(newValue);
-}
-console.log(props.site)
-  const contacts = getContacts(props.site);
-  
-  const orderUrl=`${SITEDOC_URL}/site/${props.site.siteId}/orders`;
-
-  if(orders==null){
-    requestRest<StadokOrder[]>(orderUrl,{ method: "GET"}).then(result =>{
-      if(result){
-        const orderList = result.map(order =>{
-          return OrderToDisplay.parse(order);
-        });
-        setOrders(orderList);
-
-      }else{
-        setOrders([]);
-      }
-    });
-  }
-
-  const createOrderInfo = () => {
-
-    if (orders === null) {
-      return (<div style={{ height: 300 }}>
-        <Typography variant="body1" style={{ marginTop: '10px' }}>
-          Loading orders
-        </Typography>
-      </div>)
-    } else if (orders.length === 0) {
-      return (<div style={{ height: 300 }}>
-        <Typography variant="body1" style={{ marginTop: '10px' }}>
-          No orders available
-      </Typography>
-      </div>)
-    } else {
-      return <DenseTable data={orders} height={300} headers={["Person", "State", "Current Task"]} hover={false} ariaLabelRow="activity-log-table" />
-    }
-  }
-
-  const displayImages = () => {
-
-    if (props.site.images.length === 1) {
-      return stadokImage(props.site.siteId, props.site.images[0],"large")
-    } else {
-      return <>
-        {
-          stadokImage(props.site.siteId, props.site.images[0], "large")
-        }
-        <div style={{ display: 'flex', flexDirection: 'row', flexWrap:'wrap' }}>
-
-          {
-            props.site.images.length<=9 ?
-              props.site.images.slice(1, props.site.images.length).map(image =>
-                stadokImage(props.site.siteId, image, "small")
-              )
-              :
-              <>
-              {
-                props.site.images.slice(1, 9).map(image =>
-                  stadokImage(props.site.siteId, image, "small")
-                )
-              }
-              
-              </>
-          }
-        </div>
-      </>
-    }
-
-  }
-
-  const stadokImage = (siteId: string, imagename: string, size: 'large' | 'small') => {
-    const url = `${SITEDOC_URL}/site/${siteId}/files/${imagename}`;
-    const className = size === "small" ? classes.smallImage : classes.largeImage;
-    return <img className={className} src={url} onClick={e => window.open(url)} />
-
-  }
-
-
-  return (<Dialog  onClose={onClose} fullWidth maxWidth="md" aria-labelledby="customized-dialog-title" open={open}>
-    <DialogTitle id="customized-dialog-title" onClose={onClose}>
-      {props.site.siteId}
-    </DialogTitle>
-    <DialogContent style={{minWidth:'900px'}} dividers>
-      <div style={{ display: 'flex', flexDirection: 'row', flexGrow: 1 }}>
-        <div style={{ width: '60%', display:'flex', flexDirection: 'column' }}>
-         
-        <TextField inputProps={{ 'aria-label': 'type' }} disabled={true} value={props.site.updatedOn} label="Updated on" style={{ marginTop: "5px" }} />
-
-         
-          {
-            props.site.type !== undefined && props.site.type.length > 0 &&
-            <TextField inputProps={{ 'aria-label': 'type' }} disabled={true} value={props.site.type} label="Type" style={{ marginTop: "5px" }} />
-          }
-
-
-          <TextField inputProps={{ 'aria-label': 'adress' }} disabled={true} value={`${props.site.address.streetAndNr}, ${props.site.address.zipCode !== null ? props.site.address.zipCode : ''} ${props.site.address.city}`} label="Address" style={{ marginTop: "5px" }} />
-
-
-          <TextField inputProps={{ 'aria-label': 'latitude' }} style={{ marginTop: "5px" }} disabled={true} value={LatLonToDMS(props.site.location.lat)} label="Latitude" />
-          <TextField inputProps={{ 'aria-label': 'longitude' }} style={{ marginTop: "5px" }} disabled={true} value={LatLonToDMS(props.site.location.lon, true)} label="Longitude" />
-          <AppBar position="static" style={{ marginTop: "5px", background: '#2E3B55' }}>
-            <Tabs id="site-tabs" variant="scrollable" scrollButtons="on" value={value} onChange={onHandleTabChange} aria-label="simple tabs example">
-                <Tab label="Devices" value="devices" />
-                <Tab label="Contacts" value="contacts" />
-                <Tab label="Saftey" value="safteyInfo" />
-                <Tab label="Logs" value="logs" />
-                <Tab label="Orders" value="orders" />
-            </Tabs>
-        </AppBar>
-        {
-          value == "devices" && (props.site.devices?.length>0 ?
-        <DenseTable data={props.site.devices} height={300} headers={["Device", "Antenna"]} hover={false} ariaLabelRow="devices-table" />
-        :
-        <div style={{height:300}}>
-        <Typography variant="body1" style={{ marginTop: '10px' }}>
-          No devices available
-        </Typography>
-        </div>)
-        }
-        {
-           value == "contacts" && (contacts.length>0 ?
-            <DenseTable data={contacts} height={300} headers={["Person", "Firstname", "Lastname", "Email", "Phone No."]} hover={false} ariaLabelRow="contacts-table" ariaLabelColumn={["person", "firstname", "lastname", "email", "phoneno"]} />
-            :
-            <div style={{height:300}}>
-            <Typography variant="body1" style={{ marginTop: '10px' }}>
-              No contacts available
-            </Typography>
-            </div>)
-        }
-        {
-          value == "safteyInfo" && (props.site.safteyNotices.length>0 ?
-            <DenseTable data={props.site.safteyNotices} height={300} headers={["Note"]} hover={false} ariaLabelRow="saftey-info-table"  />
-            :
-            <div style={{height:300}}>
-            <Typography variant="body1" style={{ marginTop: '10px' }}>
-              No saftey notices applicable
-            </Typography>
-            </div>)
-        }
-        {
-           value == "logs" && (props.site.logs.length>0 ?
-            <DenseTable data={props.site.logs} height={300} headers={["Date","Person", "Activity"]} hover={false} ariaLabelRow="activity-log-table"  />
-            :
-            <div style={{height:300}}>
-            <Typography variant="body1" style={{ marginTop: '10px' }}>
-              No activity log available
-            </Typography>
-            </div>)
-        }
-
-        {
-          value ==="orders" && createOrderInfo()
-        }
-        
-        </div>
-        <div style={{padding: '10px', display: 'flex', alignItems:'center', flexDirection:'column', justifyContent: 'start', width:'40%'}}>
-          {
-            props.site.images.length == 0 ? 
-            <Typography variant="body1" style={{ marginTop: '10px' }}>
-            No images available
-          </Typography>
-          : displayImages()
-          }
-        </div>
-      </div>
-
-    </DialogContent>
-  </Dialog>)
-
-}
-
-export default StadokDetailsPopup;
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/components/map/connectionInfo.tsx b/sdnr/wt/odlux/apps/networkMapApp/src/components/map/connectionInfo.tsx
deleted file mode 100644 (file)
index 3b5a15c..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import * as React from 'react'
-
-import { IApplicationStoreState } from "../../../../../framework/src/store/applicationStore";
-import connect, { IDispatcher, Connect } from "../../../../../framework/src/flux/connect";
-import { Paper, Typography } from "@material-ui/core";
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
-
-
-type props = Connect<typeof mapStateToProps, typeof mapDispatchToProps>;
-
-const ConnectionInfo: React.FunctionComponent<props> = (props) => {
-
-    return ((props.isTopoServerReachable === false || props.isTileServerReachable === false )?  <Paper style={{padding:5, position: 'absolute', top: 160, width: 230, left:"40%", zIndex:1}}>
-        <div style={{display: 'flex', flexDirection: 'column'}}>
-        <div style={{'alignSelf': 'center', marginBottom:5}}> <Typography> <FontAwesomeIcon icon={faExclamationTriangle} /> Connection Error</Typography></div>
-        {props.isTileServerReachable === false && <Typography> Tile data can't be loaded.</Typography>}
-        {props.isTopoServerReachable === false && <Typography > Network data can't be loaded.</Typography>}
-        </div>
-    </Paper> : null
-)
-
-}
-
-const mapStateToProps = (state: IApplicationStoreState) => ({
-    isTopoServerReachable: state.network.connectivity.isToplogyServerAvailable,
-    isTileServerReachable: state.network.connectivity.isTileServerAvailable
-
-});
-
-
-
-const mapDispatchToProps = (dispatcher: IDispatcher) => ({
-
-    //zoomToSearchResult: (lat: number, lon: number) => dispatcher.dispatch(new ZoomToSearchResultAction(lat, lon))
-
-});;
-
-
-export default connect(mapStateToProps,mapDispatchToProps)(ConnectionInfo)
-
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/components/map/iconSwitch.tsx b/sdnr/wt/odlux/apps/networkMapApp/src/components/map/iconSwitch.tsx
deleted file mode 100644 (file)
index 221e7da..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import * as React from 'react';
-import { FormControlLabel, Switch, Paper } from "@material-ui/core";
-import connect, { Connect, IDispatcher } from '../../../../../framework/src/flux/connect';
-import { IApplicationStoreState } from '../../../../../framework/src/store/applicationStore';
-import { SetIconSwitchAction } from '../../actions/mapActions';
-
-type props = Connect<typeof mapStateToProps, typeof mapDispatchToProps> & {visible: boolean}
-
-const IconSwitch: React.FunctionComponent<props> = (props) =>{
-
-    const toggleChecked = () => {
-      props.toogle(!props.areIconsEnabled)
-    };
-
-    return (
-      props.visible ?
-             <FormControlLabel style={{ padding:5, position: 'absolute',top: 190, zIndex:1}}
-        value="end"
-        control={<Switch color="secondary" style={{zIndex:1}} checked={props.areIconsEnabled} onChange={toggleChecked} />}
-        label="Show icons"
-        labelPlacement="end"
-      />: null)
-}
-
-const mapStateToProps = (state: IApplicationStoreState) => ({
-  areIconsEnabled: state.network.map.allowIconSwitch
-});
-
-
-const mapDispatchToProps = (dispatcher: IDispatcher) => ({ 
-  toogle : (enable:boolean) => dispatcher.dispatch(new SetIconSwitchAction(enable))
-
-});;
-
-export default (connect(mapStateToProps,mapDispatchToProps)(IconSwitch))
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/components/map/map.tsx b/sdnr/wt/odlux/apps/networkMapApp/src/components/map/map.tsx
deleted file mode 100644 (file)
index 1314edb..0000000
+++ /dev/null
@@ -1,697 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import * as React from 'react'
-import * as mapboxgl from 'mapbox-gl';
-import { RouteComponentProps, withRouter } from 'react-router-dom';
-
-
-import { Site } from '../../model/site';
-import { SelectSiteAction, ClearHistoryAction, SelectLinkAction } from '../../actions/detailsAction';
-import { OSM_STYLE, URL_API, URL_BASEPATH, URL_TILE_API } from '../../config';
-import { link } from '../../model/link';
-import MapPopup from './mapPopup';
-import { SetPopupPositionAction, SelectMultipleLinksAction, SelectMultipleSitesAction } from '../../actions/popupActions';
-import { Feature } from '../../model/Feature';
-import { HighlightLinkAction, HighlightSiteAction, SetCoordinatesAction, SetStatistics } from '../../actions/mapActions';
-import { addDistance, getUniqueFeatures, increaseBoundingBox } from '../../utils/mapUtils';
-import { IApplicationStoreState } from '../../../../../framework/src/store/applicationStore';
-import connect, { IDispatcher, Connect } from '../../../../../framework/src/flux/connect';
-import SearchBar from './searchBar';
-import { verifyResponse, IsTileServerReachableAction, handleConnectionError, setTileServerReachableAction, IsBusycheckingConnectivityAction } from '../../actions/connectivityAction';
-import ConnectionInfo from './connectionInfo'
-import  mapLayerService  from '../../utils/mapLayers';
-import Statistics from './statistics';
-import IconSwitch from './iconSwitch';
-import { addImages } from '../../services/mapImagesService';
-import { PopupElement } from '../../model/popupElements';
-import { Button } from '@material-ui/core';
-import { NavigateToApplication } from '../../../../../framework/src/actions/navigationActions';
-import customize from '../../../icons/customize.png';
-
-type coordinates = { lat: number, lon: number, zoom: number }
-
-let alarmElements: Feature[] = [];
-let map: mapboxgl.Map;
-let isLoadingInProgress = false;
-let notLoadedBoundingBoxes: mapboxgl.LngLatBounds[] = [];
-
-let lastBoundingBox: mapboxgl.LngLatBounds | null = null;
-let myRef = React.createRef<HTMLDivElement>();
-
-import 'mapbox-gl/dist/mapbox-gl.css';
-
-class Map extends React.Component<mapProps, { isPopupOpen: boolean }> {
-
-    constructor(props: mapProps) {
-        super(props);
-        //any state stuff
-        this.state = { isPopupOpen: false }
-
-    }
-
-    updateTheme(){
-        mapLayerService.settings=this.props.settings.themes;
-        if(this.props.settings.mapSettings?.networkMap.styling.theme){
-            mapLayerService.selectedTheme = this.props.settings.mapSettings?.networkMap.styling.theme;
-        }
-    }
-
-    updateOpacity(){
-        if(this.props.settings.mapSettings && this.props.settings.mapSettings.networkMap.tileOpacity){
-            mapLayerService.changeMapOpacity(map, Number(this.props.settings.mapSettings.networkMap.tileOpacity));    
-        }
-    }
-
-    async componentDidMount() {
-
-        // resize the map, if menu gets collapsed
-        window.addEventListener("menu-resized", this.handleResize);
-
-        //pass themes to mapLayerService
-        this.updateTheme();
-
-        // try if connection to tile + topologyserver are available
-
-        try {
-            const tiles = await fetch(URL_TILE_API + '/10/0/0.png');
-            if (tiles.ok) {
-                this.props.setTileServerLoaded(true);
-            }else{
-                this.props.setTileServerLoaded(false);
-            }
-
-        } catch (error) {
-            this.props.setTileServerLoaded(false);
-            console.error("tileserver " + URL_TILE_API + " can't be reached.");
-        }
-
-        try {
-           const topology = await fetch(URL_API + "/info/count/all");
-            verifyResponse(topology);
-        } catch (error) {
-            this.props.handleConnectionError(error)
-        }
-
-        //both done
-        this.props.setConnectivityCheck(false);
-        //map loaded in componentDidUpdate
-    }
-
-    setupMap = () => {
-
-        let lat = this.props.lat;
-        let lon = this.props.lon;
-        let zoom = this.props.zoom;
-
-        if(this.props.settings.mapSettings){
-            if(this.props.settings.mapSettings.networkMap.startupPosition.latitude){
-                lat = Number(this.props.settings.mapSettings.networkMap.startupPosition.latitude)
-            }
-
-            if(this.props.settings.mapSettings.networkMap.startupPosition.longitude){
-                lon = Number(this.props.settings.mapSettings.networkMap.startupPosition.longitude)
-            }
-
-            if(this.props.settings.mapSettings.networkMap.startupPosition.zoom){
-                zoom = Number(this.props.settings.mapSettings.networkMap.startupPosition.zoom)
-            }
-
-        }
-
-        const coordinates = this.extractCoordinatesFromUrl();
-        // override lat/lon/zoom with coordinates from url, if available
-        if (this.areCoordinatesValid(coordinates)) {
-            lat = coordinates.lat;
-            lon = coordinates.lon;
-            zoom = !Number.isNaN(coordinates.zoom) ? coordinates.zoom : zoom;
-        }
-
-        map = new mapboxgl.Map({
-            container: myRef.current!,
-            style: OSM_STYLE as any,
-            center: [lon, lat],
-            zoom: zoom,
-            accessToken: ''
-        });
-
-        map.on('load', (ev) => {
-
-            map.setMaxZoom(18);
-            const bbox = map.getBounds();
-            this.props.updateMapPosition(bbox.getCenter().lat, bbox.getCenter().lng, map.getZoom())
-
-            mapLayerService.addBaseSources(map, this.props.selectedSite, this.props.selectedLink);
-            
-            addImages(map, (result: boolean)=>{
-                if(map.getZoom()>11 && this.props.showIcons)
-                {
-                    mapLayerService.addIconLayers(map, this.props.selectedSite?.properties.id)
-                }else{
-                    mapLayerService.addBaseLayers(map);
-                }
-            this.updateOpacity();
-
-            });
-
-            const boundingBox = increaseBoundingBox(map);
-
-            fetch(`${URL_API}/links/geojson/${boundingBox.west},${boundingBox.south},${boundingBox.east},${boundingBox.north}`)
-                .then(result => verifyResponse(result))
-                .then(result => result.json())
-                .then(features => {
-                    if (map.getSource('lines')) {
-                        (map.getSource('lines') as mapboxgl.GeoJSONSource).setData(features);
-                    }
-                })
-                .catch(error => this.props.handleConnectionError(error));
-
-
-            fetch(`${URL_API}/sites/geojson/${boundingBox.west},${boundingBox.south},${boundingBox.east},${boundingBox.north}`)
-                .then(result => verifyResponse(result))
-                .then(result => result.json())
-                .then(features => {
-                    if (map.getSource('points')) {
-                        (map.getSource('points') as mapboxgl.GeoJSONSource).setData(features);
-                    }
-                })
-                .catch(error => this.props.handleConnectionError(error));
-                
-                map.on('click', this.mapClick);
-                map.on('moveend', this.mapMoveEnd);
-                map.on('move', this.mapMove);
-               
-        });
-    }
-
-    mapMove = () => {
-            
-        const mapZoom = map.getZoom();
-
-        const boundingBox = map.getBounds();
-        
-            this.loadNetworkData(boundingBox);
-            if (mapZoom > 9) {
-
-                if (map.getLayer('points')) {
-                    map.setLayoutProperty('selectedPoints', 'visibility', 'visible');
-                    map.setPaintProperty('points', 'circle-radius', 7);
-                }
-            } else {
-
-                // reduce size of points / lines if zoomed out
-                map.setPaintProperty('points', 'circle-radius', 2);
-                map.setLayoutProperty('selectedPoints', 'visibility', 'none');
-
-                if (mapZoom <= 4) {
-                    map.setPaintProperty('fibre-lines', 'line-width', 1);
-                    map.setPaintProperty('microwave-lines', 'line-width', 1);
-
-                } else {
-                    map.setPaintProperty('fibre-lines', 'line-width', 2);
-                    map.setPaintProperty('microwave-lines', 'line-width', 2);
-                }
-            }
-    };
-
-    mapClick = (e: any) => {
-
-           
-        if (map.getLayer('points')) { // data is shown as points
-
-            var clickedLines = getUniqueFeatures(map.queryRenderedFeatures([[e.point.x - 5, e.point.y - 5],
-            [e.point.x + 5, e.point.y + 5]], {
-                layers: ['microwave-lines', 'fibre-lines']
-            }), "id");
-
-            const clickedPoints = getUniqueFeatures(map.queryRenderedFeatures(e.point, { layers: ['points'] }), "id");
-            const alarmedSites = getUniqueFeatures(map.queryRenderedFeatures(e.point, { layers: ['alarmedPoints'] }), "id");
-
-            if (clickedPoints.length != 0) {
-
-
-                if (alarmedSites.length > 0) {
-                    alarmedSites.forEach(alarm => {
-                        const index = clickedPoints.findIndex(item => item.properties!.id === alarm.properties!.id);
-
-                        if (index !== -1) {
-                            clickedPoints[index].properties!.alarmed = true;
-                            clickedPoints[index].properties!.type = "alarmed";
-                        }
-                    });
-                }
-
-                this.showSitePopup(clickedPoints, e.point.x, e.point.y);
-            } else if (clickedLines.length != 0) {
-                this.showLinkPopup(clickedLines, e.point.x, e.point.y);
-            }
-
-
-        } else { // data is shown as icons
-
-            const clickedSites = getUniqueFeatures(map.queryRenderedFeatures(e.point, { layers: ['point-lamps', 'point-building', 'point-data-center', 'point-factory', 'point-remaining'] }), "id");
-            const clickedLines = getUniqueFeatures(map.queryRenderedFeatures([[e.point.x - 5, e.point.y - 5],
-            [e.point.x + 5, e.point.y + 5]], {
-                layers: ['microwave-lines', 'fibre-lines']
-            }), "id");
-
-            if (clickedSites.length > 0)
-                this.showSitePopup(clickedSites, e.point.x, e.point.y);
-            else if (clickedLines.length != 0) {
-                this.showLinkPopup(clickedLines, e.point.x, e.point.y);
-            }
-        }
-    };
-
-    mapMoveEnd = () => {
-
-        const mapZoom = Number(map.getZoom().toFixed(2));
-        const lat = Number(map.getCenter().lat.toFixed(4));
-        const lon = Number(map.getCenter().lng.toFixed(4));
-
-
-        if (this.props.lat !== lat || this.props.lon !== lon || this.props.zoom !== mapZoom) {
-            this.props.updateMapPosition(lat, lon, mapZoom)
-        }
-
-        // update the url to current lat,lon,zoom values
-
-        const currentUrl = window.location.href;
-        const parts = currentUrl.split(URL_BASEPATH);
-        if (parts.length > 0) {
-
-            const detailsPath = parts[1].split("/details/");
-
-            if (detailsPath[1] !== undefined && detailsPath[1].length > 0) {
-                this.props.history.replace(`/${URL_BASEPATH}/${map.getCenter().lat.toFixed(4)},${map.getCenter().lng.toFixed(4)},${mapZoom.toFixed(2)}/details/${detailsPath[1]}`)
-            }
-            else {
-                this.props.history.replace(`/${URL_BASEPATH}/${map.getCenter().lat.toFixed(4)},${map.getCenter().lng.toFixed(4)},${mapZoom.toFixed(2)}`)
-            }
-        }
-
-
-        //switch icon layers if applicable
-
-        mapLayerService.showIconLayers(map, this.props.showIcons, this.props.selectedSite?.properties.id);
-
-        //update statistics
-        const boundingBox = map.getBounds();
-
-        fetch(`${URL_API}/info/count/${boundingBox.getWest()},${boundingBox.getSouth()},${boundingBox.getEast()},${boundingBox.getNorth()}`)
-            .then(result => verifyResponse(result))
-            .then(res => res.json())
-            .then(result => {
-                if (result.links !== this.props.linkCount || result.sites !== this.props.siteCount) {
-                    this.props.setStatistics(result.links, result.sites);
-                }
-            })
-            .catch(error => this.props.handleConnectionError(error));;
-    }
-
-    componentDidUpdate(prevProps: mapProps, prevState: {}) {
-
-        if(prevProps !== this.props){
-        //(load map)
-        //triggered if either settings were done loading or tile/topology server connectivity checked
-        if(prevProps.settings !== this.props.settings || this.props.isConnectivityCheckBusy !== prevProps.isConnectivityCheckBusy){
-            
-            //update theme if settings changed
-            if(prevProps.settings !== this.props.settings){
-                this.updateTheme();
-            }
-
-            //if everything done loading/reachable, load map
-            if(!this.props.isConnectivityCheckBusy && this.props.isTileServerReachable && !this.props.settings.isLoadingData && (prevProps.settings.isLoadingData !==this.props.settings.isLoadingData || prevProps.isConnectivityCheckBusy !== this.props.isConnectivityCheckBusy)){
-
-                if(map == undefined){
-                    this.setupMap();
-                }
-                else
-                if(map.getContainer() !== myRef.current){ 
-                    // reload map, because the current container (fresh div) doesn't hold the map and changing containers isn't supported
-                    map.remove();
-                    this.setupMap();
-                }
-            }
-        }
-
-        if (map !== undefined) {
-            if (prevProps.selectedSite?.properties.id !== this.props.selectedSite?.properties.id) {
-
-                if (this.props.selectedSite != null) {
-                    if (map.getSource("selectedLine") !== undefined) {
-                        (map.getSource("selectedLine") as mapboxgl.GeoJSONSource).setData({ type: "FeatureCollection", features: [] });
-                        (map.getSource("selectedPoints") as mapboxgl.GeoJSONSource).setData({ type: "FeatureCollection", features: [this.props.selectedSite] });
-                    }
-
-
-                    if (map.getLayer('point-lamps') !== undefined) {
-
-                        map.setFilter('point-lamps', ['==', 'type', 'street lamp']);
-                        map.setFilter('point-data-center', ['==', 'type', 'data center']);
-                        map.setFilter('point-building', ['==', 'type', 'high rise building']);
-                        map.setFilter('point-factory', ['==', 'type', 'factory']);
-
-                        if (this.props.selectedSite?.properties.type !== undefined) {
-                            switch (this.props.selectedSite?.properties.type) {
-                                case 'street lamp':
-                                    map.setFilter('point-lamps', ["all", ['==', 'type', 'street lamp'], ['!=', 'id', this.props.selectedSite.properties.id]]);
-                                    break;
-                                case 'data center':
-                                    map.setFilter('point-data-center', ["all", ['==', 'type', 'data center'], ['!=', 'id', this.props.selectedSite.properties.id]]);
-                                    break;
-                                case 'high rise building':
-                                    map.setFilter('point-building', ["all", ['==', 'type', 'high rise building'], ['!=', 'id', this.props.selectedSite.properties.id]])
-                                    break;
-                                case 'factory':
-                                    map.setFilter('point-factory', ["all", ['==', 'type', 'factory'], ['!=', 'id', this.props.selectedSite.properties.id]]);
-                                    break;    
-                            }
-                        }
-                    }
-
-
-                }
-                else 
-                {
-                    if (map.getSource("selectedPoints") !== undefined)
-                        (map.getSource("selectedPoints") as mapboxgl.GeoJSONSource).setData({ type: "FeatureCollection", features: [] });
-
-                }
-            }
-
-            if (prevProps.selectedLink !== this.props.selectedLink) {
-                if (this.props.selectedLink != null) {
-
-                    if (map.getLayer('point-lamps') !== undefined) {
-                        map.setFilter('point-lamps', ['==', 'type', 'street lamp']);
-                        map.setFilter('point-data-center', ['==', 'type', 'data center']);
-                        map.setFilter('point-building', ['==', 'type', 'high rise building']);
-                        map.setFilter('point-factory', ['==', 'type', 'factory']);
-                    }
-
-                    if (map.getSource("selectedLine") !== undefined) {
-                        (map.getSource("selectedPoints") as mapboxgl.GeoJSONSource).setData({ type: "FeatureCollection", features: [] });
-                        (map.getSource("selectedLine") as mapboxgl.GeoJSONSource).setData({ type: "FeatureCollection", features: [this.props.selectedLink] });
-                    }
-                }
-                else 
-                {
-                    if (map.getSource("selectedLine") !== undefined)
-                        (map.getSource("selectedLine") as mapboxgl.GeoJSONSource).setData({ type: "FeatureCollection", features: [] });
-                }
-            }
-
-            if (prevProps.location.pathname !== this.props.location.pathname) {
-                if (map) {
-                    const coordinates = this.extractCoordinatesFromUrl();
-                    this.moveMapToCoordinates(coordinates);
-                }
-            }
-
-            if (prevProps.alarmlement !== this.props.alarmlement) {
-                if (this.props.alarmlement !== null && !alarmElements.includes(this.props.alarmlement)) {
-                    if (map.getSource("alarmedPoints"))
-                        (map.getSource("alarmedPoints") as mapboxgl.GeoJSONSource).setData({ type: "FeatureCollection", features: alarmElements });
-                    alarmElements.push(this.props.alarmlement)
-                }
-            }
-
-            if (prevProps.showIcons !== this.props.showIcons) {
-                if (map && map.getZoom() > 11) {
-                    mapLayerService.showIconLayers(map, this.props.showIcons, this.props.selectedSite?.properties.id);
-                }
-            }
-
-            if (prevProps.zoomToElement !== this.props.zoomToElement) {
-                if (this.props.zoomToElement !== null) {
-                    const currentZoom = map?.getZoom();
-
-                    map.flyTo({
-                        center: [
-                            this.props.zoomToElement.lon,
-                            this.props.zoomToElement.lat
-                        ], zoom: currentZoom < 10 ? 10 : currentZoom,
-                        essential: true
-                    });
-                }
-            }
-        }
-        }
-    }
-
-    componentWillUnmount(){
-
-        //unregister events
-        window.removeEventListener("menu-resized", this.handleResize);
-        
-        if(map){
-            map.off('click', this.mapClick);
-            map.off('moveend', this.mapMoveEnd);
-            map.off('move', this.mapMove);
-        }
-
-        lastBoundingBox=null;
-        
-        // will be checked again on next load
-        this.props.setConnectivityCheck(true); 
-    }
-
-    handleResize = () => {
-        if (map) {
-            // wait a moment until resizing actually happened
-            window.setTimeout(() => map.resize(), 500);
-        }
-    }
-
-    extractCoordinatesFromUrl = (): coordinates => {
-        const currentUrl = window.location.href;
-        const mainPathParts = currentUrl.split(URL_BASEPATH);
-        const coordinatePathPart = mainPathParts[1].split("/details/"); // split by details if present
-        const allCoordinates = coordinatePathPart[0].replace("/", "");
-        const coordinates = allCoordinates.split(",");
-        return { lat: Number(coordinates[0]), lon: Number(coordinates[1]), zoom: Number(coordinates[2]) }
-    }
-
-    areCoordinatesValid = (coordinates: coordinates) => {
-
-        if ((!Number.isNaN(coordinates.lat)) && (!Number.isNaN(coordinates.lon))) {
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-    moveMapToCoordinates = (coordinates: coordinates) => {
-
-        if (this.areCoordinatesValid(coordinates)) {
-            let zoom = -1;
-
-            if (!Number.isNaN(coordinates.zoom)) {
-                zoom = coordinates.zoom;
-            }
-
-            map.flyTo({
-                center: [
-                    coordinates.lon,
-                    coordinates.lat
-                ], zoom: zoom !== -1 ? zoom : this.props.zoom,
-                essential: true
-            })
-        }
-    }
-
-    loadNetworkData = async (bbox: mapboxgl.LngLatBounds) => {
-        if (!isLoadingInProgress) { // only load data if loading not in progress
-            isLoadingInProgress = true;
-
-            if (lastBoundingBox == null) {
-                lastBoundingBox = bbox;
-                await this.draw('lines', `${URL_API}/links/geojson/${lastBoundingBox.getWest()},${lastBoundingBox.getSouth()},${lastBoundingBox.getEast()},${lastBoundingBox.getNorth()}`);
-                await this.draw('points', `${URL_API}/sites/geojson/${lastBoundingBox.getWest()},${lastBoundingBox.getSouth()},${lastBoundingBox.getEast()},${lastBoundingBox.getNorth()}`);
-            } else {
-
-                // new bbox is bigger than old one
-                if (bbox.contains(lastBoundingBox.getNorthEast()) && bbox.contains(lastBoundingBox.getSouthWest()) && lastBoundingBox !== bbox) {  //if new bb is bigger than old one
-
-                    lastBoundingBox = bbox;
-
-                    //calculate new boundingBox
-                    const increasedBoundingBox = increaseBoundingBox(map);
-
-                    await this.draw('lines', `${URL_API}/links/geojson/${increasedBoundingBox.west},${increasedBoundingBox.south},${increasedBoundingBox.east},${increasedBoundingBox.north}`);
-                    await this.draw('points', `${URL_API}/sites/geojson/${increasedBoundingBox.west},${increasedBoundingBox.south},${increasedBoundingBox.east},${increasedBoundingBox.north}`);
-
-                } else if (lastBoundingBox.contains(bbox.getNorthEast()) && lastBoundingBox.contains(bbox.getSouthWest())) { // last one contains new one
-                    // bbox is contained in last one, do nothing
-                    isLoadingInProgress = false;
-
-                } else { // bbox is not fully contained in old one, extend
-
-                    lastBoundingBox.extend(bbox);
-
-                    await this.draw('lines', `${URL_API}/links/geojson/${lastBoundingBox.getWest()},${lastBoundingBox.getSouth()},${lastBoundingBox.getEast()},${lastBoundingBox.getNorth()}`);
-                    await this.draw('points', `${URL_API}/sites/geojson/${lastBoundingBox.getWest()},${lastBoundingBox.getSouth()},${lastBoundingBox.getEast()},${lastBoundingBox.getNorth()}`);
-                }
-
-            }
-
-
-            if (notLoadedBoundingBoxes.length > 0) { // load last not loaded boundingbox
-                this.loadNetworkData(notLoadedBoundingBoxes.pop()!)
-                notLoadedBoundingBoxes = [];
-            }
-
-        } else {
-            notLoadedBoundingBoxes.push(bbox);
-        }
-    }
-
-    showSitePopup = (sites: mapboxgl.MapboxGeoJSONFeature[], top: number, left: number) => {
-        if (sites.length > 1) {
-            const elements: PopupElement[] = sites.map(feature =>  {return {name: feature.properties!.name, id: feature.properties!.id}});
-
-            this.props.setPopupPosition(top, left);
-            this.props.selectMultipleSites(elements); //name, id object container
-            this.setState({ isPopupOpen: true });
-
-        } else {
-            const id = sites[0].properties!.id;
-
-            fetch(`${URL_API}/sites/${id}`)
-                .then(result => verifyResponse(result))
-                .then(res => res.json() as Promise<Site>)
-                .then(result => {
-                    this.props.selectSite(result);
-                    this.props.highlightSite(result);
-                    this.props.clearDetailsHistory();
-                })
-                .catch(error => this.props.handleConnectionError(error));;
-        }
-    }
-
-    showLinkPopup = (links: mapboxgl.MapboxGeoJSONFeature[], top: number, left: number) => {
-
-        if (links.length > 1) {
-
-            const elements: PopupElement[] = links.map(feature =>  {return {name: feature.properties!.name, id: feature.properties!.id}});
-
-            this.props.setPopupPosition(top, left);
-            this.props.selectMultipleLinks(elements);
-            this.setState({ isPopupOpen: true });
-
-        } else {
-            var id = links[0].properties!.id;
-
-            fetch(`${URL_API}/links/${id}`)
-                .then(result => verifyResponse(result))
-                .then(res => res.json() as Promise<link>)
-                .then(result => {
-                    this.props.selectLink(result);
-                    this.props.highlightLink(result);
-
-                    this.props.clearDetailsHistory();
-                })
-                .catch(error => this.props.handleConnectionError(error));;
-        }
-    }
-
-    draw = async (layer: string, url: string) => {
-
-        fetch(url)
-            .then(result => verifyResponse(result))
-            .then(res => res.json())
-            .then(result => {
-                isLoadingInProgress = false;
-                if (map.getSource(layer)) {
-                    (map.getSource(layer) as mapboxgl.GeoJSONSource).setData(result);
-                }
-            })
-            .catch(error => this.props.handleConnectionError(error));;
-    }
-
-    render() {
-
-        return <>
-
-{
-    !this.props.settings.isLoadingData ?
-
-            <div id="map" style={{ width: "70%", position: 'relative' }} ref={myRef} >
-                {
-                    this.state.isPopupOpen &&
-                    <MapPopup onClose={() => { this.setState({ isPopupOpen: false }); }} />
-                }
-                <SearchBar />
-                <Statistics />
-                <IconSwitch visible={this.props.zoom>11} />
-                <ConnectionInfo />
-                <Button 
-                disabled={!this.props.isTopoServerReachable}
-                style={{'position': 'absolute', 'right':5, top:5, backgroundColor:'white', zIndex:1}}
-                onClick={e => this.props.navigateToApplication("network", "customize")} >
-                    <img src={customize} />
-                </Button>
-            </div>
-            :<div style={{ width: "70%", position: 'relative' }} />
-
-    }
-        </>
-    }
-
-}
-
-type mapProps = RouteComponentProps & Connect<typeof mapStateToProps, typeof mapDispatchToProps>;
-
-const mapStateToProps = (state: IApplicationStoreState) => ({
-    selectedLink: state.network.map.selectedLink,
-    selectedSite: state.network.map.selectedSite,
-    zoomToElement: state.network.map.zoomToElement,
-    alarmlement: state.network.map.alarmlement,
-    lat: state.network.map.lat,
-    lon: state.network.map.lon,
-    zoom: state.network.map.zoom,
-    linkCount: state.network.map.statistics.links,
-    siteCount: state.network.map.statistics.sites,
-    isTopoServerReachable: state.network.connectivity.isToplogyServerAvailable,
-    isTileServerReachable: state.network.connectivity.isTileServerAvailable,
-    isConnectivityCheckBusy: state.network.connectivity.isBusy,
-    showIcons: state.network.map.allowIconSwitch,
-    settings: state.network.settings,
-});
-
-const mapDispatchToProps = (dispatcher: IDispatcher) => ({
-    selectSite: (site: Site) => dispatcher.dispatch(new SelectSiteAction(site)),
-    selectLink: (link: link) => dispatcher.dispatch(new SelectLinkAction(link)),
-    clearDetailsHistory: () => dispatcher.dispatch(new ClearHistoryAction()),
-    selectMultipleLinks: (ids: PopupElement[]) => dispatcher.dispatch(new SelectMultipleLinksAction(ids)),
-    selectMultipleSites: (ids: PopupElement[]) => dispatcher.dispatch(new SelectMultipleSitesAction(ids)),
-    setPopupPosition: (x: number, y: number) => dispatcher.dispatch(new SetPopupPositionAction(x, y)),
-    highlightLink: (link: link) => dispatcher.dispatch(new HighlightLinkAction(link)),
-    highlightSite: (site: Site) => dispatcher.dispatch(new HighlightSiteAction(site)),
-    updateMapPosition: (lat: number, lon: number, zoom: number) => dispatcher.dispatch(new SetCoordinatesAction(lat, lon, zoom)),
-    setStatistics: (linkCount: string, siteCount: string) => dispatcher.dispatch(new SetStatistics(siteCount, linkCount)),
-    setTileServerLoaded: (reachable: boolean) => dispatcher.dispatch(setTileServerReachableAction(reachable)),
-    handleConnectionError: (error: Error) => dispatcher.dispatch(handleConnectionError(error)),
-    navigateToApplication: (applicationName: string, path?: string) => dispatcher.dispatch(new NavigateToApplication(applicationName, path, "test3")),
-    setConnectivityCheck: (done: boolean) => dispatcher.dispatch(new IsBusycheckingConnectivityAction(done)),
-
-})
-
-export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Map));
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/components/map/mapPopup.tsx b/sdnr/wt/odlux/apps/networkMapApp/src/components/map/mapPopup.tsx
deleted file mode 100644 (file)
index 7a64f5a..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import * as React from 'react';
-import { Typography, Select, MenuItem, ClickAwayListener, Popper, Paper, FormGroup, Portal, Popover } from '@material-ui/core';
-import { SelectSiteAction, ClearHistoryAction, ClearDetailsAction } from '../../actions/detailsAction';
-import { Site } from '../../model/site';
-import { link } from '../../model/link';
-import { URL_API } from '../../config';
-import { HighlightLinkAction, HighlightSiteAction } from '../../actions/mapActions';
-import { IApplicationStoreState } from '../../../../../framework/src/store/applicationStore';
-import connect, { IDispatcher, Connect } from '../../../../../framework/src/flux/connect';
-import { verifyResponse, handleConnectionError } from '../../actions/connectivityAction';
-
-
-
-
-const MapPopup: React.FunctionComponent<props> = (props) => {
-
-    const [value, setValue] = React.useState("");
-
-    const handleChange = (event: any) => {
-        setValue(event.target.value);
-
-        const id = event.target.value;
-
-       
-        fetch(`${URL_API}/${props.type.toLocaleLowerCase()}s/${id}`)
-        .then(result => verifyResponse(result))
-        .then(res => res.json())
-        .then(result => {
-            props.clearDetailsHistory();
-            props.selectElement(result);
-            props.type === "link" ?  props.highlightLink(result)  : props.highlightSite(result)
-            props.onClose();
-        })
-        .catch(error => {
-            props.handleConnectionError(error); 
-            props.onClose(); 
-           // props.clearDetails();
-        });
-    };
-
-    return <>
-        <Popover open={true}  anchorEl={undefined} onClose={props.onClose} anchorReference="anchorPosition" anchorPosition={{ top: props.position.left, left: props.position.top }}>
-            <Paper style={{ padding: "15px" }}>
-                <Typography variant="h5">{`Multiple ${props.type.toLowerCase()}s were selected`}</Typography>
-                <Typography variant="body1">Please select one.</Typography>
-                <Select style={{ width: 300 }} onChange={handleChange} value={value} native>
-                    <option value={""} disabled>{props.type} ids</option>
-                    {
-                        props.elements.map(el => <option key={el.id} value={el.id}>{el.name}</option>)
-                    }
-                </Select>
-            </Paper>
-        </Popover>
-    </>
-}
-
-type props = Connect<typeof mapStateToProps, typeof mapDispatchToProps>& { onClose(): void }
-
-const mapStateToProps = (state: IApplicationStoreState) => ({
-    elements: state.network.popup.selectionPendingForElements,
-    type: state.network.popup.pendingDataType,
-    position: state.network.popup.position
-
-});
-
-const mapDispatchToProps = (dispatcher: IDispatcher) => ({ 
-    selectElement: (site: Site) => dispatcher.dispatch(new SelectSiteAction(site)),
-    clearDetailsHistory:()=> dispatcher.dispatch(new ClearHistoryAction()),
-    highlightLink: (link: link) => dispatcher.dispatch(new HighlightLinkAction(link)),
-    highlightSite: (site: Site) => dispatcher.dispatch(new HighlightSiteAction(site)),
-    handleConnectionError: (error:Error) => dispatcher.dispatch(handleConnectionError(error)),
-    clearDetails: () => dispatcher.dispatch(new ClearDetailsAction()),
-
-});
-
-export default (connect(mapStateToProps, mapDispatchToProps))(MapPopup);
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/components/map/searchBar.tsx b/sdnr/wt/odlux/apps/networkMapApp/src/components/map/searchBar.tsx
deleted file mode 100644 (file)
index 307c5d2..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import * as React from 'react';
-import { makeStyles, Paper, InputBase, IconButton, Divider, Popover, Typography } from '@material-ui/core';
-import SearchIcon from '@material-ui/icons/Search';
-
-import { URL_API } from '../../config';
-import { isSite } from '../../utils/utils';
-import { Site } from '../../model/site';
-import { link } from '../../model/link';
-import { SelectSiteAction, SelectLinkAction } from '../../actions/detailsAction';
-import { HighlightLinkAction, HighlightSiteAction, ZoomToSearchResultAction } from '../../actions/mapActions';
-import { calculateMidPoint } from '../../utils/mapUtils';
-import { SetSearchValueAction } from '../../actions/searchAction';
-import connect,{ Connect, IDispatcher } from '../../../../../framework/src/flux/connect';
-import { IApplicationStoreState } from '../../../../../framework/src/store/applicationStore';
-
-
-
-
-
-
-const styles =  makeStyles({
-    root: {
-      //{ padding:5, position: 'absolute', display:'flex', flexDirection:"column",top: 150, width: 200}
-      padding: '2px 4px',
-      position: 'absolute',
-      display:'flex',
-      alignItems: 'center',
-      top: 15,
-      marginLeft: 5,
-      width: 400,
-      zIndex:1
-    },
-    input: {
-      flex: 1,
-      marginLeft: 5
-    },
-    iconButton: {
-      padding: 10,
-    },
-    divider: {
-      height: 28,
-      margin: 4,
-    },
-  });
-
-
-const SearchBar: React.FunctionComponent<searchBarProps> = (props) =>{
-
-    const classes = styles();
-    const [anchorEl, setAnchorEl] = React.useState<any>(null);
-    const [errorMessage, setErrorMessage] = React.useState("");
-
-    const divRef = React.useRef();
-
-    const handleClick = (e: any) =>{
-
-      setAnchorEl(null);
-      if(props.searchterm.length>0){
-
-        const siteResult = fetch(`${URL_API}/sites/name/${props.searchterm}`)
-
-        const linkResult = fetch(`${URL_API}/links/${props.searchterm}`);
-  
-           Promise.all([ siteResult, linkResult]).then((result)=>{
-              const suceededResults = result.filter(el=> el.ok);
-  
-             if(suceededResults.length==0){
-              setAnchorEl(divRef.current);
-              setErrorMessage("No element found.")
-              // hide message after 3 sec
-              window.setTimeout(()=>{setAnchorEl(null)}, 3000);
-
-             }else{
-              suceededResults[0].json().then(result =>{
-                if(isSite(result)){
-                  props.selectSite(result);
-                  props.highlightSite(result);
-                  props.zoomToSearchResult(result.location.lat, result.location.lon);
-                }else{
-                  props.selectLink(result);
-                  props.highlightLink(result);
-                  const midPoint = calculateMidPoint(result.locationA.lat, result.locationA.lon, result.locationB.lat, result.locationB.lon);
-                  props.zoomToSearchResult(midPoint[1], midPoint[0])
-                }
-              });
-      }  
-    });
-  }
-  e.preventDefault();
-}
-
-    const open = Boolean(anchorEl);
-
-    const reachabe = props.isTopoServerReachable && props.isTileServerReachable;
-
-    return (
-      <>
-        <Paper ref={divRef} component="form" className={classes.root}>
-          <InputBase
-          disabled={!reachabe}
-            className={classes.input}
-            placeholder="Find sites or links by name"
-            inputProps={{ 'aria-label': 'networkmap-searchbar' }}
-            value={props.searchterm}
-            onChange={e=> props.setSearchTerm(e.currentTarget.value)}
-          />
-          <Divider className={classes.divider} orientation="vertical" />
-          <IconButton type="submit" className={classes.iconButton} aria-label="search" onClick={handleClick}>
-            <SearchIcon />
-          </IconButton>
-        </Paper>
-        <Popover open={open} onClose={e=> setAnchorEl(null)} anchorEl={anchorEl} anchorOrigin={{
-          vertical: "bottom",
-          horizontal: "left"
-        }}>
-          <Paper style={{width: 380, padding:10}}>
-      <Typography variant="body1">{errorMessage}</Typography>
-          </Paper>
-        </Popover>
-        </>
-      );
-}
-
-const mapStateToProps = (state: IApplicationStoreState) => ({
-  searchterm: state.network.search.value,
-  isTopoServerReachable: state.network.connectivity.isToplogyServerAvailable,
-  isTileServerReachable: state.network.connectivity.isTileServerAvailable
-
-});
-
-type searchBarProps = Connect<typeof mapStateToProps, typeof mapDispatchToProps>;
-
-
-const mapDispatchToProps = (dispatcher: IDispatcher) => ({ 
-  selectSite:(site: Site)=> dispatcher.dispatch(new SelectSiteAction(site)), 
-  selectLink:(link: link) => dispatcher.dispatch(new SelectLinkAction(link)), 
-  highlightLink:(link: link)=> dispatcher.dispatch(new HighlightLinkAction(link)),
-  highlightSite: (site: Site) => dispatcher.dispatch(new HighlightSiteAction(site)),
-  setSearchTerm: (value: string) => dispatcher.dispatch(new SetSearchValueAction(value)),
-  zoomToSearchResult: (lat: number, lon: number) => dispatcher.dispatch(new ZoomToSearchResultAction(lat, lon)),
-});;
-
-export default (connect(mapStateToProps,mapDispatchToProps)(SearchBar))
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/components/map/statistics.tsx b/sdnr/wt/odlux/apps/networkMapApp/src/components/map/statistics.tsx
deleted file mode 100644 (file)
index 5626891..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import * as React from 'react';
-import { Paper, Typography, Tooltip } from '@material-ui/core';
-import InfoIcon from '@material-ui/icons/Info';
-
-import { IApplicationStoreState } from '../../../../../framework/src/store/applicationStore';
-import connect, { IDispatcher, Connect } from '../../../../../framework/src/flux/connect';
-
-type props = Connect<typeof mapStateToProps, typeof mapDispatchToProps>;
-
-const mapStateToProps = (state: IApplicationStoreState) => ({
-    linkCount: state.network.map.statistics.links,
-    siteCount: state.network.map.statistics.sites,
-    isTopoServerReachable: state.network.connectivity.isToplogyServerAvailable,
-    isTileServerReachable: state.network.connectivity.isTileServerAvailable,
-
-});
-
-const mapDispatchToProps = (dispatcher: IDispatcher) => ({
-});
-
-const Statistics: React.FunctionComponent<props> = (props: props) =>{
-
-    const reachabe = props.isTopoServerReachable && props.isTileServerReachable;
-
-
-    return (<Paper style={{ padding: 5, position: 'absolute', display: 'flex', flexDirection: "column", top: 70, width: 200, marginLeft: 5, zIndex:1 }}>
-    <div style={{ display: 'flex', flexDirection: "row" }}>
-        <Typography style={{ fontWeight: "bold", flex: "1", color: reachabe ? "black" : "lightgrey" }} >Statistics</Typography>
-        <Tooltip style={{ alignSelf: "flex-end" }} title="Gets updated when the map stops moving.">
-            <InfoIcon fontSize="small" />
-        </Tooltip>
-    </div>
-
-    <Typography style={{ color: reachabe ? "black" : "lightgrey" }}>Sites: {props.siteCount}</Typography>
-    <Typography style={{ color: reachabe ? "black" : "lightgrey" }}>Links: {props.linkCount}</Typography>
-</Paper>)
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Statistics);
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/config.ts b/sdnr/wt/odlux/apps/networkMapApp/src/config.ts
deleted file mode 100644 (file)
index bdb7d15..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-export const URL_API="/topology/network"
-export const SITEDOC_URL="/sitedoc";
-export const URL_TILE_API = '/tiles'; // http://tile.openstreetmap.org can be used for local testing, never commit with tile url changed! /tiles
-
-
-export const OSM_STYLE = {
-    'version': 8,
-    'sources': {
-        'raster-tiles': {
-            'type': 'raster',
-            'tiles': [
-               URL_TILE_API+'/{z}/{x}/{y}.png'
-            ],
-            'tileSize': 256,
-            'attribution':
-                '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
-        }
-    },
-    'layers': [
-        {
-            'id': 'simple-tiles',
-            'type': 'raster',
-            'source': 'raster-tiles',
-            'minZoom': 0,
-            'maxZoom': 18
-        }
-    ]
-};
-
-export const URL_BASEPATH = "network";
-
-
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/handlers/connectivityReducer.ts b/sdnr/wt/odlux/apps/networkMapApp/src/handlers/connectivityReducer.ts
deleted file mode 100644 (file)
index 8ab82f2..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { IActionHandler } from "../../../../framework/src/flux/action";
-import { IsTopologyServerReachableAction, IsTileServerReachableAction, IsBusycheckingConnectivityAction } from "../actions/connectivityAction";
-
-
-export type connectivityState = {isToplogyServerAvailable: boolean, isTileServerAvailable: boolean, isBusy: boolean };
-
-const initialState: connectivityState = {isToplogyServerAvailable: true, isTileServerAvailable: true, isBusy: true};
-
-export const ConnectivityReducer: IActionHandler<connectivityState> =(state=initialState, action)=> {
-
-    if(action instanceof IsTopologyServerReachableAction){
-        state = Object.assign({}, state, { isToplogyServerAvailable: action.reachable });
-    }
-    else if (action instanceof IsTileServerReachableAction){
-        state = Object.assign({}, state, { isTileServerAvailable: action.reachable });
-
-    }else if(action instanceof IsBusycheckingConnectivityAction){
-        state = {...state, isBusy: action.isBusy}
-        
-    }
-
-    return state;
-} 
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/handlers/detailsReducer.ts b/sdnr/wt/odlux/apps/networkMapApp/src/handlers/detailsReducer.ts
deleted file mode 100644 (file)
index 8a7fc6a..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { IActionHandler } from '../../../../framework/src/flux/action';
-import { link } from "../model/link";
-import { Site, Device } from "../model/site";
-import { HistoryEntry } from "../model/historyEntry";
-import { SelectSiteAction, SelectLinkAction, AddToHistoryAction, ClearHistoryAction, IsBusyCheckingDeviceListAction, FinishedLoadingDeviceListAction, ClearLoadedDevicesAction, ClearDetailsAction, InitializeLoadedDevicesAction, IsSitedocReachableAction } from '../actions/detailsAction';
-
-export type DetailsStoreState={
-    data: Site | link | null,
-    history: HistoryEntry[],
-    isBusyCheckingDeviceList: boolean,
-    checkedDevices: Device[],
-    isSitedocReachable: boolean
-
-}
-
-const initialState: DetailsStoreState = {
-    data: null,
-    history:[],
-    isBusyCheckingDeviceList: false,
-    checkedDevices: [],
-    isSitedocReachable: false
-}
-
-export const DetailsReducer:IActionHandler<DetailsStoreState>=(state = initialState, action)=>{
-    
-    if(action instanceof SelectSiteAction){
-        state= Object.assign({}, state, {data: action.site});
-    }
-    else if(action instanceof SelectLinkAction){
-        state =  Object.assign({}, state, {data: action.link});
-    }else if(action instanceof ClearDetailsAction){
-        state =  Object.assign({}, state, {data: null});
-    }
-    else if(action instanceof AddToHistoryAction){
-        state = Object.assign({}, state, {history: [...state.history, action.entry]})
-
-    }else if(action instanceof ClearHistoryAction){
-        state = Object.assign({}, state, {history: []});
-
-    }else if(action instanceof IsBusyCheckingDeviceListAction){
-        state = Object.assign({}, state, {isBusyCheckingDeviceList: action.isBusy});
-    }else if (action instanceof FinishedLoadingDeviceListAction){
-        state = Object.assign({}, state, {checkedDevices: action.devices});
-        
-    }else if(action instanceof ClearLoadedDevicesAction){
-        state = Object.assign({}, state, {checkedDevices: []});
-
-    }else if(action instanceof InitializeLoadedDevicesAction){
-        state = Object.assign({}, state, {checkedDevices: action.devices});
-    }else if(action instanceof IsSitedocReachableAction){
-        state = Object.assign({}, state, {isSitedocReachable: action.isReachable});
-    }
-
-
-    return state;
-
-}
-
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/handlers/mapReducer.ts b/sdnr/wt/odlux/apps/networkMapApp/src/handlers/mapReducer.ts
deleted file mode 100644 (file)
index 442a508..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { IActionHandler } from '../../../../framework/src/flux/action';
-import { Feature } from "../model/Feature";
-import { HighlightLinkAction, HighlightSiteAction, ZoomToSearchResultAction, AddAlarmAction, SetCoordinatesAction, SetStatistics, SetIconSwitchAction, RemoveHighlightingAction } from '../actions/mapActions';
-
-export type location = {lat: number, lon:number}
-
-export type mapState = {
-    selectedLink: Feature | null,
-    selectedSite: Feature | null,
-    zoomToElement: location | null,
-    alarmlement: Feature|null,
-    lat: number,
-    lon: number, 
-    zoom: number,
-    statistics:{links: string, sites: string},
-    allowIconSwitch: boolean
-}
-
-const initialState: mapState ={
-    selectedLink: null,
-    selectedSite: null,
-    zoomToElement: null,
-    alarmlement: null,
-    lat: 52.5095,
-    lon: 13.3290,
-    zoom: 10,
-    statistics:{links:"Not counted yet.", sites: "Not counted yet."},
-    allowIconSwitch: true
-}
-
-export const MapReducer: IActionHandler<mapState> = (state=initialState, action: any) => {
-    
-    if(action instanceof HighlightLinkAction){
-      
-        state = Object.assign({}, state, {selectedSite: null, selectedLink:{type: "Feature", properties:{id:action.link.id, type: action.link.type}, geometry:{type:"LineString", coordinates:[[action.link.locationA.lon,action.link.locationA.lat ],[action.link.locationB.lon,action.link.locationB.lat ]]}}})
-
-
-    }
-    else if(action instanceof HighlightSiteAction){
-       
-    state = Object.assign({}, state, {selectedLink: null, selectedSite:{type: "Feature", properties: {id: action.site.id, type:action.site.type}, geometry:{type:"Point", coordinates:[action.site.location.lon,action.site.location.lat ]}}})
-
-    }else if (action instanceof ZoomToSearchResultAction){
-        state = Object.assign({}, state, {zoomToElement:{lat: action.lat, lon: action.lon}});
-    }else if (action instanceof AddAlarmAction){
-        state = Object.assign({}, state, {alarmlement:{type: "Feature", properties: {id: action.site.id, type:action.site.type}, geometry:{type:"Point", coordinates:[action.site.location.lon,action.site.location.lat ]}}});
-
-    }else if(action instanceof SetCoordinatesAction){
-        state = Object.assign({}, state, {lat:action.lat, lon: action.lon, zoom:action.zoom});
-        
-    }else if(action instanceof SetStatistics){
-        state = Object.assign({}, state, {statistics:{sites: action.siteCount, links: action.linkCount}});
-
-    }else if (action instanceof SetIconSwitchAction){
-        state = Object.assign({}, state, {allowIconSwitch: action.enable});
-
-    }else if(action instanceof RemoveHighlightingAction){
-        state = Object.assign({}, state, {selectedLink: null, selectedSite:null})
-
-    }
-
-    return state;
-}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/handlers/popupReducer.ts b/sdnr/wt/odlux/apps/networkMapApp/src/handlers/popupReducer.ts
deleted file mode 100644 (file)
index deb366e..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { PopupElement } from 'model/popupElements';
-import { IActionHandler } from '../../../../framework/src/flux/action';
-import { SelectMultipleLinksAction, SelectMultipleSitesAction, SetPopupPositionAction } from "../actions/popupActions";
-
-export type popupStoreState = {
-    selectionPendingForElements: PopupElement[],
-    pendingDataType: "link"|"site"| "",
-    position: { top: number, left: number }
-};
-
-const initialState: popupStoreState = {
-    selectionPendingForElements: [],
-    pendingDataType: "",
-    position: { top: 0, left: 0 }
-};
-
-export const PopupsReducer: IActionHandler<popupStoreState> = (state = initialState, action) => {
-   
-    if(action instanceof SelectMultipleLinksAction){
-        state = Object.assign({}, state, { selectionPendingForElements: action.elements, pendingDataType: "link", isSelectionNeeded: true });
-
-    }else if(action instanceof SelectMultipleSitesAction){
-        state = Object.assign({}, state, { selectionPendingForElements: action.elements, pendingDataType: "site", isSelectionNeeded: true });
-
-    }else if(action instanceof SetPopupPositionAction){
-        state= Object.assign({}, state, {position:{top:action.top, left: action.left}})
-
-    }
-       
-
-    return state;
-
-}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/handlers/rootReducer.ts b/sdnr/wt/odlux/apps/networkMapApp/src/handlers/rootReducer.ts
deleted file mode 100644 (file)
index 697dbd7..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { combineActionHandler } from '../../../../framework/src/flux/middleware';
-
-import { DetailsReducer, DetailsStoreState } from "./detailsReducer";
-import { PopupsReducer, popupStoreState } from "./popupReducer";
-import { MapReducer, mapState } from "./mapReducer";
-import { SearchReducer, searchState } from "./searchReducer";
-import { connectivityState, ConnectivityReducer } from './connectivityReducer';
-import { SettingsReducer, SettingsState } from './settingsReducer';
-
-export interface INetworkAppStoreState{
-    details: DetailsStoreState,
-    popup: popupStoreState,
-    map: mapState,
-    search: searchState,
-    connectivity: connectivityState,
-    settings: SettingsState
-}
-
-declare module '../../../../framework/src/store/applicationStore' {
-    interface IApplicationStoreState {
-      network: INetworkAppStoreState
-    }
-  }
-
-const appHandler = {
-    details: DetailsReducer, 
-    popup: PopupsReducer, 
-    map: MapReducer, 
-    search: SearchReducer,
-    connectivity: ConnectivityReducer,
-    settings: SettingsReducer};
-
-export const networkmapRootHandler = combineActionHandler<INetworkAppStoreState>(appHandler)
-
-export default networkmapRootHandler;
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/handlers/searchReducer.ts b/sdnr/wt/odlux/apps/networkMapApp/src/handlers/searchReducer.ts
deleted file mode 100644 (file)
index 68aade4..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { IActionHandler } from '../../../../framework/src/flux/action';
-import { SetSearchValueAction } from "../actions/searchAction";
-
-export type searchState = {value: string};
-
-const initialState: searchState = {value: ''};
-
-export const SearchReducer: IActionHandler<searchState> =(state=initialState, action)=> {
-
-    if(action instanceof SetSearchValueAction){
-        state = Object.assign({}, state, { value: action.value });
-    }
-
-    return state;
-} 
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/handlers/settingsReducer.ts b/sdnr/wt/odlux/apps/networkMapApp/src/handlers/settingsReducer.ts
deleted file mode 100644 (file)
index 977a379..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { NetworkMapSettings, NetworkMapThemes } from "../model/settings";
-import { IActionHandler } from "../../../../framework/src/flux/action";
-import { SetBusyLoadingAction, SetMapSettingsAction, SetSettingsAction, SetThemeSettingsAction } from "../actions/settingsAction";
-
-export type SettingsState = {
-    mapSettings: NetworkMapSettings|null,
-    themes: NetworkMapThemes,
-    isLoadingData: boolean
-};
-
-
-const defaultThemes:NetworkMapThemes = {networkMapThemes:{themes: [
-
-    {key: "light", site: "#11b4da", selectedSite: "#116bda", fiberLink: "#1154d9", microwaveLink: "#039903"},
-    {key: "dark", site: "#000000", selectedSite: "#6e6e6e", fiberLink: "#0a2a6b", microwaveLink: "#005200"},
-]}}
-
-const initialState: SettingsState = {
-    mapSettings: null,
-    themes: defaultThemes,
-    isLoadingData: true
-
-};
-
-export const SettingsReducer: IActionHandler<SettingsState> = (state = initialState, action) => {
-   
-    if(action instanceof SetSettingsAction){
-        state = {
-            isLoadingData: false,
-            mapSettings: {networkMap: action.settings.networkMap},
-            themes:{networkMapThemes: {themes: action.settings.networkMapThemes.themes}}
-        };
-    }else if(action instanceof SetMapSettingsAction){
-        state={...state, mapSettings: action.settings};
-    }else if(action instanceof SetThemeSettingsAction){
-        state={...state, themes:{networkMapThemes: {themes: action.settings.networkMapThemes.themes}}};
-    }else if(action instanceof SetBusyLoadingAction){
-        state={...state, isLoadingData: action.busy};
-    }
-
-    return state;
-
-}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/index.html b/sdnr/wt/odlux/apps/networkMapApp/src/index.html
deleted file mode 100644 (file)
index f705711..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  <meta http-equiv="X-UA-Compatible" content="ie=edge">
-  <!-- <link rel="stylesheet" href="./vendor.css" > -->
-  <title>Networkmap App</title>
-</head>
-
-<body>
-  <div id="app"></div>
-  <script type="text/javascript" src="./require.js"></script>
-  <script type="text/javascript" src="./config.js"></script>
-
-  <script>
-    // run the application
-    require(["app","connectApp","faultApp", "networkMapApp", "configurationApp", "linkCalculationApp"], function (app, connectApp, faultApp, networkMapApp, configurationApp, linkCalculationApp) {
-      connectApp.register();
-      faultApp.register();
-      //configurationApp.register();
-      linkCalculationApp.register();
-      networkMapApp.register();
-      app("./app.tsx").runApplication();
-    });
-  </script>
-</body>
-
-</html>
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/model/Feature.ts b/sdnr/wt/odlux/apps/networkMapApp/src/model/Feature.ts
deleted file mode 100644 (file)
index c4f9ad1..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-export type Feature = {type: "Feature", properties: {id: string, type?: string}, geometry: Geometry}
-
-export type Geometry = Point | LineString;
-
-type Point = {type: "Point", coordinates: number[]}
-
-type LineString ={type: "LineString", coordinates: number[][]}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/model/count.ts b/sdnr/wt/odlux/apps/networkMapApp/src/model/count.ts
deleted file mode 100644 (file)
index 726e2ff..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-export type elementCount ={sites: string, links: string}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/model/historyEntry.ts b/sdnr/wt/odlux/apps/networkMapApp/src/model/historyEntry.ts
deleted file mode 100644 (file)
index d7197a4..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { Site } from "./site";
-import { link } from "./link";
-
-export type HistoryEntry={id: string, data: Site|link};
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/model/link.ts b/sdnr/wt/odlux/apps/networkMapApp/src/model/link.ts
deleted file mode 100644 (file)
index c161209..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-type Antenna = {
-    name:string,
-    waveguideLossIndB: number,
-    gain: number
-}
-
-export type link = {id: string, 
-    name: string,
-    length: number,
-    calculatedLength: number,
-    type: string,
-     siteA: string,
-     siteB: string,
-    azimuthA: number | null,
-    azimuthB: number | null,
-    locationA: { lon: number, lat: number, amsl:number | null, antennaHeight: number | null, antenna: Antenna |null },
-    locationB: { lon: number, lat: number, amsl:number | null, antennaHeight: number | null, antenna: Antenna |null },
- };
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/model/popupElements.ts b/sdnr/wt/odlux/apps/networkMapApp/src/model/popupElements.ts
deleted file mode 100644 (file)
index 320d7ca..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-export type PopupElement = {
-    name: string,
-    id: string
-}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/model/settings.ts b/sdnr/wt/odlux/apps/networkMapApp/src/model/settings.ts
deleted file mode 100644 (file)
index 521f47c..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-export type NetworkMapSettings = { 
-    networkMap: { 
-        startupPosition: { latitude?: string, longitude?: string, zoom?: string }, 
-        tileOpacity: string, 
-        styling: { theme: string } } };
-
-export type ThemeElement = {
-    key: string, 
-    site: string, 
-    selectedSite: string, 
-    microwaveLink: string, 
-    fiberLink: string};
-    
-export type NetworkMapThemes = {networkMapThemes: {themes: ThemeElement[]} };
-
-export type NetworkSettings = NetworkMapSettings & NetworkMapThemes;
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/model/site.ts b/sdnr/wt/odlux/apps/networkMapApp/src/model/site.ts
deleted file mode 100644 (file)
index 13a7361..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { link } from "./link";
-
-export type Site = {
-    id: string,
-    name: string,
-    address: Address,
-    heightAmslInMeters?: number, //AboveGroundLevel
-    antennaHeightAmslInMeters?: number,
-    type?: string,
-    operator: string,
-    location:{lon: number, lat: number},
-    devices: Device[],
-    links: link[],
-    furtherInformation:string
-}
-
-export type Address={
-    streetAndNr: string,
-    city: string,
-    zipCode: string | null,
-    country: string
-}
-
-export class Device {
-    id: string;
-    type: string;
-    name: string;
-    manufacturer: string;
-    owner: string;
-    status?: string;
-    port: number[];
-}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/model/stadokOrder.ts b/sdnr/wt/odlux/apps/networkMapApp/src/model/stadokOrder.ts
deleted file mode 100644 (file)
index 1aad3aa..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-export type StadokOrder = {
-    date: Date,
-    assignedUser: string,
-    state: string, //todo: type restrict
-    tasks: Task[],
-
-
-};
-
-export class OrderToDisplay {
-
-    static parse = (stadokOrder: StadokOrder) =>{
-        let order = new OrderToDisplay();
-        order.assignedUser=stadokOrder.assignedUser;
-        order.state=stadokOrder.state;
-
-        const firstOpenTask = stadokOrder.tasks.find(task => !task.status);
-        
-        if(firstOpenTask){
-            order.currentTask=firstOpenTask.description;
-        }else{
-            order.currentTask="No task description available";
-        }
-
-        return order;
-    }
-
-    state: string;
-    assignedUser: string;
-    currentTask: string;
-
-};
-
-type Task = {
-    type: string,
-    description: string,
-    status: boolean
-}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/model/stadokSite.ts b/sdnr/wt/odlux/apps/networkMapApp/src/model/stadokSite.ts
deleted file mode 100644 (file)
index ed0ca39..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { Address } from "./site";
-
-type StadokSite = {
-
-    siteId: string;
-    createdBy: Contact;
-    updatedOn: Date;
-    location: { lat: number, lon: number },
-    address: Address;
-    contacts: { manager: Contact, owner: Contact };
-    safteyNotices: string[];
-    images: string[];
-    type: string;
-    devices: Device[];
-    logs: Log[];
-
-};
-
-type Contact = {
-    firstName: string;
-    lastName: string;
-    email: string;
-    telephoneNumber: string;
-};
-type Log = {
-    date: Date, //string?
-    person: string;
-    entry: string;
-};
-
-type Device = {
-    "device": string,
-    "antenna": string
-};
-
-export default StadokSite;
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/pluginTransport.tsx b/sdnr/wt/odlux/apps/networkMapApp/src/pluginTransport.tsx
deleted file mode 100644 (file)
index 24a4699..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-// app configuration and main entry point for the app
-
-import * as React from "react";
-import { faMapMarked } from '@fortawesome/free-solid-svg-icons'; // select app icon
-import applicationManager from '../../../framework/src/services/applicationManager';
-
-
-import { networkmapRootHandler } from './handlers/rootReducer';
-import MainView from "./App";
-import { subscribe, IFormatedMessage } from "../../../framework/src/services/notificationService";
-import applicationApi from "../../../framework/src/services/applicationApi";
-import { checkSitedockReachablity, IsSitedocReachableAction, UpdateDetailsView } from "./actions/detailsAction";
-import { findSiteToAlarm } from "./actions/mapActions";
-import { URL_BASEPATH } from "./config";
-import { Redirect, Route, RouteComponentProps, Switch, withRouter } from "react-router-dom";
-import CustomizationView from "./components/customize/customizationView";
-import { getSettings } from "./actions/settingsAction";
-import connect, { Connect, IDispatcher } from "../../../framework/src/flux/connect";
-import { IApplicationStoreState } from "../../../framework/src/store/applicationStore";
-
-const mapProps = (state: IApplicationStoreState) => ({
-});
-
-const mapDisp = (dispatcher: IDispatcher) => ({
-  getSettings: () => dispatcher.dispatch(getSettings()),
-  tryReachSitedoc: () => dispatcher.dispatch(checkSitedockReachablity())
-
-});
-
-
-const NetworkRouterApp = withRouter(connect(mapProps, mapDisp)((props: RouteComponentProps & Connect<typeof mapProps, typeof mapDisp>) => {
-
-  React.useLayoutEffect(() => {
-    (async function waitFor() {
-      await  props.getSettings();
-    })();
-
-    props.tryReachSitedoc();
-   
-  }, []);
-
-  //props.history.action = "POP";
-  return (
-    <Switch>
-      <Route path={`${props.match.path}/customize`} component={CustomizationView} />
-      <Route path={`${props.match.path}`} component={MainView} />
-      <Redirect to={`${props.match.path}`} />
-    </Switch>
-  )
-}));
-
-export function register() {
-  applicationManager.registerApplication({
-    name: URL_BASEPATH, // used as name of state as well
-    icon: faMapMarked,
-    rootActionHandler: networkmapRootHandler,
-    rootComponent: NetworkRouterApp,
-    menuEntry: "Network Map"
-  });
-}
-
-type ObjectNotification = {
-  counter: string;
-  nodeName: string;
-  objectId: string;
-  timeStamp: string;
-}
-
-type FaultAlarmNotification = {
-  id: string;
-  nodeName: string;
-  counter: number;
-  timeStamp: string;
-  objectId: string;
-  problem: string;
-  severity: null | 'Warning' | 'Minor' | 'Major' | 'Critical';
-  type: string;
-  sourceType: string;
-}
-/*
-// subscribe to the websocket notifications from connect
-subscribe<ObjectNotification & IFormatedMessage>(["ObjectCreationNotification", "ObjectDeletionNotification", "AttributeValueChangedNotification"], (msg => {
-  const store = applicationApi.applicationStore;
-  
- //store && store.dispatch(UpdateDetailsView(msg.nodeName))
-
-}));
-*/
-
-/*
-subscribe<FaultAlarmNotification & IFormatedMessage>("ProblemNotification", (fault => {
-  const store = applicationApi && applicationApi.applicationStore;
-  if (fault && store) {
-    store.dispatch(findSiteToAlarm(fault.nodeName));
-
-
-  }
-}));*/
-
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/services/mapImagesService.ts b/sdnr/wt/odlux/apps/networkMapApp/src/services/mapImagesService.ts
deleted file mode 100644 (file)
index 30714b8..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import * as mapboxgl from 'mapbox-gl';
-import apartment from '../../icons/apartment.png';
-import datacenter from '../../icons/datacenter.png';
-import factory from '../../icons/factory.png';
-import lamp from '../../icons/lamp.png';
-import datacenterred from '../../icons/datacenterred.png';
-import factoryred from '../../icons/factoryred.png';
-import lampred from '../../icons/lampred.png';
-
-
-type ImagesLoaded = (allImagesLoaded: boolean) => void;
-type MapImages = {name: string, url: string}
-
-export const Images : MapImages[]  = [
-    {name: 'data-center', url: datacenter}, 
-    {name: 'house', url: apartment}, 
-    {name: 'factory', url: factory},
-    {name: 'lamp', url: lamp},
-    {name: 'data-center-red', url: datacenterred}, 
-    {name: 'factory-red', url: factoryred},
-    {name: 'lamp-red', url: lampred},
-] ;
-
-export const addImages = (map: mapboxgl.Map, callback?: ImagesLoaded) =>{
-
-    Images.forEach(image => {
-       
-        map.loadImage(
-            image.url,
-            function (error: any, img: any) {
-                if (error) throw error;
-                map.addImage(image.name, img);
-                allImagesLoaded(map, callback);
-            });
-    });
-}
-
-const allImagesLoaded = (map: mapboxgl.Map, callback?: ImagesLoaded) =>{
-
-    const loadedImages = Images.map(image =>{
-        return map.hasImage(image.name);
-    });
-
-    const allImagesLoaded = loadedImages.filter(el => !el);
-    if(allImagesLoaded.length===0){
-        callback && callback(true);
-    }
-}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/services/settingsService.ts b/sdnr/wt/odlux/apps/networkMapApp/src/services/settingsService.ts
deleted file mode 100644 (file)
index 2a2f094..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { NetworkMapSettings, NetworkMapThemes, NetworkSettings } from "../model/settings";
-import { requestRest } from "../../../../framework/src/services/restService";
-
- class SettingsService{
-
-    public getMapSettings = async () =>{
-        const result = await requestRest<any>("/userdata", {method: "GET"});
-        return result;
-    }
-
-    public getMapThemes = async () =>{
-        const result = await requestRest<NetworkMapThemes>("/userdata/networkMapThemes", {method: "GET"});
-        return result;
-    }
-
-    public updateMapSettings = async (newElement: NetworkMapSettings) =>{
-
-        const result = await requestRest<NetworkMapSettings>("/userdata/networkMap", {method: "PUT", body: JSON.stringify(newElement.networkMap)});
-        return result;
-    }
-
-
- }
-
- export const settingsService = new SettingsService();
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/styles/index.css b/sdnr/wt/odlux/apps/networkMapApp/src/styles/index.css
deleted file mode 100644 (file)
index ec2585e..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-body {
-  margin: 0;
-  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
-    'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
-    sans-serif;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-
-code {
-  font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
-    monospace;
-}
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/styles/mapbox-gl.css b/sdnr/wt/odlux/apps/networkMapApp/src/styles/mapbox-gl.css
deleted file mode 100644 (file)
index 03c479a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.mapboxgl-map{font:12px/20px Helvetica Neue,Arial,Helvetica,sans-serif;overflow:hidden;position:relative;-webkit-tap-highlight-color:rgba(0,0,0,0);text-align:left}.mapboxgl-map:-webkit-full-screen{width:100%;height:100%}.mapboxgl-canary{background-color:salmon}.mapboxgl-canvas-container.mapboxgl-interactive,.mapboxgl-ctrl-group button.mapboxgl-ctrl-compass{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.mapboxgl-canvas-container.mapboxgl-interactive.mapboxgl-track-pointer{cursor:pointer}.mapboxgl-canvas-container.mapboxgl-interactive:active,.mapboxgl-ctrl-group button.mapboxgl-ctrl-compass:active{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate,.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate .mapboxgl-canvas{touch-action:pan-x pan-y}.mapboxgl-canvas-container.mapboxgl-touch-drag-pan,.mapboxgl-canvas-container.mapboxgl-touch-drag-pan .mapboxgl-canvas{touch-action:pinch-zoom}.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan,.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan .mapboxgl-canvas{touch-action:none}.mapboxgl-ctrl-bottom-left,.mapboxgl-ctrl-bottom-right,.mapboxgl-ctrl-top-left,.mapboxgl-ctrl-top-right{position:absolute;pointer-events:none;z-index:2}.mapboxgl-ctrl-top-left{top:0;left:0}.mapboxgl-ctrl-top-right{top:0;right:0}.mapboxgl-ctrl-bottom-left{bottom:0;left:0}.mapboxgl-ctrl-bottom-right{right:0;bottom:0}.mapboxgl-ctrl{clear:both;pointer-events:auto;transform:translate(0)}.mapboxgl-ctrl-top-left .mapboxgl-ctrl{margin:10px 0 0 10px;float:left}.mapboxgl-ctrl-top-right .mapboxgl-ctrl{margin:10px 10px 0 0;float:right}.mapboxgl-ctrl-bottom-left .mapboxgl-ctrl{margin:0 0 10px 10px;float:left}.mapboxgl-ctrl-bottom-right .mapboxgl-ctrl{margin:0 10px 10px 0;float:right}.mapboxgl-ctrl-group{border-radius:4px;background:#fff}.mapboxgl-ctrl-group:not(:empty){-moz-box-shadow:0 0 2px rgba(0,0,0,.1);-webkit-box-shadow:0 0 2px rgba(0,0,0,.1);box-shadow:0 0 0 2px rgba(0,0,0,.1)}@media (-ms-high-contrast:active){.mapboxgl-ctrl-group:not(:empty){box-shadow:0 0 0 2px ButtonText}}.mapboxgl-ctrl-group button{width:29px;height:29px;display:block;padding:0;outline:none;border:0;box-sizing:border-box;background-color:transparent;cursor:pointer}.mapboxgl-ctrl-group button+button{border-top:1px solid #ddd}.mapboxgl-ctrl button .mapboxgl-ctrl-icon{display:block;width:100%;height:100%;background-repeat:no-repeat;background-position:50%}@media (-ms-high-contrast:active){.mapboxgl-ctrl-icon{background-color:transparent}.mapboxgl-ctrl-group button+button{border-top:1px solid ButtonText}}.mapboxgl-ctrl button::-moz-focus-inner{border:0;padding:0}.mapboxgl-ctrl-group button:focus{box-shadow:0 0 2px 2px #0096ff}.mapboxgl-ctrl button:disabled{cursor:not-allowed}.mapboxgl-ctrl button:disabled .mapboxgl-ctrl-icon{opacity:.25}.mapboxgl-ctrl button:not(:disabled):hover{background-color:rgba(0,0,0,.05)}.mapboxgl-ctrl-group button:focus:focus-visible{box-shadow:0 0 2px 2px #0096ff}.mapboxgl-ctrl-group button:focus:not(:focus-visible){box-shadow:none}.mapboxgl-ctrl-group button:focus:first-child{border-radius:4px 4px 0 0}.mapboxgl-ctrl-group button:focus:last-child{border-radius:0 0 4px 4px}.mapboxgl-ctrl-group button:focus:only-child{border-radius:inherit}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E")}}.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E")}}.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath d='M10.5 16l4 8 4-8h-8z' fill='%23ccc'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath d='M10.5 16l4 8 4-8h-8z' fill='%23999'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath d='M10.5 16l4 8 4-8h-8z' fill='%23ccc'/%3E%3C/svg%3E")}}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23aaa'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath d='M14 5l1 1-9 9-1-1 9-9z' fill='red'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e58978'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e54e33'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-waiting .mapboxgl-ctrl-icon{-webkit-animation:mapboxgl-spin 2s linear infinite;-moz-animation:mapboxgl-spin 2s infinite linear;-o-animation:mapboxgl-spin 2s infinite linear;-ms-animation:mapboxgl-spin 2s infinite linear;animation:mapboxgl-spin 2s linear infinite}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23999'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath d='M14 5l1 1-9 9-1-1 9-9z' fill='red'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e58978'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e54e33'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23666'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath d='M14 5l1 1-9 9-1-1 9-9z' fill='red'/%3E%3C/svg%3E")}}@-webkit-keyframes mapboxgl-spin{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(1turn)}}@-moz-keyframes mapboxgl-spin{0%{-moz-transform:rotate(0deg)}to{-moz-transform:rotate(1turn)}}@-o-keyframes mapboxgl-spin{0%{-o-transform:rotate(0deg)}to{-o-transform:rotate(1turn)}}@-ms-keyframes mapboxgl-spin{0%{-ms-transform:rotate(0deg)}to{-ms-transform:rotate(1turn)}}@keyframes mapboxgl-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}a.mapboxgl-ctrl-logo{width:88px;height:23px;margin:0 0 -4px -4px;display:block;background-repeat:no-repeat;cursor:pointer;overflow:hidden;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='88' height='23' viewBox='0 0 88 23' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd'%3E%3Cdefs%3E%3Cpath id='a' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='b' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='c'%3E%3Crect width='100%25' height='100%25' fill='%23fff'/%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/mask%3E%3Cg opacity='.3' stroke='%23000' stroke-width='3'%3E%3Ccircle mask='url(%23c)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23b' mask='url(%23c)'/%3E%3C/g%3E%3Cg opacity='.9' fill='%23fff'%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/g%3E%3C/svg%3E")}a.mapboxgl-ctrl-logo.mapboxgl-compact{width:23px}@media (-ms-high-contrast:active){a.mapboxgl-ctrl-logo{background-color:transparent;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='88' height='23' viewBox='0 0 88 23' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd'%3E%3Cdefs%3E%3Cpath id='a' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='b' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='c'%3E%3Crect width='100%25' height='100%25' fill='%23fff'/%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/mask%3E%3Cg stroke='%23000' stroke-width='3'%3E%3Ccircle mask='url(%23c)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23b' mask='url(%23c)'/%3E%3C/g%3E%3Cg fill='%23fff'%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/g%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){a.mapboxgl-ctrl-logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='88' height='23' viewBox='0 0 88 23' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd'%3E%3Cdefs%3E%3Cpath id='a' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='b' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='c'%3E%3Crect width='100%25' height='100%25' fill='%23fff'/%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/mask%3E%3Cg stroke='%23fff' stroke-width='3' fill='%23fff'%3E%3Ccircle mask='url(%23c)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23b' mask='url(%23c)'/%3E%3C/g%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/svg%3E")}}.mapboxgl-ctrl.mapboxgl-ctrl-attrib{padding:0 5px;background-color:hsla(0,0%,100%,.5);margin:0}@media screen{.mapboxgl-ctrl-attrib.mapboxgl-compact{min-height:20px;padding:0;margin:10px;position:relative;background-color:#fff;border-radius:3px 12px 12px 3px}.mapboxgl-ctrl-attrib.mapboxgl-compact:hover{padding:2px 24px 2px 4px;visibility:visible;margin-top:6px}.mapboxgl-ctrl-bottom-left>.mapboxgl-ctrl-attrib.mapboxgl-compact:hover,.mapboxgl-ctrl-top-left>.mapboxgl-ctrl-attrib.mapboxgl-compact:hover{padding:2px 4px 2px 24px;border-radius:12px 3px 3px 12px}.mapboxgl-ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-inner{display:none}.mapboxgl-ctrl-attrib.mapboxgl-compact:hover .mapboxgl-ctrl-attrib-inner{display:block}.mapboxgl-ctrl-attrib.mapboxgl-compact:after{content:"";cursor:pointer;position:absolute;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' height='24' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd'%3E%3Cpath d='M4 10a6 6 0 1012 0 6 6 0 10-12 0m5-3a1 1 0 102 0 1 1 0 10-2 0m0 3a1 1 0 112 0v3a1 1 0 11-2 0'/%3E%3C/svg%3E");background-color:hsla(0,0%,100%,.5);width:24px;height:24px;box-sizing:border-box;border-radius:12px}.mapboxgl-ctrl-bottom-right>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{bottom:0;right:0}.mapboxgl-ctrl-top-right>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{top:0;right:0}.mapboxgl-ctrl-top-left>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{top:0;left:0}.mapboxgl-ctrl-bottom-left>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{bottom:0;left:0}}@media screen and (-ms-high-contrast:active){.mapboxgl-ctrl-attrib.mapboxgl-compact:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' height='24' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd' fill='%23fff'%3E%3Cpath d='M4 10a6 6 0 1012 0 6 6 0 10-12 0m5-3a1 1 0 102 0 1 1 0 10-2 0m0 3a1 1 0 112 0v3a1 1 0 11-2 0'/%3E%3C/svg%3E")}}@media screen and (-ms-high-contrast:black-on-white){.mapboxgl-ctrl-attrib.mapboxgl-compact:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' height='24' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd'%3E%3Cpath d='M4 10a6 6 0 1012 0 6 6 0 10-12 0m5-3a1 1 0 102 0 1 1 0 10-2 0m0 3a1 1 0 112 0v3a1 1 0 11-2 0'/%3E%3C/svg%3E")}}.mapboxgl-ctrl-attrib a{color:rgba(0,0,0,.75);text-decoration:none}.mapboxgl-ctrl-attrib a:hover{color:inherit;text-decoration:underline}.mapboxgl-ctrl-attrib .mapbox-improve-map{font-weight:700;margin-left:2px}.mapboxgl-attrib-empty{display:none}.mapboxgl-ctrl-scale{background-color:hsla(0,0%,100%,.75);font-size:10px;border:2px solid #333;border-top:#333;padding:0 5px;color:#333;box-sizing:border-box}.mapboxgl-popup{position:absolute;top:0;left:0;display:-webkit-flex;display:flex;will-change:transform;pointer-events:none}.mapboxgl-popup-anchor-top,.mapboxgl-popup-anchor-top-left,.mapboxgl-popup-anchor-top-right{-webkit-flex-direction:column;flex-direction:column}.mapboxgl-popup-anchor-bottom,.mapboxgl-popup-anchor-bottom-left,.mapboxgl-popup-anchor-bottom-right{-webkit-flex-direction:column-reverse;flex-direction:column-reverse}.mapboxgl-popup-anchor-left{-webkit-flex-direction:row;flex-direction:row}.mapboxgl-popup-anchor-right{-webkit-flex-direction:row-reverse;flex-direction:row-reverse}.mapboxgl-popup-tip{width:0;height:0;border:10px solid transparent;z-index:1}.mapboxgl-popup-anchor-top .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-top:none;border-bottom-color:#fff}.mapboxgl-popup-anchor-top-left .mapboxgl-popup-tip{-webkit-align-self:flex-start;align-self:flex-start;border-top:none;border-left:none;border-bottom-color:#fff}.mapboxgl-popup-anchor-top-right .mapboxgl-popup-tip{-webkit-align-self:flex-end;align-self:flex-end;border-top:none;border-right:none;border-bottom-color:#fff}.mapboxgl-popup-anchor-bottom .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-bottom:none;border-top-color:#fff}.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-tip{-webkit-align-self:flex-start;align-self:flex-start;border-bottom:none;border-left:none;border-top-color:#fff}.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-tip{-webkit-align-self:flex-end;align-self:flex-end;border-bottom:none;border-right:none;border-top-color:#fff}.mapboxgl-popup-anchor-left .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-left:none;border-right-color:#fff}.mapboxgl-popup-anchor-right .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-right:none;border-left-color:#fff}.mapboxgl-popup-close-button{position:absolute;right:0;top:0;border:0;border-radius:0 3px 0 0;cursor:pointer;background-color:transparent}.mapboxgl-popup-close-button:hover{background-color:rgba(0,0,0,.05)}.mapboxgl-popup-content{position:relative;background:#fff;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.1);padding:10px 10px 15px;pointer-events:auto}.mapboxgl-popup-anchor-top-left .mapboxgl-popup-content{border-top-left-radius:0}.mapboxgl-popup-anchor-top-right .mapboxgl-popup-content{border-top-right-radius:0}.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-content{border-bottom-left-radius:0}.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-content{border-bottom-right-radius:0}.mapboxgl-popup-track-pointer{display:none}.mapboxgl-popup-track-pointer *{pointer-events:none;user-select:none}.mapboxgl-map:hover .mapboxgl-popup-track-pointer{display:flex}.mapboxgl-map:active .mapboxgl-popup-track-pointer{display:none}.mapboxgl-marker{position:absolute;top:0;left:0;will-change:transform}.mapboxgl-user-location-dot,.mapboxgl-user-location-dot:before{background-color:#1da1f2;width:15px;height:15px;border-radius:50%}.mapboxgl-user-location-dot:before{content:"";position:absolute;-webkit-animation:mapboxgl-user-location-dot-pulse 2s infinite;-moz-animation:mapboxgl-user-location-dot-pulse 2s infinite;-ms-animation:mapboxgl-user-location-dot-pulse 2s infinite;animation:mapboxgl-user-location-dot-pulse 2s infinite}.mapboxgl-user-location-dot:after{border-radius:50%;border:2px solid #fff;content:"";height:19px;left:-2px;position:absolute;top:-2px;width:19px;box-sizing:border-box;box-shadow:0 0 3px rgba(0,0,0,.35)}@-webkit-keyframes mapboxgl-user-location-dot-pulse{0%{-webkit-transform:scale(1);opacity:1}70%{-webkit-transform:scale(3);opacity:0}to{-webkit-transform:scale(1);opacity:0}}@-ms-keyframes mapboxgl-user-location-dot-pulse{0%{-ms-transform:scale(1);opacity:1}70%{-ms-transform:scale(3);opacity:0}to{-ms-transform:scale(1);opacity:0}}@keyframes mapboxgl-user-location-dot-pulse{0%{transform:scale(1);opacity:1}70%{transform:scale(3);opacity:0}to{transform:scale(1);opacity:0}}.mapboxgl-user-location-dot-stale{background-color:#aaa}.mapboxgl-user-location-dot-stale:after{display:none}.mapboxgl-user-location-accuracy-circle{background-color:rgba(29,161,242,.2);width:1px;height:1px;border-radius:100%}.mapboxgl-crosshair,.mapboxgl-crosshair .mapboxgl-interactive,.mapboxgl-crosshair .mapboxgl-interactive:active{cursor:crosshair}.mapboxgl-boxzoom{position:absolute;top:0;left:0;width:0;height:0;background:#fff;border:2px dotted #202020;opacity:.5}@media print{.mapbox-improve-map{display:none}}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/utils/mapLayers.ts b/sdnr/wt/odlux/apps/networkMapApp/src/utils/mapLayers.ts
deleted file mode 100644 (file)
index 7ce4bfa..0000000
+++ /dev/null
@@ -1,332 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import * as mapboxgl from 'mapbox-gl';
-import { Feature } from 'model/Feature';
-import { NetworkMapThemes, ThemeElement } from 'model/settings';
-
-const fibreLinkColor = "#1154d9";
-const microwaveLinkColor = "#039903";
-
-class MapLayerService {
-
-    checkedLayers = false;
-    settings: NetworkMapThemes;
-    selectedTheme: string | null = null;
-
-    public addBaseSources = (map: mapboxgl.Map, selectedPoint: Feature | null, selectedLine: Feature | null) => {
-
-
-        // make sure the sources don't already exist
-        // (if the networkmap app gets opened quickly within short time periods, the prior sources might not be fully removed)
-
-        if (!map.getSource("lines")) {
-
-            map.addSource('lines', {
-                type: 'geojson',
-                data: { type: "FeatureCollection", features: [] }
-            });
-        }
-
-        if (!map.getSource("selectedLine")) {
-            const features = selectedLine !== null ? [selectedLine] : [];
-            map.addSource('selectedLine', {
-                type: 'geojson',
-                data: { type: "FeatureCollection", features: features }
-            });
-        }
-
-        if (!map.getSource("points")) {
-            map.addSource('points', {
-                type: 'geojson',
-                data: { type: "FeatureCollection", features: [] }
-            });
-        }
-
-        if (!map.getSource("selectedPoints")) {
-            const selectedPointFeature = selectedPoint !== null ? [selectedPoint] : [];
-            map.addSource('selectedPoints', {
-                type: 'geojson',
-                data: { type: "FeatureCollection", features: selectedPointFeature }
-
-            });
-        }
-
-        if (!map.getSource("alarmedPoints")) {
-            map.addSource("alarmedPoints", {
-                type: 'geojson',
-                data: { type: "FeatureCollection", features: [] }
-            });
-        }
-    }
-
-    private addCircleLayer = (map: mapboxgl.Map, id: string, source: string, circleColor: string, radius: number, strokeWidth: number, outerColor: string) => {
-
-        map.addLayer({
-            id: id,
-            source: source,
-            type: 'circle',
-            paint: {
-                'circle-color': circleColor,
-                'circle-radius': radius,
-                'circle-stroke-width': strokeWidth,
-                'circle-stroke-color': outerColor
-            }
-        });
-    }
-
-    private addLineLayer = (map: mapboxgl.Map, id: string, source: string, color: string, width: number, filter: string[]) => {
-
-        map.addLayer({
-            'id': id,
-            'type': 'line',
-            'source': source,
-            'layout': {
-                'line-join': 'round',
-                'line-cap': 'round'
-            },
-            'paint': {
-                'line-color': color,
-                'line-width': width
-            },
-            'filter': filter
-        });
-    }
-
-    private addIconLayer = (map: mapboxgl.Map, id: string, source: string, iconName: string, iconSize: number, filter: (string | string[])[]) => {
-        map.addLayer({
-            'id': id,
-            'type': 'symbol',
-            'source': source,
-            'layout': {
-                'icon-allow-overlap': true,
-                'icon-image': iconName,
-                'icon-size': iconSize
-
-            },
-            'filter': filter,
-        });
-    }
-
-    /**
-     * Pick the correct theme based on user selection
-     */
-    private pickTheme = () => {
-        if (this.selectedTheme !== null) {
-            const result = this.settings.networkMapThemes.themes.find(el => el.key === this.selectedTheme);
-            if (result)
-                return result;
-
-        }
-
-        return this.settings.networkMapThemes.themes[0];
-
-    }
-
-    public addBaseLayers = (map: mapboxgl.Map, themesettings?: ThemeElement) => {
-
-        const theme = !themesettings ? this.pickTheme() : themesettings;
-        console.log("user selected theme: " + this.selectedTheme)
-        console.log("found theme:" + theme);
-
-        this.addCommonLayers(map);
-
-        this.addCircleLayer(map, 'points', 'points', theme.site, 7, 1, '#fff');
-        this.addCircleLayer(map, 'selectedPoints', 'selectedPoints', theme.selectedSite, 9, 1, '#fff');
-        this.addCircleLayer(map, 'alarmedPoints', 'alarmedPoints', '#CC0000', 9, 1, '#fff');
-    }
-
-    public addIconLayers = (map: mapboxgl.Map, selectedSiteId?: string) => {
-
-        this.addCommonLayers(map);
-        this.createIconLayers(map, selectedSiteId);
-    }
-
-    private createIconLayers = (map: mapboxgl.Map, selectedSiteId?: string) => {
-
-        this.addIconLayer(map, 'point-lamps', 'points', 'lamp', 0.1, this.createFilter("street lamp", selectedSiteId));
-        this.addIconLayer(map, 'point-building', 'points', 'house', 0.1, this.createFilter("high rise building", selectedSiteId));
-        this.addIconLayer(map, 'point-data-center', 'points', 'data-center', 0.1, this.createFilter("data center", selectedSiteId));
-        this.addIconLayer(map, 'point-factory', 'points', 'factory', 0.2, this.createFilter("factory", selectedSiteId));
-
-
-        //select layers
-        this.addIconLayer(map, 'select-point-lamps', 'selectedPoints', 'lamp', 0.15, ['==', 'type', 'street lamp']);
-        this.addIconLayer(map, 'select-point-buildings', 'selectedPoints', 'house', 0.15, ['==', 'type', 'high rise building']);
-        this.addIconLayer(map, 'select-point-data-center', 'selectedPoints', 'data-center', 0.15, ['==', 'type', 'data center']);
-        this.addIconLayer(map, 'select-point-factory', 'selectedPoints', 'factory', 0.3, ['==', 'type', 'factory']);
-
-        //alarm layers
-        this.addIconLayer(map, 'point-lamps-alarm', 'alarmedPoints', 'lamp-red', 0.3, this.createFilter("street lamp"));
-        this.addIconLayer(map, 'point-building-alarm', 'alarmedPoints', 'house-red', 0.3, this.createFilter("high rise building"));
-        this.addIconLayer(map, 'point-data-center-alarm', 'alarmedPoints', 'data-center-red', 0.3, this.createFilter("data center"));
-        this.addIconLayer(map, 'point-factory-alarm', 'alarmedPoints', 'factory-red', 0.45, this.createFilter("factory"));
-
-        map.addLayer({
-            id: 'point-remaining',
-            source: 'points',
-            type: 'circle',
-            'filter': ['none', ['==', 'type', "high rise building"], ['==', 'type', "data center"], ['==', 'type', "factory"], ['==', 'type', "street lamp"]],
-            paint: {
-                'circle-color': '#11b4da',
-                'circle-radius': 7,
-                'circle-stroke-width': 1,
-                'circle-stroke-color': '#fff'
-            }
-        });
-    }
-
-    private addCommonLayers = (map: mapboxgl.Map, themesettings?: ThemeElement) => {
-
-        const theme = !themesettings ? this.pickTheme() : themesettings;
-
-        this.addLineLayer(map, 'microwave-lines', 'lines', theme.microwaveLink, 2, ['==', 'type', 'microwave']);
-        this.addLineLayer(map, 'fibre-lines', 'lines', theme.fiberLink, 2, ['==', 'type', 'fibre']);
-        this.addLineLayer(map, 'selectedLineMicrowave', 'selectedLine', theme.microwaveLink, 4, ['==', 'type', 'microwave']);
-        this.addLineLayer(map, 'selectedLineFibre', 'selectedLine', theme.fiberLink, 4, ['==', 'type', 'fibre']);
-    }
-
-    public removeBaseLayers = (map: mapboxgl.Map) => {
-
-        map.removeLayer("points");
-        map.removeLayer("lines");
-        map.removeLayer('selectedPoints');
-        map.removeLayer('selectedLine');
-    }
-
-    private removeIconLayers = (map: mapboxgl.Map) => {
-
-        map.removeLayer('point-building');
-        map.removeLayer('point-lamps');
-        map.removeLayer('point-data-center');
-        map.removeLayer('point-factory');
-        map.removeLayer('point-remaining');
-        map.removeLayer('select-point-data-center');
-        map.removeLayer('select-point-buildings');
-        map.removeLayer('select-point-lamps');
-        map.removeLayer('select-point-factory');
-        map.removeLayer('point-building-alarm');
-        map.removeLayer('point-lamps-alarm');
-        map.removeLayer('point-data-center-alarm');
-        map.removeLayer('point-factory-alarm');
-    }
-
-
-    private createFilter = (type: 'street lamp' | 'high rise building' | 'data center' | 'factory', selectedSiteId?: string) => {
-
-        return selectedSiteId === undefined ? ['==', 'type', type] : ["all", ['==', 'type', type], ['!=', 'id', selectedSiteId]]
-    }
-
-    public showIconLayers = (map: mapboxgl.Map, show: boolean, selectedSiteId?: string) => {
-
-        const zoom = map.getZoom();
-
-        if (show) {
-
-            if (zoom > 11) {
-
-                const bounds = map.getBounds();
-
-                if (map.getLayer('points') !== undefined && map.getLayer('point-lamps') === undefined && !this.checkedLayers) {
-
-                    // if sites don't have a type don't change layers to icons
-                    const elements = map.queryRenderedFeatures(undefined, {
-                        layers: ['points'], filter: ['has', 'type']
-                    });
-                    this.checkedLayers = true;
-
-                    if (elements.length > 0 && elements.length < 1000) {
-
-                        if (map.getLayer('point-lamps') === undefined) {
-                            map.removeLayer('points');
-                            map.setLayoutProperty('alarmedPoints', 'visibility', 'none');
-                            map.setLayoutProperty('selectedPoints', 'visibility', 'none');
-                            this.createIconLayers(map, selectedSiteId);
-                            //map.moveLayer('point-remaining','selectedPoints');
-
-                        }
-                    }
-                }
-
-            } else {
-                this.swapLayersBack(map);
-            }
-        } else {
-            this.swapLayersBack(map);
-        }
-    }
-
-    public swapLayersBack = (map: mapboxgl.Map) => {
-        this.checkedLayers = false;
-        const theme = this.pickTheme();
-
-        if (map.getLayer('selectedPoints') === undefined) {
-            this.addCircleLayer(map, 'selectedPoints', 'selectedPoints', theme.selectedSite, 9, 1, '#fff');
-
-        }
-
-        if (map.getLayer('alarmedPoints') === undefined) {
-            this.addCircleLayer(map, 'alarmedPoints', 'alarmedPoints', '#CC0000', 9, 1, '#fff');
-
-        }
-
-
-        if (map.getLayer('points') === undefined) {
-
-            map.setLayoutProperty('selectedPoints', 'visibility', 'visible');
-            map.setLayoutProperty('alarmedPoints', 'visibility', 'visible');
-            this.removeIconLayers(map);
-
-            this.addCircleLayer(map, 'points', 'points', theme.site, 7, 1, '#fff');
-
-
-            map.moveLayer('points', map.getLayer('selectedPoints').id);
-        }
-    }
-
-    public changeMapOpacity = (map: mapboxgl.Map, newValue: number) => {
-        const newOpacity = newValue / 100;
-        if (map) {
-            const tiles = map.getStyle().layers?.filter(el => el.id.includes("tiles"))
-            tiles?.forEach(layer => {
-                if (layer.type === 'symbol') {
-                    map.setPaintProperty(layer.id, `icon-opacity`, newOpacity);
-                    map.setPaintProperty(layer.id, `text-opacity`, newOpacity);
-                } else {
-                    map.setPaintProperty(layer.id, `${layer.type}-opacity`, newOpacity);
-                }
-            })
-        }
-
-    }
-
-    public changeTheme = (map: mapboxgl.Map, themeName: string) => {
-        this.selectedTheme = themeName;
-        const theme = this.pickTheme();
-        if (theme && map.loaded()) {
-            map.setPaintProperty('points', 'circle-color', theme.site);
-            map.setPaintProperty('selectedPoints', 'circle-color', theme.selectedSite);
-            map.setPaintProperty('microwave-lines', 'line-color', theme.microwaveLink);
-            map.setPaintProperty('fibre-lines', 'line-color', theme.fiberLink);
-        }
-    }
-}
-
-const mapLayerService = new MapLayerService();
-export default mapLayerService;
-
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/utils/mapUtils.ts b/sdnr/wt/odlux/apps/networkMapApp/src/utils/mapUtils.ts
deleted file mode 100644 (file)
index da3e97e..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-const EARTHRADIUSM = 6378137;
-
-type updatedCoordinates = { south: number, west: number, north: number, east: number };
-
-
-export const increaseBoundingBox = (map: mapboxgl.Map) =>{
-
-    const bbox = map.getBounds();
-
-    const distance = map.getCenter().distanceTo(bbox.getNorthEast()); // radius of visible area (center -> corner) (in meters)
-
-    //calculate new boundingBox
-    const increasedBoundingBox = addDistance(bbox.getSouth(), bbox.getWest(), bbox.getNorth(), bbox.getEast(), (distance / 1000) / 2);
-    return increasedBoundingBox;
-}
-
-
-
-export const addDistance = (south: number, west: number, north: number, east: number, distanceKm: number): updatedCoordinates => {
-
-    const distanceInM = distanceKm * 1000;
-
-    const dLat = distanceInM / EARTHRADIUSM;
-    const dLon = distanceInM / (EARTHRADIUSM * Math.cos(Math.PI * (north + south) / 360));
-
-    const latOffset = dLat * 180 / Math.PI;
-    const lonOffset = dLon * 180 / Math.PI;
-
-    const newEast = checkLongitude(east + lonOffset);
-    const newWest = checkLongitude(west - lonOffset);
-    const newNorth = checkLatitude(north + latOffset);
-    const newSouth = checkLatitude(south - latOffset);
-
-    return { east: newEast, north: newNorth, south: newSouth, west: newWest };
-
-}
-
-
-//taken from https://www.movable-type.co.uk/scripts/latlong.html
-export const calculateMidPoint = (lat1: number, lon1: number, lat2: number, lon2: number) =>{
-
-    const dLon = degrees_to_radians(lon2 - lon1);
-
-    //convert to radians
-    lat1 = degrees_to_radians(lat1);
-    lat2 = degrees_to_radians(lat2);
-    lon1 = degrees_to_radians(lon1);
-
-    const Bx = Math.cos(lat2) * Math.cos(dLon);
-    const By = Math.cos(lat2) * Math.sin(dLon);
-    const lat3 = Math.atan2(Math.sin(lat1) + Math.sin(lat2), Math.sqrt((Math.cos(lat1) + Bx) * (Math.cos(lat1) + Bx) + By * By));
-    const lon3 = lon1 + Math.atan2(By, Math.cos(lat1) + Bx);
-
-    return [radians_to_degrees(lon3), radians_to_degrees(lat3)];
-}
-
-
-export const LatLonToDMS = (value:number, isLon:boolean=false) =>{
-    const absoluteValue = Math.abs(value);
-    const d = Math.floor(absoluteValue);
-    const m = Math.floor((absoluteValue -d)* 60);
-    const s = (absoluteValue - d - m / 60 ) * 3600;
-    const dms=`${d}° ${m}' ${s.toFixed(2)}"`
-
-    const sign = Math.sign(value);
-
-    if(isLon){
-        return (sign === -1 || sign === -0 ) ? dms + " W" : dms + " E";
-    }else{
-        return (sign === -1 || sign === -0 ) ? dms + " S" : dms + " N";
-    } 
-}
-
-// Because features come from tiled vector data, feature geometries may be split
-// or duplicated across tile boundaries and, as a result, features may appear
-// multiple times in query results.
-
-//taken from https://docs.mapbox.com/mapbox-gl-js/example/filter-features-within-map-view/
-
-export const getUniqueFeatures = (array: mapboxgl.MapboxGeoJSONFeature[], comparatorProperty:string) =>{
-    var existingFeatureKeys: any = {};
-    
-    var uniqueFeatures = array.filter(function(el) {
-    if (existingFeatureKeys[el.properties![comparatorProperty]]) {
-    return false;
-    } else {
-    existingFeatureKeys[el.properties![comparatorProperty]] = true;
-    return true;
-    }
-    });
-     
-    return uniqueFeatures;
-    }
-
-const radians_to_degrees = (radians:number) =>{
-    
-    var pi = Math.PI;
-    return radians * (180/pi);
-}
-
- const degrees_to_radians = (degrees: number) =>
-    {
-    return degrees * (Math.PI/180);
-    }
-
-
-const checkLatitude = (lat: number) => {
-
-    if (lat > 90)
-        return 90;
-    else if (lat < -90)
-        return -90;
-    else
-        return lat;
-
-}
-
-const checkLongitude = (lon: number) => {
-    if (lon > 180)
-        return 180;
-    else if (lon < -180)
-        return -180;
-    else
-        return lon;
-}
-
-
-
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src/utils/utils.ts b/sdnr/wt/odlux/apps/networkMapApp/src/utils/utils.ts
deleted file mode 100644 (file)
index 59085d4..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt odlux
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-
-import { link } from "../model/link";
-import { Site } from "../model/site";
-
-
-export function isSite(data: link | Site): data is Site {
-    return (data as Site).location !== undefined;
-}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src2/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/MyOdluxBundle.java b/sdnr/wt/odlux/apps/networkMapApp/src2/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/MyOdluxBundle.java
deleted file mode 100644 (file)
index 43b072c..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt
- * =================================================================================================
- * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-package org.onap.ccsdk.features.sdnr.wt.odlux.bundles;
-
-import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundle;
-import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleLoader;
-
-public class MyOdluxBundle extends OdluxBundle {
-
-    @Override
-    public void initialize() {
-        super.initialize();
-    }
-
-    @Override
-    public void clean() {
-        super.clean();
-    }
-
-    @Override
-    public String getResourceFileContent(String filename) {
-        return super.getResourceFileContent(filename);
-    }
-
-    @Override
-    public boolean hasResource(String filename) {
-        return super.hasResource(filename);
-    }
-
-    @Override
-    public void setBundleName(String bundleName) {
-        super.setBundleName(bundleName);
-    }
-
-    @Override
-    public void setLoader(OdluxBundleLoader loader) {
-        super.setLoader(loader);
-    }
-
-    @Override
-    public String getBundleName() {
-        return super.getBundleName();
-    }
-
-    @Override
-    public OdluxBundleLoader getLoader() {
-        return super.getLoader();
-    }
-
-    public MyOdluxBundle() {
-        super();
-    }
-}
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src2/main/resources/OSGI-INF/blueprint/blueprint.xml b/sdnr/wt/odlux/apps/networkMapApp/src2/main/resources/OSGI-INF/blueprint/blueprint.xml
deleted file mode 100644 (file)
index 4ede944..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-    <reference id="loadersvc" availability="mandatory" activation="eager" interface="org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleLoader"/>
-
-    <bean id="bundle" init-method="initialize" destroy-method="clean" class="org.onap.ccsdk.features.sdnr.wt.odlux.bundles.MyOdluxBundle">
-        <property name="loader" ref="loadersvc"/>
-        <property name="bundleName" value="networkMapApp"/>
-        <property name="index" value="110"/>
-    </bean>
-</blueprint>
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java b/sdnr/wt/odlux/apps/networkMapApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java
deleted file mode 100644 (file)
index c319bb1..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt
- * =================================================================================================
- * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-package org.onap.ccsdk.features.sdnr.wt.odlux.bundles.test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import org.junit.Test;
-import org.onap.ccsdk.features.sdnr.wt.odlux.OdluxBundleLoaderImpl;
-import org.onap.ccsdk.features.sdnr.wt.odlux.bundles.MyOdluxBundle;
-
-public class TestBundleRes {
-
-    @Test
-    public void test() {
-        OdluxBundleLoaderImpl loader = OdluxBundleLoaderImpl.getInstance();
-        MyOdluxBundle b = new MyOdluxBundle();
-        b.setLoader(loader);
-        b.setIndex(0);
-        b.setBundleName("abc");
-        b.initialize();
-        assertTrue(loader.getNumberOfBundles()==1);
-        assertNotNull(b.getLoader());
-        assertEquals("abc",b.getBundleName());
-        assertTrue(b.hasResource("test.js"));
-        assertNotNull(b.getResourceFileContent("test.js"));
-        b.clean();
-        assertTrue(loader.getNumberOfBundles()==0);
-    }
-
-}
diff --git a/sdnr/wt/odlux/apps/networkMapApp/src2/test/resources/test.js b/sdnr/wt/odlux/apps/networkMapApp/src2/test/resources/test.js
deleted file mode 100644 (file)
index b47fdc3..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-asdac sad 
-as
-d 
-sad
- sadfa
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/networkMapApp/tsconfig.json b/sdnr/wt/odlux/apps/networkMapApp/tsconfig.json
deleted file mode 100644 (file)
index a66b5d8..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-{
-  "compilerOptions": {
-    "baseUrl": "./src",
-    "outDir": "./dist",
-    "sourceMap": true,
-    "forceConsistentCasingInFileNames": true,
-    "allowSyntheticDefaultImports": false,
-    "allowUnreachableCode": false,
-    "allowUnusedLabels": false,
-    "noFallthroughCasesInSwitch": true,
-    "noImplicitAny": true,
-    "noImplicitReturns": true,
-    "noImplicitThis": true,
-    "strictNullChecks": true,
-    "pretty": true,
-    "newLine": "LF",
-    "module": "es2015",
-    "target": "es2016",
-    "moduleResolution": "node",
-    "experimentalDecorators": true,
-    "jsx": "preserve",
-    "lib": [
-      "dom",
-      "es2015",
-      "es2016"
-    ],
-    "types": [
-      "prop-types",
-      "react",
-      "react-dom"
-    ]
-  },
-  "exclude": [
-    "dist",
-    "node_modules"
-  ]
-}
diff --git a/sdnr/wt/odlux/apps/networkMapApp/webpack.config.js b/sdnr/wt/odlux/apps/networkMapApp/webpack.config.js
deleted file mode 100644 (file)
index 5684040..0000000
+++ /dev/null
@@ -1,200 +0,0 @@
-/**
- * Webpack 4 configuration file
- * see https://webpack.js.org/configuration/
- * see https://webpack.js.org/configuration/dev-server/
- */
-
-"use strict";
-
-const path = require("path");
-const webpack = require("webpack");
-const CopyWebpackPlugin = require("copy-webpack-plugin");
-const TerserPlugin = require('terser-webpack-plugin');
-
-// const __dirname = (path => path.replace(/^([a-z]\:)/, c => c.toUpperCase()))(process.__dirname());
-
-module.exports = (env) => {
-  const distPath = path.resolve(__dirname, env === "release" ? "." : "../..", "dist");
-  const frameworkPath = path.resolve(__dirname, env === "release" ? "../../framework" : "../..", "dist");
-  return [{
-    name: "App",
-
-    mode: "none", //disable default behavior
-
-    target: "web",
-
-    context: path.resolve(__dirname, "src"),
-
-    entry: {
-      networkMapApp: ["./pluginTransport.tsx"]
-    },
-
-    devtool: env === "release" ? false : "source-map",
-
-    resolve: {
-      extensions: [".ts", ".tsx", ".js", ".jsx"]
-    },
-
-    output: {
-      path: distPath,
-      filename: "[name].js",
-      library: "[name]",
-      libraryTarget: "umd2",
-      chunkFilename: "[name].js"
-    },
-    module: {
-      rules: [{
-        test: /\.tsx?$/,
-        exclude: /node_modules/,
-        use: [{
-          loader: "babel-loader"
-        }, {
-          loader: "ts-loader"
-        }]
-      }, {
-        test: /\.jsx?$/,
-        exclude: /node_modules/,
-        use: [{
-          loader: "babel-loader"
-        }]
-      },
-       {
-        test: /\.(png|gif|jpg|svg)$/,
-        use: [{
-          loader: 'url-loader',
-          options: {
-            limit: 10000,
-            name: './icons/[hash].[ext]'
-          }
-        }]
-      },
-      {
-        test: /\.css$/i,
-        use: ["style-loader", "css-loader"],
-      }]
-    },
-
-    optimization: {
-      noEmitOnErrors: true,
-      namedModules: env !== "release",
-      minimize: env === "release",
-      minimizer: env !== "release" ? [] : [new TerserPlugin({
-        terserOptions: {
-          warnings: false, // false, true, "verbose"
-          compress: {
-            drop_console: true,
-            drop_debugger: true,
-          }
-        }
-      })],
-    },
-
-    plugins: [
-      new webpack.DllReferencePlugin({
-        context: path.resolve(__dirname, "../../framework/src"),
-        manifest: require(path.resolve(frameworkPath, "vendor-manifest.json")),
-        sourceType: "umd2"
-      }),
-      new webpack.DllReferencePlugin({
-        context: path.resolve(__dirname, "../../framework/src"),
-        manifest: require(path.resolve(frameworkPath, "app-manifest.json")),
-        sourceType: "umd2"
-      }),
-      ...(env === "release") ? [
-        new webpack.DefinePlugin({
-          "process.env": {
-            NODE_ENV: "'production'",
-            VERSION: JSON.stringify(require("./package.json").version)
-          }
-        }),
-      ] : [
-          new webpack.DefinePlugin({
-            "process.env": {
-              NODE_ENV: "'development'",
-              VERSION: JSON.stringify(require("./package.json").version)
-            }
-          }),
-          new CopyWebpackPlugin([{
-            from: 'index.html',
-            to: distPath
-          }]),
-        ]
-    ],
-
-    devServer: {
-      public: "http://localhost:3100",
-      contentBase: frameworkPath,
-
-      compress: true,
-      headers: {
-        "Access-Control-Allow-Origin": "*"
-      },
-      host: "0.0.0.0",
-      port: 3100,
-      disableHostCheck: true,
-      historyApiFallback: true,
-      inline: true,
-      hot: false,
-      quiet: false,
-      stats: {
-        colors: true
-      },
-      proxy: {
-        "/yang-schema/": {
-          target: "http://sdnr:8181",
-          secure: false
-        },  
-        "/userdata": {
-          target: "http://sdnr:8181",
-          secure: false
-        },  
-        "/userdata/": {
-          target: "http://sdnr:8181",
-          secure: false
-        }, 
-        "/oauth2/": {
-          target: "http://sdnr:8181",
-          secure: false
-        },
-        "/database/": {
-          target: "http://sdnr:8181",
-          secure: false
-        },
-        "/restconf/": {
-          target: "http://sdnr:8181",
-          secure: false
-        },
-        "/rests/": {
-          target: "http://sdnr:8181",
-          secure: false
-        },
-        "/topology/": {
-          target: "http://localhost:3002",
-          secure: false
-        },
-        "/sitedoc/": {
-          target: "http://localhost:3002",
-          secure: false,
-          pathRewrite(pathname) {
-            return pathname.replace(/^\/sitedoc/, '/topology/stadok')
-          }
-        },
-        "/tiles/": {
-          target: "http://tile.openstreetmap.org",
-          secure: false
-        },
-        "/help/": {
-          target: "http://sdnr:8181",
-          secure: false
-        },
-        "/websocket": {
-          target: "http://sdnr:8181",
-          ws: true,
-          changeOrigin: true,
-          secure: false
-        }
-      }
-
-    }
-  }];
-}
index af38fb1..9a08612 100644 (file)
   "author": "Sai Neetha Phulmali",
   "license": "Apache-2.0",
   "dependencies": {
-    "@odlux/framework": "*",
+    "@emotion/react": "^11.7.0",
+    "@emotion/styled": "^11.6.0",
+    "@mui/icons-material": "^5.2.0",
+    "@mui/material": "^5.2.2",
+    "@mui/styles": "^5.2.2",
     "@odlux/connect-app": "*",
-    "react-chartjs-2": "2.7.6",
-    "chart.js": "2.8.0"
+    "@odlux/framework": "*",
+    "chart.js": "2.8.0",
+    "react-chartjs-2": "2.7.6"
   },
   "peerDependencies": {
-    "@types/react": "17.0.3",
-    "@types/react-dom": "17.0.2",
-    "@types/react-router-dom": "5.1.7",
-    "@material-ui/core": "4.11.4",
-    "@material-ui/icons": "4.11.2",
     "@types/classnames": "2.2.6",
     "@types/flux": "3.1.8",
     "@types/jquery": "3.3.10",
+    "@types/react": "17.0.37",
+    "@types/react-dom": "17.0.11",
+    "@types/react-router-dom": "5.1.7",
     "jquery": "3.3.1",
-    "react": "17.0.1",
-    "react-dom": "17.0.1",
+    "react": "17.0.2",
+    "react-dom": "17.0.2",
     "react-router-dom": "5.2.0"
   }
-}
\ No newline at end of file
+}
index 9637fec..2b8e6e2 100644 (file)
@@ -51,8 +51,8 @@ export class AllDeviceListLoadedAction extends BaseAction {
  */
 export const loadAllDeviceListAsync = async (dispatch: Dispatch) => {
   dispatch(new LoadAllDeviceListAction());
-  const deviceListFromPerfHistory: DeviceListType[] = await PerformanceHistoryService.getDeviceListfromPerf15minHistory().then(ne => (ne)) || [];
-  const deviceListFromPerf24History: DeviceListType[] = await PerformanceHistoryService.getDeviceListfromPerf24hHistory().then(ne => (ne)) || [];
+  const deviceListFromPerfHistory: DeviceListType[] = (await PerformanceHistoryService.getDeviceListfromPerf15minHistory().then(ne => (ne))) || [];
+  const deviceListFromPerf24History: DeviceListType[] = (await PerformanceHistoryService.getDeviceListfromPerf24hHistory().then(ne => (ne))) || [];
   deviceListFromPerf24History.forEach(deviceList24h => {
     if (deviceListFromPerfHistory.findIndex(deviceList15min => deviceList15min.nodeId === deviceList24h.nodeId) < 0) {
       deviceListFromPerfHistory.push(deviceList24h);
index e7583de..e66e6c1 100644 (file)
@@ -18,7 +18,9 @@
 
 
 import * as React from 'react';
-import { makeStyles, TextField, Typography, Select, MenuItem, FormControl, InputLabel } from '@material-ui/core';
+import { TextField, Typography, Select, MenuItem, FormControl, InputLabel } from '@mui/material';
+
+import makeStyles from '@mui/styles/makeStyles';
 
 const styles = makeStyles({
     filterInput: {
@@ -44,19 +46,19 @@ const ChartFilter: React.FunctionComponent<filterProps> = (props) => {
             {
                 props.isVisible &&
                 <div className={classes.filterContainer}>
-                    <TextField inputProps={{'aria-label': 'radio-signal-filter'}} className={classes.filterInput} label="Radio Signal" value={props.filters.radioSignalId || ''} onChange={(event) => props.onFilterChanged("radioSignalId", event.target.value)} InputLabelProps={{
+                    <TextField variant="standard" inputProps={{'aria-label': 'radio-signal-filter'}} className={classes.filterInput} label="Radio Signal" value={props.filters.radioSignalId || ''} onChange={(event) => props.onFilterChanged("radioSignalId", event.target.value)} InputLabelProps={{
                         shrink: true,
                     }} />
-                    <TextField inputProps={{'aria-label': 'scanner-id-filter'}} className={classes.filterInput} label="Scanner ID" value={props.filters.scannerId || ''} onChange={(event) => props.onFilterChanged("scannerId", event.target.value)} InputLabelProps={{
+                    <TextField variant="standard" inputProps={{'aria-label': 'scanner-id-filter'}} className={classes.filterInput} label="Scanner ID" value={props.filters.scannerId || ''} onChange={(event) => props.onFilterChanged("scannerId", event.target.value)} InputLabelProps={{
                         shrink: true,
                     }} />
-                    <TextField inputProps={{'aria-label': 'end-time-filter'}} className={classes.filterInput} label="End Time" value={props.filters.timeStamp || ''} onChange={(event) => props.onFilterChanged("timeStamp", event.target.value)} InputLabelProps={{
+                    <TextField variant="standard" inputProps={{'aria-label': 'end-time-filter'}} className={classes.filterInput} label="End Time" value={props.filters.timeStamp || ''} onChange={(event) => props.onFilterChanged("timeStamp", event.target.value)} InputLabelProps={{
                         shrink: true,
                     }} />
-                    <FormControl>
+                    <FormControl variant="standard">
                         <InputLabel id="suspect-interval-label" shrink>Suspect Interval</InputLabel>
 
-                        <Select aria-label="suspect-interval-selection" labelId="suspect-interval-label" value={suspectIntervalFlag || ''} onChange={(event) => props.onFilterChanged("suspectIntervalFlag", event.target.value as string)}>
+                        <Select variant="standard" aria-label="suspect-interval-selection" labelId="suspect-interval-label" value={suspectIntervalFlag || ''} onChange={(event) => props.onFilterChanged("suspectIntervalFlag", event.target.value as string)}>
                             <MenuItem value={undefined} aria-label="none">None</MenuItem>
                             <MenuItem value={"true"} aria-label="true">true</MenuItem>
                             <MenuItem value={"false"} aria-label="false">false</MenuItem>
index b6c14a9..ef6cfc7 100644 (file)
  */
 
 import * as React from 'react';
-import { MenuItem, Select, FormControl, Typography } from '@material-ui/core';
-import { makeStyles } from '@material-ui/core/styles';
+import { MenuItem, Select, FormControl, Typography, SelectChangeEvent } from '@mui/material';
+import makeStyles from '@mui/styles/makeStyles';
 import { LtpIds } from 'models/availableLtps';
 import { Loader } from '../../../../framework/src/components/material-ui';
 
+import { Theme } from '@mui/material/styles';
 
-const useStyles = makeStyles(theme => ({
+const useStyles = makeStyles((theme: Theme) => ({
     display: {
         display: "inline-block"
     },
@@ -47,24 +48,28 @@ const useStyles = makeStyles(theme => ({
     }
 }));
 
-type LtpSelectionProps = { selectedNE: string, error?: string, finishedLoading: boolean, selectedLtp: string, availableLtps: LtpIds[], onChangeLtp(event: React.ChangeEvent<HTMLSelectElement>): void, selectedTimePeriod: string, onChangeTimePeriod(event: React.ChangeEvent<HTMLSelectElement>): void };
+type LtpSelectionProps = { selectedNE: string, error?: string, finishedLoading: boolean, selectedLtp: string, 
+    availableLtps: LtpIds[], 
+    onChangeLtp(event: SelectChangeEvent<HTMLSelectElement | string> ): void, 
+    selectedTimePeriod: string, 
+    onChangeTimePeriod(event: SelectChangeEvent<HTMLSelectElement | string> ): void };
 
 export const LtpSelection = (props: LtpSelectionProps) => {
     const classes = useStyles();
     return (
         <>
             <h3>Selected Network Element: {props.selectedNE} </h3>
-            <FormControl className={classes.display}>
+            <FormControl variant="standard" className={classes.display}>
                 <span>
                     Select LTP
                 </span>
-                <Select className={classes.selectDropdown} value={props.selectedLtp} onChange={props.onChangeLtp} aria-label="ltp-selection" >
+                <Select variant="standard" className={classes.selectDropdown} value={props.selectedLtp} onChange={props.onChangeLtp} aria-label="ltp-selection" >
                     <MenuItem value={"-1"} aria-label="none"><em>--Select--</em></MenuItem>
                     {props.availableLtps.map(ltp =>
                         (<MenuItem value={ltp.key} key={ltp.key} aria-label={ltp.key}>{ltp.key}</MenuItem>))}
                 </Select>
                 <span> Time-Period </span>
-                <Select className={classes.selectDropdown} value={props.selectedTimePeriod} onChange={props.onChangeTimePeriod} aria-label="time-period-selection">
+                <Select variant="standard" className={classes.selectDropdown} value={props.selectedTimePeriod} onChange={props.onChangeTimePeriod} aria-label="time-period-selection">
                     <MenuItem value={"15min"} aria-label="15minutes">15min</MenuItem>
                     <MenuItem value={"24hours"} aria-label="24hours">24hours</MenuItem>
                 </Select>
index 88dc9fd..8696fe4 100644 (file)
  */
 
 import * as React from 'react';
-import ToggleButton from '@material-ui/lab/ToggleButton';
-import ToggleButtonGroup from '@material-ui/lab/ToggleButtonGroup';
-import BarChartIcon from '@material-ui/icons/BarChart';
-import TableChartIcon from '@material-ui/icons/TableChart';
-import { makeStyles } from '@material-ui/core';
-import Tooltip from '@material-ui/core/Tooltip';
+import ToggleButton from '@mui/material/ToggleButton';
+import ToggleButtonGroup from '@mui/material/ToggleButtonGroup';
+import BarChartIcon from '@mui/icons-material/BarChart';
+import TableChartIcon from '@mui/icons-material/TableChart';
+import makeStyles from '@mui/styles/makeStyles';
+import Tooltip from '@mui/material/Tooltip';
 import ChartFilter from './chartFilter'
-import FilterListIcon from '@material-ui/icons/FilterList';
+import FilterListIcon from '@mui/icons-material/FilterList';
 
 const styles = makeStyles({
     toggleButtonContainer: {
@@ -67,20 +67,20 @@ const ToggleContainer: React.FunctionComponent<toggleProps> = (props) => {
             <div className={classes.toggleButtonContainer} >
                 <ToggleButtonGroup className={classes.subViewGroup} size="medium" value={props.selectedValue} exclusive onChange={handleChange}>
                     <ToggleButton aria-label="display-chart" key={1} value="chart">
-                        <Tooltip title="Chart">
+                        <Tooltip disableInteractive title="Chart">
                             <BarChartIcon />
                         </Tooltip>
                     </ToggleButton>
                     <ToggleButton aria-label="display-table" key={2} value="table">
-                        <Tooltip title="Table">
+                        <Tooltip disableInteractive title="Table">
                             <TableChartIcon />
                         </Tooltip>
                     </ToggleButton>
                 </ToggleButtonGroup>
 
                 <ToggleButtonGroup className={classes.filterGroup} onChange={handleFilterChange} >
-                    <ToggleButton aria-label="show-filter" selected={props.showFilter as boolean} disabled={props.selectedValue !== "chart"}>
-                        <Tooltip title={props.showFilter ? 'Hide filter' : 'Show available filter'}>
+                    <ToggleButton value="" aria-label="show-filter" selected={props.showFilter as boolean} disabled={props.selectedValue !== "chart"}>
+                        <Tooltip disableInteractive title={props.showFilter ? 'Hide filter' : 'Show available filter'}>
                             <FilterListIcon />
                         </Tooltip>
                     </ToggleButton>
index b0fd54c..b33b442 100644 (file)
  */
 import * as React from 'react';
 
-import { createStyles, Theme, withStyles, WithStyles } from '@material-ui/core/styles';
-import FormControl from '@material-ui/core/FormControl';
-import MenuItem from '@material-ui/core/MenuItem';
-import Select from '@material-ui/core/Select';
+import { Theme } from '@mui/material/styles';
+import { WithStyles } from '@mui/styles';
+import createStyles from '@mui/styles/createStyles';
+import withStyles from '@mui/styles/withStyles';
+import FormControl from '@mui/material/FormControl';
+import MenuItem from '@mui/material/MenuItem';
+import Select from '@mui/material/Select';
 
 import connect, { Connect, IDispatcher } from '../../../../framework/src/flux/connect';
 import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
@@ -50,7 +53,7 @@ import { createSignalToInterferencePreActions, signalToInterferenceReloadAction,
 import { createCrossPolarDiscriminationPreActions, crossPolarDiscriminationReloadAction, createCrossPolarDiscriminationActions } from '../handlers/crossPolarDiscriminationHandler';
 
 import { MaterialTable, MaterialTableCtorType } from '../../../../framework/src/components/material-table';
-import { AppBar, Tabs, Tab } from '@material-ui/core';
+import { AppBar, Tabs, Tab, SelectChangeEvent } from '@mui/material';
 import LtpSelection from '../components/ltpSelection';
 import { ResetAllSubViewsAction } from '../actions/toggleActions';
 import { ReloadAction } from '../actions/reloadAction';
@@ -152,7 +155,7 @@ class PerformanceHistoryComponent extends React.Component<PerformanceHistoryComp
     };
   }
 
-  onChangeTabs = (event: React.ChangeEvent<{}>, newValue: PanelId) => {
+  onChangeTabs = (event: React.SyntheticEvent, newValue: PanelId) => {
     const nextActivePanel = newValue;
     this.changeTabs(nextActivePanel);
   }
@@ -244,8 +247,8 @@ class PerformanceHistoryComponent extends React.Component<PerformanceHistoryComp
           {this.state.showPanels &&
             <>
 
-              <AppBar position="static" >
-                <Tabs value={activePanel} onChange={this.onChangeTabs} variant="scrollable" scrollButtons="auto" aria-label="performance-data-tabs">
+              <AppBar enableColorOnDark position="static" >
+                <Tabs indicatorColor="secondary" textColor="inherit" value={activePanel} onChange={this.onChangeTabs} variant="scrollable" scrollButtons="auto" aria-label="performance-data-tabs">
                   <Tab label="Performance Data" value="PerformanceData" aria-label="performance-data" />
                   <Tab label="Receive Level" value="ReceiveLevel" aria-label="receive-level" />
                   <Tab label="Transmission Power" value="TransmissionPower" aria-label="transmission-power" />
@@ -411,25 +414,25 @@ class PerformanceHistoryComponent extends React.Component<PerformanceHistoryComp
   /**
   * Function which handles the time period changes.
   */
-  private handleTimePeriodChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
+  private handleTimePeriodChange = (event: SelectChangeEvent<HTMLSelectElement>) => {
 
     const selectedTimeInterval = event.target.value === "15min"
       ? PmDataInterval.pmInterval15Min
       : PmDataInterval.pmInterval24Hours;
 
     this.setState({
-      selectedTimePeriod: event.target.value,
+      selectedTimePeriod: event.target.value as string,
     });
 
     this.props.timeIntervalChange(selectedTimeInterval);
-    this.props.getDistinctLtpsIds(this.state.selectedNetworkElement, event.target.value, this.state.selectedLtp, undefined, this.resetLtpDropdown);
-    this.preFilterChangeAndReload(this.state.selectedNetworkElement, event.target.value, this.state.selectedLtp);
+    this.props.getDistinctLtpsIds(this.state.selectedNetworkElement, event.target.value as string, this.state.selectedLtp, undefined, this.resetLtpDropdown);
+    this.preFilterChangeAndReload(this.state.selectedNetworkElement, event.target.value as string, this.state.selectedLtp);
   }
 
   /**
   * Function which handles the ltp changes.
   */
-  private handleLtpChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
+  private handleLtpChange = (event:SelectChangeEvent<HTMLSelectElement> ) => {
 
     if (event.target.value === "-1") {
       this.setState({
@@ -440,9 +443,9 @@ class PerformanceHistoryComponent extends React.Component<PerformanceHistoryComp
     } else if (event.target.value !== this.state.selectedLtp) {
       this.setState({
         showPanels: true,
-        selectedLtp: event.target.value
+        selectedLtp: event.target.value as string
       });
-      this.preFilterChangeAndReload(this.state.selectedNetworkElement, this.state.selectedTimePeriod, event.target.value);
+      this.preFilterChangeAndReload(this.state.selectedNetworkElement, this.state.selectedTimePeriod, event.target.value as string);
 
     }
   }
index 5faf69e..8f2192f 100644 (file)
@@ -85,7 +85,7 @@ module.exports = (env) => {
         manifest: require(path.resolve(frameworkPath, "app-manifest.json")),
         sourceType: "umd2"
       }),
-      ...(env === "release") ? [
+      ...(env === "release" ? [
         new webpack.DefinePlugin({
           "process.env": {
             NODE_ENV: "'production'",
@@ -103,7 +103,7 @@ module.exports = (env) => {
             from: 'index.html',
             to: distPath
           }]),
-        ]
+        ])
     ],
 
     devServer: {
index 8fd027f..6ea0841 100644 (file)
   "author": "Matthias Fischer",\r
   "license": "Apache-2.0",\r
   "peerDependencies": {\r
-    "@types/node": "^12.0.0",\r
-    "@types/react": "17.0.3",\r
-    "@types/react-dom": "17.0.2",\r
-    "@types/react-router-dom": "5.1.7",\r
-    "@material-ui/core": "4.11.4",\r
-    "@material-ui/icons": "4.11.2",\r
+    "@fortawesome/fontawesome-svg-core": "1.2.35",\r
+    "@fortawesome/free-solid-svg-icons": "5.6.3",\r
+    "@fortawesome/react-fontawesome": "0.1.14",\r
     "@types/classnames": "2.2.6",\r
     "@types/flux": "3.1.8",\r
     "@types/jquery": "3.3.10",\r
+    "@types/jsonwebtoken": "7.2.8",\r
+    "@types/node": "^12.0.0",\r
+    "@types/react": "17.0.37",\r
+    "@types/react-dom": "17.0.11",\r
+    "@types/react-router-dom": "5.1.7",\r
     "jquery": "3.3.1",\r
-    "react": "17.0.1",\r
-    "react-dom": "17.0.1",\r
-    "react-router-dom": "5.2.0",\r
-    "@fortawesome/react-fontawesome": "0.1.14",\r
-    "@fortawesome/fontawesome-svg-core": "1.2.35",\r
-    "@fortawesome/free-solid-svg-icons": "5.6.3",\r
     "jsonwebtoken": "8.3.0",\r
-    "@types/jsonwebtoken": "7.2.8"\r
+    "react": "17.0.2",\r
+    "react-dom": "17.0.2",\r
+    "react-router-dom": "5.2.0"\r
   },\r
   "dependencies": {\r
     "@babel/polyfill": "^7.0.0",\r
+    "@emotion/react": "^11.7.0",\r
+    "@emotion/styled": "^11.6.0",\r
+    "@mui/icons-material": "^5.2.0",\r
+    "@mui/material": "^5.2.2",\r
+    "@mui/styles": "^5.2.2",\r
+    "@mui/system": "^5.2.2",\r
     "@types/x2js": "^3.1.0",\r
     "chart.js": "^3.4.0",\r
     "http-server": "^0.11.1",\r
index 54e7d38..83ba6f3 100644 (file)
@@ -19,6 +19,7 @@
   ~ ============LICENSE_END=======================================================
   ~
   -->
+
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
@@ -45,7 +46,7 @@
     <properties>
         <buildtime>${maven.build.timestamp}</buildtime>
         <distversion>ONAP Frankfurt (Neon, mdsal ${odl.mdsal.version})</distversion>
-        <buildno>137.be0dfd7(21/12/03)</buildno>
+        <buildno>142.63ceae1(22/01/31)</buildno>
         <odlux.version>ONAP SDN-R | ONF Wireless for ${distversion} - Build: ${buildtime} ${buildno} ${project.version}</odlux.version>
     </properties>
 
index 32e2b26..ad4d606 100644 (file)
  */
 import { Action } from '../flux/action';
 import { SnackbarItem } from '../models/snackbarItem';
-import { Omit } from '@material-ui/core';
+import { DistributiveOmit } from '@mui/types';
 
 export class AddSnackbarNotification extends Action {
 
-  constructor(notification: Omit<SnackbarItem, 'key' >) {
+  constructor(notification: DistributiveOmit<SnackbarItem, 'key' >) {
     super();
 
     this.notification = { ...notification, key: (new Date().getTime() + Math.random()) }
index a73b752..9b03a21 100644 (file)
-/**\r
- * ============LICENSE_START========================================================================\r
- * ONAP : ccsdk feature sdnr wt odlux\r
- * =================================================================================================\r
- * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.\r
- * =================================================================================================\r
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except\r
- * in compliance with the License. You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software distributed under the License\r
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\r
- * or implied. See the License for the specific language governing permissions and limitations under\r
- * the License.\r
- * ============LICENSE_END==========================================================================\r
- */\r
-\r
-import * as React from 'react';\r
-import * as ReactDOM from 'react-dom';\r
-\r
-import { MuiThemeProvider } from '@material-ui/core/styles';\r
-\r
-import { Frame } from './views/frame';\r
-\r
-import { User } from './models/authentication';\r
-\r
-import { AddErrorInfoAction } from './actions/errorActions';\r
-import { loginUserAction } from './actions/authentication';\r
-\r
-import { applicationStoreCreator } from './store/applicationStore';\r
-import { ApplicationStoreProvider } from './flux/connect';\r
-\r
-import { startHistoryListener } from './middleware/navigation';\r
-import { startRestService } from './services/restService';\r
-\r
-import { startUserSessionService } from './services/userSessionService';\r
-import { startNotificationService } from './services/notificationService';\r
-\r
-import theme from './design/default';\r
-import '!style-loader!css-loader!./app.css';\r
-import { startBroadcastChannel } from './services/broadcastService';\r
-\r
-declare module '@material-ui/core/styles/createMuiTheme' {\r
-\r
-  interface IDesign {\r
-    id: string,\r
-    name: string,\r
-    url: string,        // image url of a company logo, which will be presented in the ui header\r
-    height: number,     // image height [px] as delivered by the url\r
-    width: number,      // image width [px] as delivered by the url\r
-    logoHeight: number  // height in [px] of the logo (see url) within the ui header\r
-  }\r
-\r
-  interface Theme {\r
-    design?: IDesign\r
-  }\r
-  interface ThemeOptions {\r
-    design?: IDesign\r
-  }\r
-}\r
-\r
-export { configureApplication } from "./handlers/applicationStateHandler";\r
-\r
-export const transportPCEUrl = "transportPCEUrl";\r
-\r
-export const runApplication = () => {\r
-  \r
-  const initialToken = localStorage.getItem("userToken");\r
-  const applicationStore = applicationStoreCreator();\r
-\r
-  startBroadcastChannel(applicationStore);\r
-  startUserSessionService(applicationStore);\r
-  \r
-  if (initialToken) {\r
-    applicationStore.dispatch(loginUserAction(User.fromString(initialToken) || undefined));\r
-  }\r
-\r
-  window.onerror = function (msg: string, url: string, line: number, col: number, error: Error) {\r
-    // Note that col & error are new to the HTML 5 spec and may not be\r
-    // supported in every browser.  It worked for me in Chrome.\r
-    var extra = !col ? '' : '\ncolumn: ' + col;\r
-    extra += !error ? '' : '\nerror: ' + error;\r
-\r
-    // You can view the information in an alert to see things working like this:\r
-    applicationStore.dispatch(new AddErrorInfoAction({ error, message: msg, url, line, col, info: { extra } }));\r
-\r
-    var suppressErrorAlert = true;\r
-    // If you return true, then error alerts (like in older versions of\r
-    // Internet Explorer) will be suppressed.\r
-    return suppressErrorAlert;\r
-  };\r
-  \r
-\r
-  startRestService(applicationStore);\r
-  startHistoryListener(applicationStore);\r
-  startNotificationService(applicationStore);\r
-\r
-  const App = (): JSX.Element => (\r
-    <ApplicationStoreProvider applicationStore={applicationStore} >\r
-      <MuiThemeProvider theme={theme}>\r
-        <Frame />\r
-      </MuiThemeProvider>\r
-    </ApplicationStoreProvider>\r
-  );\r
-\r
-  ReactDOM.render(<App />, document.getElementById('app'));\r
-\r
-  \r
-\r
-};\r
+/**
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt odlux
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ */
+
+import * as React from 'react';
+import * as ReactDOM from 'react-dom';
+
+import { ThemeProvider, Theme, StyledEngineProvider } from '@mui/material/styles';
+
+import { Frame } from './views/frame';
+
+import { User } from './models/authentication';
+
+import { AddErrorInfoAction } from './actions/errorActions';
+import { loginUserAction } from './actions/authentication';
+
+import { applicationStoreCreator } from './store/applicationStore';
+import { ApplicationStoreProvider } from './flux/connect';
+
+import { startHistoryListener } from './middleware/navigation';
+import { startRestService } from './services/restService';
+
+import { startUserSessionService } from './services/userSessionService';
+import { startNotificationService } from './services/notificationService';
+
+import theme from './design/default';
+import '!style-loader!css-loader!./app.css';
+import { startBroadcastChannel } from './services/broadcastService';
+
+declare module '@mui/material/styles' {
+
+  interface IDesign {
+    id: string,
+    name: string,
+    url: string,        // image url of a company logo, which will be presented in the ui header
+    height: number,     // image height [px] as delivered by the url
+    width: number,      // image width [px] as delivered by the url
+    logoHeight: number  // height in [px] of the logo (see url) within the ui header
+  }
+
+  interface Theme {
+    design?: IDesign
+  }
+  interface DeprecatedThemeOptions {
+    design?: IDesign
+  }
+}
+
+
+declare module '@mui/styles/defaultTheme' {
+  // eslint-disable-next-line @typescript-eslint/no-empty-interface (remove this line if you don't have the rule enabled)
+  interface DefaultTheme extends Theme {}
+}
+
+export { configureApplication } from "./handlers/applicationStateHandler";
+
+export const transportPCEUrl = "transportPCEUrl";
+
+export const runApplication = () => {
+  
+  const initialToken = localStorage.getItem("userToken");
+  const applicationStore = applicationStoreCreator();
+
+  startBroadcastChannel(applicationStore);
+  startUserSessionService(applicationStore);
+  
+  if (initialToken) {
+    applicationStore.dispatch(loginUserAction(User.fromString(initialToken) || undefined));
+  }
+
+  window.onerror = function (msg: string, url: string, line: number, col: number, error: Error) {
+    // Note that col & error are new to the HTML 5 spec and may not be
+    // supported in every browser.  It worked for me in Chrome.
+    var extra = !col ? '' : '\ncolumn: ' + col;
+    extra += !error ? '' : '\nerror: ' + error;
+
+    // You can view the information in an alert to see things working like this:
+    applicationStore.dispatch(new AddErrorInfoAction({ error, message: msg, url, line, col, info: { extra } }));
+
+    var suppressErrorAlert = true;
+    // If you return true, then error alerts (like in older versions of
+    // Internet Explorer) will be suppressed.
+    return suppressErrorAlert;
+  };
+  
+
+  startRestService(applicationStore);
+  startHistoryListener(applicationStore);
+  startNotificationService(applicationStore);
+
+  const App = (): JSX.Element => (
+    <ApplicationStoreProvider applicationStore={applicationStore} >
+      <StyledEngineProvider injectFirst>
+        <ThemeProvider theme={theme}>
+          <Frame />
+        </ThemeProvider>
+      </StyledEngineProvider>
+    </ApplicationStoreProvider>
+  );
+
+  ReactDOM.render(<App />, document.getElementById('app'));
+
+  
+
+};
index b2a1f1f..a04ab16 100644 (file)
  * ============LICENSE_END==========================================================================
  */
 import * as React from 'react';
-import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/styles';
+import { Theme } from '@mui/material/styles';
 
-import Modal from '@material-ui/core/Modal';
-import Button from '@material-ui/core/Button';
-import Card from '@material-ui/core/Card';
-import CardActions from '@material-ui/core/CardActions';
-import CardContent from '@material-ui/core/CardContent';
-import Typography from '@material-ui/core/Typography';
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
+
+import Modal from '@mui/material/Modal';
+import Button from '@mui/material/Button';
+import Card from '@mui/material/Card';
+import CardActions from '@mui/material/CardActions';
+import CardContent from '@mui/material/CardContent';
+import Typography from '@mui/material/Typography';
 
 import { ClearErrorInfoAction, RemoveErrorInfoAction } from '../actions/errorActions';
 
@@ -113,7 +117,7 @@ class ErrorDisplayComponent extends React.Component<ErrorDisplayProps> {
                 </Typography>
               </CardContent>
               <CardActions>
-                <Button size="small" onClick={() => this.props.dispatch(new RemoveErrorInfoAction(errorInfo))} >Close</Button>
+                <Button color="inherit" size="small" onClick={() => this.props.dispatch(new RemoveErrorInfoAction(errorInfo))} >Close</Button>
               </CardActions>
             </Card>
           </div> || <div></div>
index 470eb96..b10cc8c 100644 (file)
 import * as React from 'react';
 import { withRouter, RouteComponentProps } from 'react-router-dom';
 
-import { WithStyles, withStyles, createStyles, Theme } from '@material-ui/core/styles'; // infra for styling
+import { Theme } from '@mui/material/styles'; // infra for styling
+
+
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
 
 
 import defaultLogo from '../assets/images/defaultLogo.svg';
index 8124e45..ce5b2cd 100644 (file)
@@ -1,55 +1,55 @@
-/**\r
- * ============LICENSE_START========================================================================\r
- * ONAP : ccsdk feature sdnr wt odlux\r
- * =================================================================================================\r
- * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.\r
- * =================================================================================================\r
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except\r
- * in compliance with the License. You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software distributed under the License\r
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\r
- * or implied. See the License for the specific language governing permissions and limitations under\r
- * the License.\r
- * ============LICENSE_END==========================================================================\r
- */\r
-\r
-import * as React from 'react';\r
-\r
-export enum ColumnType {\r
-  text,\r
-  numeric,\r
-  boolean,\r
-  date,\r
-  custom\r
-}\r
-\r
-type CustomControl<TData> = {\r
-  className?: string;\r
-  style?: React.CSSProperties;\r
-  rowData: TData;\r
-}\r
-\r
-export type ColumnModel<TData> = {\r
-  title?: string;\r
-  disablePadding?: boolean;\r
-  width?: string | number ;\r
-  className?: string;\r
-  style?: React.CSSProperties;\r
-  align?: 'inherit' | 'left' | 'center' | 'right' | 'justify';\r
-  disableSorting?: boolean;\r
-  disableFilter?: boolean;\r
-} & ({\r
-  property: string;\r
-  type: ColumnType.custom;\r
-  customControl: React.ComponentType<CustomControl<TData>>;\r
-} | {\r
-  property: keyof TData;\r
-  type: ColumnType.boolean;\r
-  labels?: { "true": string, "false": string };\r
-} | {\r
-    property: keyof TData;\r
-    type?: ColumnType.numeric | ColumnType.text | ColumnType.date;\r
+/**
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt odlux
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ */
+
+import * as React from 'react';
+
+export enum ColumnType {
+  text,
+  numeric,
+  boolean,
+  date,
+  custom
+}
+
+type CustomControl<TData> = {
+  className?: string;
+  style?: React.CSSProperties;
+  rowData: TData;
+}
+
+export type ColumnModel<TData> = {
+  title?: string;
+  disablePadding?: boolean;
+  width?: string | number ;
+  className?: string;
+  style?: React.CSSProperties;
+  align?: 'inherit' | 'left' | 'center' | 'right' | 'justify';
+  disableSorting?: boolean;
+  disableFilter?: boolean;
+} & ({
+  property: string;
+  type: ColumnType.custom;
+  customControl: React.ComponentType<CustomControl<TData>>;
+} | {
+  property: keyof TData;
+  type: ColumnType.boolean;
+  labels?: { "true": string, "false": string };
+} | {
+    property: keyof TData;
+    type?: ColumnType.numeric | ColumnType.text | ColumnType.date;
 });
\ No newline at end of file
index cb67521..aac2a12 100644 (file)
  * ============LICENSE_END==========================================================================
  */
 import * as React from 'react';
-import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/styles';
+import { Theme } from '@mui/material/styles';
 
-import Table from '@material-ui/core/Table';
-import TableBody from '@material-ui/core/TableBody';
-import TableCell from '@material-ui/core/TableCell';
-import TableContainer from '@material-ui/core/TableContainer';
-import TablePagination from '@material-ui/core/TablePagination';
-import TableRow from '@material-ui/core/TableRow';
-import Paper from '@material-ui/core/Paper';
-import Checkbox from '@material-ui/core/Checkbox';
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
+
+import Table from '@mui/material/Table';
+import TableBody from '@mui/material/TableBody';
+import TableCell from '@mui/material/TableCell';
+import TableContainer from '@mui/material/TableContainer';
+import TablePagination from '@mui/material/TablePagination';
+import TableRow from '@mui/material/TableRow';
+import Paper from '@mui/material/Paper';
+import Checkbox from '@mui/material/Checkbox';
 
 import { TableToolbar } from './tableToolbar';
 import { EnhancedTableHead } from './tableHead';
 import { EnhancedTableFilter } from './tableFilter';
 
 import { ColumnModel, ColumnType } from './columnModel';
-import { Omit, Menu, makeStyles } from '@material-ui/core';
+import { Menu } from '@mui/material';
+import { DistributiveOmit } from '@mui/types';
+
+import makeStyles from '@mui/styles/makeStyles';
 
-import { SvgIconProps } from '@material-ui/core/SvgIcon/SvgIcon';
+import { SvgIconProps } from '@mui/material/SvgIcon';
 
-import { DividerTypeMap } from '@material-ui/core/Divider';
-import { MenuItemProps } from '@material-ui/core/MenuItem';
-import { flexbox } from '@material-ui/system';
+import { DividerTypeMap } from '@mui/material/Divider';
+import { MenuItemProps } from '@mui/material/MenuItem';
+import { flexbox } from '@mui/system';
 import { RowDisabled } from './utilities';
 import { toAriaLabel } from '../../utilities/yangHelper';
 export { ColumnModel, ColumnType } from './columnModel';
@@ -51,7 +58,7 @@ export type DataCallback<TData = dataType> = (page?: number, rowsPerPage?: numbe
 
 function regExpEscape(s: string) {
   return s.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&');
-};
+}
 
 function wildcardCheck(input: string, pattern: string) {
    if (!pattern) return true; 
@@ -61,7 +68,7 @@ function wildcardCheck(input: string, pattern: string) {
      (!pattern.endsWith('*') ? '$' : '')
    );
    return input.match(regex) !== null && input.match(regex)!.length >= 1;
-};
+}
 
 function desc(a: dataType, b: dataType, orderBy: string) {
   if ((b[orderBy] || "") < (a[orderBy] || "")) {
@@ -240,7 +247,7 @@ class MaterialTableComponent<TData extends {} = {}> extends React.Component<Mate
         <TableContainer className={classes.container}>
           <TableToolbar tableId={this.props.tableId} numSelected={selected && selected.length} title={this.props.title} customActionButtons={this.props.customActionButtons} onExportToCsv={this.exportToCsv}
             onToggleFilter={toggleFilter} />
-          <Table aria-label={this.props.tableId ? this.props.tableId : 'tableTitle'} stickyHeader={this.props.stickyHeader || false} >
+          <Table padding="normal" aria-label={this.props.tableId ? this.props.tableId : 'tableTitle'} stickyHeader={this.props.stickyHeader || false} >
             <EnhancedTableHead
               columns={columns}
               numSelected={selected && selected.length}
@@ -330,15 +337,15 @@ class MaterialTableComponent<TData extends {} = {}> extends React.Component<Mate
           count={rowCount}
           rowsPerPage={rowsPerPage}
           page={page}
-          aria-label={"table-pagination-footer" }
+          aria-label={this.props.isPopup ? "popup-table-pagination-footer" : "table-pagination-footer" }
           backIconButtonProps={{
             'aria-label': this.props.isPopup ? 'popup-previous-page' : 'previous-page',
           }}
           nextIconButtonProps={{
             'aria-label': this.props.isPopup ? 'popup-next-page': 'next-page',
           }}
-          onChangePage={this.onHandleChangePage}
-          onChangeRowsPerPage={this.onHandleChangeRowsPerPage}
+          onPageChange={this.onHandleChangePage}
+          onRowsPerPageChange={this.onHandleChangeRowsPerPage}
         />
       </Paper>
     );
@@ -371,7 +378,7 @@ class MaterialTableComponent<TData extends {} = {}> extends React.Component<Mate
 
   private static updateRows(props: MaterialTableComponentPropsWithRows, state: MaterialTableComponentState): { rows: {}[], total: number, page: number } {
 
-    let data = [...props.rows as dataType[] || []];
+    let data = [...(props.rows as dataType[] || [])];
     const columns = props.columns;
 
     const { page, rowsPerPage, order, orderBy, filter } = state;
@@ -661,7 +668,7 @@ class MaterialTableComponent<TData extends {} = {}> extends React.Component<Mate
   }
 }
 
-export type MaterialTableCtorType<TData extends {} = {}> = new () => React.Component<Omit<MaterialTableComponentProps<TData>, 'classes'>>;
+export type MaterialTableCtorType<TData extends {} = {}> = new () => React.Component<DistributiveOmit<MaterialTableComponentProps<TData>, 'classes'>>;
 
 export const MaterialTable = withStyles(styles)(MaterialTableComponent);
 export default MaterialTable;
\ No newline at end of file
index e4cc5ab..a46dd18 100644 (file)
 
 import * as React from 'react';
 import { ColumnModel, ColumnType } from './columnModel';
-import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/styles';
+import { Theme } from '@mui/material/styles';
 
 
-import TableCell from '@material-ui/core/TableCell';
-import TableRow from '@material-ui/core/TableRow';
-import Input from '@material-ui/core/Input';
-import { Select, FormControl, InputLabel, MenuItem } from '@material-ui/core';
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
+
+
+import TableCell from '@mui/material/TableCell';
+import TableRow from '@mui/material/TableRow';
+import Input from '@mui/material/Input';
+import { Select, FormControl, InputLabel, MenuItem, SelectChangeEvent } from '@mui/material';
 import { toAriaLabel } from '../../utilities/yangHelper';
 
 
@@ -49,9 +54,13 @@ interface IEnhancedTableFilterComponentProps extends WithStyles<typeof styles> {
 }
 
 class EnhancedTableFilterComponent extends React.Component<IEnhancedTableFilterComponentProps> {
-  createFilterHandler = (property: string) => (event: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => {
-    this.props.onFilterChanged && this.props.onFilterChanged(property, event.target.value);
+  createSelectFilterHandler = (property: string) => (event: SelectChangeEvent<HTMLSelectElement | string>) => {
+    this.props.onFilterChanged && this.props.onFilterChanged(property, event.target.value as string);
   };
+  createInputFilterHandler = (property: string) => (event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>) => {
+    this.props.onFilterChanged && this.props.onFilterChanged(property, event.currentTarget.value);
+  };
+
 
   render() {
     const { columns, filter, classes } = this.props;
@@ -68,20 +77,26 @@ class EnhancedTableFilterComponent extends React.Component<IEnhancedTableFilterC
             <TableCell
               className={col.type === ColumnType.numeric ? classes.numberInput : ''}
               key={col.property}
-              padding={col.disablePadding ? 'none' : 'default'}
+              padding={col.disablePadding ? 'none' : 'normal'}
               style={style}
             >
               {col.disableFilter || (col.type === ColumnType.custom)
                 ? null
                 : (col.type === ColumnType.boolean)
-                  ? <Select className={classes.input} aria-label={col.title ? toAriaLabel(col.title as string) + '-filter' : `${ind + 1}-filter`} value={filter[col.property] !== undefined ? filter[col.property] : ''} onChange={this.createFilterHandler(col.property)} inputProps={{ name: `${col.property}-bool`, id: `${col.property}-bool` }} >
+                  ? <Select variant="standard" className={classes.input} aria-label={col.title ? toAriaLabel(col.title as string) + '-filter' : `${ind + 1}-filter`}
+                    value={filter[col.property] !== undefined ? filter[col.property] : ''}
+                    onChange={this.createSelectFilterHandler(col.property)}
+                    inputProps={{ name: `${col.property}-bool`, id: `${col.property}-bool` }} >
                     <MenuItem value={undefined} aria-label="none-value" >
                       <em>None</em>
                     </MenuItem>
                     <MenuItem aria-label="true-value" value={true as any as string}>{col.labels ? col.labels["true"] : "true"}</MenuItem>
                     <MenuItem aria-label="false-value" value={false as any as string}>{col.labels ? col.labels["false"] : "false"}</MenuItem>
                   </Select>
-                  : <Input className={classes.input} inputProps={{ 'aria-label': col.title ? toAriaLabel(col.title as string)+ '-filter' : `${ind + 1}-filter` }} value={filter[col.property] || ''} onChange={this.createFilterHandler(col.property)} />}
+                  : <Input className={classes.input}
+                    inputProps={{ 'aria-label': col.title ? toAriaLabel(col.title as string) + '-filter' : `${ind + 1}-filter` }}
+                    value={filter[col.property] || ''}
+                    onChange={this.createInputFilterHandler(col.property)} />}
             </TableCell>
           );
         }, this)}
index 428f4cf..c500f44 100644 (file)
 
 import * as React from 'react';
 import { ColumnModel, ColumnType } from './columnModel';
-import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/styles';
+import { Theme } from '@mui/material/styles';
 
-import TableSortLabel from '@material-ui/core/TableSortLabel';
-import TableCell from '@material-ui/core/TableCell';
-import TableHead from '@material-ui/core/TableHead';
-import TableRow from '@material-ui/core/TableRow';
-import Checkbox from '@material-ui/core/Checkbox';
-import Tooltip from '@material-ui/core/Tooltip';
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
 
-interface IEnhancedTableHeadComponentProps {
+import TableSortLabel from '@mui/material/TableSortLabel';
+import TableCell from '@mui/material/TableCell';
+import TableHead from '@mui/material/TableHead';
+import TableRow from '@mui/material/TableRow';
+import Checkbox from '@mui/material/Checkbox';
+import Tooltip from '@mui/material/Tooltip';
+
+const styles = (theme: Theme) => createStyles({
+  header: {
+    backgroundColor: "#fafafa",
+    position: "sticky",
+    top: 0
+  }
+});
+
+
+type styles_header = WithStyles<typeof styles>;
+
+interface IEnhancedTableHeadComponentProps extends styles_header {
   numSelected: number | null;
   onRequestSort: (event: React.SyntheticEvent, property: string) => void;
   onSelectAllClick: () => void;
@@ -45,12 +60,13 @@ class EnhancedTableHeadComponent extends React.Component<IEnhancedTableHeadCompo
 
   render() {
     const { onSelectAllClick, order, orderBy, numSelected, rowCount, columns } = this.props;
+    const {classes} = this.props;
 
     return (
       <TableHead>
         <TableRow>
           { this.props.enableSelection 
-           ? <TableCell padding="checkbox" style={ { width: "50px" } }>
+           ? <TableCell padding="checkbox" style={ { width: "50px" } } className= {classes.header} >
               <Checkbox
                  indeterminate={ numSelected && numSelected > 0 && numSelected < rowCount || undefined }
                  checked={ numSelected === rowCount }
@@ -62,10 +78,10 @@ class EnhancedTableHeadComponent extends React.Component<IEnhancedTableHeadCompo
           { columns.map(col => {
             const style = col.width ? { width: col.width } : {};
             return (
-              <TableCell
+              <TableCell className= {classes.header}
                 key={ col.property }
                 align={ col.type === ColumnType.numeric ? 'right' : 'left' } 
-                padding={ col.disablePadding ? 'none' : 'default' }
+                padding={ col.disablePadding ? 'none' : 'normal' }
                 sortDirection={ orderBy === (col.property) ? order : false }
                 style={ style }
               >
@@ -76,7 +92,7 @@ class EnhancedTableHeadComponent extends React.Component<IEnhancedTableHeadCompo
                   >
                     { col.title || col.property }
                   </TableSortLabel>
-                  : <Tooltip
+                  : <Tooltip disableInteractive
                     title="Sort"
                     placement={ col.type === ColumnType.numeric ? 'bottom-end' : 'bottom-start' }
                     enterDelay={ 300 }
@@ -98,4 +114,4 @@ class EnhancedTableHeadComponent extends React.Component<IEnhancedTableHeadCompo
   }
 }
 
-export const EnhancedTableHead = EnhancedTableHeadComponent;
\ No newline at end of file
+export const EnhancedTableHead = withStyles(styles)(EnhancedTableHeadComponent);
\ No newline at end of file
index 4ad6422..426436d 100644 (file)
  * ============LICENSE_END==========================================================================
  */
 import * as React from 'react';
-import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/styles';
+import { Theme, lighten } from '@mui/material/styles';
 
-import IconButton from '@material-ui/core/IconButton';
-import Tooltip from '@material-ui/core/Tooltip';
-import Toolbar from '@material-ui/core/Toolbar';
-import Typography from '@material-ui/core/Typography';
-import DeleteIcon from '@material-ui/icons/Delete';
-import MoreIcon from '@material-ui/icons/MoreVert';
-import FilterListIcon from '@material-ui/icons/FilterList';
-import MenuItem from '@material-ui/core/MenuItem';
-import Menu from '@material-ui/core/Menu';
-import { lighten } from '@material-ui/core/styles/colorManipulator';
-import { SvgIconProps } from '@material-ui/core/SvgIcon/SvgIcon';
-import { Button } from '@material-ui/core';
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
+
+import IconButton from '@mui/material/IconButton';
+import Tooltip from '@mui/material/Tooltip';
+import Toolbar from '@mui/material/Toolbar';
+import Typography from '@mui/material/Typography';
+import DeleteIcon from '@mui/icons-material/Delete';
+import MoreIcon from '@mui/icons-material/MoreVert';
+import FilterListIcon from '@mui/icons-material/FilterList';
+import MenuItem from '@mui/material/MenuItem';
+import Menu from '@mui/material/Menu';
+import { SvgIconProps } from '@mui/material/SvgIcon';
+import { Button } from '@mui/material';
 
 const styles = (theme: Theme) => createStyles({
   root: {
     paddingRight: theme.spacing(1),
   },
   highlight:
-    theme.palette.type === 'light'
+    theme.palette.mode === 'light'
       ? {
         color: theme.palette.secondary.main,
         backgroundColor: lighten(theme.palette.secondary.light, 0.85),
@@ -109,32 +112,41 @@ class TableToolbarComponent extends React.Component<ITableToolbarComponentProps,
         <div className={classes.actions}>
           {this.props.customActionButtons
             ? this.props.customActionButtons.map((action, ind) => (
-              <Tooltip key={`custom-action-${ind}`} title={action.tooltip || ''}>
-                <IconButton disabled={action.disabled} aria-label={`${buttonPrefix}-${action.ariaLabel}-button`} onClick={() => action.onClick()}>
+              <Tooltip disableInteractive key={`custom-action-${ind}`} title={action.tooltip || ''}>
+                <IconButton
+                  disabled={action.disabled}
+                  aria-label={`${buttonPrefix}-${action.ariaLabel}-button`}
+                  onClick={() => action.onClick()}
+                  size="large">
                   <action.icon />
                 </IconButton>
               </Tooltip>
             ))
             : null}
           {numSelected && numSelected > 0 ? (
-            <Tooltip title="Delete">
-              <IconButton aria-label={`${buttonPrefix}-delete-button`}>
+            <Tooltip disableInteractive title="Delete">
+              <IconButton aria-label={`${buttonPrefix}-delete-button`} size="large">
                 <DeleteIcon />
               </IconButton>
             </Tooltip>
           ) : (
-              <Tooltip title="Filter list">
-                <IconButton aria-label={`${buttonPrefix}-filter-list-button`} onClick={() => { this.props.onToggleFilter && this.props.onToggleFilter() }}>
+              <Tooltip disableInteractive title="Filter list">
+                <IconButton
+                  aria-label={`${buttonPrefix}-filter-list-button`}
+                  onClick={() => { this.props.onToggleFilter && this.props.onToggleFilter() }}
+                  size="large">
                   <FilterListIcon />
                 </IconButton>
               </Tooltip>
             )}
-          <Tooltip title="Actions">
-            <IconButton color="inherit"
-            aria-label={`${buttonPrefix}-additional-actions-button`}
+          <Tooltip disableInteractive title="Actions">
+            <IconButton
+              color="inherit"
+              aria-label={`${buttonPrefix}-additional-actions-button`}
               aria-owns={open ? 'menu-appbar' : undefined}
               aria-haspopup="true"
-              onClick={this.handleMenu} >
+              onClick={this.handleMenu}
+              size="large">
               <MoreIcon />
             </IconButton>
           </Tooltip>
@@ -146,6 +158,6 @@ class TableToolbarComponent extends React.Component<ITableToolbarComponentProps,
       </Toolbar>
     );
   }
-};
+}
 
 export const TableToolbar = withStyles(styles)(TableToolbarComponent);
\ No newline at end of file
index 49e7be5..744cb0d 100644 (file)
@@ -1,72 +1,75 @@
-/**\r
- * ============LICENSE_START========================================================================\r
- * ONAP : ccsdk feature sdnr wt odlux\r
- * =================================================================================================\r
- * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.\r
- * =================================================================================================\r
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except\r
- * in compliance with the License. You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software distributed under the License\r
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\r
- * or implied. See the License for the specific language governing permissions and limitations under\r
- * the License.\r
- * ============LICENSE_END==========================================================================\r
- */\r
-import * as React from 'react';\r
-import { NavLink, Link, Route } from 'react-router-dom';\r
-\r
-import ListItem from '@material-ui/core/ListItem';\r
-import ListItemIcon from '@material-ui/core/ListItemIcon';\r
-import ListItemText from '@material-ui/core/ListItemText';\r
-\r
-import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/styles';\r
-import { toAriaLabel } from '../../utilities/yangHelper';\r
-\r
-const styles = (theme: Theme) => createStyles({\r
-  active: {\r
-    backgroundColor: theme.palette.action.selected\r
-  }\r
-});\r
-\r
-export interface IListItemLinkProps extends WithStyles<typeof styles> {\r
-  icon: JSX.Element | null;\r
-  primary: string | React.ComponentType;\r
-  secondary?: React.ComponentType;\r
-  to: string;\r
-  exact?: boolean;\r
-  external?: boolean;\r
-}\r
-\r
-export const ListItemLink = withStyles(styles)((props: IListItemLinkProps) => {\r
-  const { icon, primary: Primary, secondary: Secondary, classes, to, exact = false, external=false } = props;\r
-  const renderLink = (itemProps: any): JSX.Element => (\r
-    props.external ? <a target="_blank" href={to} { ...itemProps }></a> :\r
-  <NavLink exact={ exact } to={ to } activeClassName={ classes.active } { ...itemProps } />);\r
-\r
-  const ariaLabel = typeof Primary === 'string' ? toAriaLabel("link-to-"+Primary) : toAriaLabel("link-to-"+Primary.displayName);\r
-  return (\r
-       <>\r
-        <ListItem button component={ renderLink } aria-label={ariaLabel}>\r
-          { icon\r
-            ? <ListItemIcon>{ icon }</ListItemIcon>\r
-            : null\r
-          }\r
-        { typeof Primary === 'string'\r
-          ? <ListItemText primary={ Primary } style={{ padding: 0 }} /> \r
-          : <Primary />\r
-          }\r
-        </ListItem>\r
-        { Secondary \r
-          ? <Route exact={ exact } path={ to } component={ Secondary } />\r
-          : null\r
-        }\r
-      </>\r
-    );\r
-  }\r
-);\r
-\r
-export default ListItemLink;\r
-\r
+/**
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt odlux
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ */
+import * as React from 'react';
+import { NavLink, Link, Route } from 'react-router-dom';
+
+import ListItem from '@mui/material/ListItem';
+import ListItemIcon from '@mui/material/ListItemIcon';
+import ListItemText from '@mui/material/ListItemText';
+
+import { Theme } from '@mui/material/styles';
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
+import { toAriaLabel } from '../../utilities/yangHelper';
+
+const styles = (theme: Theme) => createStyles({
+  active: {
+    backgroundColor: theme.palette.action.selected
+  }
+});
+
+export interface IListItemLinkProps extends WithStyles<typeof styles> {
+  icon: JSX.Element | null;
+  primary: string | React.ComponentType;
+  secondary?: React.ComponentType;
+  to: string;
+  exact?: boolean;
+  external?: boolean;
+}
+
+export const ListItemLink = withStyles(styles)((props: IListItemLinkProps) => {
+  const { icon, primary: Primary, secondary: Secondary, classes, to, exact = false, external=false } = props;
+  const renderLink = (itemProps: any): JSX.Element => (
+    props.external ? <a target="_blank" href={to} { ...itemProps }></a> :
+  <NavLink exact={ exact } to={ to } activeClassName={ classes.active } { ...itemProps } />);
+
+  const ariaLabel = typeof Primary === 'string' ? toAriaLabel("link-to-"+Primary) : toAriaLabel("link-to-"+Primary.displayName);
+  return (
+       <>
+        <ListItem button component={ renderLink } aria-label={ariaLabel}>
+          { icon
+            ? <ListItemIcon>{ icon }</ListItemIcon>
+            : null
+          }
+        { typeof Primary === 'string'
+          ? <ListItemText primary={ Primary } style={{ padding: 0 }} /> 
+          : <Primary />
+          }
+        </ListItem>
+        { Secondary 
+          ? <Route exact={ exact } path={ to } component={ Secondary } />
+          : null
+        }
+      </>
+    );
+  }
+);
+
+export default ListItemLink;
+
index 5ab2fd4..bd523e1 100644 (file)
 
 import * as React from "react";
 
-import { WithStyles, withStyles, createStyles, Theme } from '@material-ui/core/styles';
+import { Theme } from '@mui/material/styles';
+
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
 
 const styles = (theme: Theme) => createStyles({
   "@keyframes spin": {
index 378d485..6d192d2 100644 (file)
@@ -1,73 +1,76 @@
-/**\r
- * ============LICENSE_START========================================================================\r
- * ONAP : ccsdk feature sdnr wt odlux\r
- * =================================================================================================\r
- * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.\r
- * =================================================================================================\r
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except\r
- * in compliance with the License. You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software distributed under the License\r
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\r
- * or implied. See the License for the specific language governing permissions and limitations under\r
- * the License.\r
- * ============LICENSE_END==========================================================================\r
- */\r
-import * as React from 'react';\r
-\r
-import { withStyles, Theme, WithStyles, createStyles } from '@material-ui/core/styles';\r
-\r
-import { ExpansionPanel, ExpansionPanelSummary, ExpansionPanelDetails, Typography, ExpansionPanelActions } from '@material-ui/core';\r
-\r
-import ExpandMoreIcon from '@material-ui/icons/ExpandMore';\r
-import { SvgIconProps } from '@material-ui/core/SvgIcon';\r
-\r
-const styles = (theme: Theme) => createStyles({\r
-  accordion: {\r
-    // background: theme.palette.secondary.dark,\r
-    // color: theme.palette.primary.contrastText\r
-  },\r
-  detail: {\r
-    // background: theme.palette.background.paper,\r
-    // color: theme.palette.text.primary,\r
-    position: "relative",\r
-    display: 'flex',\r
-    flexDirection: 'column'\r
-  },\r
-  text: {\r
-    // color: theme.palette.common.white,\r
-    // fontSize: "1rem"\r
-  },\r
-});\r
-\r
-type PanalProps = WithStyles<typeof styles> & {\r
-  activePanel: string | null,\r
-  panelId: string,\r
-  title: string,\r
-  customActionButtons?: JSX.Element[];\r
-  onToggle: (panelId: string | null) => void;\r
-}\r
-\r
-const PanelComponent: React.SFC<PanalProps> = (props) => {\r
-  const { classes, activePanel, onToggle } = props;\r
-  return (\r
-    <ExpansionPanel className={classes.accordion} expanded={activePanel === props.panelId} onChange={() => onToggle(props.panelId)} >\r
-      <ExpansionPanelSummary expandIcon={<ExpandMoreIcon />}>\r
-        <Typography className={classes.text} >{props.title}</Typography>\r
-      </ExpansionPanelSummary>\r
-      <ExpansionPanelDetails className={classes.detail}>\r
-        {props.children}\r
-      </ExpansionPanelDetails>\r
-      {props.customActionButtons\r
-        ? <ExpansionPanelActions>\r
-          {props.customActionButtons}\r
-        </ExpansionPanelActions>\r
-        : null}\r
-    </ExpansionPanel>\r
-  );\r
-};\r
-\r
-export const Panel = withStyles(styles)(PanelComponent);\r
+/**
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt odlux
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ */
+import * as React from 'react';
+
+import { Theme } from '@mui/material/styles';
+
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
+
+import { Accordion, AccordionSummary, AccordionDetails, Typography, AccordionActions } from '@mui/material';
+
+import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
+import { SvgIconProps } from '@mui/material/SvgIcon';
+
+const styles = (theme: Theme) => createStyles({
+  accordion: {
+    // background: theme.palette.secondary.dark,
+    // color: theme.palette.primary.contrastText
+  },
+  detail: {
+    // background: theme.palette.background.paper,
+    // color: theme.palette.text.primary,
+    position: "relative",
+    flexDirection: 'column'
+  },
+  text: {
+    // color: theme.palette.common.white,
+    // fontSize: "1rem"
+  },
+});
+
+type PanalProps = WithStyles<typeof styles> & {
+  activePanel: string | null,
+  panelId: string,
+  title: string,
+  customActionButtons?: JSX.Element[];
+  onToggle: (panelId: string | null) => void;
+}
+
+const PanelComponent: React.SFC<PanalProps> = (props) => {
+  const { classes, activePanel, onToggle } = props;
+  return (
+    <Accordion className={classes.accordion} expanded={activePanel === props.panelId} onChange={() => onToggle(props.panelId)} >
+      <AccordionSummary expandIcon={<ExpandMoreIcon />}>
+        <Typography className={classes.text} >{props.title}</Typography>
+      </AccordionSummary>
+      <AccordionDetails className={classes.detail}>
+        {props.children}
+      </AccordionDetails>
+      {props.customActionButtons
+        ? <AccordionActions>
+          {props.customActionButtons}
+        </AccordionActions>
+        : null}
+    </Accordion>
+  );
+};
+
+export const Panel = withStyles(styles)(PanelComponent);
 export default Panel;
\ No newline at end of file
index 1a29d69..54f14a7 100644 (file)
-/**\r
- * ============LICENSE_START========================================================================\r
- * ONAP : ccsdk feature sdnr wt odlux\r
- * =================================================================================================\r
- * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.\r
- * =================================================================================================\r
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except\r
- * in compliance with the License. You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software distributed under the License\r
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\r
- * or implied. See the License for the specific language governing permissions and limitations under\r
- * the License.\r
- * ============LICENSE_END==========================================================================\r
- */\r
-\r
-import * as React from 'react';\r
-import classNames from 'classnames';\r
-import { withStyles, WithStyles, Theme, createStyles } from '@material-ui/core/styles';\r
-import { fade } from '@material-ui/core/styles/colorManipulator';\r
-import ButtonBase from '@material-ui/core/ButtonBase';\r
-\r
-\r
-export const styles = (theme: Theme) => createStyles({\r
-    /* Styles applied to the root element. */\r
-    root: {\r
-        ...theme.typography.button,\r
-        height: 32,\r
-        minWidth: 48,\r
-        margin: 0,\r
-        padding: `${theme.spacing(1 - 4)}px ${theme.spacing(1.5)}px`,\r
-        borderRadius: 2,\r
-        willChange: 'opacity',\r
-        color: fade(theme.palette.action.active, 0.38),\r
-        '&:hover': {\r
-            textDecoration: 'none',\r
-            // Reset on mouse devices\r
-            backgroundColor: fade(theme.palette.text.primary, 0.12),\r
-            '@media (hover: none)': {\r
-                backgroundColor: 'transparent',\r
-            },\r
-            '&$disabled': {\r
-                backgroundColor: 'transparent',\r
-            },\r
-        },\r
-        '&:not(:first-child)': {\r
-            borderTopLeftRadius: 0,\r
-            borderBottomLeftRadius: 0,\r
-        },\r
-        '&:not(:last-child)': {\r
-            borderTopRightRadius: 0,\r
-            borderBottomRightRadius: 0,\r
-        },\r
-    },\r
-    /* Styles applied to the root element if `disabled={true}`. */\r
-    disabled: {\r
-        color: fade(theme.palette.action.disabled, 0.12),\r
-    },\r
-    /* Styles applied to the root element if `selected={true}`. */\r
-    selected: {\r
-        color: theme.palette.action.active,\r
-        '&:after': {\r
-            content: '""',\r
-            display: 'block',\r
-            position: 'absolute',\r
-            overflow: 'hidden',\r
-            borderRadius: 'inherit',\r
-            width: '100%',\r
-            height: '100%',\r
-            left: 0,\r
-            top: 0,\r
-            pointerEvents: 'none',\r
-            zIndex: 0,\r
-            backgroundColor: 'currentColor',\r
-            opacity: 0.38,\r
-        },\r
-        '& + &:before': {\r
-            content: '""',\r
-            display: 'block',\r
-            position: 'absolute',\r
-            overflow: 'hidden',\r
-            width: 1,\r
-            height: '100%',\r
-            left: 0,\r
-            top: 0,\r
-            pointerEvents: 'none',\r
-            zIndex: 0,\r
-            backgroundColor: 'currentColor',\r
-            opacity: 0.12,\r
-        },\r
-    },\r
-    /* Styles applied to the `label` wrapper element. */\r
-    label: {\r
-        width: '100%',\r
-        display: 'inherit',\r
-        alignItems: 'inherit',\r
-        justifyContent: 'inherit',\r
-    },\r
-});\r
-\r
-export type ToggleButtonClassKey = 'disabled' | 'root' | 'label' | 'selected';\r
-\r
-interface IToggleButtonProps extends WithStyles<typeof styles> {\r
-    className?: string;\r
-    component?: React.ReactType<IToggleButtonProps>;\r
-    disabled?: boolean;\r
-    disableFocusRipple?: boolean;\r
-    disableRipple?: boolean;\r
-    selected?: boolean;\r
-    type?: string;\r
-    value?: any;\r
-    onClick?: (event: React.FormEvent<HTMLElement>, value?: any) => void;\r
-    onChange?: (event: React.FormEvent<HTMLElement>, value?: any) => void;\r
-}\r
-\r
-class ToggleButtonComponent extends React.Component<IToggleButtonProps> {\r
-    handleChange = (event: React.FormEvent<HTMLElement>) => {\r
-        const { onChange, onClick, value } = this.props;\r
-\r
-        event.stopPropagation();\r
-        if (onClick) {\r
-            onClick(event, value);\r
-            if (event.isDefaultPrevented()) {\r
-                return;\r
-            }\r
-        }\r
-\r
-        if (onChange) {\r
-            onChange(event, value);\r
-        }\r
-        event.preventDefault();\r
-    };\r
-\r
-    render() {\r
-        const {\r
-            children,\r
-            className: classNameProp,\r
-            classes,\r
-            disableFocusRipple,\r
-            disabled,\r
-            selected,\r
-            ...other\r
-        } = this.props;\r
-\r
-        const className = classNames(\r
-            classes.root,\r
-            {\r
-                [classes.disabled]: disabled,\r
-                [classes.selected]: selected,\r
-            },\r
-            classNameProp,\r
-        );\r
-\r
-        return (\r
-            <ButtonBase\r
-                className={className}\r
-                disabled={disabled}\r
-                focusRipple={!disableFocusRipple}\r
-                onClick={this.handleChange}\r
-                href="#"\r
-                {...other}\r
-            >\r
-                <span className={classes.label}>{children}</span>\r
-            </ButtonBase>\r
-        );\r
-    }\r
-    public static defaultProps = {\r
-        disabled: false,\r
-        disableFocusRipple: false,\r
-        disableRipple: false,\r
-    };\r
-\r
-    public static muiName = 'ToggleButton';\r
-}\r
-\r
-export const ToggleButton = withStyles(styles, { name: 'MuiToggleButton' })(ToggleButtonComponent);\r
+/**
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt odlux
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ */
+
+import * as React from 'react';
+import classNames from 'classnames';
+import { Theme, alpha } from '@mui/material/styles';
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
+import ButtonBase from '@mui/material/ButtonBase';
+
+
+export const styles = (theme: Theme) => createStyles({
+    /* Styles applied to the root element. */
+    root: {
+        ...theme.typography.button,
+        height: 32,
+        minWidth: 48,
+        margin: 0,
+        padding: `${theme.spacing(1 - 4)} ${theme.spacing(1.5)}`,
+        borderRadius: 2,
+        willChange: 'opacity',
+        color: alpha(theme.palette.action.active, 0.38),
+        '&:hover': {
+            textDecoration: 'none',
+            // Reset on mouse devices
+            backgroundColor: alpha(theme.palette.text.primary, 0.12),
+            '@media (hover: none)': {
+                backgroundColor: 'transparent',
+            },
+            '&.Mui-disabled': {
+                backgroundColor: 'transparent',
+            },
+        },
+        '&:not(:first-child)': {
+            borderTopLeftRadius: 0,
+            borderBottomLeftRadius: 0,
+        },
+        '&:not(:last-child)': {
+            borderTopRightRadius: 0,
+            borderBottomRightRadius: 0,
+        },
+    },
+    /* Styles applied to the root element if `disabled={true}`. */
+    disabled: {
+        color: alpha(theme.palette.action.disabled, 0.12),
+    },
+    /* Styles applied to the root element if `selected={true}`. */
+    selected: {
+        color: theme.palette.action.active,
+        '&:after': {
+            content: '""',
+            display: 'block',
+            position: 'absolute',
+            overflow: 'hidden',
+            borderRadius: 'inherit',
+            width: '100%',
+            height: '100%',
+            left: 0,
+            top: 0,
+            pointerEvents: 'none',
+            zIndex: 0,
+            backgroundColor: 'currentColor',
+            opacity: 0.38,
+        },
+        '& + &:before': {
+            content: '""',
+            display: 'block',
+            position: 'absolute',
+            overflow: 'hidden',
+            width: 1,
+            height: '100%',
+            left: 0,
+            top: 0,
+            pointerEvents: 'none',
+            zIndex: 0,
+            backgroundColor: 'currentColor',
+            opacity: 0.12,
+        },
+    },
+    /* Styles applied to the `label` wrapper element. */
+    label: {
+        width: '100%',
+        display: 'inherit',
+        alignItems: 'inherit',
+        justifyContent: 'inherit',
+    },
+});
+
+export type ToggleButtonClassKey = 'disabled' | 'root' | 'label' | 'selected';
+
+interface IToggleButtonProps extends WithStyles<typeof styles> {
+    className?: string;
+    component?: React.ReactType<IToggleButtonProps>;
+    disabled?: boolean;
+    disableFocusRipple?: boolean;
+    disableRipple?: boolean;
+    selected?: boolean;
+    type?: string;
+    value?: any;
+    onClick?: (event: React.FormEvent<HTMLElement>, value?: any) => void;
+    onChange?: (event: React.FormEvent<HTMLElement>, value?: any) => void;
+}
+
+class ToggleButtonComponent extends React.Component<IToggleButtonProps> {
+    handleChange = (event: React.FormEvent<HTMLElement>) => {
+        const { onChange, onClick, value } = this.props;
+
+        event.stopPropagation();
+        if (onClick) {
+            onClick(event, value);
+            if (event.isDefaultPrevented()) {
+                return;
+            }
+        }
+
+        if (onChange) {
+            onChange(event, value);
+        }
+        event.preventDefault();
+    };
+
+    render() {
+        const {
+            children,
+            className: classNameProp,
+            classes,
+            disableFocusRipple,
+            disabled,
+            selected,
+            ...other
+        } = this.props;
+
+        const className = classNames(
+            classes.root,
+            {
+                [classes.disabled]: disabled,
+                [classes.selected]: selected,
+            },
+            classNameProp,
+        );
+
+        return (
+            <ButtonBase
+                className={className}
+                disabled={disabled}
+                focusRipple={!disableFocusRipple}
+                onClick={this.handleChange}
+                href="#"
+                {...other}
+            >
+                <span className={classes.label}>{children}</span>
+            </ButtonBase>
+        );
+    }
+    public static defaultProps = {
+        disabled: false,
+        disableFocusRipple: false,
+        disableRipple: false,
+    };
+
+    public static muiName = 'ToggleButton';
+}
+
+export const ToggleButton = withStyles(styles, { name: 'MuiToggleButton' })(ToggleButtonComponent);
 export default ToggleButton;
\ No newline at end of file
index 6460e8a..bdabe0d 100644 (file)
  */
 import * as React from 'react';
 import classNames from 'classnames';
-import { withStyles, WithStyles, Theme, createStyles } from '@material-ui/core/styles';
+import { Theme } from '@mui/material/styles';
+
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
 
 export const styles = (theme: Theme) => createStyles({
   /* Styles applied to the root element. */
index e62b424..5c23909 100644 (file)
  * ============LICENSE_END==========================================================================
  */
 import * as React from 'react';
-import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/styles';
+import { Theme } from '@mui/material/styles';
 
-import { List, ListItem, TextField, ListItemText, ListItemIcon, WithTheme, withTheme, Omit, Typography } from '@material-ui/core';
+import { makeStyles, WithStyles, WithTheme } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
 
-import { SvgIconProps } from '@material-ui/core/SvgIcon';
-import FileIcon from '@material-ui/icons/InsertDriveFile';
-import CloseIcon from '@material-ui/icons/ExpandLess';
-import OpenIcon from '@material-ui/icons/ExpandMore';
-import FolderIcon from '@material-ui/icons/Folder';
+import { List, ListItem, TextField, ListItemText, ListItemIcon, Typography } from '@mui/material';
+import { DistributiveOmit } from '@mui/types';
+
+import withTheme from '@mui/styles/withTheme';
+
+import { SvgIconProps } from '@mui/material/SvgIcon';
+import FileIcon from '@mui/icons-material/InsertDriveFile';
+import CloseIcon from '@mui/icons-material/ExpandLess';
+import OpenIcon from '@mui/icons-material/ExpandMore';
+import FolderIcon from '@mui/icons-material/Folder';
+
+declare module '@mui/styles/defaultTheme' {
+  // eslint-disable-next-line @typescript-eslint/no-empty-interface (remove this line if you don't have the rule enabled)
+  interface DefaultTheme extends Theme {}
+}
 
 const styles = (theme: Theme) => createStyles({
   root: {
@@ -33,7 +45,7 @@ const styles = (theme: Theme) => createStyles({
     paddingTop: 8,
   },
   search: {
-    padding: `0px ${theme.spacing(1)}px`
+    padding: `0px ${theme.spacing(1)}`
   }
 });
 
@@ -153,7 +165,7 @@ class TreeViewComponent<TData = { }> extends React.Component<TreeViewComponentPr
     return (
       <div className={this.props.className ? `${this.props.classes.root} ${this.props.className}` : this.props.classes.root} style={this.props.style}>
         {children}
-        {enableSearchBar && <TextField label={"Search"} inputProps={{'aria-label': 'treeview-searchfield'}} fullWidth={true} className={this.props.classes.search} value={searchTermValue} onKeyDown={this.onSearchKeyDown} onChange={this.onChangeSearchText} /> || null}
+        {enableSearchBar && <TextField variant="standard" label={"Search"} inputProps={{'aria-label': 'treeview-searchfield'}} fullWidth={true} className={this.props.classes.search} value={searchTermValue} onKeyDown={this.onSearchKeyDown} onChange={this.onChangeSearchText} /> || null}
         {enableSearchBar && (searchTerm === undefined || searchTerm.length===0 )&& <Typography style={{marginTop:'10px'}}>Please search for an inventory identifier or use *.</Typography>}
         <List>
           {this.renderItems(items, searchTerm && searchTerm.toLowerCase())}
@@ -187,10 +199,10 @@ class TreeViewComponent<TData = { }> extends React.Component<TreeViewComponentPr
 
     }, [] as JSX.Element[]);
   }
-  private renderItem = (item: ExternalTreeItem<TData>, searchTerm: string | undefined, depth: number, isFolder: boolean, expanded: boolean, forceRender: boolean): JSX.Element | null => {
+  private renderItem = (item: ExternalTreeItem<TData> , searchTerm: string | undefined, depth: number, isFolder: boolean, expanded: boolean, forceRender: boolean): JSX.Element | null => {  
     const styles = {
       item: {
-        paddingLeft: (((this.props.depthOffset || 0) + depth) * this.props.theme.spacing(3)),
+        paddingLeft: (((this.props.depthOffset || 0) + depth) * Number(this.props.theme.spacing(3).replace("px", ''))),
         backgroundColor: this.state.activeItem === item ? this.props.theme.palette.action.selected : undefined,
         height: this.props.itemHeight || undefined,
         cursor: item.disabled ? 'not-allowed' : 'pointer',
@@ -201,8 +213,17 @@ class TreeViewComponent<TData = { }> extends React.Component<TreeViewComponentPr
     };
 
     const text = item.content || ''; // need to keep track of search
-    const matchIndex = searchTerm ? text.toLowerCase().indexOf(searchTerm) : -1;
-    const searchTermLength = searchTerm && searchTerm.length || 0;
+    const search_array = searchTerm?.split("*");
+    const index = search_array?.findIndex(function (_str: String) {
+      return _str.length > 0;
+    }) || 0;
+    const firstSearchSubString = search_array ? search_array[index] : "";
+    const matchIndex = firstSearchSubString ? text.toLowerCase().indexOf(firstSearchSubString) : -1;
+
+    const hasStarInSearch = search_array ? search_array.length > 1 : false;
+    const isSearchStringWithStar = hasStarInSearch && firstSearchSubString?.length > 0 || false;
+
+    const searchTermLength = firstSearchSubString && firstSearchSubString.length || 0;
 
     const handleClickCreator = (isIcon: boolean) => (event: React.SyntheticEvent) => {
       if (item.disabled) return;
@@ -225,9 +246,8 @@ class TreeViewComponent<TData = { }> extends React.Component<TreeViewComponentPr
 
 
           { // highlight search result
-            matchIndex > -1
-              ? <ListItemText className={item.contentClass} primary={(<span>
-                {text.substring(0, matchIndex)}
+            isSearchStringWithStar && matchIndex > -1
+              ? <ListItemText className={item.contentClass} primary={(
                 <span
                   style={{
                     display: 'inline-block',
@@ -235,18 +255,29 @@ class TreeViewComponent<TData = { }> extends React.Component<TreeViewComponentPr
                     padding: '3px',
                   }}
                 >
-                  {text.substring(matchIndex, matchIndex + searchTermLength)}
-                </span>
-                {text.substring(matchIndex + searchTermLength)}
-              </span>)} />
-              : <ListItemText className={item.contentClass} primary={(
-                <span style={item.isMatch ? {
-                  display: 'inline-block',
-                  backgroundColor: 'rgba(255,235,59,0.5)',
-                  padding: '3px',
-                } : undefined}>
-                  {text} </span>
-              )} />
+                  {text}
+                </span>)} />
+              : matchIndex > -1
+                ? <ListItemText className={item.contentClass} primary={(<span>
+                  {text.substring(0, matchIndex)}
+                  <span
+                    style={{
+                      display: 'inline-block',
+                      backgroundColor: 'rgba(255,235,59,0.5)',
+                      padding: '3px',
+                    }}
+                  >
+                    {text.substring(matchIndex, matchIndex + searchTermLength)}
+                  </span>
+                  {text.substring(matchIndex + searchTermLength)}
+                </span>)} />
+                : <ListItemText className={item.contentClass} primary={(
+                  <span style={item.isMatch ? {
+                    display: 'inline-block',
+                    padding: '3px',
+                  } : undefined}>
+                    {text} </span>
+                )} />
           }
 
           { // display the right icon, depending on the state
@@ -343,7 +374,7 @@ class TreeViewComponent<TData = { }> extends React.Component<TreeViewComponentPr
   }
 }
 
-export type TreeViewCtorType<TData = { }> = new () => React.Component<Omit<TreeViewComponentProps<TData>, 'theme'|'classes'>>;
+export type TreeViewCtorType<TData = { }> = new () => React.Component<DistributiveOmit<TreeViewComponentProps<TData>, 'theme'|'classes'>>;
 
 export const TreeView = withTheme(withStyles(styles)(TreeViewComponent));
 export default TreeView;
\ No newline at end of file
index b50d680..1134e23 100644 (file)
-/**\r
- * ============LICENSE_START========================================================================\r
- * ONAP : ccsdk feature sdnr wt odlux\r
- * =================================================================================================\r
- * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.\r
- * =================================================================================================\r
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except\r
- * in compliance with the License. You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software distributed under the License\r
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\r
- * or implied. See the License for the specific language governing permissions and limitations under\r
- * the License.\r
- * ============LICENSE_END==========================================================================\r
- */\r
-import * as React from 'react';\r
-import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/styles';\r
-\r
-import { faHome, faAddressBook } from '@fortawesome/free-solid-svg-icons';\r
-\r
-import Drawer from '@material-ui/core/Drawer';\r
-import List from '@material-ui/core/List';\r
-\r
-import Divider from '@material-ui/core/Divider';\r
-\r
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r
-import { faProjectDiagram } from '@fortawesome/free-solid-svg-icons';\r
-\r
-import ListItemLink from '../components/material-ui/listItemLink';\r
-\r
-import connect, { Connect } from '../flux/connect';\r
-import { MenuAction } from '../actions/menuAction';\r
-import * as classNames from 'classnames';\r
-import { transportPCEUrl } from '../app';\r
-\r
-\r
-const drawerWidth = 240;\r
-\r
-const extraLinks = (window as any)._odluxExtraLinks as [string, string][];\r
-\r
-const styles = (theme: Theme) => createStyles({\r
-  drawerPaper: {\r
-    position: 'relative',\r
-    width: drawerWidth,\r
-  },\r
-  toolbar: theme.mixins.toolbar as any,\r
-\r
-  drawerOpen: {\r
-    width: drawerWidth,\r
-    transition: theme.transitions.create('width', {\r
-      easing: theme.transitions.easing.sharp,\r
-      duration: theme.transitions.duration.enteringScreen,\r
-    }),\r
-  },\r
-  drawerClose: {\r
-    transition: theme.transitions.create('width', {\r
-      easing: theme.transitions.easing.sharp,\r
-      duration: theme.transitions.duration.leavingScreen,\r
-    }),\r
-    overflowX: 'hidden',\r
-    width: theme.spacing(7) + 1,\r
-    [theme.breakpoints.up('sm')]: {\r
-      width: theme.spacing(9) + 1,\r
-    },\r
-  },\r
-  drawer: {\r
-\r
-  },\r
-  menu: {\r
-    flex: "1 0 0%",\r
-  },\r
-  optLinks: {\r
-    borderTop: "2px solid #cfcfcf",\r
-    display: "flex",\r
-    flexDirection: "row",\r
-    flexWrap: "wrap",\r
-    justifyContent: "space-around"\r
-  },\r
-  link: {\r
-    margin: theme.spacing(1)+1,\r
-    fontSize: theme.typography.fontSize-2,\r
-  },\r
-});\r
-\r
-const tabletWidthBreakpoint = 768;\r
-\r
-export const NavigationMenu = withStyles(styles)(connect()(({ classes, state, dispatch }: WithStyles<typeof styles> & Connect & Connect) => {\r
-  const { user } = state.framework.authenticationState;\r
-  const isOpen = state.framework.applicationState.isMenuOpen;\r
-  const closedByUser = state.framework.applicationState.isMenuClosedByUser;\r
-  const transportUrl = state.framework.applicationState.transportpceUrl;\r
-\r
-  const [responsive, setResponsive] = React.useState(false);\r
-\r
-  //collapse menu on mount if necessary\r
-  React.useEffect(()=>{\r
-\r
-    if(isOpen && window.innerWidth < tabletWidthBreakpoint){\r
-\r
-      setResponsive(true);\r
-      dispatch(new MenuAction(false));\r
-    }\r
-\r
-  },[]);\r
-\r
-  React.useEffect(() => {\r
-\r
-    function handleResize() {\r
-      if (user && user.isValid) {\r
-        if (window.innerWidth < tabletWidthBreakpoint && !responsive) {\r
-          setResponsive(true);\r
-          if (!closedByUser) {\r
-            console.log("responsive menu collapsed")\r
-            dispatch(new MenuAction(false));\r
-          }\r
-\r
-        } else if (window.innerWidth > tabletWidthBreakpoint && responsive) {\r
-          setResponsive(false);\r
-          if (!closedByUser) {\r
-            console.log("responsive menu restored")\r
-            dispatch(new MenuAction(true));\r
-          }\r
-\r
-        }\r
-      }\r
-    }\r
-    window.addEventListener("resize", handleResize);\r
-\r
-\r
-    return () => {\r
-      window.removeEventListener("resize", handleResize);\r
-    }\r
-  })\r
-\r
-  React.useEffect(()=>{\r
-    // trigger a resize if menu changed in case elements have to re-arrange\r
-    window.dispatchEvent(new Event('menu-resized'));\r
-  }, [isOpen])\r
-\r
-  let menuItems = state.framework.applicationRegistraion && Object.keys(state.framework.applicationRegistraion).map(key => {\r
-    const reg = state.framework.applicationRegistraion[key];\r
-    return reg && (\r
-      <ListItemLink\r
-        key={reg.name}\r
-        to={reg.path || `/${reg.name}`}\r
-        primary={reg.menuEntry || reg.name}\r
-        secondary={reg.subMenuEntry}\r
-        icon={reg.icon && <FontAwesomeIcon icon={reg.icon} /> || null} />\r
-    ) || null;\r
-  }) || null;\r
-\r
-  if(transportUrl.length>0){\r
-\r
-    const transportPCELink = <ListItemLink\r
-      key={"transportPCE"}\r
-      to={transportUrl}\r
-      primary={"TransportPCE"}\r
-      icon={<FontAwesomeIcon icon={faProjectDiagram} />}\r
-      external />;\r
-\r
-    const linkFound = menuItems.find(obj => obj.key === "linkCalculation");\r
-    \r
-    if (linkFound) {\r
-      const index = menuItems.indexOf(linkFound);\r
-      menuItems.splice(index + 1, 0, transportPCELink);\r
-    } else {\r
-      menuItems.push(transportPCELink);\r
-    }\r
-  }\r
-  \r
-\r
-  return (\r
-    <Drawer\r
-      variant="permanent"\r
-      className={\r
-        classNames(classes.drawer, {\r
-          [classes.drawerOpen]: isOpen,\r
-          [classes.drawerClose]: !isOpen\r
-        })\r
-      }\r
-      classes={{\r
-        paper: classes.drawerPaper,\r
-      }}\r
-    >\r
-      {user && user.isValid && <>\r
-        <div className={classes.toolbar} />\r
-        { /* https://fiffty.github.io/react-treeview-mui/ */}\r
-        <List className={classes.menu} component="nav">\r
-          <ListItemLink exact to="/" primary="Home" icon={<FontAwesomeIcon icon={faHome} />} />\r
-          <Divider />\r
-          {\r
-          menuItems\r
-          }\r
-          <Divider />\r
-          <ListItemLink to="/about" primary="About" icon={<FontAwesomeIcon icon={faAddressBook} />} />\r
-          {(false && process.env.NODE_ENV === "development")\r
-            ? <>\r
-              <Divider />\r
-              <ListItemLink to="/test" primary="Test" icon={<FontAwesomeIcon icon={faHome} />} />\r
-            </>\r
-            : null\r
-          }\r
-        </List>\r
-        {isOpen && extraLinks && <div className={classes.optLinks}>\r
-          {extraLinks.map(linkInfo => (<a className={classes.link} href={linkInfo[1]}>{linkInfo[0]}</a>))}\r
-        </div> || null}\r
-      </> || null\r
-      }\r
-    </Drawer>)\r
-}));\r
-\r
+/**
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt odlux
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ */
+import * as React from 'react';
+import { Theme } from '@mui/material/styles';
+
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
+
+import { faHome, faAddressBook } from '@fortawesome/free-solid-svg-icons';
+
+import Drawer from '@mui/material/Drawer';
+import List from '@mui/material/List';
+
+import Divider from '@mui/material/Divider';
+
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import { faProjectDiagram } from '@fortawesome/free-solid-svg-icons';
+
+import ListItemLink from '../components/material-ui/listItemLink';
+
+import connect, { Connect } from '../flux/connect';
+import { MenuAction } from '../actions/menuAction';
+import * as classNames from 'classnames';
+import { transportPCEUrl } from '../app';
+
+
+const drawerWidth = 240;
+
+const extraLinks = (window as any)._odluxExtraLinks as [string, string][];
+
+const styles = (theme: Theme) => createStyles({
+  drawerPaper: {
+    position: 'relative',
+    width: drawerWidth,
+  },
+  toolbar: theme.mixins.toolbar as any,
+
+  drawerOpen: {
+    width: drawerWidth,
+    transition: theme.transitions.create('width', {
+      easing: theme.transitions.easing.sharp,
+      duration: theme.transitions.duration.enteringScreen,
+    }),
+  },
+  drawerClose: {
+    transition: theme.transitions.create('width', {
+      easing: theme.transitions.easing.sharp,
+      duration: theme.transitions.duration.leavingScreen,
+    }),
+    overflowX: 'hidden',
+    width: theme.spacing(7) + 1,
+    [theme.breakpoints.up('sm')]: {
+      width: theme.spacing(9) + 1,
+    },
+  },
+  drawer: {
+
+  },
+  menu: {
+    flex: "1 0 0%",
+  },
+  optLinks: {
+    borderTop: "2px solid #cfcfcf",
+    display: "flex",
+    flexDirection: "row",
+    flexWrap: "wrap",
+    justifyContent: "space-around"
+  },
+  link: {
+    margin: theme.spacing(1)+1,
+    fontSize: theme.typography.fontSize-2,
+  },
+});
+
+const tabletWidthBreakpoint = 768;
+
+export const NavigationMenu = withStyles(styles)(connect()(({ classes, state, dispatch }: WithStyles<typeof styles> & Connect & Connect) => {
+  const { user } = state.framework.authenticationState;
+  const isOpen = state.framework.applicationState.isMenuOpen;
+  const closedByUser = state.framework.applicationState.isMenuClosedByUser;
+  const transportUrl = state.framework.applicationState.transportpceUrl;
+
+  const [responsive, setResponsive] = React.useState(false);
+
+  //collapse menu on mount if necessary
+  React.useEffect(()=>{
+
+    if(isOpen && window.innerWidth < tabletWidthBreakpoint){
+
+      setResponsive(true);
+      dispatch(new MenuAction(false));
+    }
+
+  },[]);
+
+  React.useEffect(() => {
+
+    function handleResize() {
+      if (user && user.isValid) {
+        if (window.innerWidth < tabletWidthBreakpoint && !responsive) {
+          setResponsive(true);
+          if (!closedByUser) {
+            console.log("responsive menu collapsed")
+            dispatch(new MenuAction(false));
+          }
+
+        } else if (window.innerWidth > tabletWidthBreakpoint && responsive) {
+          setResponsive(false);
+          if (!closedByUser) {
+            console.log("responsive menu restored")
+            dispatch(new MenuAction(true));
+          }
+
+        }
+      }
+    }
+    window.addEventListener("resize", handleResize);
+
+
+    return () => {
+      window.removeEventListener("resize", handleResize);
+    }
+  })
+
+  React.useEffect(()=>{
+    // trigger a resize if menu changed in case elements have to re-arrange
+    window.dispatchEvent(new Event('menu-resized'));
+  }, [isOpen])
+
+  let menuItems = state.framework.applicationRegistraion && Object.keys(state.framework.applicationRegistraion).map(key => {
+    const reg = state.framework.applicationRegistraion[key];
+    return reg && (
+      <ListItemLink
+        key={reg.name}
+        to={reg.path || `/${reg.name}`}
+        primary={reg.menuEntry || reg.name}
+        secondary={reg.subMenuEntry}
+        icon={reg.icon && <FontAwesomeIcon icon={reg.icon} /> || null} />
+    ) || null;
+  }) || null;
+
+  if(transportUrl.length>0){
+
+    const transportPCELink = <ListItemLink
+      key={"transportPCE"}
+      to={transportUrl}
+      primary={"TransportPCE"}
+      icon={<FontAwesomeIcon icon={faProjectDiagram} />}
+      external />;
+
+    const linkFound = menuItems.find(obj => obj.key === "linkCalculation");
+    
+    if (linkFound) {
+      const index = menuItems.indexOf(linkFound);
+      menuItems.splice(index + 1, 0, transportPCELink);
+    } else {
+      menuItems.push(transportPCELink);
+    }
+  }
+  
+
+  return (
+    <Drawer
+      variant="permanent"
+      className={
+        classNames(classes.drawer, {
+          [classes.drawerOpen]: isOpen,
+          [classes.drawerClose]: !isOpen
+        })
+      }
+      classes={{
+        paper: classes.drawerPaper,
+      }}
+    >
+      {user && user.isValid && <>
+        <div className={classes.toolbar} />
+        { /* https://fiffty.github.io/react-treeview-mui/ */}
+        <List className={classes.menu} component="nav">
+          <ListItemLink exact to="/" primary="Home" icon={<FontAwesomeIcon icon={faHome} />} />
+          <Divider />
+          {
+          menuItems
+          }
+          <Divider />
+          <ListItemLink to="/about" primary="About" icon={<FontAwesomeIcon icon={faAddressBook} />} />
+          {(false && process.env.NODE_ENV === "development")
+            ? <>
+              <Divider />
+              <ListItemLink to="/test" primary="Test" icon={<FontAwesomeIcon icon={faHome} />} />
+            </>
+            : null
+          }
+        </List>
+        {isOpen && extraLinks && <div className={classes.optLinks}>
+          {extraLinks.map(linkInfo => (<a className={classes.link} href={linkInfo[1]}>{linkInfo[0]}</a>))}
+        </div> || null}
+      </> || null
+      }
+    </Drawer>)
+}));
+
 export default NavigationMenu;
\ No newline at end of file
index d2de7cc..10a0547 100644 (file)
@@ -17,7 +17,7 @@
  */
 
 import * as React from "react";
-import { makeStyles } from '@material-ui/core/styles';
+import makeStyles from '@mui/styles/makeStyles';
 
 export const getTypeName = (obj: any): string => {
   if (obj == null) {
index d212257..d055b8a 100644 (file)
@@ -1,55 +1,55 @@
-/**\r
- * ============LICENSE_START========================================================================\r
- * ONAP : ccsdk feature sdnr wt odlux\r
- * =================================================================================================\r
- * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.\r
- * =================================================================================================\r
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except\r
- * in compliance with the License. You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software distributed under the License\r
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\r
- * or implied. See the License for the specific language governing permissions and limitations under\r
- * the License.\r
- * ============LICENSE_END==========================================================================\r
- */\r
-import * as React from 'react';\r
-\r
-import connect, { Connect } from '../../flux/connect';\r
-\r
-import { SetTitleAction } from '../../actions/titleActions';\r
-import { AddErrorInfoAction } from '../../actions/errorActions';\r
-\r
-import { IconType } from '../../models/iconDefinition';\r
-\r
-export interface IAppFrameProps  {\r
-  title: string;\r
-  icon?: IconType;\r
-  appId?: string\r
-}\r
-\r
-/**\r
- * Represents a component to wich will embed each single app providing the\r
- * functionality to update the title and implement an exeprion border.\r
- */\r
-export class AppFrame extends React.Component<IAppFrameProps & Connect> {\r
-\r
-  public render(): JSX.Element {\r
-    return (\r
-      <div style={{ flex: "1", overflow: "hidden", display: "flex", flexDirection: "column" }}>\r
-        { this.props.children }\r
-      </div>\r
-     )\r
-    }\r
-\r
-  public componentDidMount() {\r
-    this.props.dispatch(new SetTitleAction(this.props.title, this.props.icon, this.props.appId));\r
-  }\r
-  public componentDidCatch(error: Error | null, info: object) {\r
-    this.props.dispatch(new AddErrorInfoAction({ error, info }));\r
-  }\r
-}\r
-\r
+/**
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt odlux
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ */
+import * as React from 'react';
+
+import connect, { Connect } from '../../flux/connect';
+
+import { SetTitleAction } from '../../actions/titleActions';
+import { AddErrorInfoAction } from '../../actions/errorActions';
+
+import { IconType } from '../../models/iconDefinition';
+
+export interface IAppFrameProps  {
+  title: string;
+  icon?: IconType;
+  appId?: string
+}
+
+/**
+ * Represents a component to wich will embed each single app providing the
+ * functionality to update the title and implement an exeprion border.
+ */
+export class AppFrame extends React.Component<IAppFrameProps & Connect> {
+
+  public render(): JSX.Element {
+    return (
+      <div style={{ flex: "1", overflow: "hidden", display: "flex", flexDirection: "column" }}>
+        { this.props.children }
+      </div>
+     )
+    }
+
+  public componentDidMount() {
+    this.props.dispatch(new SetTitleAction(this.props.title, this.props.icon, this.props.appId));
+  }
+  public componentDidCatch(error: Error | null, info: object) {
+    this.props.dispatch(new AddErrorInfoAction({ error, info }));
+  }
+}
+
 export default connect()(AppFrame);
\ No newline at end of file
index ca18490..90f15c1 100644 (file)
@@ -16,7 +16,8 @@
  * ============LICENSE_END==========================================================================
  */
 
-import { Button, FormControlLabel, makeStyles, Switch, Typography } from '@material-ui/core';
+import { Button, FormControlLabel, Switch, Typography } from '@mui/material';
+import makeStyles from '@mui/styles/makeStyles';
 import { SettingsComponentProps } from '../../models/settings';
 import * as React from 'react';
 import connect, { Connect, IDispatcher } from '../../flux/connect';
@@ -94,13 +95,13 @@ const onCancel = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) =>{
         </Typography>
         <FormControlLabel style={{ padding:5}}
         value="end"
-        control={<Switch color="secondary" checked={areWebsocketsEnabled} onChange={onWebsocketsChange} />}
+        control={<Switch color="secondary" aria-label="enable-notifications-button" aria-checked={areWebsocketsEnabled} checked={areWebsocketsEnabled} onChange={onWebsocketsChange} />}
         label="Enable Notifications"
         labelPlacement="end"
       />
       <div className={classes.buttonPosition}>
-       <Button className={classes.elementMargin} variant="contained" color="primary" onClick={onCancel}>Cancel</Button>
-       <Button className={classes.elementMargin} variant="contained" color="secondary" onClick={onSave}>Save</Button>
+       <Button aria-label="cancel-button" className={classes.elementMargin} variant="contained" color="primary" onClick={onCancel}>Cancel</Button>
+       <Button aria-label="save-button" className={classes.elementMargin} variant="contained" color="secondary" onClick={onSave}>Save</Button>
     </div>
     </div>
 }
index 5d916e8..7872e51 100644 (file)
-/**\r
- * ============LICENSE_START========================================================================\r
- * ONAP : ccsdk feature sdnr wt odlux\r
- * =================================================================================================\r
- * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.\r
- * =================================================================================================\r
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except\r
- * in compliance with the License. You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software distributed under the License\r
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\r
- * or implied. See the License for the specific language governing permissions and limitations under\r
- * the License.\r
- * ============LICENSE_END==========================================================================\r
- */\r
-import * as React from 'react';\r
-import { withRouter, RouteComponentProps } from 'react-router-dom';\r
-\r
-import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/styles';\r
-import AppBar from '@material-ui/core/AppBar';\r
-import Toolbar from '@material-ui/core/Toolbar';\r
-import Typography from '@material-ui/core/Typography';\r
-import Button from '@material-ui/core/Button';\r
-import IconButton from '@material-ui/core/IconButton';\r
-import Block from '@material-ui/icons/Block';\r
-import Adjust from '@material-ui/icons/Adjust';\r
-import MenuIcon from '@material-ui/icons/Menu';\r
-import AccountCircle from '@material-ui/icons/AccountCircle';\r
-import MenuItem from '@material-ui/core/MenuItem';\r
-import Menu from '@material-ui/core/Menu';\r
-\r
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r
-import { faBan } from '@fortawesome/free-solid-svg-icons';\r
-import { faDotCircle } from '@fortawesome/free-solid-svg-icons';\r
-\r
-import { logoutUser } from '../actions/authentication';\r
-import { PushAction, ReplaceAction } from '../actions/navigationActions';\r
-\r
-import connect, { Connect, IDispatcher } from '../flux/connect';\r
-import Logo from './logo';\r
-import { MenuAction, MenuClosedByUser } from '../actions/menuAction';\r
-\r
-const styles = (theme: Theme) => createStyles({\r
-  appBar: {\r
-    zIndex: theme.zIndex.drawer + 1,\r
-  },\r
-  grow: {\r
-    flexGrow: 1,\r
-  },\r
-  menuButton: {\r
-    marginLeft: -12,\r
-    marginRight: 20,\r
-  },\r
-  icon: {\r
-    marginLeft: 16,\r
-    marginRight: 8\r
-  },\r
-  connected: {\r
-    color: "green"\r
-  },\r
-  notConnected: {\r
-    color: "red"\r
-  },\r
-  notificationInfo: {\r
-    marginLeft: 5\r
-  }\r
-});\r
-\r
-const mapDispatch = (dispatcher: IDispatcher) => {\r
-  return {\r
-    logout: () => {\r
-      dispatcher.dispatch(logoutUser());\r
-      dispatcher.dispatch(new ReplaceAction("/login"));\r
-    },\r
-    openSettings : () =>{\r
-      dispatcher.dispatch(new PushAction("/settings"));\r
-    },\r
-    toggleMainMenu: (value: boolean, value2: boolean) => {\r
-      dispatcher.dispatch(new MenuAction(value));\r
-      dispatcher.dispatch(new MenuClosedByUser(value2))\r
-    }\r
-  }\r
-};\r
-\r
-type TitleBarProps = RouteComponentProps<{}> & WithStyles<typeof styles> & Connect<undefined, typeof mapDispatch>\r
-\r
-class TitleBarComponent extends React.Component<TitleBarProps, { anchorEl: HTMLElement | null }> {\r
-\r
-  constructor(props: TitleBarProps) {\r
-    super(props);\r
-    this.state = {\r
-      anchorEl: null\r
-    }\r
-\r
-  }\r
-  render(): JSX.Element {\r
-    const { classes, state, history, location } = this.props;\r
-    const open = !!this.state.anchorEl;\r
-    let toolbarElements: Array<JSX.Element>;\r
-    toolbarElements = [];\r
-\r
-    // create notificationInfo element\r
-    const notificationInfo = state.framework.applicationState.isWebsocketAvailable != undefined ?\r
-      (state.framework.applicationState.isWebsocketAvailable ?\r
-        <Typography aria-label="notifications-are-active" variant="body1" className={classes.notificationInfo}>Notifications <FontAwesomeIcon className={classes.connected} icon={faDotCircle} />  |</Typography> : <Typography aria-label="notifications-are-inactive" variant="body1" className={classes.notificationInfo}>Notifications <FontAwesomeIcon className={classes.notConnected} icon={faBan} /> |</Typography>)\r
-      : <Typography variant="body1" aria-label="notifications-are-not-available" className={classes.notificationInfo}>Notifications N/A |</Typography>;\r
-\r
-\r
-    // add notificationInfo element before help\r
-    if (state.framework.applicationRegistraion) {\r
-      let isNotificationInfoAdded = false;\r
-      Object.keys(state.framework.applicationRegistraion).map(key => {\r
-        const reg = state.framework.applicationRegistraion[key];\r
-        if (reg && reg.statusBarElement) {\r
-          if (key === "help") {\r
-            isNotificationInfoAdded = true;\r
-            toolbarElements.push(notificationInfo);\r
-          }\r
-          toolbarElements.push(<reg.statusBarElement key={key} />);\r
-        }\r
-      });\r
-\r
-      // add notificationInfo in case help wasn't found\r
-      if (!isNotificationInfoAdded) {\r
-        toolbarElements.push(notificationInfo);\r
-      }\r
-    }\r
-\r
-    return (\r
-      <AppBar position="absolute" className={classes.appBar}>\r
-        <Toolbar>\r
-          <IconButton className={classes.menuButton} color="inherit" aria-label="Menu" onClick={this.toggleMainMenu}>\r
-            <MenuIcon />\r
-          </IconButton>\r
-          <Logo />\r
-          <Typography variant="h6" color="inherit" >\r
-            {state.framework.applicationState.icon\r
-              ? (<FontAwesomeIcon className={classes.icon} icon={state.framework.applicationState.icon} />)\r
-              : null}\r
-            {state.framework.applicationState.title}\r
-          </Typography>\r
-          <div className={classes.grow}></div>\r
-          {\r
-            // render toolbar\r
-            toolbarElements.map((item) => {\r
-              return item\r
-            })\r
-          }\r
-\r
-          {state.framework.authenticationState.user\r
-            ? (<div>\r
-              <Button aria-label="current user menu button"\r
-                aria-owns={open ? 'menu-appbar' : undefined}\r
-                aria-haspopup="true"\r
-                onClick={this.openMenu}\r
-                color="inherit"\r
-              >\r
-                <AccountCircle />\r
-                {state.framework.authenticationState.user.user}\r
-              </Button>\r
-              <Menu\r
-                id="menu-appbar"\r
-                anchorEl={this.state.anchorEl}\r
-                anchorOrigin={{\r
-                  vertical: 'top',\r
-                  horizontal: 'right',\r
-                }}\r
-                transformOrigin={{\r
-                  vertical: 'top',\r
-                  horizontal: 'right',\r
-                }}\r
-                open={open}\r
-                onClose={this.closeMenu}\r
-              >\r
-                {/* <MenuItem onClick={ this.closeMenu }>Profile</MenuItem> */}\r
-                <MenuItem \r
-                 aria-label="settings-button"\r
-                 onClick={ () =>{\r
-                    this.props.openSettings();\r
-                    this.closeMenu(); }}>Settings</MenuItem>\r
-                <MenuItem\r
-                aria-label="logout-button"\r
-                onClick={() => {\r
-                  this.props.logout();\r
-                  this.closeMenu();\r
-                }}>Logout</MenuItem>\r
-              </Menu>\r
-            </div>)\r
-            : (<Button onClick={() => { history.push('/login') }} color="inherit" disabled={location.pathname == "/login"}>Login</Button>)}\r
-        </Toolbar>\r
-      </AppBar>\r
-    );\r
-  };\r
-\r
-  private toggleMainMenu = (event: React.MouseEvent<HTMLElement>) => {\r
-    console.log(this.props);\r
-    if (this.props.state.framework.authenticationState.user && this.props.state.framework.authenticationState.user.isValid) {\r
-      const isMainMenuOpen = this.props.state.framework.applicationState.isMenuOpen\r
-      const isClosedByUser = this.props.state.framework.applicationState.isMenuClosedByUser\r
-      this.props.toggleMainMenu(!isMainMenuOpen, !isClosedByUser);\r
-    }\r
-  }\r
-\r
-  private openMenu = (event: React.MouseEvent<HTMLElement>) => {\r
-    this.setState({ anchorEl: event.currentTarget });\r
-  };\r
-\r
-  private closeMenu = () => {\r
-    this.setState({ anchorEl: null });\r
-  };\r
-}\r
-\r
-//todo: ggf. https://github.com/acdlite/recompose verwenden zur Vereinfachung\r
-\r
-export const TitleBar = withStyles(styles)(withRouter(connect(undefined, mapDispatch)(TitleBarComponent)));\r
+/**
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt odlux
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ */
+import * as React from 'react';
+import { withRouter, RouteComponentProps } from 'react-router-dom';
+
+import { Theme } from '@mui/material/styles';
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
+import AppBar from '@mui/material/AppBar';
+import Toolbar from '@mui/material/Toolbar';
+import Typography from '@mui/material/Typography';
+import Button from '@mui/material/Button';
+import IconButton from '@mui/material/IconButton';
+import Block from '@mui/icons-material/Block';
+import Adjust from '@mui/icons-material/Adjust';
+import MenuIcon from '@mui/icons-material/Menu';
+import AccountCircle from '@mui/icons-material/AccountCircle';
+import MenuItem from '@mui/material/MenuItem';
+import Menu from '@mui/material/Menu';
+
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import { faBan } from '@fortawesome/free-solid-svg-icons';
+import { faDotCircle } from '@fortawesome/free-solid-svg-icons';
+
+import { logoutUser } from '../actions/authentication';
+import { PushAction, ReplaceAction } from '../actions/navigationActions';
+
+import connect, { Connect, IDispatcher } from '../flux/connect';
+import Logo from './logo';
+import { MenuAction, MenuClosedByUser } from '../actions/menuAction';
+
+const styles = (theme: Theme) => createStyles({
+  appBar: {
+    zIndex: theme.zIndex.drawer + 1,
+  },
+  grow: {
+    flexGrow: 1,
+  },
+  menuButton: {
+    marginLeft: -12,
+    marginRight: 20,
+  },
+  icon: {
+    marginLeft: 16,
+    marginRight: 8
+  },
+  connected: {
+    color: "green"
+  },
+  notConnected: {
+    color: "red"
+  },
+  notificationInfo: {
+    marginLeft: 5
+  }
+});
+
+const mapDispatch = (dispatcher: IDispatcher) => {
+  return {
+    logout: () => {
+      dispatcher.dispatch(logoutUser());
+      dispatcher.dispatch(new ReplaceAction("/login"));
+    },
+    openSettings : () =>{
+      dispatcher.dispatch(new PushAction("/settings"));
+    },
+    toggleMainMenu: (value: boolean, value2: boolean) => {
+      dispatcher.dispatch(new MenuAction(value));
+      dispatcher.dispatch(new MenuClosedByUser(value2))
+    }
+  }
+};
+
+type TitleBarProps = RouteComponentProps<{}> & WithStyles<typeof styles> & Connect<undefined, typeof mapDispatch>
+
+class TitleBarComponent extends React.Component<TitleBarProps, { anchorEl: HTMLElement | null }> {
+
+  constructor(props: TitleBarProps) {
+    super(props);
+    this.state = {
+      anchorEl: null
+    }
+
+  }
+  render(): JSX.Element {
+    const { classes, state, history, location } = this.props;
+    const open = !!this.state.anchorEl;
+    let toolbarElements: Array<JSX.Element>;
+    toolbarElements = [];
+
+    // create notificationInfo element
+    const notificationInfo = state.framework.applicationState.isWebsocketAvailable != undefined ?
+      (state.framework.applicationState.isWebsocketAvailable ?
+        <Typography aria-label="notifications-are-active" variant="body1" className={classes.notificationInfo}>Notifications <FontAwesomeIcon className={classes.connected} icon={faDotCircle} />  |</Typography> : <Typography aria-label="notifications-are-inactive" variant="body1" className={classes.notificationInfo}>Notifications <FontAwesomeIcon className={classes.notConnected} icon={faBan} /> |</Typography>)
+      : <Typography variant="body1" aria-label="notifications-are-not-available" className={classes.notificationInfo}>Notifications N/A |</Typography>;
+
+
+    // add notificationInfo element before help
+    if (state.framework.applicationRegistraion) {
+      let isNotificationInfoAdded = false;
+      Object.keys(state.framework.applicationRegistraion).map(key => {
+        const reg = state.framework.applicationRegistraion[key];
+        if (reg && reg.statusBarElement) {
+          if (key === "help") {
+            isNotificationInfoAdded = true;
+            toolbarElements.push(notificationInfo);
+          }
+          toolbarElements.push(<reg.statusBarElement key={key} />);
+        }
+      });
+
+      // add notificationInfo in case help wasn't found
+      if (!isNotificationInfoAdded) {
+        toolbarElements.push(notificationInfo);
+      }
+    }
+
+    return (
+      <AppBar enableColorOnDark position="absolute" className={classes.appBar}>
+        <Toolbar>
+          <IconButton
+            className={classes.menuButton}
+            color="inherit"
+            aria-label="Menu"
+            onClick={this.toggleMainMenu}
+            size="large">
+            <MenuIcon />
+          </IconButton>
+          <Logo />
+          <Typography variant="h6" color="inherit" >
+            {state.framework.applicationState.icon
+              ? (<FontAwesomeIcon className={classes.icon} icon={state.framework.applicationState.icon} />)
+              : null}
+            {state.framework.applicationState.title}
+          </Typography>
+          <div className={classes.grow}></div>
+          {
+            // render toolbar
+            toolbarElements.map((item) => {
+              return item
+            })
+          }
+
+          {state.framework.authenticationState.user
+            ? (<div>
+              <Button aria-label="current user menu button"
+                aria-owns={open ? 'menu-appbar' : undefined}
+                aria-haspopup="true"
+                onClick={this.openMenu}
+                color="inherit"
+              >
+                <AccountCircle />
+                {state.framework.authenticationState.user.user}
+              </Button>
+              <Menu
+                id="menu-appbar"
+                anchorEl={this.state.anchorEl}
+                anchorOrigin={{
+                  vertical: 'top',
+                  horizontal: 'right',
+                }}
+                transformOrigin={{
+                  vertical: 'top',
+                  horizontal: 'right',
+                }}
+                open={open}
+                onClose={this.closeMenu}
+              >
+                {/* <MenuItem onClick={ this.closeMenu }>Profile</MenuItem> */}
+                <MenuItem 
+                 aria-label="settings-button"
+                 onClick={ () =>{
+                    this.props.openSettings();
+                    this.closeMenu(); }}>Settings</MenuItem>
+                <MenuItem
+                aria-label="logout-button"
+                onClick={() => {
+                  this.props.logout();
+                  this.closeMenu();
+                }}>Logout</MenuItem>
+              </Menu>
+            </div>)
+            : (<Button onClick={() => { history.push('/login') }} color="inherit" disabled={location.pathname == "/login"}>Login</Button>)}
+        </Toolbar>
+      </AppBar>
+    );
+  };
+
+  private toggleMainMenu = (event: React.MouseEvent<HTMLElement>) => {
+    console.log(this.props);
+    if (this.props.state.framework.authenticationState.user && this.props.state.framework.authenticationState.user.isValid) {
+      const isMainMenuOpen = this.props.state.framework.applicationState.isMenuOpen
+      const isClosedByUser = this.props.state.framework.applicationState.isMenuClosedByUser
+      this.props.toggleMainMenu(!isMainMenuOpen, !isClosedByUser);
+    }
+  }
+
+  private openMenu = (event: React.MouseEvent<HTMLElement>) => {
+    this.setState({ anchorEl: event.currentTarget });
+  };
+
+  private closeMenu = () => {
+    this.setState({ anchorEl: null });
+  };
+}
+
+//todo: ggf. https://github.com/acdlite/recompose verwenden zur Vereinfachung
+
+export const TitleBar = withStyles(styles)(withRouter(connect(undefined, mapDispatch)(TitleBarComponent)));
 export default TitleBar;
\ No newline at end of file
index 59b8c20..c4a8118 100644 (file)
  * limitations under the License.
  *****************************************************************************/
 
-import { createMuiTheme } from '@material-ui/core/styles';
+import { createTheme, adaptV4Theme } from '@mui/material/styles';
 import onapLogo from '../assets/images/onapLogo.gif'
 
-const theme = createMuiTheme({
+const theme = createTheme(adaptV4Theme({
   design: {
     id: "onap",
     name: "Open Networking Automation Plattform (ONAP)",
@@ -60,7 +60,7 @@ const theme = createMuiTheme({
   overrides: { //temp fix for labels turning white after material new version (palette primary color)
     MuiFormLabel: {
       root: {
-        "&$focused": {
+        "&.Mui-focused": {
           color: "rgba(143,143,143,1)"
         }
       },
@@ -76,6 +76,6 @@ const theme = createMuiTheme({
       }
     }
   },
-});
+}));
 
 export default theme;
\ No newline at end of file
index 94350ab..5f3eed5 100644 (file)
@@ -60,11 +60,11 @@ const routerMiddlewareCreator = (history: History) => () => (next: Dispatch): Di
       if (tokenStr && token) {
         // @ts-ignore
         const user = new User({ username: token["name"], access_token: tokenStr, token_type: "Bearer", expires: token['exp'], issued: token['iat'] }) || undefined;
-        return next(loginUserAction(user)) as any;
+        applicationStore?.dispatch(loginUserAction(user));
       }
     } if (!action.pathname.startsWith("/login") && applicationStore && (!applicationStore.state.framework.authenticationState.user || !applicationStore.state.framework.authenticationState.user.isValid)) {
       history.replace(`/login?returnTo=${action.pathname}`);
-      return next(logoutUser()) as any;
+      applicationStore.dispatch(logoutUser());
     
     }else if (action.pathname.startsWith("/login") && applicationStore && (applicationStore.state.framework.authenticationState.user && applicationStore.state.framework.authenticationState.user.isValid)) {
       history.replace(`/`);
index b5f2509..41d29fb 100644 (file)
@@ -1,61 +1,61 @@
-/**\r
- * ============LICENSE_START========================================================================\r
- * ONAP : ccsdk feature sdnr wt odlux\r
- * =================================================================================================\r
- * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.\r
- * =================================================================================================\r
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except\r
- * in compliance with the License. You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software distributed under the License\r
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\r
- * or implied. See the License for the specific language governing permissions and limitations under\r
- * the License.\r
- * ============LICENSE_END==========================================================================\r
- */\r
-export type Result<TSource extends {}> = {\r
-  "data-provider:output": {\r
-    pagination?: {\r
-      size: number;\r
-      page: number;\r
-      total: number;\r
-    },\r
-    data: TSource[];\r
-  }\r
-}\r
-\r
-export type SingeResult<TSource extends {}> = {\r
-  "data-provider:output": TSource;\r
-}\r
-\r
-\r
-export type HitEntry<TSource extends {}> = {\r
-  _index: string;\r
-  _type: string;\r
-  _id: string;\r
-  _score: number;\r
-  _source: TSource;\r
-}\r
-\r
-type ActionResponse ={\r
-  _index: string;\r
-  _type: string;\r
-  _id: string;\r
-  _shards: {\r
-    total: number,\r
-    successful: number,\r
-    failed: number\r
-    },\r
-\r
-}\r
-\r
-export type PostResponse = ActionResponse & {\r
-  created: boolean\r
-}\r
-\r
-export type DeleteResponse = ActionResponse & {\r
-  found: boolean\r
-}\r
-\r
+/**
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt odlux
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ */
+export type Result<TSource extends {}> = {
+  "data-provider:output": {
+    pagination?: {
+      size: number;
+      page: number;
+      total: number;
+    },
+    data: TSource[];
+  }
+}
+
+export type SingeResult<TSource extends {}> = {
+  "data-provider:output": TSource;
+}
+
+
+export type HitEntry<TSource extends {}> = {
+  _index: string;
+  _type: string;
+  _id: string;
+  _score: number;
+  _source: TSource;
+}
+
+type ActionResponse ={
+  _index: string;
+  _type: string;
+  _id: string;
+  _shards: {
+    total: number,
+    successful: number,
+    failed: number
+    },
+
+}
+
+export type PostResponse = ActionResponse & {
+  created: boolean
+}
+
+export type DeleteResponse = ActionResponse & {
+  found: boolean
+}
+
index ca95ebc..5ed4d7b 100644 (file)
@@ -55,7 +55,7 @@ export const createRestApiAccessor = <TResult extends PlainObject>(urlOrPath: st
         $.ajax({
           url: uri,
           method: (action.settings && action.settings.method) || "GET",
-          headers: { ...authHeader, ...action.settings && action.settings.headers ? action.settings.headers : { } },
+          headers: { ...authHeader, ...(action.settings && action.settings.headers ? action.settings.headers : { }) },
         }).then((data: TResult) => {
            next(new RestResponseAction(data));
         }).catch((err: any) => {
index cfd743d..2d54590 100644 (file)
@@ -16,9 +16,9 @@
  * ============LICENSE_END==========================================================================
  */
 
-import { createMuiTheme } from '@material-ui/core/styles';
+import { createTheme, adaptV4Theme } from '@mui/material/styles';
 
-const theme = createMuiTheme({
+const theme = createTheme(adaptV4Theme({
   design: {
     id: "att",
     name: "AT&T",
@@ -41,6 +41,6 @@ const theme = createMuiTheme({
       contrastText: "#0094d3"
     }
   },
-});
+}));
 
 export default theme;
index 400ee35..1b6135e 100644 (file)
@@ -19,8 +19,7 @@ import * as React from 'react';
 import * as marked from 'marked';
 import * as hljs from 'highlight.js';
 import { requestRestExt } from '../services/restService';
-import { Button, Typography } from '@material-ui/core';
-import createBreakpoints from '@material-ui/core/styles/createBreakpoints';
+import { Button, Typography } from '@mui/material';
 const defaultRenderer = new marked.Renderer();
 defaultRenderer.link = (href, title, text) => (
   `<a target="_blank" rel="noopener noreferrer" href="${href}" title="${title}">${text}</a>`
@@ -168,7 +167,7 @@ class AboutComponent extends React.Component<any, AboutState> {
       <div style={containerStyle}>
         { this.state.isContentLoadedSucessfully &&
         <div style={{float: "right", marginRight: "10px"}}>
-        <Button variant="contained" onClick={e => this.copyToClipboard(e)}>
+        <Button color="inherit" variant="contained" onClick={e => this.copyToClipboard(e)}>
            Copy to clipboard
         </Button>
           {
index 1c78dd2..278fbe1 100644 (file)
-/**\r
- * ============LICENSE_START========================================================================\r
- * ONAP : ccsdk feature sdnr wt odlux\r
- * =================================================================================================\r
- * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.\r
- * =================================================================================================\r
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except\r
- * in compliance with the License. You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software distributed under the License\r
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\r
- * or implied. See the License for the specific language governing permissions and limitations under\r
- * the License.\r
- * ============LICENSE_END==========================================================================\r
- */\r
-import * as React from 'react';\r
-import { HashRouter as Router, Route, Redirect, Switch } from 'react-router-dom';\r
-\r
-import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/styles';\r
-import { faHome, faAddressBook, faSignInAlt, faCog } from '@fortawesome/free-solid-svg-icons';\r
-\r
-import { SnackbarProvider } from 'notistack';\r
-import { ConfirmProvider } from 'material-ui-confirm';\r
-\r
-import AppFrame from '../components/routing/appFrame';\r
-import TitleBar from '../components/titleBar';\r
-import Menu from '../components/navigationMenu';\r
-import ErrorDisplay from '../components/errorDisplay';\r
-import SnackDisplay from '../components/material-ui/snackDisplay';\r
-\r
-import Home from '../views/home';\r
-import Login from '../views/login';\r
-import About from '../views/about';\r
-import Test from '../views/test';\r
-import UserSettings from '../views/settings';\r
-\r
-import applicationService from '../services/applicationManager';\r
-\r
-\r
-const styles = (theme: Theme) => createStyles({\r
-  root: {\r
-    flexGrow: 1,\r
-    height: '100%',\r
-    zIndex: 1,\r
-    overflow: 'hidden',\r
-    position: 'relative',\r
-    display: 'flex',\r
-  },\r
-  content: {\r
-    flexGrow: 1,\r
-    display: "flex",\r
-    flexDirection: "column",\r
-    backgroundColor: theme.palette.background.default,\r
-    padding: theme.spacing(3),\r
-    minWidth: 0, // So the Typography noWrap works\r
-  },\r
-  toolbar: theme.mixins.toolbar as any\r
-});\r
-\r
-\r
-\r
-type FrameProps = WithStyles<typeof styles>;\r
-\r
-class FrameComponent extends React.Component<FrameProps>{\r
-\r
-  render() {\r
-    const registrations = applicationService.applications;\r
-    const { classes } = this.props;\r
-    return (\r
-      <ConfirmProvider>\r
-        <SnackbarProvider maxSnack={3}>\r
-            <Router>\r
-            <div className={classes.root}>\r
-                <SnackDisplay />\r
-                <ErrorDisplay />\r
-                <TitleBar />\r
-                <Menu />\r
-                <main className={classes.content}>\r
-                {\r
-                    <div className={classes.toolbar} /> //needed for margins, don't remove!\r
-                }\r
-                <Switch>\r
-                    <Route exact path="/" component={() => (\r
-                      <AppFrame title={"Home"} icon={faHome} >\r
-                          <Home />\r
-                      </AppFrame>\r
-                    )} />\r
-                    <Route path="/about" component={() => (\r
-                      <AppFrame title={"About"} icon={faAddressBook} >\r
-                          <About />\r
-                      </AppFrame>\r
-                    )} />\r
-                    <Route path="/settings" component={() => (\r
-                      <AppFrame title={"Settings"} icon={faCog} >\r
-                          <UserSettings />\r
-                      </AppFrame>\r
-                    )} />\r
-                    {process.env.NODE_ENV === "development" ? <Route path="/test" component={() => (\r
-                      <AppFrame title={"Test"} icon={faAddressBook} >\r
-                          <Test />\r
-                      </AppFrame>\r
-                    )} /> : null}\r
-                    <Route path="/login" component={() => (\r
-                      <AppFrame title={"Login"} icon={faSignInAlt} >\r
-                          <Login />\r
-                      </AppFrame>\r
-                      )} />\r
-                    { Object.keys(registrations).map(p => {\r
-                      const application = registrations[p];\r
-                      return (<Route key={application.name} path={application.path || `/${application.name}`} component={() => (\r
-                          <AppFrame title={application.title || (typeof application.menuEntry === 'string' && application.menuEntry) || application.name} icon={application.icon} appId={application.name} >\r
-                          <application.rootComponent />\r
-                          </AppFrame>\r
-                      )} />)\r
-                    })}\r
-                    <Redirect to="/" />\r
-                </Switch>\r
-                </main>\r
-            </div>\r
-            </Router>\r
-        </SnackbarProvider>\r
-      </ConfirmProvider>  \r
-    );\r
-  }\r
-}\r
-\r
-export const Frame = withStyles(styles)(FrameComponent);\r
-export default Frame;\r
+/**
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt odlux
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ */
+import * as React from 'react';
+import { HashRouter as Router, Route, Redirect, Switch } from 'react-router-dom';
+
+import { Theme } from '@mui/material/styles';
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
+import { faHome, faAddressBook, faSignInAlt, faCog } from '@fortawesome/free-solid-svg-icons';
+
+import { SnackbarProvider } from 'notistack';
+import { ConfirmProvider } from 'material-ui-confirm';
+
+import AppFrame from '../components/routing/appFrame';
+import TitleBar from '../components/titleBar';
+import Menu from '../components/navigationMenu';
+import ErrorDisplay from '../components/errorDisplay';
+import SnackDisplay from '../components/material-ui/snackDisplay';
+
+import Home from '../views/home';
+import Login from '../views/login';
+import About from '../views/about';
+import Test from '../views/test';
+import UserSettings from '../views/settings';
+
+import applicationService from '../services/applicationManager';
+
+
+const styles = (theme: Theme) => createStyles({
+  root: {
+    flexGrow: 1,
+    height: '100%',
+    zIndex: 1,
+    overflow: 'hidden',
+    position: 'relative',
+    display: 'flex',
+  },
+  content: {
+    flexGrow: 1,
+    display: "flex",
+    flexDirection: "column",
+    backgroundColor: '#fafafa',
+    padding: theme.spacing(3),
+    minWidth: 0, // So the Typography noWrap works
+  },
+  toolbar: theme.mixins.toolbar as any
+});
+
+
+
+type FrameProps = WithStyles<typeof styles>;
+
+class FrameComponent extends React.Component<FrameProps>{
+
+  render() {
+    const registrations = applicationService.applications;
+    const { classes } = this.props;
+    return (
+      <ConfirmProvider>
+        <SnackbarProvider maxSnack={3}>
+            <Router>
+            <div className={classes.root}>
+                <SnackDisplay />
+                <ErrorDisplay />
+                <TitleBar />
+                <Menu />
+                <main className={classes.content}>
+                {
+                    <div className={classes.toolbar} /> //needed for margins, don't remove!
+                }
+                <Switch>
+                    <Route exact path="/" component={() => (
+                      <AppFrame title={"Home"} icon={faHome} >
+                          <Home />
+                      </AppFrame>
+                    )} />
+                    <Route path="/about" component={() => (
+                      <AppFrame title={"About"} icon={faAddressBook} >
+                          <About />
+                      </AppFrame>
+                    )} />
+                    <Route path="/settings" component={() => (
+                      <AppFrame title={"Settings"} icon={faCog} >
+                          <UserSettings />
+                      </AppFrame>
+                    )} />
+                    {process.env.NODE_ENV === "development" ? <Route path="/test" component={() => (
+                      <AppFrame title={"Test"} icon={faAddressBook} >
+                          <Test />
+                      </AppFrame>
+                    )} /> : null}
+                    <Route path="/login" component={() => (
+                      <AppFrame title={"Login"} icon={faSignInAlt} >
+                          <Login />
+                      </AppFrame>
+                      )} />
+                    { Object.keys(registrations).map(p => {
+                      const application = registrations[p];
+                      return (<Route key={application.name} path={application.path || `/${application.name}`} component={() => (
+                          <AppFrame title={application.title || (typeof application.menuEntry === 'string' && application.menuEntry) || application.name} icon={application.icon} appId={application.name} >
+                          <application.rootComponent />
+                          </AppFrame>
+                      )} />)
+                    })}
+                    <Redirect to="/" />
+                </Switch>
+                </main>
+            </div>
+            </Router>
+        </SnackbarProvider>
+      </ConfirmProvider>  
+    );
+  }
+}
+
+export const Frame = withStyles(styles)(FrameComponent);
+export default Frame;
index 176de02..92fd0b2 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START========================================================================
  * ONAP : ccsdk feature sdnr wt odlux
  * =================================================================================================
- * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. All rights reserved.
  * =================================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
  * in compliance with the License. You may obtain a copy of the License at
  * the License.
  * ============LICENSE_END==========================================================================
  */
-import * as React from 'react';
-
-import { withRouter, RouteComponentProps } from 'react-router-dom';
-import connect, { Connect, IDispatcher } from '..//flux/connect';
-import { IApplicationState } from '../handlers/applicationStateHandler';
-import { IApplicationStoreState } from '../store/applicationStore';
-import { WithStyles, withStyles, createStyles, Theme } from '@material-ui/core/styles';
-import { Doughnut } from 'react-chartjs-2';
-import { NavigateToApplication } from '../actions/navigationActions';
 
-const styles = (theme: Theme) => createStyles({
-  pageWidthSettings: {
-    width: '50%',
-    float: 'left'
-  },
-})
+import * as React from 'react';
+import { IApplicationStoreState } from "../store/applicationStore";
+import connect, { Connect, IDispatcher } from "../flux/connect";
+import applicationService from '../services/applicationManager';
 
-const scrollbar = { overflow: "auto", paddingRight: "20px" }
+type props = Connect<typeof mapProps, typeof mapDispatch>;
 
-let connectionStatusinitialLoad = true;
-let connectionStatusinitialStateChanged = false;
-let connectionStatusDataLoad: number[] = [0, 0, 0, 0];
-let connectionTotalCount = 0;
+type SettingsEntry = { name: string, element: JSX.Element }
 
-let alarmStatusinitialLoad = true;
-let alarmStatusinitialStateChanged = false;
-let alarmStatusDataLoad: number[] = [0, 0, 0, 0];
-let alarmTotalCount = 0;
 
 const mapProps = (state: IApplicationStoreState) => ({
-  connectionStatusCount: state.connect.connectionStatusCount,
-  alarmStatus: state.fault.faultStatus
 });
 
 const mapDispatch = (dispatcher: IDispatcher) => ({
-  navigateToApplication: (applicationName: string, path?: string) => dispatcher.dispatch(new NavigateToApplication(applicationName, path)),
 });
 
-type HomeComponentProps = RouteComponentProps & Connect<typeof mapProps, typeof mapDispatch> & WithStyles<typeof styles>;
-
-class Home extends React.Component<HomeComponentProps>  {
-  constructor(props: HomeComponentProps) {
-    super(props);
-    this.state = {
-    }
-  }
-
-  render(): JSX.Element {
-    const { classes } = this.props;
-
-    if (!this.props.connectionStatusCount.isLoadingConnectionStatusChart) {
-      connectionStatusDataLoad = [
-        this.props.connectionStatusCount.Connected,
-        this.props.connectionStatusCount.Connecting,
-        this.props.connectionStatusCount.Disconnected,
-        this.props.connectionStatusCount.UnableToConnect
-      ];
-      connectionTotalCount = this.props.connectionStatusCount.Connected + this.props.connectionStatusCount.Connecting
-        + this.props.connectionStatusCount.Disconnected + this.props.connectionStatusCount.UnableToConnect;
+const DashboardView: React.FunctionComponent<props> = (props) => {
 
-    }
-
-    if (!this.props.alarmStatus.isLoadingAlarmStatusChart) {
-      alarmStatusDataLoad = [
-        this.props.alarmStatus.critical,
-        this.props.alarmStatus.major,
-        this.props.alarmStatus.minor,
-        this.props.alarmStatus.warning
-      ];
-      alarmTotalCount = this.props.alarmStatus.critical + this.props.alarmStatus.major
-        + this.props.alarmStatus.minor + this.props.alarmStatus.warning;
-    }
+  const registrations = applicationService.applications;
 
-    /** Available Network Connection Status chart data */
-    const connectionStatusData = {
-      labels: ['Connected', 'Connecting', 'Disconnected', 'UnableToConnect'],
-      datasets: [{
-        data: connectionStatusDataLoad,
-        backgroundColor: [
-          'rgb(0, 153, 51)',
-          'rgb(255, 102, 0)',
-          'rgb(191, 191, 191)',
-          'rgb(191, 191, 191)'
-        ]
-      }]
-    };
+  const [selectedIndex] = React.useState(0);
 
+  let settingsArray: SettingsEntry[] = [];
 
-    /** No Devices available */
-    const connectionStatusUnavailableData = {
-      labels: ['No Devices available'],
-      datasets: [{
-        data: [1],
-        backgroundColor: [
-          'rgb(255, 255, 255)'
-        ]
-      }]
-    };
-
-    /** Loading Connection Status chart */
-    const connectionStatusisLoading = {
-      labels: ['Loading chart...'],
-      datasets: [{
-        data: [1],
-        backgroundColor: [
-          'rgb(255, 255, 255)'
-        ]
-      }]
-    };
-
-    /** Loading Alarm Status chart */
-    const alarmStatusisLoading = {
-      labels: ['Loading chart...'],
-      datasets: [{
-        data: [1],
-        backgroundColor: [
-          'rgb(255, 255, 255)'
-        ]
-      }]
-    };
-
-    /** Connection status options */
-    let labels: String[] = ['Connected', 'Connecting', 'Disconnected', 'UnableToConnect'];
-    const connectionStatusOptions = {
-      responsive: true,
-      maintainAspectRatio: false,
-      animation: {
-        duration: 0
-      },
-      plugins: {
-        legend: {
-          display: true,
-          position: 'top'
-        }
-      },
-      onClick: (event: MouseEvent, item: any) => {
-        if (item[0]) {
-          let connectionStatus = labels[item[0].index] + '';
-          this.props.navigateToApplication("connect", '/connectionStatus/' + connectionStatus);
-        }
-      }
-    }
-
-    /** Connection status unavailable options */
-    const connectionStatusUnavailableOptions = {
-      responsive: true,
-      maintainAspectRatio: false,
-      animation: {
-        duration: 0
-      },
-      plugins: {
-        legend: {
-          display: true,
-          position: 'top'
-        },
-        tooltip: {
-          enabled: false
-        }
-      }
-    }
+  let settingsElements: (SettingsEntry)[] = Object.keys(registrations).map(p => {
+    const application = registrations[p];
 
-    /** Add text inside the doughnut chart for Connection Status */
-    const connectionStatusPlugins = [{
-      beforeDraw: function (chart: any) {
-        var width = chart.width,
-          height = chart.height,
-          ctx = chart.ctx;
-        ctx.restore();
-        var fontSize = (height / 480).toFixed(2);
-        ctx.font = fontSize + "em sans-serif";
-        ctx.textBaseline = "top";
-        var text = "Network Connection Status",
-          textX = Math.round((width - ctx.measureText(text).width) / 2),
-          textY = height / 2;
-        ctx.fillText(text, textX, textY);
-        ctx.save();
-      }
-    }]
+    if (application.dashbaordElement) {
+      const value: SettingsEntry = { name: application.menuEntry?.toString()!, element: <application.dashbaordElement /> };
+      return value;
 
-    /** Alarm status Data */
-    const alarmStatusData = {
-      labels: [
-        'Critical',
-        'Major',
-        'Minor',
-        'Warning'
-      ],
-      datasets: [{
-        data: alarmStatusDataLoad,
-        backgroundColor: [
-          'rgb(240, 25, 10)',
-          'rgb(240, 133, 10)',
-          'rgb(240, 240, 10)',
-          'rgb(46, 115, 176)'
-        ],
-      }]
-    }
-
-    /** No Alarm status available */
-    const alarmStatusUnavailableData = {
-      labels: ['No Alarms available'],
-      datasets: [{
-        data: [1],
-        backgroundColor: [
-          'rgb(0, 153, 51)'
-        ]
-      }]
-    };
-
-    /** Alarm status Options */
-    let alarmLabels: String[] = ['Critical', 'Major', 'Minor', 'Warning'];
-    const alarmStatusOptions = {
-      responsive: true,
-      maintainAspectRatio: false,
-      animation: {
-        duration: 0
-      },
-      plugins: {
-        legend: {
-          display: true,
-          position: 'top'
-        }
-      },
-      onClick: (event: MouseEvent, item: any) => {
-        if (item[0]) {
-          let severity = alarmLabels[item[0].index] + '';
-          this.props.navigateToApplication("fault", '/alarmStatus/' + severity);
-        }
-      },
-    };
-
-    /** Alarm status unavailable options */
-    const alarmStatusUnavailableOptions = {
-      responsive: true,
-      maintainAspectRatio: false,
-      animation: {
-        duration: 0
-      },
-      plugins: {
-        legend: {
-          display: true,
-          position: 'top'
-        },
-        tooltip: {
-          enabled: false
-        }
-      }
-    }
-    /** Add text inside the doughnut chart for Alarm Status */
-    const alarmStatusPlugins = [{
-      beforeDraw: function (chart: any) {
-        var width = chart.width,
-          height = chart.height,
-          ctx = chart.ctx;
-        ctx.restore();
-        var fontSize = (height / 480).toFixed(2);
-        ctx.font = fontSize + "em sans-serif";
-        ctx.textBaseline = "top";
-        var text = "Network Alarm Status",
-          textX = Math.round((width - ctx.measureText(text).width) / 2),
-          textY = height / 2;
-        ctx.fillText(text, textX, textY);
-        ctx.save();
-      }
-    }]
-
-    return (
-      <>
-        <div style={scrollbar} >
-          <h1>Welcome to ODLUX</h1>
-          <div className={classes.pageWidthSettings}>
-            {this.checkElementsAreLoaded() ?
-              this.checkConnectionStatus() && connectionTotalCount != 0 ?
-                <Doughnut
-                  data={connectionStatusData}
-                  type={Doughnut}
-                  width={500}
-                  height={500}
-                  options={connectionStatusOptions}
-                  plugins={connectionStatusPlugins}
-                />
-                : <Doughnut
-                  data={connectionStatusUnavailableData}
-                  type={Doughnut}
-                  width={500}
-                  height={500}
-                  options={connectionStatusUnavailableOptions}
-                  plugins={connectionStatusPlugins} />
-              : <Doughnut
-                data={connectionStatusisLoading}
-                type={Doughnut}
-                width={500}
-                height={500}
-                options={connectionStatusUnavailableOptions}
-                plugins={connectionStatusPlugins}
-              />
-            }
-          </div>
-          <div className={classes.pageWidthSettings}>
-            {this.checkAlarmsAreLoaded() ?
-              this.checkAlarmStatus() && alarmTotalCount != 0 ?
-                <Doughnut
-                  data={alarmStatusData}
-                  type={Doughnut}
-                  width={500}
-                  height={500}
-                  options={alarmStatusOptions}
-                  plugins={alarmStatusPlugins}
-                />
-                : <Doughnut
-                  data={alarmStatusUnavailableData}
-                  type={Doughnut}
-                  width={500}
-                  height={500}
-                  options={alarmStatusUnavailableOptions}
-                  plugins={alarmStatusPlugins}
-                />
-              : <Doughnut
-                data={alarmStatusisLoading}
-                type={Doughnut}
-                width={500}
-                height={500}
-                options={alarmStatusUnavailableOptions}
-                plugins={alarmStatusPlugins}
-              />
-            }
-          </div>
-        </div>
-      </>
-    )
-  }
-
-  /** Check if connection status data available */
-  public checkConnectionStatus = () => {
-    let statusCount = this.props.connectionStatusCount;
-    if (statusCount.isLoadingConnectionStatusChart) {
-      return true;
-    }
-    if (statusCount.Connected == 0 && statusCount.Connecting == 0 && statusCount.Disconnected == 0
-      && statusCount.UnableToConnect == 0) {
-      return false;
     } else {
-      return true;
+      return null;
     }
-  }
+  }).filter((x): x is SettingsEntry => x !== null);
 
-  /** Check if connection status chart data is loaded */
-  public checkElementsAreLoaded = () => {
-    let isLoadingCheck = this.props.connectionStatusCount;
-    if (connectionStatusinitialLoad && !isLoadingCheck.isLoadingConnectionStatusChart) {
-      if (this.checkConnectionStatus()) {
-        connectionStatusinitialLoad = false;
-        return true;
-      }
-      return false;
-    } else if (connectionStatusinitialLoad && isLoadingCheck.isLoadingConnectionStatusChart) {
-      connectionStatusinitialLoad = false;
-      connectionStatusinitialStateChanged = true;
-      return !isLoadingCheck.isLoadingConnectionStatusChart;
-    } else if (connectionStatusinitialStateChanged) {
-      if (!isLoadingCheck.isLoadingConnectionStatusChart) {
-        connectionStatusinitialStateChanged = false;
-      }
-      return !isLoadingCheck.isLoadingConnectionStatusChart;
-    }
-    return true;
-  }
 
-  /** Check if alarms data available */
-  public checkAlarmStatus = () => {
-    let alarmCount = this.props.alarmStatus;
-    if (alarmCount.isLoadingAlarmStatusChart) {
-      return true;
-    }
-    if (alarmCount.critical == 0 && alarmCount.major == 0 && alarmCount.minor == 0 && alarmCount.warning == 0) {
-      return false;
-    }
-    else {
-      return true;
-    }
-  }
+  settingsArray.push(...settingsElements);
 
-  /** Check if alarm status chart data is loaded */
-  public checkAlarmsAreLoaded = () => {
-    let isLoadingCheck = this.props.alarmStatus;
-    if (alarmStatusinitialLoad && !isLoadingCheck.isLoadingAlarmStatusChart) {
-      if (this.checkAlarmStatus()) {
-        alarmStatusinitialLoad = false;
-        return true;
-      }
-      return false;
-    } else if (alarmStatusinitialLoad && isLoadingCheck.isLoadingAlarmStatusChart) {
-      alarmStatusinitialLoad = false;
-      alarmStatusinitialStateChanged = true;
-      return !isLoadingCheck.isLoadingAlarmStatusChart;
-    } else if (alarmStatusinitialStateChanged) {
-      if (!isLoadingCheck.isLoadingAlarmStatusChart) {
-        alarmStatusinitialStateChanged = false;
-      }
-      return !isLoadingCheck.isLoadingAlarmStatusChart;
-    }
-    return true;
-  }
+  return <div>
+    <div>
+      <div>
+        {
+          settingsArray[selectedIndex]?.element
+        }
+      </div>
+    </div>
+  </div>
 }
 
-export default withStyles(styles)(withRouter(connect(mapProps, mapDispatch)(Home)));
\ No newline at end of file
+
+export default connect(mapProps, mapDispatch)(DashboardView);
index 53219fa..8eb7a6c 100644 (file)
 import * as React from 'react';
 import { withRouter, RouteComponentProps } from 'react-router-dom';
 
-import Alert from '@material-ui/lab/Alert';
-import Avatar from '@material-ui/core/Avatar';
-import Button from '@material-ui/core/Button';
-import CssBaseline from '@material-ui/core/CssBaseline';
-import FormControl from '@material-ui/core/FormControl';
-import FormControlLabel from '@material-ui/core/FormControlLabel';
-import Checkbox from '@material-ui/core/Checkbox';
-import Input from '@material-ui/core/Input';
-import InputLabel from '@material-ui/core/InputLabel';
-import LockIcon from '@material-ui/icons/LockOutlined';
-import Paper from '@material-ui/core/Paper';
-import Typography from '@material-ui/core/Typography';
-import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/styles';
+import Alert from '@mui/material/Alert';
+import Avatar from '@mui/material/Avatar';
+import Button from '@mui/material/Button';
+import CssBaseline from '@mui/material/CssBaseline';
+import FormControl from '@mui/material/FormControl';
+import FormControlLabel from '@mui/material/FormControlLabel';
+import Checkbox from '@mui/material/Checkbox';
+import Input from '@mui/material/Input';
+import InputLabel from '@mui/material/InputLabel';
+import LockIcon from '@mui/icons-material/LockOutlined';
+import Paper from '@mui/material/Paper';
+import Typography from '@mui/material/Typography';
+import { Theme } from '@mui/material/styles';
+
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
 
 import connect, { Connect, IDispatcher } from '../flux/connect';
 import authenticationService from '../services/authenticationService';
@@ -40,8 +44,8 @@ import { loginUserAction, UpdatePolicies } from '../actions/authentication';
 
 import { IApplicationStoreState } from '../store/applicationStore';
 import { AuthPolicy, AuthToken, User } from '../models/authentication';
-import Menu from '@material-ui/core/Menu';
-import { MenuItem } from '@material-ui/core';
+import Menu from '@mui/material/Menu';
+import { MenuItem } from '@mui/material';
 
 const styles = (theme: Theme) => createStyles({
   layout: {
@@ -49,7 +53,7 @@ const styles = (theme: Theme) => createStyles({
     display: 'block', // Fix IE11 issue.
     marginLeft: theme.spacing(3),
     marginRight: theme.spacing(3),
-    [theme.breakpoints.up(400 + theme.spacing(3) * 2)]: {
+    [theme.breakpoints.up(400 + Number(theme.spacing(3).replace('px','')) * 2)]: {
       width: 400,
       marginLeft: 'auto',
       marginRight: 'auto',
@@ -60,7 +64,7 @@ const styles = (theme: Theme) => createStyles({
     display: 'flex',
     flexDirection: 'column',
     alignItems: 'center',
-    padding: `${theme.spacing(2)}px ${theme.spacing(3)}px ${theme.spacing(3)}px`,
+    padding: `${theme.spacing(2)} ${theme.spacing(3)} ${theme.spacing(3)}`,
   },
   avatar: {
     margin: theme.spacing(1),
@@ -175,7 +179,7 @@ class LoginComponent extends React.Component<LoginProps, ILoginState> {
                         aria-haspopup="true"
                         fullWidth
                         variant="contained"
-                        color="primary"
+                        color="inherit"
                         className={classes.submit} onClick={() => { window.location = provider.loginUrl as any; }}>
                         {provider.title}
                       </Button>))
@@ -189,14 +193,14 @@ class LoginComponent extends React.Component<LoginProps, ILoginState> {
                 </>
               }
 
-              <FormControl margin="normal" required fullWidth>
+              <FormControl variant="standard" margin="normal" required fullWidth>
                 <InputLabel htmlFor="username">Username</InputLabel>
                 <Input id="username" name="username" autoComplete="username" autoFocus
                   disabled={this.state.busy}
                   value={this.state.username}
                   onChange={event => { this.setState({ username: event.target.value }) }} />
               </FormControl>
-              <FormControl margin="normal" required fullWidth>
+              <FormControl variant="standard" margin="normal" required fullWidth>
                 <InputLabel htmlFor="password">Password</InputLabel>
                 <Input
                   name="password"
@@ -208,7 +212,7 @@ class LoginComponent extends React.Component<LoginProps, ILoginState> {
                   onChange={event => { this.setState({ password: event.target.value }) }}
                 />
               </FormControl>
-              <FormControl margin="normal" required fullWidth>
+              <FormControl variant="standard" margin="normal" required fullWidth>
                 <InputLabel htmlFor="password">Domain</InputLabel>
                 <Input
                   name="scope"
@@ -224,7 +228,7 @@ class LoginComponent extends React.Component<LoginProps, ILoginState> {
                 type="submit"
                 fullWidth
                 variant="contained"
-                color="primary"
+                color="inherit"
                 disabled={this.state.busy}
                 className={classes.submit}
                 onClick={this.onSignIn}
index f1a8ab3..a6b940b 100644 (file)
@@ -21,8 +21,8 @@ import { IApplicationStoreState } from "../store/applicationStore";
 import connect, { Connect, IDispatcher } from "../flux/connect";
 
 import applicationService from '../services/applicationManager';
-import { makeStyles } from '@material-ui/styles';
-import { Divider, List, ListItem, ListItemText, Paper } from '@material-ui/core';
+import { makeStyles } from '@mui/styles';
+import { Divider, List, ListItem, ListItemText, Paper } from '@mui/material';
 
 import { GeneralUserSettings } from '../components/settings/general'
 import { GoBackAction } from '../actions/navigationActions';
index 763b79a..84c4094 100644 (file)
 import * as React from 'react';
 
 import { withComponents, WithComponents } from '../utilities/withComponents';
-import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/styles';
+import { Theme } from '@mui/material/styles';
 
-import ExpansionPanel from '@material-ui/core/ExpansionPanel';
-import ExpansionPanelSummary from '@material-ui/core/ExpansionPanelSummary';
-import ExpansionPanelDetails from '@material-ui/core/ExpansionPanelDetails';
-import Typography from '@material-ui/core/Typography';
-import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
+import { WithStyles } from '@mui/styles';
+import withStyles from '@mui/styles/withStyles';
+import createStyles from '@mui/styles/createStyles';
+
+import Accordion from '@mui/material/Accordion';
+import AccordionSummary from '@mui/material/AccordionSummary';
+import AccordionDetails from '@mui/material/AccordionDetails';
+import Typography from '@mui/material/Typography';
+import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
 
 import { MaterialTable, MaterialTableCtorType, ColumnType } from '../components/material-table';
 import { TreeView, TreeItem, TreeViewCtorType } from '../components/material-ui/treeView';
-import { SvgIconProps } from '@material-ui/core/SvgIcon';
+import { SvgIconProps } from '@mui/material/SvgIcon';
 
 const styles = (theme: Theme) => createStyles({
   root: {
@@ -839,11 +843,11 @@ const TestComponent = (props: WithComponents<typeof components> & WithStyles<typ
   return (
     <div>
       <h2>About</h2>
-      <ExpansionPanel>
-        <ExpansionPanelSummary expandIcon={<ExpandMoreIcon />}>
+      <Accordion>
+        <AccordionSummary expandIcon={<ExpandMoreIcon />}>
           <Typography className={props.classes.heading}>Client Side Table Demo</Typography>
-        </ExpansionPanelSummary>
-        <ExpansionPanelDetails>
+        </AccordionSummary>
+        <AccordionDetails>
           <SampleDataMaterialTable rows={tableData} columns={
             [
               { property: "index", type: ColumnType.text, title: "Index", width: "80px", disableFilter: true, disableSorting: true },
@@ -855,16 +859,16 @@ const TestComponent = (props: WithComponents<typeof components> & WithStyles<typ
             ]
           } idProperty={"_id"} title={"Customers 2018"} >
           </SampleDataMaterialTable>
-        </ExpansionPanelDetails>
-      </ExpansionPanel>
-      <ExpansionPanel>
-        <ExpansionPanelSummary expandIcon={<ExpandMoreIcon />}>
+        </AccordionDetails>
+      </Accordion>
+      <Accordion>
+        <AccordionSummary expandIcon={<ExpandMoreIcon />}>
           <Typography className={props.classes.heading}>Tree Demo</Typography>
-        </ExpansionPanelSummary>
-        <ExpansionPanelDetails>
+        </AccordionSummary>
+        <AccordionDetails>
           <SampleTree items={treeData} useFolderIcons enableSearchBar />
-        </ExpansionPanelDetails>
-      </ExpansionPanel>
+        </AccordionDetails>
+      </Accordion>
     </div>
   );
 };
index 95b5f5e..b7bbacb 100644 (file)
-/**\r
- * ============LICENSE_START========================================================================\r
- * ONAP : ccsdk feature sdnr wt odlux\r
- * =================================================================================================\r
- * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.\r
- * =================================================================================================\r
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except\r
- * in compliance with the License. You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software distributed under the License\r
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\r
- * or implied. See the License for the specific language governing permissions and limitations under\r
- * the License.\r
- * ============LICENSE_END==========================================================================\r
- */\r
-/**\r
- * Webpack 4 configuration file\r
- * see https://webpack.js.org/configuration/\r
- * see https://webpack.js.org/configuration/dev-server/\r
- */\r
-\r
-"use strict";\r
-\r
-const path = require("path");\r
-const webpack = require("webpack");\r
-const CopyWebpackPlugin = require("copy-webpack-plugin");\r
-const requirejsPlugin = require('requirejs-webpack-plugin');\r
-const TerserPlugin = require('terser-webpack-plugin');\r
-\r
-// const __dirname = (path => path.replace(/^([a-z]\:)/, c => c.toUpperCase()))(process.__dirname());\r
-\r
-module.exports = (env) => {\r
-  const distPath = path.resolve(__dirname, env === "release" ? "." : "..", "dist");\r
-  const frameworkPath = path.resolve(__dirname, env === "release" ? "." : "..", "dist");\r
-  return [{\r
-    name: "Client",\r
-    mode: "none", //disable default behavior\r
-    target: "web",\r
-\r
-    context: path.resolve(__dirname, "src"),\r
-\r
-    entry: {\r
-      app: [\r
-        "./run.ts",\r
-        "./app.tsx",\r
-        "./services",\r
-        "./components/objectDump",\r
-        "./components/material-table",\r
-        "./components/material-ui",\r
-        "./utilities/elasticSearch",\r
-        "./models"],\r
-    },\r
-\r
-    devtool: env === "release" ? false : "source-map",\r
-\r
-    resolve: {\r
-      extensions: [".ts", ".tsx", ".js", ".jsx"]\r
-    },\r
-\r
-    output: {\r
-      path: distPath,\r
-      library: "[name]", // related to webpack.DllPlugin::name\r
-      libraryTarget: "umd2",\r
-      filename: "[name].js",\r
-      chunkFilename: "[name].js"\r
-    },\r
-\r
-    module: {\r
-      rules: [{\r
-        test: /\.tsx?$/,\r
-        exclude: /node_modules/,\r
-        use: [{\r
-          loader: "babel-loader"\r
-        }, {\r
-          loader: "ts-loader"\r
-        }]\r
-      }, {\r
-        test: /\.jsx?$/,\r
-        exclude: /node_modules/,\r
-        use: [{\r
-          loader: "babel-loader"\r
-        }]\r
-      }, \r
-      {\r
-        //don't minify images\r
-        test: /\.(png|gif|jpg|svg)$/,\r
-        use: [{\r
-          loader: 'url-loader',\r
-          options: {\r
-            limit: 10,\r
-            name: './images/[name].[ext]'\r
-          }\r
-        }]\r
-      }\r
-      ]\r
-    },\r
-\r
-    optimization: {\r
-      noEmitOnErrors: true,\r
-      namedModules: env !== "release",\r
-      minimize: env === "release",\r
-      minimizer: env !== "release" ? [] : [new TerserPlugin({\r
-        terserOptions: {\r
-          mangle: {\r
-            reserved: ["./app.tsx"]\r
-          },\r
-          warnings: false, // false, true, "verbose"\r
-          compress: {\r
-            drop_console: true,\r
-            drop_debugger: true,\r
-          }\r
-        }\r
-      })],\r
-    },\r
-\r
-    plugins: [\r
-      new CopyWebpackPlugin([{\r
-        from: '../../node_modules/requirejs/require.js',\r
-        to: '.'\r
-      }, {\r
-        from: './favicon.ico',\r
-        to: '.'\r
-      }, {\r
-        from: env === "release" ? './index.html' : 'index.dev.html',\r
-        to: './index.html'\r
-      }]),\r
-      new requirejsPlugin({\r
-        path: distPath,\r
-        filename: 'config.js',\r
-        baseUrl: '',\r
-        pathUrl: '',\r
-        processOutput: function (assets) {\r
-          let mainConfig =  JSON.stringify(assets, null, 2);\r
-          mainConfig = mainConfig.slice(0,-1); // remove closing bracket from string\r
-          const entireConfig = mainConfig.concat(", waitSeconds: 30}"); // add waitSeconds to config\r
-          return 'require.config(' + entireConfig + ')';\r
-        }\r
-      }),\r
-      // new HtmlWebpackPlugin({\r
-      //   filename: "index.html",\r
-      //   template: "./index.html",\r
-      //   inject: "head"\r
-      // }),\r
-      // new HtmlWebpackIncludeAssetsPlugin({\r
-      //    assets: ['vendor.js'],\r
-      //    append: false\r
-      // }),\r
-      new webpack.DllReferencePlugin({\r
-        context: path.resolve(__dirname, "src"),\r
-        manifest: require(path.resolve(frameworkPath, "vendor-manifest.json")),\r
-        sourceType: "umd2"\r
-      }),\r
-      new webpack.DllPlugin({\r
-        context: path.resolve(__dirname, "src"),\r
-        name: "[name]",\r
-        path: path.resolve(distPath, "[name]-manifest.json")\r
-      }),\r
-      ...(env === "release") ? [\r
-        new webpack.DefinePlugin({\r
-          "process.env": {\r
-            NODE_ENV: "'production'",\r
-            VERSION: JSON.stringify(require("./package.json").version)\r
-          }\r
-        }),\r
-      ] : [\r
-          new webpack.HotModuleReplacementPlugin(),\r
-          new webpack.DefinePlugin({\r
-            "process.env": {\r
-              NODE_ENV: "'development'",\r
-              VERSION: JSON.stringify(require("./package.json").version)\r
-            }\r
-          }),\r
-          new webpack.WatchIgnorePlugin([\r
-            /css\.d\.ts$/,\r
-            /less\.d\.ts$/\r
-          ]),\r
-          new CopyWebpackPlugin([{\r
-            from: './assets/version.json',\r
-            to: './version.json'\r
-          }])\r
-        ]\r
-    ],\r
-\r
-    devServer: {\r
-      public: "http://localhost:3100",\r
-      contentBase: distPath,\r
-\r
-      compress: true,\r
-      headers: {\r
-        "Access-Control-Allow-Origin": "*"\r
-      },\r
-      host: "0.0.0.0",\r
-      port: 3100,\r
-      disableHostCheck: true,\r
-      historyApiFallback: true,\r
-      inline: true,\r
-      hot: false,\r
-      quiet: false,\r
-      stats: {\r
-        colors: true\r
-      },\r
-      proxy: {\r
-        "/about": {\r
-          // target: "http://10.20.6.29:48181",\r
-          target: "http://sdnr:8181",\r
-          secure: false\r
-        }, \r
-        "/yang-schema/": {\r
-          target: "http://sdnr:8181",\r
-          secure: false\r
-        },   \r
-        "/oauth/": {\r
-          // target: "https://10.20.35.188:30205",\r
-          target: "http://sdnr:8181",\r
-          secure: false\r
-        },\r
-        "/oauth2/": {\r
-          // target: "https://10.20.35.188:30205",\r
-          target: "http://sdnr:8181",\r
-          secure: false\r
-        },\r
-        "/database/": {\r
-          target: "http://sdnr:8181",\r
-          secure: false\r
-        },\r
-        "/restconf/": {\r
-          target: "http://sdnr:8181",\r
-          secure: false\r
-        },\r
-        "/rests/": {\r
-          target: "http://sdnr:8181",\r
-          secure: false\r
-        },\r
-        "/help/": {\r
-          target: "http://sdnr:8181",\r
-          secure: false\r
-        },\r
-         "/about/": {\r
-          target: "http://sdnr:8181",\r
-          secure: false\r
-        },\r
-        "/tree/": {\r
-          target: "http://sdnr:8181",\r
-          secure: false\r
-        },\r
-        "/websocket": {\r
-          target: "http://sdnr:8181",\r
-          ws: true,\r
-          changeOrigin: true,\r
-          secure: false\r
-        },\r
-        "/apidoc": {\r
-          target: "http://sdnr:8181",\r
-          ws: true,\r
-          changeOrigin: true,\r
-          secure: false\r
-        }\r
-      }\r
-    }\r
-  }];\r
-}\r
-\r
-\r
+/**
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt odlux
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ */
+/**
+ * Webpack 4 configuration file
+ * see https://webpack.js.org/configuration/
+ * see https://webpack.js.org/configuration/dev-server/
+ */
+
+"use strict";
+
+const path = require("path");
+const webpack = require("webpack");
+const CopyWebpackPlugin = require("copy-webpack-plugin");
+const requirejsPlugin = require('requirejs-webpack-plugin');
+const TerserPlugin = require('terser-webpack-plugin');
+
+// const __dirname = (path => path.replace(/^([a-z]\:)/, c => c.toUpperCase()))(process.__dirname());
+
+module.exports = (env) => {
+  const distPath = path.resolve(__dirname, env === "release" ? "." : "..", "dist");
+  const frameworkPath = path.resolve(__dirname, env === "release" ? "." : "..", "dist");
+  return [{
+    name: "Client",
+    mode: "none", //disable default behavior
+    target: "web",
+
+    context: path.resolve(__dirname, "src"),
+
+    entry: {
+      app: [
+        "./run.ts",
+        "./app.tsx",
+        "./services",
+        "./components/objectDump",
+        "./components/material-table",
+        "./components/material-ui",
+        "./utilities/elasticSearch",
+        "./models"],
+    },
+
+    devtool: env === "release" ? false : "source-map",
+
+    resolve: {
+      extensions: [".ts", ".tsx", ".js", ".jsx"]
+    },
+
+    output: {
+      path: distPath,
+      library: "[name]", // related to webpack.DllPlugin::name
+      libraryTarget: "umd2",
+      filename: "[name].js",
+      chunkFilename: "[name].js"
+    },
+
+    module: {
+      rules: [{
+        test: /\.tsx?$/,
+        exclude: /node_modules/,
+        use: [{
+          loader: "babel-loader"
+        }, {
+          loader: "ts-loader"
+        }]
+      }, {
+        test: /\.jsx?$/,
+        exclude: /node_modules/,
+        use: [{
+          loader: "babel-loader"
+        }]
+      }, 
+      {
+        //don't minify images
+        test: /\.(png|gif|jpg|svg)$/,
+        use: [{
+          loader: 'url-loader',
+          options: {
+            limit: 10,
+            name: './images/[name].[ext]'
+          }
+        }]
+      }
+      ]
+    },
+
+    optimization: {
+      noEmitOnErrors: true,
+      namedModules: env !== "release",
+      minimize: env === "release",
+      minimizer: env !== "release" ? [] : [new TerserPlugin({
+        terserOptions: {
+          mangle: {
+            reserved: ["./app.tsx"]
+          },
+          warnings: false, // false, true, "verbose"
+          compress: {
+            drop_console: true,
+            drop_debugger: true,
+          }
+        }
+      })],
+    },
+
+    plugins: [
+      new CopyWebpackPlugin([{
+        from: '../../node_modules/requirejs/require.js',
+        to: '.'
+      }, {
+        from: './favicon.ico',
+        to: '.'
+      }, {
+        from: env === "release" ? './index.html' : 'index.dev.html',
+        to: './index.html'
+      }]),
+      new requirejsPlugin({
+        path: distPath,
+        filename: 'config.js',
+        baseUrl: '',
+        pathUrl: '',
+        processOutput: function (assets) {
+          let mainConfig =  JSON.stringify(assets, null, 2);
+          mainConfig = mainConfig.slice(0,-1); // remove closing bracket from string
+          const entireConfig = mainConfig.concat(", waitSeconds: 30}"); // add waitSeconds to config
+          return 'require.config(' + entireConfig + ')';
+        }
+      }),
+      // new HtmlWebpackPlugin({
+      //   filename: "index.html",
+      //   template: "./index.html",
+      //   inject: "head"
+      // }),
+      // new HtmlWebpackIncludeAssetsPlugin({
+      //    assets: ['vendor.js'],
+      //    append: false
+      // }),
+      new webpack.DllReferencePlugin({
+        context: path.resolve(__dirname, "src"),
+        manifest: require(path.resolve(frameworkPath, "vendor-manifest.json")),
+        sourceType: "umd2"
+      }),
+      new webpack.DllPlugin({
+        context: path.resolve(__dirname, "src"),
+        name: "[name]",
+        path: path.resolve(distPath, "[name]-manifest.json")
+      }),
+      ...(env === "release" ? [
+        new webpack.DefinePlugin({
+          "process.env": {
+            NODE_ENV: "'production'",
+            VERSION: JSON.stringify(require("./package.json").version)
+          }
+        }),
+      ] : [
+          new webpack.HotModuleReplacementPlugin(),
+          new webpack.DefinePlugin({
+            "process.env": {
+              NODE_ENV: "'development'",
+              VERSION: JSON.stringify(require("./package.json").version)
+            }
+          }),
+          new webpack.WatchIgnorePlugin([
+            /css\.d\.ts$/,
+            /less\.d\.ts$/
+          ]),
+          new CopyWebpackPlugin([{
+            from: './assets/version.json',
+            to: './version.json'
+          }])
+        ])
+    ],
+
+    devServer: {
+      public: "http://localhost:3100",
+      contentBase: distPath,
+
+      compress: true,
+      headers: {
+        "Access-Control-Allow-Origin": "*"
+      },
+      host: "0.0.0.0",
+      port: 3100,
+      disableHostCheck: true,
+      historyApiFallback: true,
+      inline: true,
+      hot: false,
+      quiet: false,
+      stats: {
+        colors: true
+      },
+      proxy: {
+        "/about": {
+          // target: "http://10.20.6.29:48181",
+          target: "http://sdnr:8181",
+          secure: false
+        }, 
+        "/yang-schema/": {
+          target: "http://sdnr:8181",
+          secure: false
+        },   
+        "/oauth/": {
+          // target: "https://10.20.35.188:30205",
+          target: "http://sdnr:8181",
+          secure: false
+        },
+        "/oauth2/": {
+          // target: "https://10.20.35.188:30205",
+          target: "http://sdnr:8181",
+          secure: false
+        },
+        "/database/": {
+          target: "http://sdnr:8181",
+          secure: false
+        },
+        "/restconf/": {
+          target: "http://sdnr:8181",
+          secure: false
+        },
+        "/rests/": {
+          target: "http://sdnr:8181",
+          secure: false
+        },
+        "/help/": {
+          target: "http://sdnr:8181",
+          secure: false
+        },
+         "/about/": {
+          target: "http://sdnr:8181",
+          secure: false
+        },
+        "/tree/": {
+          target: "http://sdnr:8181",
+          secure: false
+        },
+        "/websocket": {
+          target: "http://sdnr:8181",
+          ws: true,
+          changeOrigin: true,
+          secure: false
+        },
+        "/apidoc": {
+          target: "http://sdnr:8181",
+          ws: true,
+          changeOrigin: true,
+          secure: false
+        }
+      }
+    }
+  }];
+}
+
+
index c07721f..02bcf6b 100644 (file)
@@ -81,5 +81,5 @@ module.exports = (env) => {
 
     ]
   }
-  ]
+  ];
 };
\ No newline at end of file
index 649c9b9..b880292 100644 (file)
@@ -35,7 +35,7 @@ module.exports = (env) => {
         "react",
         "react-dom",
         "react-router-dom",
-        "@material-ui/core"
+        "@mui/material"
       ]
     },
 
@@ -105,7 +105,7 @@ module.exports = (env) => {
         name: "[name]",
         path: path.resolve(distPath, "[name]-manifest.json")
       }),
-      ...(env === "release") ? [
+      ...(env === "release" ? [
         new webpack.DefinePlugin({
           "process.env": {
             NODE_ENV: "'production'",
@@ -124,7 +124,7 @@ module.exports = (env) => {
             /s?css\.d\.ts$/,
             /less\.d\.ts$/
           ])
-        ]
+        ])
     ]
   }];
 }
index 843cf77..37778be 100644 (file)
@@ -19,7 +19,9 @@
   ~ ============LICENSE_END=======================================================
   ~
   -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <parent>
                                     <overWrite>false</overWrite>
                                 </artifactItem>
                                 <!-- demoApp -->
-                                  <!--<artifactItem>
+                                <!--<artifactItem>
                                     <groupId>${project.groupId}</groupId>
                                     <artifactId>sdnr-wt-odlux-app-demoApp</artifactId>
                                     <version>${project.version}</version>
                                     <type>jar</type>
                                     <overWrite>false</overWrite>
-                                  </artifactItem>-->
+                                </artifactItem>-->
                                 <!-- faultApp -->
                                 <artifactItem>
                                     <groupId>${project.groupId}</groupId>
                                     <version>${project.version}</version>
                                     <type>jar</type>
                                     <overWrite>false</overWrite>
-                                </artifactItem>
-                                 <!-- networkMapApp-->
-                                <artifactItem>
-                                    <groupId>${project.groupId}</groupId>
-                                    <artifactId>sdnr-wt-odlux-app-networkMapApp</artifactId>
-                                    <version>${project.version}</version>
-                                    <type>jar</type>
-                                    <overWrite>false</overWrite>
-                                </artifactItem>
-                                 <!-- linkCalculationApp-->
-                                <artifactItem>
-                                    <groupId>${project.groupId}</groupId>
-                                    <artifactId>sdnr-wt-odlux-app-linkCalculationApp</artifactId>
-                                    <version>${project.version}</version>
-                                    <type>jar</type>
-                                    <overWrite>false</overWrite>
-                                </artifactItem>
-                                <!-- line of sight app-->
-                                <artifactItem>
-                                    <groupId>${project.groupId}</groupId>
-                                    <artifactId>sdnr-wt-odlux-app-lineOfSightApp</artifactId>
-                                    <version>${project.version}</version>
-                                    <type>jar</type>
-                                    <overWrite>false</overWrite>
                                 </artifactItem>
                                 <!-- inventoryApp -->
                                 <artifactItem>
index 598d849..b02a0a9 100644 (file)
@@ -1,13 +1,11 @@
-odlux.framework.buildno=137.be0dfd7(21/12/03)
-odlux.apps.configurationApp.buildno=120.b383d6e(21/08/23)
-odlux.apps.connectApp.buildno=137.be0dfd7(21/12/03)
-odlux.apps.eventLogApp.buildno=108.a60ec28(21/06/11)
-odlux.apps.faultApp.buildno=137.be0dfd7(21/12/03)
-odlux.apps.helpApp.buildno=108.a60ec28(21/06/11)
-odlux.apps.inventoryApp.buildno=108.a60ec28(21/06/11)
-odlux.apps.linkCalculationApp.buildno=116.8c2f6b7(21/08/05)
-odlux.apps.maintenanceApp.buildno=108.a60ec28(21/06/11)
-odlux.apps.mediatorApp.buildno=108.a60ec28(21/06/11)
-odlux.apps.networkMapApp.buildno=115.f8b3b3c(21/07/30)
-odlux.apps.lineOfSightApp.buildno=116.8c2f6b7(21/08/05)
-odlux.apps.permanceHistoryApp.buildno=81.1c38886(20/12/04)
+odlux.framework.buildno=142.63ceae1(22/01/31)
+odlux.apps.configurationApp.buildno=142.63ceae1(22/01/31)
+odlux.apps.connectApp.buildno=142.63ceae1(22/01/31)
+odlux.apps.eventLogApp.buildno=142.63ceae1(22/01/31)
+odlux.apps.faultApp.buildno=142.63ceae1(22/01/31)
+odlux.apps.helpApp.buildno=142.63ceae1(22/01/31)
+odlux.apps.inventoryApp.buildno=142.63ceae1(22/01/31)
+odlux.apps.maintenanceApp.buildno=142.63ceae1(22/01/31)
+odlux.apps.mediatorApp.buildno=142.63ceae1(22/01/31)
+odlux.apps.lineOfSightApp.buildno=142.63ceae1(22/01/31)
+odlux.apps.permanceHistoryApp.buildno=142.63ceae1(22/01/31)
index a8c2d76..d65555e 100644 (file)
     "test": "jest --no-cache --coverage --config jest.json"
   },
   "dependencies": {
+    "@emotion/react": "^11.7.0",
+    "@emotion/styled": "^11.6.0",
     "@fortawesome/fontawesome-svg-core": "1.2.35",
     "@fortawesome/free-solid-svg-icons": "5.6.3",
     "@fortawesome/react-fontawesome": "0.1.14",
-    "@material-ui/core": "4.11.4",
-    "@material-ui/icons": "4.11.2",
-    "@material-ui/lab": "4.0.0-alpha.58",
+    "@mui/icons-material": "^5.2.0",
+    "@mui/lab": "^5.0.0-alpha.58",
+    "@mui/material": "^5.2.2",
+    "@mui/styles": "^5.2.2",
     "@types/classnames": "2.2.6",
     "@types/flux": "3.1.8",
     "@types/glob-to-regexp": "0.4.0",
     "@types/jquery": "3.3.10",
     "@types/jsonwebtoken": "7.2.8",
     "@types/node": "^12.0.0",
-    "@types/react": "17.0.3",
-    "@types/react-dom": "17.0.2",
+    "@types/react": "17.0.37",
+    "@types/react-dom": "17.0.11",
     "@types/react-router-dom": "5.1.7",
     "@types/react-transition-group": "2.0.15",
     "classnames": "2.2.6",
     "jsonwebtoken": "8.3.0",
     "jss": "10.0.3",
     "lerna": "3.22.1",
-    "material-ui-confirm": "2.1.2",
-    "notistack": "0.9.6",
+    "material-ui-confirm": "3.0.2",
+    "notistack": "2.0.3",
     "prop-types": "15.7.2",
-    "react": "17.0.1",
-    "react-dom": "17.0.1",
+    "react": "17.0.2",
+    "react-dom": "17.0.2",
     "react-router-dom": "5.2.0",
     "react-transition-group": "4.3.0"
   },
index c680f08..8bc52d3 100644 (file)
@@ -51,9 +51,6 @@
         <module>apps/performanceHistoryApp</module>
         <module>apps/eventLogApp</module>
         <module>apps/configurationApp</module>
-        <module>apps/networkMapApp</module>
-        <module>apps/linkCalculationApp</module>
-        <module>apps/lineOfSightApp</module>
         <module>apps/app-feature</module>
         <module>apps/app-installer</module>
         <module>installer</module>
index 4fb7040..a98d4b8 100644 (file)
   dependencies:
     "@babel/types" "^7.14.5"
 
+"@babel/helper-module-imports@^7.12.13":
+  version "7.16.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3"
+  integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==
+  dependencies:
+    "@babel/types" "^7.16.0"
+
 "@babel/helper-module-transforms@^7.14.5":
   version "7.14.5"
   resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz#7de42f10d789b423eb902ebd24031ca77cb1e10e"
   resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8"
   integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==
 
+"@babel/helper-validator-identifier@^7.15.7":
+  version "7.15.7"
+  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389"
+  integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==
+
 "@babel/helper-validator-option@^7.14.5":
   version "7.14.5"
   resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3"
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.0"
 
+"@babel/plugin-syntax-jsx@^7.12.13":
+  version "7.16.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz#f9624394317365a9a88c82358d3f8471154698f1"
+  integrity sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.14.5"
+
 "@babel/plugin-syntax-jsx@^7.14.5":
   version "7.14.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz#000e2e25d8673cce49300517a3eda44c263e4201"
     "@babel/plugin-transform-react-jsx-self" "^7.0.0"
     "@babel/plugin-transform-react-jsx-source" "^7.0.0"
 
-"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.12.1", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7":
+"@babel/runtime@^7.1.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.13.10", "@babel/runtime@^7.16.3", "@babel/runtime@^7.7.2":
+  version "7.16.3"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5"
+  integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==
+  dependencies:
+    regenerator-runtime "^0.13.4"
+
+"@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7":
   version "7.14.6"
   resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.6.tgz#535203bc0892efc7dec60bdc27b2ecf6e409062d"
   integrity sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==
     "@babel/helper-validator-identifier" "^7.14.5"
     to-fast-properties "^2.0.0"
 
+"@babel/types@^7.16.0":
+  version "7.16.0"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba"
+  integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.15.7"
+    to-fast-properties "^2.0.0"
+
+"@date-io/core@^2.11.0":
+  version "2.11.0"
+  resolved "https://registry.yarnpkg.com/@date-io/core/-/core-2.11.0.tgz#28580cda1c8228ab2c7ed6aee673ef0495f913e6"
+  integrity sha512-DvPBnNoeuLaoSJZaxgpu54qzRhRKjSYVyQjhznTFrllKuDpm0sDFjHo6lvNLCM/cfMx2gb2PM2zY2kc9C8nmuw==
+
+"@date-io/date-fns@^2.11.0":
+  version "2.11.0"
+  resolved "https://registry.yarnpkg.com/@date-io/date-fns/-/date-fns-2.11.0.tgz#142fbf954eda7ad66514af7a2802d78c4ea40053"
+  integrity sha512-mPQ71plBeFrArvBSHtjWMHXA89IUbZ6kuo2dsjlRC/1uNOybo91spIb+wTu03NxKTl8ut07s0jJ9svF71afpRg==
+  dependencies:
+    "@date-io/core" "^2.11.0"
+
+"@date-io/dayjs@^2.11.0":
+  version "2.11.0"
+  resolved "https://registry.yarnpkg.com/@date-io/dayjs/-/dayjs-2.11.0.tgz#41f4b4b9629612e6012accffd848875d1aeffb74"
+  integrity sha512-w67vRK56NZJIKhJM/CrNbfnIcuMvR3ApfxzNZiCZ5w29sxgBDeKuX4M+P7A9r5HXOMGcsOcpgaoTDINNGkdpGQ==
+  dependencies:
+    "@date-io/core" "^2.11.0"
+
+"@date-io/luxon@^2.11.1":
+  version "2.11.1"
+  resolved "https://registry.yarnpkg.com/@date-io/luxon/-/luxon-2.11.1.tgz#31a72f7b5e163c74e8a3b29d8f16c4c30de6ed43"
+  integrity sha512-JUXo01kdPQxLORxqdENrgdUhooKgDUggsNRSdi2BcUhASIY2KGwwWXu8ikVHHGkw+DUF4FOEKGfkQd0RHSvX6g==
+  dependencies:
+    "@date-io/core" "^2.11.0"
+
+"@date-io/moment@^2.11.0":
+  version "2.11.0"
+  resolved "https://registry.yarnpkg.com/@date-io/moment/-/moment-2.11.0.tgz#850f8dd090d401845b39276d034dbabe20224ef5"
+  integrity sha512-QSL+83qezQ9Ty0dtFgAkk6eC0GMl/lgYfDajeVUDB3zVA2A038hzczRLBg29ifnBGhQMPABxuOafgWwhDjlarg==
+  dependencies:
+    "@date-io/core" "^2.11.0"
+
+"@emotion/babel-plugin@^11.3.0":
+  version "11.3.0"
+  resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.3.0.tgz#3a16850ba04d8d9651f07f3fb674b3436a4fb9d7"
+  integrity sha512-UZKwBV2rADuhRp+ZOGgNWg2eYgbzKzQXfQPtJbu/PLy8onurxlNCLvxMQEvlr1/GudguPI5IU9qIY1+2z1M5bA==
+  dependencies:
+    "@babel/helper-module-imports" "^7.12.13"
+    "@babel/plugin-syntax-jsx" "^7.12.13"
+    "@babel/runtime" "^7.13.10"
+    "@emotion/hash" "^0.8.0"
+    "@emotion/memoize" "^0.7.5"
+    "@emotion/serialize" "^1.0.2"
+    babel-plugin-macros "^2.6.1"
+    convert-source-map "^1.5.0"
+    escape-string-regexp "^4.0.0"
+    find-root "^1.1.0"
+    source-map "^0.5.7"
+    stylis "^4.0.3"
+
+"@emotion/cache@^11.6.0":
+  version "11.6.0"
+  resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.6.0.tgz#65fbdbbe4382f1991d8b20853c38e63ecccec9a1"
+  integrity sha512-ElbsWY1KMwEowkv42vGo0UPuLgtPYfIs9BxxVrmvsaJVvktknsHYYlx5NQ5g6zLDcOTyamlDc7FkRg2TAcQDKQ==
+  dependencies:
+    "@emotion/memoize" "^0.7.4"
+    "@emotion/sheet" "^1.1.0"
+    "@emotion/utils" "^1.0.0"
+    "@emotion/weak-memoize" "^0.2.5"
+    stylis "^4.0.10"
+
 "@emotion/hash@^0.8.0":
   version "0.8.0"
   resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413"
   integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==
 
+"@emotion/is-prop-valid@^1.1.1":
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.1.1.tgz#cbd843d409dfaad90f9404e7c0404c55eae8c134"
+  integrity sha512-bW1Tos67CZkOURLc0OalnfxtSXQJMrAMV0jZTVGJUPSOd4qgjF3+tTD5CwJM13PHA8cltGW1WGbbvV9NpvUZPw==
+  dependencies:
+    "@emotion/memoize" "^0.7.4"
+
+"@emotion/memoize@^0.7.4", "@emotion/memoize@^0.7.5":
+  version "0.7.5"
+  resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50"
+  integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==
+
+"@emotion/react@^11.7.0":
+  version "11.7.0"
+  resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.7.0.tgz#b179da970ac0e8415de3ac165deadf8d9c4bf89f"
+  integrity sha512-WL93hf9+/2s3cA1JVJlz8+Uy6p6QWukqQFOm2OZO5ki51hfucHMOmbSjiyC3t2Y4RI8XUmBoepoc/24ny/VBbA==
+  dependencies:
+    "@babel/runtime" "^7.13.10"
+    "@emotion/cache" "^11.6.0"
+    "@emotion/serialize" "^1.0.2"
+    "@emotion/sheet" "^1.1.0"
+    "@emotion/utils" "^1.0.0"
+    "@emotion/weak-memoize" "^0.2.5"
+    hoist-non-react-statics "^3.3.1"
+
+"@emotion/serialize@^1.0.2":
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.2.tgz#77cb21a0571c9f68eb66087754a65fa97bfcd965"
+  integrity sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==
+  dependencies:
+    "@emotion/hash" "^0.8.0"
+    "@emotion/memoize" "^0.7.4"
+    "@emotion/unitless" "^0.7.5"
+    "@emotion/utils" "^1.0.0"
+    csstype "^3.0.2"
+
+"@emotion/sheet@^1.1.0":
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.1.0.tgz#56d99c41f0a1cda2726a05aa6a20afd4c63e58d2"
+  integrity sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==
+
+"@emotion/styled@^11.6.0":
+  version "11.6.0"
+  resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.6.0.tgz#9230d1a7bcb2ebf83c6a579f4c80e0664132d81d"
+  integrity sha512-mxVtVyIOTmCAkFbwIp+nCjTXJNgcz4VWkOYQro87jE2QBTydnkiYusMrRGFtzuruiGK4dDaNORk4gH049iiQuw==
+  dependencies:
+    "@babel/runtime" "^7.13.10"
+    "@emotion/babel-plugin" "^11.3.0"
+    "@emotion/is-prop-valid" "^1.1.1"
+    "@emotion/serialize" "^1.0.2"
+    "@emotion/utils" "^1.0.0"
+
+"@emotion/unitless@^0.7.5":
+  version "0.7.5"
+  resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed"
+  integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
+
+"@emotion/utils@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.0.0.tgz#abe06a83160b10570816c913990245813a2fd6af"
+  integrity sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==
+
+"@emotion/weak-memoize@^0.2.5":
+  version "0.2.5"
+  resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46"
+  integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==
+
 "@evocateur/libnpmaccess@^3.1.2":
   version "3.1.2"
   resolved "https://registry.yarnpkg.com/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz#ecf7f6ce6b004e9f942b098d92200be4a4b1c845"
     npmlog "^4.1.2"
     write-file-atomic "^2.3.0"
 
-"@mapbox/geojson-rewind@^0.5.0":
-  version "0.5.1"
-  resolved "https://registry.yarnpkg.com/@mapbox/geojson-rewind/-/geojson-rewind-0.5.1.tgz#adbe16dc683eb40e90934c51a5e28c7bbf44f4e1"
-  integrity sha512-eL7fMmfTBKjrb+VFHXCGv9Ot0zc3C0U+CwXo1IrP+EPwDczLoXv34Tgq3y+2mPSFNVUXgU42ILWJTC7145KPTA==
+"@mrmlnc/readdir-enhanced@^2.2.1":
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
+  integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==
   dependencies:
-    get-stream "^6.0.1"
-    minimist "^1.2.5"
-
-"@mapbox/geojson-types@^1.0.2":
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz#9aecf642cb00eab1080a57c4f949a65b4a5846d6"
-  integrity sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==
-
-"@mapbox/jsonlint-lines-primitives@^2.0.2":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz#ce56e539f83552b58d10d672ea4d6fc9adc7b234"
-  integrity sha1-zlblOfg1UrWNENZy6k1vya3HsjQ=
-
-"@mapbox/mapbox-gl-supported@^1.5.0":
-  version "1.5.0"
-  resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz#f60b6a55a5d8e5ee908347d2ce4250b15103dc8e"
-  integrity sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==
-
-"@mapbox/point-geometry@0.1.0", "@mapbox/point-geometry@^0.1.0", "@mapbox/point-geometry@~0.1.0":
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz#8a83f9335c7860effa2eeeca254332aa0aeed8f2"
-  integrity sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI=
-
-"@mapbox/tiny-sdf@^1.1.1":
-  version "1.2.5"
-  resolved "https://registry.yarnpkg.com/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz#424c620a96442b20402552be70a7f62a8407cc59"
-  integrity sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==
-
-"@mapbox/unitbezier@^0.0.0":
-  version "0.0.0"
-  resolved "https://registry.yarnpkg.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz#15651bd553a67b8581fb398810c98ad86a34524e"
-  integrity sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4=
+    call-me-maybe "^1.0.1"
+    glob-to-regexp "^0.3.0"
 
-"@mapbox/vector-tile@^1.3.1":
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz#d3a74c90402d06e89ec66de49ec817ff53409666"
-  integrity sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==
+"@mui/base@5.0.0-alpha.58":
+  version "5.0.0-alpha.58"
+  resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-alpha.58.tgz#01ab59a028f314e2f9a79f903a8336ac45853652"
+  integrity sha512-YZorCbbzkokQZUnj+sdjUWIe+jaesuSVpKgwWS2mWdE50v1Ti/qMmevIrOT1lvFAilpj80Bkcg4KtlGWBJ6utQ==
   dependencies:
-    "@mapbox/point-geometry" "~0.1.0"
+    "@babel/runtime" "^7.16.3"
+    "@emotion/is-prop-valid" "^1.1.1"
+    "@mui/utils" "^5.2.2"
+    "@popperjs/core" "^2.4.4"
+    clsx "^1.1.1"
+    prop-types "^15.7.2"
+    react-is "^17.0.2"
 
-"@mapbox/whoots-js@^3.1.0":
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe"
-  integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==
-
-"@material-ui/core@4.11.4":
-  version "4.11.4"
-  resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.11.4.tgz#4fb9fe5dec5dcf780b687e3a40cff78b2b9640a4"
-  integrity sha512-oqb+lJ2Dl9HXI9orc6/aN8ZIAMkeThufA5iZELf2LQeBn2NtjVilF5D2w7e9RpntAzDb4jK5DsVhkfOvFY/8fg==
-  dependencies:
-    "@babel/runtime" "^7.4.4"
-    "@material-ui/styles" "^4.11.4"
-    "@material-ui/system" "^4.11.3"
-    "@material-ui/types" "5.1.0"
-    "@material-ui/utils" "^4.11.2"
-    "@types/react-transition-group" "^4.2.0"
-    clsx "^1.0.4"
+"@mui/icons-material@^5.2.0":
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.2.0.tgz#6c6135bb2d7891e29d6f9419df402b82dd663517"
+  integrity sha512-NvyrVaGKpP4R1yFw8BCnE0QcsQ67RtpgxPr4FtH8q60MDYPuPVczLOn5Ash5CFavoDWur/NfM/4DpT54yf3InA==
+  dependencies:
+    "@babel/runtime" "^7.16.3"
+
+"@mui/lab@^5.0.0-alpha.58":
+  version "5.0.0-alpha.58"
+  resolved "https://registry.yarnpkg.com/@mui/lab/-/lab-5.0.0-alpha.58.tgz#47c3b2976df066119fa040131a63139677ba5a66"
+  integrity sha512-Vn3bWlID2SgCb7KX3d29uSLWv3JDEHJ+QiApnaPuUqqymwHARbQUk+b2h6wfQCz/WqaR0MtmsRwA6OrrLsL3Eg==
+  dependencies:
+    "@babel/runtime" "^7.16.3"
+    "@date-io/date-fns" "^2.11.0"
+    "@date-io/dayjs" "^2.11.0"
+    "@date-io/luxon" "^2.11.1"
+    "@date-io/moment" "^2.11.0"
+    "@mui/base" "5.0.0-alpha.58"
+    "@mui/system" "^5.2.2"
+    "@mui/utils" "^5.2.2"
+    clsx "^1.1.1"
+    prop-types "^15.7.2"
+    react-is "^17.0.2"
+    react-transition-group "^4.4.2"
+    rifm "^0.12.1"
+
+"@mui/material@^5.2.2":
+  version "5.2.2"
+  resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.2.2.tgz#4dfbc9186a83e16a9dcdcc10e4a70ecaf641b1a3"
+  integrity sha512-vqmZq+v59CT4V84WcvYkYldnjC6uRddYx0TJqgl2h5YRbbPYCGVVywVvg9cBwxy4j5xI3F2WH6z7WGkHqkJIQA==
+  dependencies:
+    "@babel/runtime" "^7.16.3"
+    "@mui/base" "5.0.0-alpha.58"
+    "@mui/system" "^5.2.2"
+    "@mui/types" "^7.1.0"
+    "@mui/utils" "^5.2.2"
+    "@types/react-transition-group" "^4.4.4"
+    clsx "^1.1.1"
+    csstype "^3.0.10"
     hoist-non-react-statics "^3.3.2"
-    popper.js "1.16.1-lts"
     prop-types "^15.7.2"
-    react-is "^16.8.0 || ^17.0.0"
-    react-transition-group "^4.4.0"
+    react-is "^17.0.2"
+    react-transition-group "^4.4.2"
 
-"@material-ui/icons@4.11.2":
-  version "4.11.2"
-  resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-4.11.2.tgz#b3a7353266519cd743b6461ae9fdfcb1b25eb4c5"
-  integrity sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ==
+"@mui/private-theming@^5.2.2":
+  version "5.2.2"
+  resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.2.2.tgz#ede801bc4b6939aedf5900edcece981fde8fa210"
+  integrity sha512-BfTjZ5ao6KY4Sg11lgaVuQ9uUq8unaM2u9/RKDD12If0B2Vp/AhRSe7i5OTd+wErmK2guTX0kPSraGZzwDEIVg==
   dependencies:
-    "@babel/runtime" "^7.4.4"
+    "@babel/runtime" "^7.16.3"
+    "@mui/utils" "^5.2.2"
+    prop-types "^15.7.2"
 
-"@material-ui/lab@4.0.0-alpha.58":
-  version "4.0.0-alpha.58"
-  resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-4.0.0-alpha.58.tgz#c7ebb66f49863c5acbb20817163737caa299fafc"
-  integrity sha512-GKHlJqLxUeHH3L3dGQ48ZavYrqGOTXkFkiEiuYMAnAvXAZP4rhMIqeHOPXSUQan4Bd8QnafDcpovOSLnadDmKw==
+"@mui/styled-engine@^5.2.0":
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.2.0.tgz#5c97e2b1b6c4c2d9991f07517ed862972d362b85"
+  integrity sha512-NZ4pWYQcM5wreUfiXRd7IMFRF+Nq1vMzsIdXtXNjgctJTKHunrofasoBqv+cqevO+hqT75ezSbNHyaXzOXp6Mg==
   dependencies:
-    "@babel/runtime" "^7.4.4"
-    "@material-ui/utils" "^4.11.2"
-    clsx "^1.0.4"
+    "@babel/runtime" "^7.16.3"
+    "@emotion/cache" "^11.6.0"
     prop-types "^15.7.2"
-    react-is "^16.8.0 || ^17.0.0"
 
-"@material-ui/styles@^4.11.4":
-  version "4.11.4"
-  resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.11.4.tgz#eb9dfccfcc2d208243d986457dff025497afa00d"
-  integrity sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew==
+"@mui/styles@^5.2.2":
+  version "5.2.2"
+  resolved "https://registry.yarnpkg.com/@mui/styles/-/styles-5.2.2.tgz#34c9ba1d6d5a0b9399fbd0c6e85b8f2dcfe54fbd"
+  integrity sha512-Hfg/3nAU+25RVzpgB0xyE1JjrOCI4rjujrJ0K4tS7M/U4NKZQrmtinc5ldvCaZUlxb51bZGs5V1MGn2dLKZVNQ==
   dependencies:
-    "@babel/runtime" "^7.4.4"
+    "@babel/runtime" "^7.16.3"
     "@emotion/hash" "^0.8.0"
-    "@material-ui/types" "5.1.0"
-    "@material-ui/utils" "^4.11.2"
-    clsx "^1.0.4"
-    csstype "^2.5.2"
+    "@mui/private-theming" "^5.2.2"
+    "@mui/types" "^7.1.0"
+    "@mui/utils" "^5.2.2"
+    clsx "^1.1.1"
+    csstype "^3.0.10"
     hoist-non-react-statics "^3.3.2"
-    jss "^10.5.1"
-    jss-plugin-camel-case "^10.5.1"
-    jss-plugin-default-unit "^10.5.1"
-    jss-plugin-global "^10.5.1"
-    jss-plugin-nested "^10.5.1"
-    jss-plugin-props-sort "^10.5.1"
-    jss-plugin-rule-value-function "^10.5.1"
-    jss-plugin-vendor-prefixer "^10.5.1"
+    jss "^10.8.2"
+    jss-plugin-camel-case "^10.8.2"
+    jss-plugin-default-unit "^10.8.2"
+    jss-plugin-global "^10.8.2"
+    jss-plugin-nested "^10.8.2"
+    jss-plugin-props-sort "^10.8.2"
+    jss-plugin-rule-value-function "^10.8.2"
+    jss-plugin-vendor-prefixer "^10.8.2"
     prop-types "^15.7.2"
 
-"@material-ui/system@^4.11.3":
-  version "4.12.1"
-  resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.12.1.tgz#2dd96c243f8c0a331b2bb6d46efd7771a399707c"
-  integrity sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw==
-  dependencies:
-    "@babel/runtime" "^7.4.4"
-    "@material-ui/utils" "^4.11.2"
-    csstype "^2.5.2"
+"@mui/system@^5.2.2":
+  version "5.2.2"
+  resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.2.2.tgz#81ef74f0c269d18b99a2d0253833d6554bbf5198"
+  integrity sha512-221tPOcZC8A89GOt6LH9YPTj2Iqf880iqrHd7AHT/HznBKOlLrnWD83pCuLPyX2jeFz4OzhvmGbdt5a74UEgaA==
+  dependencies:
+    "@babel/runtime" "^7.16.3"
+    "@mui/private-theming" "^5.2.2"
+    "@mui/styled-engine" "^5.2.0"
+    "@mui/types" "^7.1.0"
+    "@mui/utils" "^5.2.2"
+    clsx "^1.1.1"
+    csstype "^3.0.10"
     prop-types "^15.7.2"
 
-"@material-ui/types@5.1.0":
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.1.0.tgz#efa1c7a0b0eaa4c7c87ac0390445f0f88b0d88f2"
-  integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==
+"@mui/types@^7.1.0":
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.1.0.tgz#5ed928c5a41cfbf9a4be82ea3bbdc47bcc9610d5"
+  integrity sha512-Hh7ALdq/GjfIwLvqH3XftuY3bcKhupktTm+S6qRIDGOtPtRuq2L21VWzOK4p7kblirK0XgGVH5BLwa6u8z/6QQ==
 
-"@material-ui/utils@^4.11.2":
-  version "4.11.2"
-  resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.11.2.tgz#f1aefa7e7dff2ebcb97d31de51aecab1bb57540a"
-  integrity sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==
+"@mui/utils@^5.2.2":
+  version "5.2.2"
+  resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.2.2.tgz#972aab7d2564e77c06e0c3c11e7b1aec6e37c927"
+  integrity sha512-0u9ImUfpCfTxmvQTfUzTSS+jKWMX15MBZeZCRQZ0f7o9Yi8BlrLj33lMx0mFBkUSYdTXnqL4yfOn7RBzV01HMQ==
   dependencies:
-    "@babel/runtime" "^7.4.4"
+    "@babel/runtime" "^7.16.3"
+    "@types/prop-types" "^15.7.4"
+    "@types/react-is" "^16.7.1 || ^17.0.0"
     prop-types "^15.7.2"
-    react-is "^16.8.0 || ^17.0.0"
-
-"@mrmlnc/readdir-enhanced@^2.2.1":
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
-  integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==
-  dependencies:
-    call-me-maybe "^1.0.1"
-    glob-to-regexp "^0.3.0"
+    react-is "^17.0.2"
 
 "@nodelib/fs.stat@^1.1.2":
   version "1.1.3"
   dependencies:
     "@octokit/openapi-types" "^8.2.1"
 
+"@popperjs/core@^2.4.4":
+  version "2.11.0"
+  resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.0.tgz#6734f8ebc106a0860dff7f92bf90df193f0935d7"
+  integrity sha512-zrsUxjLOKAzdewIDRWy9nsV1GQsKBCWaGwsZQlCgr6/q+vjyZhFgqedLfFBuI9anTPEUT4APq9Mu0SZBTzIcGQ==
+
 "@types/classnames@2.2.6":
   version "2.2.6"
   resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.2.6.tgz#dbe8a666156d556ed018e15a4c65f08937c3f628"
   integrity sha512-XHcYvVdbtAxVstjKxuULYqYaWIzHR15yr1pZj4fnGChuBVJlIAp9StJna0ZJNSgxPh4Nac2FL4JM3M11Tm6fqQ==
 
-"@types/d3-array@^2":
-  version "2.12.3"
-  resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-2.12.3.tgz#8d16d51fb04ad5a5a8ebe14eb8263a579f1efdd1"
-  integrity sha512-hN879HLPTVqZV3FQEXy7ptt083UXwguNbnxdTGzVW4y4KjX5uyNKljrQixZcSJfLyFirbpUokxpXtvR+N5+KIg==
-
-"@types/d3-axis@^2":
-  version "2.1.3"
-  resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-2.1.3.tgz#348cca877f6643030aa8c866d08ccae06821a0e2"
-  integrity sha512-QjXjwZ0xzyrW2ndkmkb09ErgWDEYtbLBKGui73QLMFm3woqWpxptfD5Y7vqQdybMcu7WEbjZ5q+w2w5+uh2IjA==
-  dependencies:
-    "@types/d3-selection" "^2"
-
-"@types/d3-brush@^2":
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-2.1.2.tgz#c75890d1ccaef24fba1811daae3f896c1806418b"
-  integrity sha512-DnZmjdK1ycX1CMiW9r5E3xSf1tL+bp3yob1ON8bf0xB0/odfmGXeYOTafU+2SmU1F0/dvcqaO4SMjw62onOu6A==
-  dependencies:
-    "@types/d3-selection" "^2"
-
-"@types/d3-chord@^2":
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-2.0.3.tgz#3009b792b754da964d893b4269d1fe7757f21370"
-  integrity sha512-koIqSNQLPRQPXt7c55hgRF6Lr9Ps72r1+Biv55jdYR+SHJ463MsB2lp4ktzttFNmrQw/9yWthf/OmSUj5dNXKw==
-
-"@types/d3-color@^2":
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-2.0.3.tgz#8bc4589073c80e33d126345542f588056511fe82"
-  integrity sha512-+0EtEjBfKEDtH9Rk3u3kLOUXM5F+iZK+WvASPb0MhIZl8J8NUvGeZRwKCXl+P3HkYx5TdU4YtcibpqHkSR9n7w==
-
-"@types/d3-contour@^2":
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/@types/d3-contour/-/d3-contour-2.0.4.tgz#2fc5aa8949c1a1d12d183633603923025e3d14fd"
-  integrity sha512-WMac1xV/mXAgkgr5dUvzsBV5OrgNZDBDpJk9s3v2SadTqGgDRirKABb2Ek2H1pFlYVH4Oly9XJGnuzxKDduqWA==
-  dependencies:
-    "@types/d3-array" "^2"
-    "@types/geojson" "*"
-
-"@types/d3-delaunay@^5":
-  version "5.3.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-delaunay/-/d3-delaunay-5.3.1.tgz#47ae03af6b78cb3aa39d3d3c42ca71daca488aef"
-  integrity sha512-F6itHi2DxdatHil1rJ2yEFUNhejj8+0Acd55LZ6Ggwbdoks0+DxVY2cawNj16sjCBiWvubVlh6eBMVsYRNGLew==
-
-"@types/d3-dispatch@^2":
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-2.0.1.tgz#d7dc50f9b679996ccf70f3c79dbbf99505a93107"
-  integrity sha512-eT2K8uG3rXkmRiCpPn0rNrekuSLdBfV83vbTvfZliA5K7dbeaqWS/CBHtJ9SQoF8aDTsWSY4A0RU67U/HcKdJQ==
-
-"@types/d3-drag@^2":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-2.0.2.tgz#ed538d24456c839967a9ac7aab5e1b63b28bac7f"
-  integrity sha512-m9USoFaTgVw2mmE7vLjWTApT9dMxMlql/dl3Gj503x+1a2n6K455iDWydqy2dfCpkUBCoF82yRGDgcSk9FUEyQ==
-  dependencies:
-    "@types/d3-selection" "^2"
-
-"@types/d3-dsv@^2":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-2.0.2.tgz#e10fa57576b50ded27e261db9984b9a92efec2f3"
-  integrity sha512-T4aL2ZzaILkLGKbxssipYVRs8334PSR9FQzTGftZbc3jIPGkiXXS7qUCh8/q8UWFzxBZQ92dvR0v7+AM9wL2PA==
-
-"@types/d3-ease@^2":
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-2.0.1.tgz#be03d29980ed7359be1d5b93ff666f95ddcbcf48"
-  integrity sha512-Af1ftZXv82ktPCk1+Vxe7f+VSfxDsQ1mwwakDl17+UzI/ii3vsDIAzaBDDSEQd2Cg9BYPTSx8wXH8rJNDuSjeg==
-
-"@types/d3-fetch@^2":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-2.0.2.tgz#628c65d14b3a0d02fe1b9c2f3098b81a47e370bc"
-  integrity sha512-sllsCSWrNdSvzOJWN5RnxkmtvW9pCttONGajSxHX9FUQ9kOkGE391xlz6VDBdZxLnpwjp3I+mipbwsaCjq4m5A==
-  dependencies:
-    "@types/d3-dsv" "^2"
-
-"@types/d3-force@^2":
-  version "2.1.3"
-  resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-2.1.3.tgz#7b0d9ff608e394e6675cce5163eda8368fba7a07"
-  integrity sha512-b/1KrS7hESsMXZ3dOh5KrWPoDcQQbQKey344HO7F3o0tEcVzWHIgp1UMfHv8MLcysfHsRSPGpO7dRyLOVhMQnw==
-
-"@types/d3-format@^2":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-2.0.2.tgz#97b2ac314430ae9f7768cc9efba8b23b63af82ef"
-  integrity sha512-OhQPuTeeMhD9A0Ksqo4q1S9Z1Q57O/t4tTPBxBQxRB4IERnxeoEYLPe72fA/GYpPSUrfKZVOgLHidkxwbzLdJA==
-
-"@types/d3-geo@^2":
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-2.0.3.tgz#4af0f33c9e796aad6c3fc0dd8cadda9886d1fea9"
-  integrity sha512-kFwLEMXq1mGJ2Eho7KrOUYvLcc2YTDeKj+kTFt87JlEbRQ0rgo8ZENNb5vTYmZrJ2xL/vVM5M7yqVZGOPH2JFg==
-  dependencies:
-    "@types/geojson" "*"
-
-"@types/d3-hierarchy@^2":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-2.0.2.tgz#afd09d509c36e8cd4907333556f8b591f23589e9"
-  integrity sha512-6PlBRwbjUPPt0ZFq/HTUyOAdOF3p73EUYots74lHMUyAVtdFSOS/hAeNXtEIM9i7qRDntuIblXxHGUMb9MuNRA==
-
-"@types/d3-interpolate@^2":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-2.0.2.tgz#78eddf7278b19e48e8652603045528d46897aba0"
-  integrity sha512-lElyqlUfIPyWG/cD475vl6msPL4aMU7eJvx1//Q177L8mdXoVPFl1djIESF2FKnc0NyaHvQlJpWwKJYwAhUoCw==
-  dependencies:
-    "@types/d3-color" "^2"
-
-"@types/d3-path@^2":
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-2.0.1.tgz#ca03dfa8b94d8add97ad0cd97e96e2006b4763cb"
-  integrity sha512-6K8LaFlztlhZO7mwsZg7ClRsdLg3FJRzIIi6SZXDWmmSJc2x8dd2VkESbLXdk3p8cuvz71f36S0y8Zv2AxqvQw==
-
-"@types/d3-polygon@^2":
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-polygon/-/d3-polygon-2.0.1.tgz#c2056594f85b512bc2b4f741caddd4b5448bc115"
-  integrity sha512-X3XTIwBxlzRIWe4yaD1KsmcfItjSPLTGL04QDyP08jyHDVsnz3+NZJMwtD4vCaTAVpGSjbqS+jrBo8cO2V/xMA==
-
-"@types/d3-quadtree@^2":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-2.0.2.tgz#e3cd92b4e05318f98b0a16e780ba99ce7b13eb77"
-  integrity sha512-KgWL4jlz8QJJZX01E4HKXJ9FLU94RTuObsAYqsPp8YOAcYDmEgJIQJ+ojZcnKUAnrUb78ik8JBKWas5XZPqJnQ==
-
-"@types/d3-random@^2":
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-2.2.1.tgz#551edbb71cb317dea2cf9c76ebe059d311eefacb"
-  integrity sha512-5vvxn6//poNeOxt1ZwC7QU//dG9QqABjy1T7fP/xmFHY95GnaOw3yABf29hiu5SR1Oo34XcpyHFbzod+vemQjA==
-
-"@types/d3-scale-chromatic@^2":
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-2.0.1.tgz#495cbbae7273e0d0ff564cdc19aa6d2b9928da83"
-  integrity sha512-3EuZlbPu+pvclZcb1DhlymTWT2W+lYsRKBjvkH2ojDbCWDYavifqu1vYX9WGzlPgCgcS4Alhk1+zapXbGEGylQ==
-
-"@types/d3-scale@^3":
-  version "3.3.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-3.3.2.tgz#18c94e90f4f1c6b1ee14a70f14bfca2bd1c61d06"
-  integrity sha512-gGqr7x1ost9px3FvIfUMi5XA/F/yAf4UkUDtdQhpH92XCT0Oa7zkkRzY61gPVJq+DxpHn/btouw5ohWkbBsCzQ==
-  dependencies:
-    "@types/d3-time" "^2"
-
-"@types/d3-selection@^2":
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-2.0.1.tgz#bc2816c96faff285d204dda72b79734d4f37d583"
-  integrity sha512-3mhtPnGE+c71rl/T5HMy+ykg7migAZ4T6gzU0HxpgBFKcasBrSnwRbYV1/UZR6o5fkpySxhWxAhd7yhjj8jL7g==
-
-"@types/d3-shape@^2":
-  version "2.1.3"
-  resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-2.1.3.tgz#35d397b9e687abaa0de82343b250b9897b8cacf3"
-  integrity sha512-HAhCel3wP93kh4/rq+7atLdybcESZ5bRHDEZUojClyZWsRuEMo3A52NGYJSh48SxfxEU6RZIVbZL2YFZ2OAlzQ==
-  dependencies:
-    "@types/d3-path" "^2"
-
-"@types/d3-time-format@^3":
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-3.0.1.tgz#1680fb6c41ab3a85db261ede296626668592246a"
-  integrity sha512-5GIimz5IqaRsdnxs4YlyTZPwAMfALu/wA4jqSiuqgdbCxUZ2WjrnwANqOtoBJQgeaUTdYNfALJO0Yb0YrDqduA==
-
-"@types/d3-time@^2":
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-2.1.1.tgz#743fdc821c81f86537cbfece07093ac39b4bc342"
-  integrity sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg==
-
-"@types/d3-timer@^2":
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-2.0.1.tgz#ffb6620d290624f3726aa362c0c8a4b44c8d7200"
-  integrity sha512-TF8aoF5cHcLO7W7403blM7L1T+6NF3XMyN3fxyUolq2uOcFeicG/khQg/dGxiCJWoAcmYulYN7LYSRKO54IXaA==
-
-"@types/d3-transition@^2":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-2.0.2.tgz#d5ba1c26a3daeb0c5527d573d44b4c5ca9fae027"
-  integrity sha512-376TICEykdXOEA9uUIYpjshEkxfGwCPnkHUl8+6gphzKbf5NMnUhKT7wR59Yxrd9wtJ/rmE3SVLx6/8w4eY6Zg==
-  dependencies:
-    "@types/d3-selection" "^2"
-
-"@types/d3-zoom@^2":
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-2.0.3.tgz#9eef8763600fa8be11b8cb0ed9144a395df6dffb"
-  integrity sha512-9X9uDYKk2U8w775OHj36s9Q7GkNAnJKGw6+sbkP5DpHSjELwKvTGzEK6+IISYfLpJRL/V3mRXMhgDnnJ5LkwJg==
-  dependencies:
-    "@types/d3-interpolate" "^2"
-    "@types/d3-selection" "^2"
-
-"@types/d3@^6.7.0":
-  version "6.7.5"
-  resolved "https://registry.yarnpkg.com/@types/d3/-/d3-6.7.5.tgz#6ae8034ea21db10fa3e31db1f670c5887d91d8a3"
-  integrity sha512-TUZ6zuT/KIvbHSv81kwAiO5gG5aTuoiLGnWR/KxHJ15Idy/xmGUXaaF5zMG+UMIsndcGlSHTmrvwRgdvZlNKaA==
-  dependencies:
-    "@types/d3-array" "^2"
-    "@types/d3-axis" "^2"
-    "@types/d3-brush" "^2"
-    "@types/d3-chord" "^2"
-    "@types/d3-color" "^2"
-    "@types/d3-contour" "^2"
-    "@types/d3-delaunay" "^5"
-    "@types/d3-dispatch" "^2"
-    "@types/d3-drag" "^2"
-    "@types/d3-dsv" "^2"
-    "@types/d3-ease" "^2"
-    "@types/d3-fetch" "^2"
-    "@types/d3-force" "^2"
-    "@types/d3-format" "^2"
-    "@types/d3-geo" "^2"
-    "@types/d3-hierarchy" "^2"
-    "@types/d3-interpolate" "^2"
-    "@types/d3-path" "^2"
-    "@types/d3-polygon" "^2"
-    "@types/d3-quadtree" "^2"
-    "@types/d3-random" "^2"
-    "@types/d3-scale" "^3"
-    "@types/d3-scale-chromatic" "^2"
-    "@types/d3-selection" "^2"
-    "@types/d3-shape" "^2"
-    "@types/d3-time" "^2"
-    "@types/d3-time-format" "^3"
-    "@types/d3-timer" "^2"
-    "@types/d3-transition" "^2"
-    "@types/d3-zoom" "^2"
-
 "@types/fbemitter@*":
   version "2.0.32"
   resolved "https://registry.yarnpkg.com/@types/fbemitter/-/fbemitter-2.0.32.tgz#8ed204da0f54e9c8eaec31b1eec91e25132d082c"
     "@types/fbemitter" "*"
     "@types/react" "*"
 
-"@types/geojson@*":
-  version "7946.0.8"
-  resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.8.tgz#30744afdb385e2945e22f3b033f897f76b1f12ca"
-  integrity sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==
-
 "@types/glob-to-regexp@0.4.0":
   version "0.4.0"
   resolved "https://registry.yarnpkg.com/@types/glob-to-regexp/-/glob-to-regexp-0.4.0.tgz#a295047724f4554be8192b4c779c5e44920a2fdc"
   resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.10.tgz#d0afaec7ee55f591992e74c607df5dc7cd9c76ab"
   integrity sha512-W2bE8pGh9Tsg8mxh+B6BSH8lTG6ZV7K2ZMAlEwSTqKFU1wMI5HShyRKSp3DngnxCmDu35tW3RAC4mxBFYRsTuw==
 
-"@types/json-schema@^7.0.7":
-  version "7.0.8"
-  resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.8.tgz#edf1bf1dbf4e04413ca8e5b17b3b7d7d54b59818"
-  integrity sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg==
-
 "@types/jsonwebtoken@7.2.8":
   version "7.2.8"
   resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-7.2.8.tgz#8d199dab4ddb5bba3234f8311b804d2027af2b3a"
   dependencies:
     "@types/node" "*"
 
-"@types/mapbox-gl@^1.10.2":
-  version "1.13.2"
-  resolved "https://registry.yarnpkg.com/@types/mapbox-gl/-/mapbox-gl-1.13.2.tgz#d20959d02b9ca17a2a3244387f1da763992ed11d"
-  integrity sha512-sv69WkijddNCIdLLyUsG90+X3Lh67a26lKsqaL8WbmXMkWITDrshe+sc9BI8oUV7sh+XD0jraI3qBe0NtJs7dw==
-  dependencies:
-    "@types/geojson" "*"
-
 "@types/marked@0.6.0":
   version "0.6.0"
   resolved "https://registry.yarnpkg.com/@types/marked/-/marked-0.6.0.tgz#e4ac316144a84afda5c2474488d7b9fef3ab9995"
   resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301"
   integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==
 
-"@types/prop-types@*":
+"@types/parse-json@^4.0.0":
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
+  integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+
+"@types/prop-types@*", "@types/prop-types@^15.7.4":
   version "15.7.4"
   resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11"
   integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==
 
-"@types/react-dom@17.0.2":
-  version "17.0.2"
-  resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.2.tgz#35654cf6c49ae162d5bc90843d5437dc38008d43"
-  integrity sha512-Icd9KEgdnFfJs39KyRyr0jQ7EKhq8U6CcHRMGAS45fp5qgUvxL3ujUCfWFttUK2UErqZNj97t9gsVPNAqcwoCg==
+"@types/react-dom@17.0.11":
+  version "17.0.11"
+  resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.11.tgz#e1eadc3c5e86bdb5f7684e00274ae228e7bcc466"
+  integrity sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q==
+  dependencies:
+    "@types/react" "*"
+
+"@types/react-is@^16.7.1 || ^17.0.0":
+  version "17.0.3"
+  resolved "https://registry.yarnpkg.com/@types/react-is/-/react-is-17.0.3.tgz#2d855ba575f2fc8d17ef9861f084acc4b90a137a"
+  integrity sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==
   dependencies:
     "@types/react" "*"
 
   dependencies:
     "@types/react" "*"
 
-"@types/react-transition-group@^4.2.0":
-  version "4.4.2"
-  resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.2.tgz#38890fd9db68bf1f2252b99a942998dc7877c5b3"
-  integrity sha512-KibDWL6nshuOJ0fu8ll7QnV/LVTo3PzQ9aCPnRUYPfX7eZohHwLIdNHj7pftanREzHNP4/nJa8oeM73uSiavMQ==
+"@types/react-transition-group@^4.4.4":
+  version "4.4.4"
+  resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.4.tgz#acd4cceaa2be6b757db61ed7b432e103242d163e"
+  integrity sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==
   dependencies:
     "@types/react" "*"
 
     "@types/scheduler" "*"
     csstype "^3.0.2"
 
-"@types/react@17.0.3":
-  version "17.0.3"
-  resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.3.tgz#ba6e215368501ac3826951eef2904574c262cc79"
-  integrity sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg==
+"@types/react@17.0.37":
+  version "17.0.37"
+  resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.37.tgz#6884d0aa402605935c397ae689deed115caad959"
+  integrity sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg==
   dependencies:
     "@types/prop-types" "*"
     "@types/scheduler" "*"
   dependencies:
     x2js "*"
 
-"@types/yup@^0.29.7":
-  version "0.29.13"
-  resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.29.13.tgz#21b137ba60841307a3c8a1050d3bf4e63ad561e9"
-  integrity sha512-qRyuv+P/1t1JK1rA+elmK1MmCL1BapEzKKfbEhDBV/LMMse4lmhZ/XbgETI39JveDJRpLjmToOI6uFtMW/WR2g==
-
 "@webassemblyjs/ast@1.7.11":
   version "1.7.11"
   resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace"
     "@webassemblyjs/helper-wasm-bytecode" "1.7.11"
     "@webassemblyjs/wast-parser" "1.7.11"
 
-"@webassemblyjs/ast@1.9.0":
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964"
-  integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==
-  dependencies:
-    "@webassemblyjs/helper-module-context" "1.9.0"
-    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
-    "@webassemblyjs/wast-parser" "1.9.0"
-
 "@webassemblyjs/floating-point-hex-parser@1.7.11":
   version "1.7.11"
   resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313"
   integrity sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==
 
-"@webassemblyjs/floating-point-hex-parser@1.9.0":
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4"
-  integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==
-
 "@webassemblyjs/helper-api-error@1.7.11":
   version "1.7.11"
   resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a"
   integrity sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==
 
-"@webassemblyjs/helper-api-error@1.9.0":
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2"
-  integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==
-
 "@webassemblyjs/helper-buffer@1.7.11":
   version "1.7.11"
   resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b"
   integrity sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==
 
-"@webassemblyjs/helper-buffer@1.9.0":
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00"
-  integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==
-
 "@webassemblyjs/helper-code-frame@1.7.11":
   version "1.7.11"
   resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz#cf8f106e746662a0da29bdef635fcd3d1248364b"
   dependencies:
     "@webassemblyjs/wast-printer" "1.7.11"
 
-"@webassemblyjs/helper-code-frame@1.9.0":
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27"
-  integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==
-  dependencies:
-    "@webassemblyjs/wast-printer" "1.9.0"
-
 "@webassemblyjs/helper-fsm@1.7.11":
   version "1.7.11"
   resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181"
   integrity sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==
 
-"@webassemblyjs/helper-fsm@1.9.0":
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8"
-  integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==
-
 "@webassemblyjs/helper-module-context@1.7.11":
   version "1.7.11"
   resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209"
   integrity sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==
 
-"@webassemblyjs/helper-module-context@1.9.0":
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07"
-  integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==
-  dependencies:
-    "@webassemblyjs/ast" "1.9.0"
-
 "@webassemblyjs/helper-wasm-bytecode@1.7.11":
   version "1.7.11"
   resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06"
   integrity sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==
 
-"@webassemblyjs/helper-wasm-bytecode@1.9.0":
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790"
-  integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==
-
 "@webassemblyjs/helper-wasm-section@1.7.11":
   version "1.7.11"
   resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz#9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a"
     "@webassemblyjs/helper-wasm-bytecode" "1.7.11"
     "@webassemblyjs/wasm-gen" "1.7.11"
 
-"@webassemblyjs/helper-wasm-section@1.9.0":
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346"
-  integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==
-  dependencies:
-    "@webassemblyjs/ast" "1.9.0"
-    "@webassemblyjs/helper-buffer" "1.9.0"
-    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
-    "@webassemblyjs/wasm-gen" "1.9.0"
-
 "@webassemblyjs/ieee754@1.7.11":
   version "1.7.11"
   resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz#c95839eb63757a31880aaec7b6512d4191ac640b"
   dependencies:
     "@xtuc/ieee754" "^1.2.0"
 
-"@webassemblyjs/ieee754@1.9.0":
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4"
-  integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==
-  dependencies:
-    "@xtuc/ieee754" "^1.2.0"
-
 "@webassemblyjs/leb128@1.7.11":
   version "1.7.11"
   resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz#d7267a1ee9c4594fd3f7e37298818ec65687db63"
   dependencies:
     "@xtuc/long" "4.2.1"
 
-"@webassemblyjs/leb128@1.9.0":
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95"
-  integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==
-  dependencies:
-    "@xtuc/long" "4.2.2"
-
 "@webassemblyjs/utf8@1.7.11":
   version "1.7.11"
   resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82"
   integrity sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==
 
-"@webassemblyjs/utf8@1.9.0":
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab"
-  integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==
-
 "@webassemblyjs/wasm-edit@1.7.11":
   version "1.7.11"
   resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz#8c74ca474d4f951d01dbae9bd70814ee22a82005"
     "@webassemblyjs/wasm-parser" "1.7.11"
     "@webassemblyjs/wast-printer" "1.7.11"
 
-"@webassemblyjs/wasm-edit@1.9.0":
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf"
-  integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==
-  dependencies:
-    "@webassemblyjs/ast" "1.9.0"
-    "@webassemblyjs/helper-buffer" "1.9.0"
-    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
-    "@webassemblyjs/helper-wasm-section" "1.9.0"
-    "@webassemblyjs/wasm-gen" "1.9.0"
-    "@webassemblyjs/wasm-opt" "1.9.0"
-    "@webassemblyjs/wasm-parser" "1.9.0"
-    "@webassemblyjs/wast-printer" "1.9.0"
-
 "@webassemblyjs/wasm-gen@1.7.11":
   version "1.7.11"
   resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz#9bbba942f22375686a6fb759afcd7ac9c45da1a8"
     "@webassemblyjs/leb128" "1.7.11"
     "@webassemblyjs/utf8" "1.7.11"
 
-"@webassemblyjs/wasm-gen@1.9.0":
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c"
-  integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==
-  dependencies:
-    "@webassemblyjs/ast" "1.9.0"
-    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
-    "@webassemblyjs/ieee754" "1.9.0"
-    "@webassemblyjs/leb128" "1.9.0"
-    "@webassemblyjs/utf8" "1.9.0"
-
 "@webassemblyjs/wasm-opt@1.7.11":
   version "1.7.11"
   resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz#b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7"
     "@webassemblyjs/wasm-gen" "1.7.11"
     "@webassemblyjs/wasm-parser" "1.7.11"
 
-"@webassemblyjs/wasm-opt@1.9.0":
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61"
-  integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==
-  dependencies:
-    "@webassemblyjs/ast" "1.9.0"
-    "@webassemblyjs/helper-buffer" "1.9.0"
-    "@webassemblyjs/wasm-gen" "1.9.0"
-    "@webassemblyjs/wasm-parser" "1.9.0"
-
 "@webassemblyjs/wasm-parser@1.7.11":
   version "1.7.11"
   resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz#6e3d20fa6a3519f6b084ef9391ad58211efb0a1a"
     "@webassemblyjs/leb128" "1.7.11"
     "@webassemblyjs/utf8" "1.7.11"
 
-"@webassemblyjs/wasm-parser@1.9.0":
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e"
-  integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==
-  dependencies:
-    "@webassemblyjs/ast" "1.9.0"
-    "@webassemblyjs/helper-api-error" "1.9.0"
-    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
-    "@webassemblyjs/ieee754" "1.9.0"
-    "@webassemblyjs/leb128" "1.9.0"
-    "@webassemblyjs/utf8" "1.9.0"
-
 "@webassemblyjs/wast-parser@1.7.11":
   version "1.7.11"
   resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz#25bd117562ca8c002720ff8116ef9072d9ca869c"
     "@webassemblyjs/helper-fsm" "1.7.11"
     "@xtuc/long" "4.2.1"
 
-"@webassemblyjs/wast-parser@1.9.0":
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914"
-  integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==
-  dependencies:
-    "@webassemblyjs/ast" "1.9.0"
-    "@webassemblyjs/floating-point-hex-parser" "1.9.0"
-    "@webassemblyjs/helper-api-error" "1.9.0"
-    "@webassemblyjs/helper-code-frame" "1.9.0"
-    "@webassemblyjs/helper-fsm" "1.9.0"
-    "@xtuc/long" "4.2.2"
-
 "@webassemblyjs/wast-printer@1.7.11":
   version "1.7.11"
   resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz#c4245b6de242cb50a2cc950174fdbf65c78d7813"
     "@webassemblyjs/wast-parser" "1.7.11"
     "@xtuc/long" "4.2.1"
 
-"@webassemblyjs/wast-printer@1.9.0":
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899"
-  integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==
-  dependencies:
-    "@webassemblyjs/ast" "1.9.0"
-    "@webassemblyjs/wast-parser" "1.9.0"
-    "@xtuc/long" "4.2.2"
-
 "@xtuc/ieee754@^1.2.0":
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
   resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8"
   integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==
 
-"@xtuc/long@4.2.2":
-  version "4.2.2"
-  resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
-  integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
-
 "@zkochan/cmd-shim@^3.1.0":
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz#2ab8ed81f5bb5452a85f25758eb9b8681982fd2e"
@@ -2516,7 +2310,7 @@ acorn@^5.0.0, acorn@^5.5.3, acorn@^5.6.2:
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e"
   integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==
 
-acorn@^6.0.1, acorn@^6.4.1:
+acorn@^6.0.1:
   version "6.4.2"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6"
   integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==
@@ -2547,12 +2341,12 @@ ajv-errors@^1.0.0:
   resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
   integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
 
-ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2:
+ajv-keywords@^3.1.0:
   version "3.5.2"
   resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
   integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
 
-ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.5:
+ajv@^6.1.0, ajv@^6.12.3:
   version "6.12.6"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
   integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -2948,6 +2742,15 @@ babel-plugin-jest-hoist@^23.2.0:
   resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167"
   integrity sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=
 
+babel-plugin-macros@^2.6.1:
+  version "2.8.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138"
+  integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==
+  dependencies:
+    "@babel/runtime" "^7.7.2"
+    cosmiconfig "^6.0.0"
+    resolve "^1.12.0"
+
 babel-plugin-syntax-object-rest-spread@^6.13.0:
   version "6.13.0"
   resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
@@ -3464,6 +3267,11 @@ callsites@^2.0.0:
   resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
   integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
 
+callsites@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+  integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
 camel-case@3.0.x:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
@@ -3588,21 +3396,6 @@ chartjs-color@^2.1.0:
     chartjs-color-string "^0.6.0"
     color-convert "^1.9.3"
 
-"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.1:
-  version "3.5.2"
-  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75"
-  integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==
-  dependencies:
-    anymatch "~3.1.2"
-    braces "~3.0.2"
-    glob-parent "~5.1.2"
-    is-binary-path "~2.1.0"
-    is-glob "~4.0.1"
-    normalize-path "~3.0.0"
-    readdirp "~3.6.0"
-  optionalDependencies:
-    fsevents "~2.3.2"
-
 chokidar@^2.0.0, chokidar@^2.1.8:
   version "2.1.8"
   resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
@@ -3622,12 +3415,27 @@ chokidar@^2.0.0, chokidar@^2.1.8:
   optionalDependencies:
     fsevents "^1.2.7"
 
+chokidar@^3.4.1:
+  version "3.5.2"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75"
+  integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==
+  dependencies:
+    anymatch "~3.1.2"
+    braces "~3.0.2"
+    glob-parent "~5.1.2"
+    is-binary-path "~2.1.0"
+    is-glob "~4.0.1"
+    normalize-path "~3.0.0"
+    readdirp "~3.6.0"
+  optionalDependencies:
+    fsevents "~2.3.2"
+
 chownr@^1.0.1, chownr@^1.1.1, chownr@^1.1.2:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
   integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
 
-chrome-trace-event@^1.0.0, chrome-trace-event@^1.0.2:
+chrome-trace-event@^1.0.0:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
   integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
@@ -3665,11 +3473,6 @@ classnames@2.2.6:
   resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce"
   integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==
 
-classnames@^2.2.6:
-  version "2.3.1"
-  resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e"
-  integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==
-
 clean-css@4.2.x:
   version "4.2.3"
   resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78"
@@ -3745,7 +3548,7 @@ clone@^2.1.1, clone@^2.1.2:
   resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
   integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
 
-clsx@^1.0.4:
+clsx@^1.1.0, clsx@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188"
   integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==
@@ -3820,11 +3623,6 @@ commander@2.17.x:
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
   integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
 
-commander@7:
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
-  integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
-
 commander@^2.12.1, commander@^2.19.0, commander@^2.20.0:
   version "2.20.3"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
@@ -4021,7 +3819,7 @@ conventional-recommended-bump@^5.0.0:
     meow "^4.0.0"
     q "^1.5.1"
 
-convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.1:
+convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1:
   version "1.8.0"
   resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
   integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
@@ -4094,6 +3892,17 @@ cosmiconfig@^5.0.0, cosmiconfig@^5.1.0:
     js-yaml "^3.13.1"
     parse-json "^4.0.0"
 
+cosmiconfig@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982"
+  integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==
+  dependencies:
+    "@types/parse-json" "^4.0.0"
+    import-fresh "^3.1.0"
+    parse-json "^5.0.0"
+    path-type "^4.0.0"
+    yaml "^1.7.2"
+
 create-ecdh@^4.0.0:
   version "4.0.4"
   resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
@@ -4211,11 +4020,6 @@ css-what@^5.0.0:
   resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad"
   integrity sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==
 
-csscolorparser@~1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/csscolorparser/-/csscolorparser-1.0.3.tgz#b34f391eea4da8f3e98231e2ccd8df9c041f171b"
-  integrity sha1-s085HupNqPPpgjHizNjfnAQfFxs=
-
 cssesc@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
@@ -4238,11 +4042,16 @@ csstype@2.6.8:
   resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.8.tgz#0fb6fc2417ffd2816a418c9336da74d7f07db431"
   integrity sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA==
 
-csstype@^2.5.2, csstype@^2.6.5:
+csstype@^2.6.5:
   version "2.6.17"
   resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.17.tgz#4cf30eb87e1d1a005d8b6510f95292413f6a1c0e"
   integrity sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A==
 
+csstype@^3.0.10:
+  version "3.0.10"
+  resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5"
+  integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==
+
 csstype@^3.0.2:
   version "3.0.8"
   resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340"
@@ -4260,250 +4069,6 @@ cyclist@^1.0.1:
   resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
   integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
 
-"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.0.1.tgz#ca45c263f5bb780ab5a34a6e1d3d5883fe4a8d14"
-  integrity sha512-l3Bh5o8RSoC3SBm5ix6ogaFW+J6rOUm42yOtZ2sQPCEvCqUMepeX7zgrlLLGIemxgOyo9s2CsWEidnLv5PwwRw==
-  dependencies:
-    internmap "1 - 2"
-
-d3-axis@3:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322"
-  integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==
-
-d3-brush@3:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c"
-  integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==
-  dependencies:
-    d3-dispatch "1 - 3"
-    d3-drag "2 - 3"
-    d3-interpolate "1 - 3"
-    d3-selection "3"
-    d3-transition "3"
-
-d3-chord@3:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966"
-  integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==
-  dependencies:
-    d3-path "1 - 3"
-
-"d3-color@1 - 3", d3-color@3:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.0.1.tgz#03316e595955d1fcd39d9f3610ad41bb90194d0a"
-  integrity sha512-6/SlHkDOBLyQSJ1j1Ghs82OIUXpKWlR0hCsw0XrLSQhuUPuCSmLQ1QPH98vpnQxMUQM2/gfAkUEWsupVpd9JGw==
-
-d3-contour@3:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-3.0.1.tgz#2c64255d43059599cd0dba8fe4cc3d51ccdd9bbd"
-  integrity sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==
-  dependencies:
-    d3-array "2 - 3"
-
-d3-delaunay@6:
-  version "6.0.2"
-  resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.2.tgz#7fd3717ad0eade2fc9939f4260acfb503f984e92"
-  integrity sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==
-  dependencies:
-    delaunator "5"
-
-"d3-dispatch@1 - 3", d3-dispatch@3:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e"
-  integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==
-
-"d3-drag@2 - 3", d3-drag@3:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba"
-  integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==
-  dependencies:
-    d3-dispatch "1 - 3"
-    d3-selection "3"
-
-"d3-dsv@1 - 3", d3-dsv@3:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73"
-  integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==
-  dependencies:
-    commander "7"
-    iconv-lite "0.6"
-    rw "1"
-
-"d3-ease@1 - 3", d3-ease@3:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4"
-  integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==
-
-d3-fetch@3:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22"
-  integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==
-  dependencies:
-    d3-dsv "1 - 3"
-
-d3-force@3:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4"
-  integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==
-  dependencies:
-    d3-dispatch "1 - 3"
-    d3-quadtree "1 - 3"
-    d3-timer "1 - 3"
-
-"d3-format@1 - 3", d3-format@3:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.0.1.tgz#e41b81b2ab79277141ec1404aa5d05001da64084"
-  integrity sha512-hdL7+HBIohpgfolhBxr1KX47VMD6+vVD/oEFrxk5yhmzV2prk99EkFKYpXuhVkFpTgHdJ6/4bYcjdLPPXV4tIA==
-
-d3-geo@3:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.0.1.tgz#4f92362fd8685d93e3b1fae0fd97dc8980b1ed7e"
-  integrity sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==
-  dependencies:
-    d3-array "2.5.0 - 3"
-
-d3-hierarchy@3:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.0.1.tgz#0365342d54972e38ca05e9143e0ab1c60846b3b5"
-  integrity sha512-RlLTaofEoOrMK1JoXYIGhKTkJFI/6rFrYPgxy6QlZo2BcVc4HGTqEU0rPpzuMq5T/5XcMtAzv1XiLA3zRTfygw==
-
-"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d"
-  integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==
-  dependencies:
-    d3-color "1 - 3"
-
-"d3-path@1 - 3", d3-path@3:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.0.1.tgz#f09dec0aaffd770b7995f1a399152bf93052321e"
-  integrity sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==
-
-d3-polygon@3, d3-polygon@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398"
-  integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==
-
-"d3-quadtree@1 - 3", d3-quadtree@3:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f"
-  integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==
-
-d3-random@3:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4"
-  integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==
-
-d3-scale-chromatic@3:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#15b4ceb8ca2bb0dcb6d1a641ee03d59c3b62376a"
-  integrity sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==
-  dependencies:
-    d3-color "1 - 3"
-    d3-interpolate "1 - 3"
-
-d3-scale@4:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.0.tgz#294377ea1d7e5a31509ee648b98d7916ac0b34e3"
-  integrity sha512-foHQYKpWQcyndH1CGoHdUC4PECxTxonzwwBXGT8qu+Drb1FIc6ON6dG2P5f4hRRMkLiIKeWK7iFtdznDUrnuPQ==
-  dependencies:
-    d3-array "2.10.0 - 3"
-    d3-format "1 - 3"
-    d3-interpolate "1.2.0 - 3"
-    d3-time "2.1.1 - 3"
-    d3-time-format "2 - 4"
-
-"d3-selection@2 - 3", d3-selection@3:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31"
-  integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==
-
-d3-shape@3:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.0.1.tgz#9ccdfb28fd9b0d12f2d8aec234cd5c4a9ea27931"
-  integrity sha512-HNZNEQoDhuCrDWEc/BMbF/hKtzMZVoe64TvisFLDp2Iyj0UShB/E6/lBsLlJTfBMbYgftHj90cXJ0SEitlE6Xw==
-  dependencies:
-    d3-path "1 - 3"
-
-"d3-time-format@2 - 4", d3-time-format@4:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.0.0.tgz#930ded86a9de761702344760d8a25753467f28b7"
-  integrity sha512-nzaCwlj+ZVBIlFuVOT1RmU+6xb/7D5IcnhHzHQcBgS/aTa5K9fWZNN5LCXA27LgF5WxoSNJqKBbLcGMtM6Ca6A==
-  dependencies:
-    d3-time "1 - 3"
-
-"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.0.0.tgz#65972cb98ae2d4954ef5c932e8704061335d4975"
-  integrity sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==
-  dependencies:
-    d3-array "2 - 3"
-
-"d3-timer@1 - 3", d3-timer@3:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0"
-  integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==
-
-"d3-transition@2 - 3", d3-transition@3:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f"
-  integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==
-  dependencies:
-    d3-color "1 - 3"
-    d3-dispatch "1 - 3"
-    d3-ease "1 - 3"
-    d3-interpolate "1 - 3"
-    d3-timer "1 - 3"
-
-d3-zoom@3:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3"
-  integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==
-  dependencies:
-    d3-dispatch "1 - 3"
-    d3-drag "2 - 3"
-    d3-interpolate "1 - 3"
-    d3-selection "2 - 3"
-    d3-transition "2 - 3"
-
-d3@^7.0.0:
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/d3/-/d3-7.0.0.tgz#fe6036b38ba2026ff34223e208fd294db1b997da"
-  integrity sha512-t+jEKGO2jQiSBLJYYq6RFc500tsCeXBB4x41oQaSnZD3Som95nQrlw9XJGrFTMUOQOkwSMauWy9+8Tz1qm9UZw==
-  dependencies:
-    d3-array "3"
-    d3-axis "3"
-    d3-brush "3"
-    d3-chord "3"
-    d3-color "3"
-    d3-contour "3"
-    d3-delaunay "6"
-    d3-dispatch "3"
-    d3-drag "3"
-    d3-dsv "3"
-    d3-ease "3"
-    d3-fetch "3"
-    d3-force "3"
-    d3-format "3"
-    d3-geo "3"
-    d3-hierarchy "3"
-    d3-interpolate "3"
-    d3-path "3"
-    d3-polygon "3"
-    d3-quadtree "3"
-    d3-random "3"
-    d3-scale "4"
-    d3-scale-chromatic "3"
-    d3-selection "3"
-    d3-shape "3"
-    d3-time "3"
-    d3-time-format "4"
-    d3-timer "3"
-    d3-transition "3"
-    d3-zoom "3"
-
 dargs@^4.0.1:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17"
@@ -4612,11 +4177,6 @@ deep-is@~0.1.3:
   resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
   integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
 
-deepmerge@^2.1.1:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170"
-  integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==
-
 default-gateway@^2.6.0:
   version "2.7.2"
   resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f"
@@ -4680,13 +4240,6 @@ del@^3.0.0:
     pify "^3.0.0"
     rimraf "^2.2.8"
 
-delaunator@5:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b"
-  integrity sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==
-  dependencies:
-    robust-predicates "^3.0.0"
-
 delayed-stream@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
@@ -4890,11 +4443,6 @@ duplexify@^3.4.2, duplexify@^3.6.0:
     readable-stream "^2.0.0"
     stream-shift "^1.0.0"
 
-earcut@^2.2.2:
-  version "2.2.3"
-  resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.3.tgz#d44ced2ff5a18859568e327dd9c7d46b16f55cf4"
-  integrity sha512-iRDI1QeCQIhMCZk48DRDMVgQSSBDmbzzNhnxIo+pwx3swkfjMh6vh0nWLq1NdvGHLKH6wIrAM3vQWeTj6qeoug==
-
 ecc-jsbn@~0.1.1:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
@@ -4977,7 +4525,7 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0:
   dependencies:
     once "^1.4.0"
 
-enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0, enhanced-resolve@^4.5.0:
+enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0:
   version "4.5.0"
   resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec"
   integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==
@@ -5020,7 +4568,7 @@ error-ex@^1.2.0, error-ex@^1.3.1:
   dependencies:
     is-arrayish "^0.2.1"
 
-es-abstract@^1.18.0-next.2, es-abstract@^1.18.2:
+es-abstract@^1.18.0-next.2:
   version "1.18.3"
   resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0"
   integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==
@@ -5083,6 +4631,11 @@ escape-string-regexp@^2.0.0:
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
   integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
 
+escape-string-regexp@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+  integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
 escodegen@^1.9.1:
   version "1.14.3"
   resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503"
@@ -5095,7 +4648,7 @@ escodegen@^1.9.1:
   optionalDependencies:
     source-map "~0.6.1"
 
-eslint-scope@^4.0.0, eslint-scope@^4.0.3:
+eslint-scope@^4.0.0:
   version "4.0.3"
   resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
   integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
@@ -5515,6 +5068,11 @@ find-cache-dir@^2.0.0, find-cache-dir@^2.1.0:
     make-dir "^2.0.0"
     pkg-dir "^3.0.0"
 
+find-root@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
+  integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
+
 find-up@^1.0.0:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
@@ -5563,11 +5121,6 @@ flush-write-stream@^1.0.0:
     inherits "^2.0.3"
     readable-stream "^2.3.6"
 
-fn-name@~3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-3.0.0.tgz#0596707f635929634d791f452309ab41558e3c5c"
-  integrity sha512-eNMNr5exLoavuAMhIUVsOKF79SWd/zG104ef6sxBTSw+cZc6BXdQXDvYcGvp0VbxVVSp1XDUNoz7mg1xMtSznA==
-
 follow-redirects@^1.0.0:
   version "1.14.1"
   resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43"
@@ -5618,19 +5171,6 @@ form-data@~2.3.2:
     combined-stream "^1.0.6"
     mime-types "^2.1.12"
 
-formik@^2.1.5:
-  version "2.2.9"
-  resolved "https://registry.yarnpkg.com/formik/-/formik-2.2.9.tgz#8594ba9c5e2e5cf1f42c5704128e119fc46232d0"
-  integrity sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==
-  dependencies:
-    deepmerge "^2.1.1"
-    hoist-non-react-statics "^3.3.0"
-    lodash "^4.17.21"
-    lodash-es "^4.17.21"
-    react-fast-compare "^2.0.1"
-    tiny-warning "^1.0.2"
-    tslib "^1.10.0"
-
 forwarded@0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
@@ -5741,11 +5281,6 @@ genfun@^5.0.0:
   resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537"
   integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==
 
-geojson-vt@^3.2.1:
-  version "3.2.1"
-  resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-3.2.1.tgz#f8adb614d2c1d3f6ee7c4265cad4bbf3ad60c8b7"
-  integrity sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==
-
 get-caller-file@^1.0.1:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
@@ -5798,11 +5333,6 @@ get-stream@^4.0.0, get-stream@^4.1.0:
   dependencies:
     pump "^3.0.0"
 
-get-stream@^6.0.1:
-  version "6.0.1"
-  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
-  integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
-
 get-value@^2.0.3, get-value@^2.0.6:
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
@@ -5869,11 +5399,6 @@ github-markdown-css@2.10.0:
   resolved "https://registry.yarnpkg.com/github-markdown-css/-/github-markdown-css-2.10.0.tgz#0612fed22816b33b282f37ef8def7a4ecabfe993"
   integrity sha512-RX5VUC54uX6Lvrm226M9kMzsNeOa81MnKyxb3J0G5KLjyoOySOZgwyKFkUpv6iUhooiUZdogk+OTwQPJ4WttYg==
 
-gl-matrix@^3.2.1:
-  version "3.3.0"
-  resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-3.3.0.tgz#232eef60b1c8b30a28cbbe75b2caf6c48fd6358b"
-  integrity sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA==
-
 glob-base@^0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
@@ -6017,11 +5542,6 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
   integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
 
-grid-index@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/grid-index/-/grid-index-1.1.0.tgz#97f8221edec1026c8377b86446a7c71e79522ea7"
-  integrity sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==
-
 growly@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
@@ -6180,7 +5700,7 @@ hmac-drbg@^1.0.1:
     minimalistic-assert "^1.0.0"
     minimalistic-crypto-utils "^1.0.1"
 
-hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2:
+hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2:
   version "3.3.2"
   resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
   integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
@@ -6410,7 +5930,7 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24:
   dependencies:
     safer-buffer ">= 2.1.2 < 3"
 
-iconv-lite@0.6, iconv-lite@^0.6.2:
+iconv-lite@^0.6.2:
   version "0.6.3"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
   integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
@@ -6429,7 +5949,7 @@ icss-utils@^2.1.0:
   dependencies:
     postcss "^6.0.1"
 
-ieee754@^1.1.12, ieee754@^1.1.4:
+ieee754@^1.1.4:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
   integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
@@ -6476,6 +5996,14 @@ import-fresh@^2.0.0:
     caller-path "^2.0.0"
     resolve-from "^3.0.0"
 
+import-fresh@^3.1.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+  integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+  dependencies:
+    parent-module "^1.0.0"
+    resolve-from "^4.0.0"
+
 import-from@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1"
@@ -6600,11 +6128,6 @@ internal-ip@^3.0.1:
     default-gateway "^2.6.0"
     ipaddr.js "^1.5.2"
 
-"internmap@1 - 2":
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.1.tgz#33d0fa016185397549fb1a14ea3dbe5a2949d1cd"
-  integrity sha512-Ujwccrj9FkGqjbY3iVoxD1VV+KdZZeENx0rphrtzmRXbFvkFO88L80BL/zeSIguX/7T+y8k04xqtgWgS5vxwxw==
-
 interpret@^1.1.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
@@ -7537,7 +7060,7 @@ json3@^3.3.2:
   resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81"
   integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==
 
-json5@2.x, json5@^2.1.2:
+json5@2.x:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3"
   integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==
@@ -7593,65 +7116,65 @@ jsprim@^1.2.2:
     json-schema "0.2.3"
     verror "1.10.0"
 
-jss-plugin-camel-case@^10.5.1:
-  version "10.7.1"
-  resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.7.1.tgz#e7f7097cf97e9deec599cef3275e213452318b93"
-  integrity sha512-+ioIyWvmAfgDCWXsQcW1NMnLBvRinOVFkSYJUgewQ6TynOcSj5F1bSU23B7z0p1iqK0PPHIU62xY1iNJD33WGA==
+jss-plugin-camel-case@^10.8.2:
+  version "10.8.2"
+  resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.8.2.tgz#8d7f915c8115afaff8cbde08faf610ec9892fba6"
+  integrity sha512-2INyxR+1UdNuKf4v9It3tNfPvf7IPrtkiwzofeKuMd5D58/dxDJVUQYRVg/n460rTlHUfsEQx43hDrcxi9dSPA==
   dependencies:
     "@babel/runtime" "^7.3.1"
     hyphenate-style-name "^1.0.3"
-    jss "10.7.1"
+    jss "10.8.2"
 
-jss-plugin-default-unit@^10.5.1:
-  version "10.7.1"
-  resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.7.1.tgz#826270e2ee38d7024a281ac67c30d6944f124786"
-  integrity sha512-tW+dfYVNARBQb/ONzBwd8uyImigyzMiAEDai+AbH5rcHg5h3TtqhAkxx06iuZiT/dZUiFdSKlbe3q9jZGAPIwA==
+jss-plugin-default-unit@^10.8.2:
+  version "10.8.2"
+  resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.8.2.tgz#c66f12e02e0815d911b85c02c2a979ee7b4ce69a"
+  integrity sha512-UZ7cwT9NFYSG+SEy7noRU50s4zifulFdjkUNKE+u6mW7vFP960+RglWjTgMfh79G6OENZmaYnjHV/gcKV4nSxg==
   dependencies:
     "@babel/runtime" "^7.3.1"
-    jss "10.7.1"
+    jss "10.8.2"
 
-jss-plugin-global@^10.5.1:
-  version "10.7.1"
-  resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.7.1.tgz#9725c46d662aac2e596a0a8741944c060e2b90a1"
-  integrity sha512-FbxCnu44IkK/bw8X3CwZKmcAnJqjAb9LujlAc/aP0bMSdVa3/MugKQRyeQSu00uGL44feJJDoeXXiHOakBr/Zw==
+jss-plugin-global@^10.8.2:
+  version "10.8.2"
+  resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.8.2.tgz#1a35632a693cf50113bcc5ffe6b51969df79c4ec"
+  integrity sha512-UaYMSPsYZ7s/ECGoj4KoHC2jwQd5iQ7K+FFGnCAILdQrv7hPmvM2Ydg45ThT/sH46DqktCRV2SqjRuxeBH8nRA==
   dependencies:
     "@babel/runtime" "^7.3.1"
-    jss "10.7.1"
+    jss "10.8.2"
 
-jss-plugin-nested@^10.5.1:
-  version "10.7.1"
-  resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.7.1.tgz#35563a7a710a45307fd6b9742ffada1d72a62eb7"
-  integrity sha512-RNbICk7FlYKaJyv9tkMl7s6FFfeLA3ubNIFKvPqaWtADK0KUaPsPXVYBkAu4x1ItgsWx67xvReMrkcKA0jSXfA==
+jss-plugin-nested@^10.8.2:
+  version "10.8.2"
+  resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.8.2.tgz#79f3c7f75ea6a36ae72fe52e777035bb24d230c7"
+  integrity sha512-acRvuPJOb930fuYmhkJaa994EADpt8TxI63Iyg96C8FJ9T2xRyU5T6R1IYKRwUiqZo+2Sr7fdGzRTDD4uBZaMA==
   dependencies:
     "@babel/runtime" "^7.3.1"
-    jss "10.7.1"
+    jss "10.8.2"
     tiny-warning "^1.0.2"
 
-jss-plugin-props-sort@^10.5.1:
-  version "10.7.1"
-  resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.7.1.tgz#1d12b26048541ed3a2ed1b69f7fc231605728362"
-  integrity sha512-eyd5FhA+J0QrpqXxO7YNF/HMSXXl4pB0EmUdY4vSJI4QG22F59vQ6AHtP6fSwhmBdQ98Qd9gjfO+RMxcE39P1A==
+jss-plugin-props-sort@^10.8.2:
+  version "10.8.2"
+  resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.8.2.tgz#e25a7471868652c394562b6dc5433dcaea7dff6f"
+  integrity sha512-wqdcjayKRWBZnNpLUrXvsWqh+5J5YToAQ+8HNBNw0kZxVvCDwzhK2Nx6AKs7p+5/MbAh2PLgNW5Ym/ysbVAuqQ==
   dependencies:
     "@babel/runtime" "^7.3.1"
-    jss "10.7.1"
+    jss "10.8.2"
 
-jss-plugin-rule-value-function@^10.5.1:
-  version "10.7.1"
-  resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.7.1.tgz#123eb796eb9982f8efa7a7e362daddd90c0c69fe"
-  integrity sha512-fGAAImlbaHD3fXAHI3ooX6aRESOl5iBt3LjpVjxs9II5u9tzam7pqFUmgTcrip9VpRqYHn8J3gA7kCtm8xKwHg==
+jss-plugin-rule-value-function@^10.8.2:
+  version "10.8.2"
+  resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.8.2.tgz#55354b55f1b2968a15976729968f767f02d64049"
+  integrity sha512-bW0EKAs+0HXpb6BKJhrn94IDdiWb0CnSluTkh0rGEgyzY/nmD1uV/Wf6KGlesGOZ9gmJzQy+9FFdxIUID1c9Ug==
   dependencies:
     "@babel/runtime" "^7.3.1"
-    jss "10.7.1"
+    jss "10.8.2"
     tiny-warning "^1.0.2"
 
-jss-plugin-vendor-prefixer@^10.5.1:
-  version "10.7.1"
-  resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.7.1.tgz#217821be2d6dacee31d2d464886760ba7742e19a"
-  integrity sha512-1UHFmBn7hZNsHXTkLLOL8abRl8vi+D1EVzWD4WmLFj55vawHZfnH1oEz6TUf5Y61XHv0smdHabdXds6BgOXe3A==
+jss-plugin-vendor-prefixer@^10.8.2:
+  version "10.8.2"
+  resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.8.2.tgz#ebb4a482642f34091e454901e21176441dd5f475"
+  integrity sha512-DeGv18QsSiYLSVIEB2+l0af6OToUe0JB+trpzUxyqD2QRC/5AzzDrCrYffO5AHZ81QbffYvSN/pkfZaTWpRXlg==
   dependencies:
     "@babel/runtime" "^7.3.1"
     css-vendor "^2.0.8"
-    jss "10.7.1"
+    jss "10.8.2"
 
 jss@10.0.3:
   version "10.0.3"
@@ -7663,10 +7186,10 @@ jss@10.0.3:
     is-in-browser "^1.1.3"
     tiny-warning "^1.0.2"
 
-jss@10.7.1, jss@^10.5.1:
-  version "10.7.1"
-  resolved "https://registry.yarnpkg.com/jss/-/jss-10.7.1.tgz#16d846e1a22fb42e857b99f9c6a0c5a27341c804"
-  integrity sha512-5QN8JSVZR6cxpZNeGfzIjqPEP+ZJwJJfZbXmeABNdxiExyO+eJJDy6WDtqTf8SDKnbL5kZllEpAP71E/Lt7PXg==
+jss@10.8.2, jss@^10.8.2:
+  version "10.8.2"
+  resolved "https://registry.yarnpkg.com/jss/-/jss-10.8.2.tgz#4b2a30b094b924629a64928236017a52c7c97505"
+  integrity sha512-FkoUNxI329CKQ9OQC8L72MBF9KPf5q8mIupAJ5twU7G7XREW7ahb+7jFfrjZ4iy1qvhx1HwIWUIvkZBDnKkEdQ==
   dependencies:
     "@babel/runtime" "^7.3.1"
     csstype "^3.0.2"
@@ -7690,11 +7213,6 @@ jws@^3.1.5:
     jwa "^1.4.1"
     safe-buffer "^5.0.1"
 
-kdbush@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-3.0.0.tgz#f8484794d47004cc2d85ed3a79353dbe0abc2bf0"
-  integrity sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==
-
 killable@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
@@ -7729,11 +7247,6 @@ kleur@^2.0.1:
   resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.2.tgz#b704f4944d95e255d038f0cb05fb8a602c55a300"
   integrity sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==
 
-klona@^2.0.4:
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0"
-  integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==
-
 lcid@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
@@ -7857,7 +7370,7 @@ load-json-file@^5.3.0:
     strip-bom "^3.0.0"
     type-fest "^0.3.0"
 
-loader-runner@^2.3.0, loader-runner@^2.4.0:
+loader-runner@^2.3.0:
   version "2.4.0"
   resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
   integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==
@@ -7882,7 +7395,7 @@ loader-utils@^0.2.16:
     json5 "^0.5.0"
     object-assign "^4.0.1"
 
-loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3:
+loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
   integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
@@ -7891,15 +7404,6 @@ loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2
     emojis-list "^3.0.0"
     json5 "^1.0.1"
 
-loader-utils@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0"
-  integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==
-  dependencies:
-    big.js "^5.2.2"
-    emojis-list "^3.0.0"
-    json5 "^2.1.2"
-
 locate-path@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
@@ -7923,11 +7427,6 @@ locate-path@^5.0.0:
   dependencies:
     p-locate "^4.1.0"
 
-lodash-es@^4.17.11, lodash-es@^4.17.21:
-  version "4.17.21"
-  resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
-  integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
-
 lodash._reinterpolate@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
@@ -8158,44 +7657,15 @@ map-visit@^1.0.0:
   dependencies:
     object-visit "^1.0.0"
 
-mapbox-gl@^1.11.0:
-  version "1.13.1"
-  resolved "https://registry.yarnpkg.com/mapbox-gl/-/mapbox-gl-1.13.1.tgz#322efe75ab4c764fc4c776da1506aad58d5a5b9d"
-  integrity sha512-GSyubcoSF5MyaP8z+DasLu5v7KmDK2pp4S5+VQ5WdVQUOaAqQY4jwl4JpcdNho3uWm2bIKs7x1l7q3ynGmW60g==
-  dependencies:
-    "@mapbox/geojson-rewind" "^0.5.0"
-    "@mapbox/geojson-types" "^1.0.2"
-    "@mapbox/jsonlint-lines-primitives" "^2.0.2"
-    "@mapbox/mapbox-gl-supported" "^1.5.0"
-    "@mapbox/point-geometry" "^0.1.0"
-    "@mapbox/tiny-sdf" "^1.1.1"
-    "@mapbox/unitbezier" "^0.0.0"
-    "@mapbox/vector-tile" "^1.3.1"
-    "@mapbox/whoots-js" "^3.1.0"
-    csscolorparser "~1.0.3"
-    earcut "^2.2.2"
-    geojson-vt "^3.2.1"
-    gl-matrix "^3.2.1"
-    grid-index "^1.1.0"
-    minimist "^1.2.5"
-    murmurhash-js "^1.0.0"
-    pbf "^3.2.1"
-    potpack "^1.0.1"
-    quickselect "^2.0.0"
-    rw "^1.3.3"
-    supercluster "^7.1.0"
-    tinyqueue "^2.0.3"
-    vt-pbf "^3.1.1"
-
 marked@0.6.0:
   version "0.6.0"
   resolved "https://registry.yarnpkg.com/marked/-/marked-0.6.0.tgz#a18d01cfdcf8d15c3c455b71c8329e5e0f01faa1"
   integrity sha512-HduzIW2xApSXKXJSpCipSxKyvMbwRRa/TwMbepmlZziKdH8548WSoDP4SxzulEKjlo8BE39l+2fwJZuRKOln6g==
 
-material-ui-confirm@2.1.2:
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/material-ui-confirm/-/material-ui-confirm-2.1.2.tgz#906e591ee3a8a620c024c8c6423864d1e7abe14e"
-  integrity sha512-GdM1vFQfkj2kpeW2hLmTxznPmIjWVqWoYzV7Vhjh92UqItOFxLbV15lyakuWdHOn92Bx4y9rQuGHIDP6PENpmQ==
+material-ui-confirm@3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/material-ui-confirm/-/material-ui-confirm-3.0.2.tgz#c1871fa3b1de504722bad0f20e51c71890a38f90"
+  integrity sha512-DMs9uNF7vmqHr2rZkfrJqla7r+7mjOj2Jroih7Nsxs5rrsRbTLPn6PzhQzMa8pBcPszPGtMAJ+Gf4rt4SFUmIQ==
 
 math-random@^1.0.1:
   version "1.0.4"
@@ -8225,14 +7695,6 @@ mem@^4.0.0:
     mimic-fn "^2.0.0"
     p-is-promise "^2.0.0"
 
-memory-fs@^0.4.1, memory-fs@~0.4.1:
-  version "0.4.1"
-  resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
-  integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=
-  dependencies:
-    errno "^0.1.3"
-    readable-stream "^2.0.1"
-
 memory-fs@^0.5.0:
   version "0.5.0"
   resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c"
@@ -8241,6 +7703,14 @@ memory-fs@^0.5.0:
     errno "^0.1.3"
     readable-stream "^2.0.1"
 
+memory-fs@~0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+  integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=
+  dependencies:
+    errno "^0.1.3"
+    readable-stream "^2.0.1"
+
 meow@^3.3.0, meow@^3.7.0:
   version "3.7.0"
   resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
@@ -8526,7 +7996,7 @@ mkdirp@*:
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
   integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
 
-mkdirp@0.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.0:
+mkdirp@0.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.0:
   version "0.5.5"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
   integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
@@ -8598,11 +8068,6 @@ multimatch@^3.0.0:
     arrify "^1.0.1"
     minimatch "^3.0.4"
 
-murmurhash-js@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51"
-  integrity sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E=
-
 mute-stream@0.0.7:
   version "0.0.7"
   resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
@@ -8654,7 +8119,7 @@ negotiator@0.6.2:
   resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
   integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
 
-neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2:
+neo-async@^2.5.0, neo-async@^2.6.0:
   version "2.6.2"
   resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
   integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
@@ -8730,7 +8195,7 @@ node-int64@^0.4.0:
   resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
   integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
 
-node-libs-browser@^2.0.0, node-libs-browser@^2.2.1:
+node-libs-browser@^2.0.0:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
   integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==
@@ -8798,29 +8263,6 @@ node-sass@4.12.0:
     stdout-stream "^1.4.0"
     "true-case-path" "^1.0.2"
 
-node-sass@^4.14.1:
-  version "4.14.1"
-  resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.1.tgz#99c87ec2efb7047ed638fb4c9db7f3a42e2217b5"
-  integrity sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==
-  dependencies:
-    async-foreach "^0.1.3"
-    chalk "^1.1.1"
-    cross-spawn "^3.0.0"
-    gaze "^1.0.0"
-    get-stdin "^4.0.1"
-    glob "^7.0.3"
-    in-publish "^2.0.0"
-    lodash "^4.17.15"
-    meow "^3.7.0"
-    mkdirp "^0.5.1"
-    nan "^2.13.2"
-    node-gyp "^3.8.0"
-    npmlog "^4.0.0"
-    request "^2.88.0"
-    sass-graph "2.2.5"
-    stdout-stream "^1.4.0"
-    "true-case-path" "^1.0.2"
-
 "nopt@2 || 3":
   version "3.0.6"
   resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
@@ -8878,15 +8320,13 @@ normalize-url@^6.1.0:
   resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
   integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
 
-notistack@0.9.6:
-  version "0.9.6"
-  resolved "https://registry.yarnpkg.com/notistack/-/notistack-0.9.6.tgz#a9b2589e2379096eac292139306f486d4ed5697a"
-  integrity sha512-vo1zOwhQBxwWiMxwVjeSDXNzJuaM/nfkayv4uRo+9ON9CAtaPSNt15QHeELKkbOSLH29fb7zmoZl4AlkCqhGsA==
+notistack@2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/notistack/-/notistack-2.0.3.tgz#9007550e5cbc14df84d1d54e7a55ac0948eb59e8"
+  integrity sha512-krmVFtTO9kEY1Pa4NrbyexrjiRcV6TqBM2xLx8nuDea1g96Z/OZfkvVLmYKkTvoSJ3jyQntWK16z86ssW5kt4A==
   dependencies:
-    classnames "^2.2.6"
+    clsx "^1.1.0"
     hoist-non-react-statics "^3.3.0"
-    prop-types "^15.7.2"
-    react-is "^16.8.6"
 
 npm-bundled@^1.0.1:
   version "1.1.2"
@@ -9059,15 +8499,6 @@ object.pick@^1.3.0:
   dependencies:
     isobject "^3.0.1"
 
-object.values@^1.1.1:
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30"
-  integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==
-  dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.3"
-    es-abstract "^1.18.2"
-
 obuf@^1.0.0, obuf@^1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
@@ -9312,6 +8743,13 @@ param-case@2.1.x:
   dependencies:
     no-case "^2.2.0"
 
+parent-module@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+  integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+  dependencies:
+    callsites "^3.0.0"
+
 parse-asn1@^5.0.0, parse-asn1@^5.1.5:
   version "5.1.6"
   resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
@@ -9478,13 +8916,10 @@ path-type@^3.0.0:
   dependencies:
     pify "^3.0.0"
 
-pbf@^3.2.1:
-  version "3.2.1"
-  resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.2.1.tgz#b4c1b9e72af966cd82c6531691115cc0409ffe2a"
-  integrity sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==
-  dependencies:
-    ieee754 "^1.1.12"
-    resolve-protobuf-schema "^2.1.0"
+path-type@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+  integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
 
 pbkdf2@^3.0.3:
   version "3.1.2"
@@ -9553,11 +8988,6 @@ pn@^1.1.0:
   resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
   integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==
 
-popper.js@1.16.1-lts:
-  version "1.16.1-lts"
-  resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05"
-  integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==
-
 portfinder@^1.0.13, portfinder@^1.0.9:
   version "1.0.28"
   resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778"
@@ -9644,11 +9074,6 @@ postcss@^7.0.0, postcss@^7.0.2:
     source-map "^0.6.1"
     supports-color "^6.1.0"
 
-potpack@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.1.tgz#d1b1afd89e4c8f7762865ec30bd112ab767e2ebf"
-  integrity sha512-15vItUAbViaYrmaB/Pbw7z6qX2xENbFSTA7Ii4tgbPtasxm5v6ryKhKtL91tpWovDJzTiZqdwzhcFBCwiMVdVw==
-
 prelude-ls@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
@@ -9734,21 +9159,11 @@ prop-types@15.7.2, prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2:
     object-assign "^4.1.1"
     react-is "^16.8.1"
 
-property-expr@^2.0.2:
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.4.tgz#37b925478e58965031bb612ec5b3260f8241e910"
-  integrity sha512-sFPkHQjVKheDNnPvotjQmm3KD3uk1fWKUN7CrpdbwmUx3CrG3QiM8QpTSimvig5vTXmTvjz7+TDvXOI9+4rkcg==
-
 proto-list@~1.2.1:
   version "1.2.4"
   resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
   integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
 
-protocol-buffers-schema@^3.3.1:
-  version "3.5.1"
-  resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.5.1.tgz#8388e768d383ac8cbea23e1280dfadb79f4122ad"
-  integrity sha512-YVCvdhxWNDP8/nJDyXLuM+UFsuPk4+1PB7WGPVDzm3HTHbzFLxQYeW2iZpS4mmnXrQJGBzt230t/BbEb7PrQaw==
-
 protocols@^1.1.0, protocols@^1.4.0:
   version "1.4.8"
   resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8"
@@ -9898,11 +9313,6 @@ quick-lru@^4.0.1:
   resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
   integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
 
-quickselect@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018"
-  integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==
-
 randomatic@^3.0.0:
   version "3.1.1"
   resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed"
@@ -9957,26 +9367,21 @@ react-chartjs-2@^3.0.3:
   dependencies:
     lodash "^4.17.19"
 
-react-dom@17.0.1:
-  version "17.0.1"
-  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.1.tgz#1de2560474ec9f0e334285662ede52dbc5426fc6"
-  integrity sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==
+react-dom@17.0.2:
+  version "17.0.2"
+  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23"
+  integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==
   dependencies:
     loose-envify "^1.1.0"
     object-assign "^4.1.1"
-    scheduler "^0.20.1"
-
-react-fast-compare@^2.0.1:
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9"
-  integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==
+    scheduler "^0.20.2"
 
-react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.6:
+react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1:
   version "16.13.1"
   resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
   integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
 
-"react-is@^16.8.0 || ^17.0.0":
+react-is@^17.0.2:
   version "17.0.2"
   resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
   integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
@@ -10020,7 +9425,7 @@ react-transition-group@4.3.0:
     loose-envify "^1.4.0"
     prop-types "^15.6.2"
 
-react-transition-group@^4.4.0:
+react-transition-group@^4.4.2:
   version "4.4.2"
   resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470"
   integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==
@@ -10030,10 +9435,10 @@ react-transition-group@^4.4.0:
     loose-envify "^1.4.0"
     prop-types "^15.6.2"
 
-react@17.0.1:
-  version "17.0.1"
-  resolved "https://registry.yarnpkg.com/react/-/react-17.0.1.tgz#6e0600416bd57574e3f86d92edba3d9008726127"
-  integrity sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==
+react@17.0.2:
+  version "17.0.2"
+  resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037"
+  integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==
   dependencies:
     loose-envify "^1.1.0"
     object-assign "^4.1.1"
@@ -10426,13 +9831,6 @@ resolve-pathname@^3.0.0:
   resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd"
   integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==
 
-resolve-protobuf-schema@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz#9ca9a9e69cf192bbdaf1006ec1973948aa4a3758"
-  integrity sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==
-  dependencies:
-    protocol-buffers-schema "^3.3.1"
-
 resolve-url@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
@@ -10443,7 +9841,7 @@ resolve@1.1.7:
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
   integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
 
-resolve@1.x, resolve@^1.10.0, resolve@^1.20.0, resolve@^1.3.2:
+resolve@1.x, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.20.0, resolve@^1.3.2:
   version "1.20.0"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
   integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
@@ -10469,6 +9867,11 @@ retry@^0.10.0:
   resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4"
   integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=
 
+rifm@^0.12.1:
+  version "0.12.1"
+  resolved "https://registry.yarnpkg.com/rifm/-/rifm-0.12.1.tgz#8fa77f45b7f1cda2a0068787ac821f0593967ac4"
+  integrity sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg==
+
 rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3:
   version "2.7.1"
   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
@@ -10491,11 +9894,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
     hash-base "^3.0.0"
     inherits "^2.0.1"
 
-robust-predicates@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.1.tgz#ecde075044f7f30118682bd9fb3f123109577f9a"
-  integrity sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==
-
 rsvp@^3.3.3:
   version "3.6.2"
   resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a"
@@ -10513,11 +9911,6 @@ run-queue@^1.0.0, run-queue@^1.0.3:
   dependencies:
     aproba "^1.1.1"
 
-rw@1, rw@^1.3.3:
-  version "1.3.3"
-  resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
-  integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=
-
 rxjs@^6.4.0:
   version "6.6.7"
   resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
@@ -10563,16 +9956,6 @@ sane@^2.0.0:
   optionalDependencies:
     fsevents "^1.2.3"
 
-sass-graph@2.2.5:
-  version "2.2.5"
-  resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8"
-  integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==
-  dependencies:
-    glob "^7.0.0"
-    lodash "^4.0.0"
-    scss-tokenizer "^0.2.3"
-    yargs "^13.3.2"
-
 sass-graph@^2.2.4:
   version "2.2.6"
   resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.6.tgz#09fda0e4287480e3e4967b72a2d133ba09b8d827"
@@ -10595,30 +9978,12 @@ sass-loader@7.1.0:
     pify "^3.0.0"
     semver "^5.5.0"
 
-sass-loader@^10.0.2:
-  version "10.2.0"
-  resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.2.0.tgz#3d64c1590f911013b3fa48a0b22a83d5e1494716"
-  integrity sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==
-  dependencies:
-    klona "^2.0.4"
-    loader-utils "^2.0.0"
-    neo-async "^2.6.2"
-    schema-utils "^3.0.0"
-    semver "^7.3.2"
-
-sass@^1.26.11:
-  version "1.35.2"
-  resolved "https://registry.yarnpkg.com/sass/-/sass-1.35.2.tgz#b732314fcdaf7ef8d0f1698698adc378043cb821"
-  integrity sha512-jhO5KAR+AMxCEwIH3v+4zbB2WB0z67V1X0jbapfVwQQdjHZUGUyukpnoM6+iCMfsIUC016w9OPKQ5jrNOS9uXw==
-  dependencies:
-    chokidar ">=3.0.0 <4.0.0"
-
 sax@^1.2.4:
   version "1.2.4"
   resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
   integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
 
-scheduler@^0.20.1:
+scheduler@^0.20.2:
   version "0.20.2"
   resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91"
   integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==
@@ -10643,15 +10008,6 @@ schema-utils@^1.0.0:
     ajv-errors "^1.0.0"
     ajv-keywords "^3.1.0"
 
-schema-utils@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.0.tgz#95986eb604f66daadeed56e379bfe7a7f963cdb9"
-  integrity sha512-tTEaeYkyIhEZ9uWgAjDerWov3T9MgX8dhhy2r0IGeeX4W8ngtGl1++dUve/RUqzuaASSh7shwCDJjEzthxki8w==
-  dependencies:
-    "@types/json-schema" "^7.0.7"
-    ajv "^6.12.5"
-    ajv-keywords "^3.5.2"
-
 scss-tokenizer@^0.2.3:
   version "0.2.3"
   resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
@@ -10682,7 +10038,7 @@ semver@^6.0.0, semver@^6.2.0, semver@^6.3.0:
   resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
   integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
 
-semver@^7.3.2, semver@^7.3.4:
+semver@^7.3.4:
   version "7.3.5"
   resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
   integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
@@ -11307,12 +10663,10 @@ style-loader@0.23.0:
     loader-utils "^1.1.0"
     schema-utils "^0.4.5"
 
-supercluster@^7.1.0:
-  version "7.1.3"
-  resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-7.1.3.tgz#8c5412c7d7e53b010f7514e87f279544babc3425"
-  integrity sha512-7+bR4FbF5SYsmkHfDp61QiwCKtwNDyPsddk9TzfsDA5DQr5Goii5CVD2SXjglweFCxjrzVZf945ahqYfUIk8UA==
-  dependencies:
-    kdbush "^3.0.0"
+stylis@^4.0.10, stylis@^4.0.3:
+  version "4.0.10"
+  resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.10.tgz#446512d1097197ab3f02fb3c258358c3f7a14240"
+  integrity sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg==
 
 supports-color@^2.0.0:
   version "2.0.0"
@@ -11345,12 +10699,7 @@ symbol-tree@^3.2.2:
   resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
   integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
 
-synchronous-promise@^2.0.13:
-  version "2.0.15"
-  resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.15.tgz#07ca1822b9de0001f5ff73595f3d08c4f720eb8e"
-  integrity sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg==
-
-tapable@^1.0.0, tapable@^1.1.0, tapable@^1.1.3:
+tapable@^1.0.0, tapable@^1.1.0:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
   integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
@@ -11408,7 +10757,7 @@ terser-webpack-plugin@1.2.1:
     webpack-sources "^1.1.0"
     worker-farm "^1.5.2"
 
-terser-webpack-plugin@^1.1.0, terser-webpack-plugin@^1.4.3:
+terser-webpack-plugin@^1.1.0:
   version "1.4.5"
   resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b"
   integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==
@@ -11517,20 +10866,15 @@ timers-browserify@^2.0.4:
     setimmediate "^1.0.4"
 
 tiny-invariant@^1.0.2:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875"
-  integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9"
+  integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==
 
 tiny-warning@^1.0.0, tiny-warning@^1.0.2, tiny-warning@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
   integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==
 
-tinyqueue@^2.0.3:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08"
-  integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==
-
 tmp@^0.0.33:
   version "0.0.33"
   resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
@@ -11600,11 +10944,6 @@ toposort@^1.0.0:
   resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029"
   integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk=
 
-toposort@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330"
-  integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=
-
 tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.5.0:
   version "2.5.0"
   resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
@@ -11683,7 +11022,7 @@ tslib@1.9.0:
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8"
   integrity sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==
 
-tslib@^1.0.0, tslib@^1.10.0, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0:
+tslib@^1.0.0, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0:
   version "1.14.1"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
   integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
@@ -12156,15 +11495,6 @@ vm-browserify@^1.0.1:
   resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
   integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
 
-vt-pbf@^3.1.1:
-  version "3.1.3"
-  resolved "https://registry.yarnpkg.com/vt-pbf/-/vt-pbf-3.1.3.tgz#68fd150756465e2edae1cc5c048e063916dcfaac"
-  integrity sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==
-  dependencies:
-    "@mapbox/point-geometry" "0.1.0"
-    "@mapbox/vector-tile" "^1.3.1"
-    pbf "^3.2.1"
-
 w3c-hr-time@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
@@ -12194,7 +11524,7 @@ watchpack-chokidar2@^2.0.1:
   dependencies:
     chokidar "^2.1.8"
 
-watchpack@^1.5.0, watchpack@^1.7.4:
+watchpack@^1.5.0:
   version "1.7.5"
   resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453"
   integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==
@@ -12297,7 +11627,7 @@ webpack-log@^2.0.0:
     ansi-colors "^3.0.0"
     uuid "^3.3.2"
 
-webpack-sources@^1.1.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1:
+webpack-sources@^1.1.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0:
   version "1.4.3"
   resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
   integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
@@ -12335,35 +11665,6 @@ webpack@4.28.4:
     watchpack "^1.5.0"
     webpack-sources "^1.3.0"
 
-webpack@^4.44.2:
-  version "4.46.0"
-  resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542"
-  integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==
-  dependencies:
-    "@webassemblyjs/ast" "1.9.0"
-    "@webassemblyjs/helper-module-context" "1.9.0"
-    "@webassemblyjs/wasm-edit" "1.9.0"
-    "@webassemblyjs/wasm-parser" "1.9.0"
-    acorn "^6.4.1"
-    ajv "^6.10.2"
-    ajv-keywords "^3.4.1"
-    chrome-trace-event "^1.0.2"
-    enhanced-resolve "^4.5.0"
-    eslint-scope "^4.0.3"
-    json-parse-better-errors "^1.0.2"
-    loader-runner "^2.4.0"
-    loader-utils "^1.2.3"
-    memory-fs "^0.4.1"
-    micromatch "^3.1.10"
-    mkdirp "^0.5.3"
-    neo-async "^2.6.1"
-    node-libs-browser "^2.2.1"
-    schema-utils "^1.0.0"
-    tapable "^1.1.3"
-    terser-webpack-plugin "^1.4.3"
-    watchpack "^1.7.4"
-    webpack-sources "^1.4.1"
-
 websocket-driver@>=0.5.1:
   version "0.7.4"
   resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760"
@@ -12594,6 +11895,11 @@ yallist@^4.0.0:
   resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
   integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
 
+yaml@^1.7.2:
+  version "1.10.2"
+  resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
+  integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
+
 yargs-parser@10.x, yargs-parser@^10.1.0:
   version "10.1.0"
   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8"
@@ -12609,14 +11915,6 @@ yargs-parser@^11.1.1:
     camelcase "^5.0.0"
     decamelize "^1.2.0"
 
-yargs-parser@^13.1.2:
-  version "13.1.2"
-  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
-  integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
-  dependencies:
-    camelcase "^5.0.0"
-    decamelize "^1.2.0"
-
 yargs-parser@^15.0.1:
   version "15.0.3"
   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.3.tgz#316e263d5febe8b38eef61ac092b33dfcc9b1115"
@@ -12699,22 +11997,6 @@ yargs@^12.0.4:
     y18n "^3.2.1 || ^4.0.0"
     yargs-parser "^11.1.1"
 
-yargs@^13.3.2:
-  version "13.3.2"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
-  integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
-  dependencies:
-    cliui "^5.0.0"
-    find-up "^3.0.0"
-    get-caller-file "^2.0.1"
-    require-directory "^2.1.1"
-    require-main-filename "^2.0.0"
-    set-blocking "^2.0.0"
-    string-width "^3.0.0"
-    which-module "^2.0.0"
-    y18n "^4.0.0"
-    yargs-parser "^13.1.2"
-
 yargs@^14.2.2:
   version "14.2.3"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414"
@@ -12750,16 +12032,3 @@ yargs@^7.0.0:
     which-module "^1.0.0"
     y18n "^3.2.1"
     yargs-parser "^5.0.1"
-
-yup@^0.29.3:
-  version "0.29.3"
-  resolved "https://registry.yarnpkg.com/yup/-/yup-0.29.3.tgz#69a30fd3f1c19f5d9e31b1cf1c2b851ce8045fea"
-  integrity sha512-RNUGiZ/sQ37CkhzKFoedkeMfJM0vNQyaz+wRZJzxdKE7VfDeVKH8bb4rr7XhRLbHJz5hSjoDNwMEIaKhuMZ8gQ==
-  dependencies:
-    "@babel/runtime" "^7.10.5"
-    fn-name "~3.0.0"
-    lodash "^4.17.15"
-    lodash-es "^4.17.11"
-    property-expr "^2.0.2"
-    synchronous-promise "^2.0.13"
-    toposort "^2.0.2"