diff options
author | Aijana Schumann <aijana.schumann@highstreet-technologies.com> | 2022-02-01 13:18:42 +0100 |
---|---|---|
committer | Aijana Schumann <aijana.schumann@highstreet-technologies.com> | 2022-02-01 13:18:42 +0100 |
commit | 1a868116614dd9996c78e69941b537e9da19460b (patch) | |
tree | 352e8e4226f6ce798610d75ceef08ad9056df6d9 /sdnr/wt/odlux/apps/linkCalculationApp/src | |
parent | 9912e1626d93afeb4f7148dd5d826ae1caa1ef8a (diff) |
Update ODLUX
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
Diffstat (limited to 'sdnr/wt/odlux/apps/linkCalculationApp/src')
7 files changed, 0 insertions, 1330 deletions
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 index d499ec209..000000000 --- a/sdnr/wt/odlux/apps/linkCalculationApp/src/actions/commonLinkCalculationActions.ts +++ /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 index e6d82e236..000000000 --- a/sdnr/wt/odlux/apps/linkCalculationApp/src/components/connectionInfo.tsx +++ /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 index 01512eb92..000000000 --- a/sdnr/wt/odlux/apps/linkCalculationApp/src/handlers/linkCalculationAppRootHandler.ts +++ /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 index edcbd2514..000000000 --- a/sdnr/wt/odlux/apps/linkCalculationApp/src/index.html +++ /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 index a15bf033d..000000000 --- a/sdnr/wt/odlux/apps/linkCalculationApp/src/pluginLinkCalculation.tsx +++ /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 index e4b0c7797..000000000 --- a/sdnr/wt/odlux/apps/linkCalculationApp/src/views/Style.scss +++ /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 index e3eaa6ba0..000000000 --- a/sdnr/wt/odlux/apps/linkCalculationApp/src/views/linkCalculationComponent.tsx +++ /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> </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); |