2 * ============LICENSE_START========================================================================
3 * ONAP : ccsdk feature sdnr wt odlux
4 * =================================================================================================
5 * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
6 * =================================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
8 * in compliance with the License. You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software distributed under the License
13 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
14 * or implied. See the License for the specific language governing permissions and limitations under
16 * ============LICENSE_END==========================================================================
18 import React from 'react';
19 import { connect, Connect, IDispatcher } from '../../../../framework/src/flux/connect';
21 import { Theme } from '@mui/material/styles';
22 import { WithStyles } from '@mui/styles';
23 import createStyles from '@mui/styles/createStyles';
24 import withStyles from '@mui/styles/withStyles';
27 import { NavigateToApplication } from '../../../../framework/src/actions/navigationActions';
28 import { Dispatch } from '../../../../framework/src/flux/store';
29 import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
31 import { loadAllDeviceListAsync } from '../actions/deviceListActions';
32 import { loadDistinctLtpsbyNetworkElementAsync, ResetLtpsAction } from '../actions/ltpAction';
33 import { SetPanelAction } from '../actions/panelChangeActions';
34 import { TimeChangeAction } from '../actions/timeChangeAction';
35 import AdaptiveModulation from '../components/adaptiveModulation';
36 import CrossPolarDiscrimination from '../components/crossPolarDiscrimination';
37 import PerformanceData from '../components/performanceData';
38 import ReceiveLevel from '../components/receiveLevel';
39 import SignalToInterference from '../components/signalToInterference';
40 import Temperature from '../components/temperature';
41 import TransmissionPower from '../components/transmissionPower';
42 import { adaptiveModulationReloadAction, createAdaptiveModulationActions, createAdaptiveModulationPreActions } from '../handlers/adaptiveModulationHandler';
43 import { createCrossPolarDiscriminationActions, createCrossPolarDiscriminationPreActions, crossPolarDiscriminationReloadAction } from '../handlers/crossPolarDiscriminationHandler';
44 import { createPerformanceDataActions, createPerformanceDataPreActions, performanceDataReloadAction } from '../handlers/performanceDataHandler';
45 import { createReceiveLevelActions, createReceiveLevelPreActions, receiveLevelReloadAction } from '../handlers/receiveLevelHandler';
46 import { createSignalToInterferenceActions, createSignalToInterferencePreActions, signalToInterferenceReloadAction } from '../handlers/signalToInterferenceHandler';
47 import { createTemperatureActions, createTemperaturePreActions, temperatureReloadAction } from '../handlers/temperatureHandler';
48 import { createTransmissionPowerActions, createTransmissionPowerPreActions, transmissionPowerReloadAction } from '../handlers/transmissionPowerHandler';
49 import { PanelId } from '../models/panelId';
50 import { PmDataInterval } from '../models/performanceDataType';
52 import { AppBar, SelectChangeEvent, Tab, Tabs } from '@mui/material';
53 import { MaterialTable, MaterialTableCtorType } from '../../../../framework/src/components/material-table';
54 import { ReloadAction } from '../actions/reloadAction';
55 import { ResetAllSubViewsAction } from '../actions/toggleActions';
56 import LtpSelection from '../components/ltpSelection';
58 const PerformanceHistoryComponentStyles = (theme: Theme) => createStyles({
64 margin: theme.spacing(1),
68 const mapProps = (state: IApplicationStoreState) => ({
69 ...state.performanceHistory,
70 activePanel: state.performanceHistory.currentOpenPanel,
71 availableLtps: state.performanceHistory.ltps.distinctLtps,
72 networkElements: state.performanceHistory.networkElements.deviceList,
73 initialLoaded: state.performanceHistory.ltps.loadedOnce,
74 error: state.performanceHistory.ltps.error,
75 shouldReload: state.performanceHistory.isReloadSchedueled,
78 const mapDispatcher = (dispatcher: IDispatcher) => ({
79 enableFilterPerformanceData: createPerformanceDataActions(dispatcher.dispatch),
80 enableFilterReceiveLevel: createReceiveLevelActions(dispatcher.dispatch),
81 enableFilterTransmissionPower: createTransmissionPowerActions(dispatcher.dispatch),
82 enableFilterAdaptiveModulation: createAdaptiveModulationActions(dispatcher.dispatch),
83 enableFilterTemperature: createTemperatureActions(dispatcher.dispatch),
84 enableFilterSinr: createSignalToInterferenceActions(dispatcher.dispatch),
85 enableFilterCpd: createCrossPolarDiscriminationActions(dispatcher.dispatch),
86 reloadPerformanceData: () => dispatcher.dispatch(performanceDataReloadAction),
87 reloadReceiveLevel: () => dispatcher.dispatch(receiveLevelReloadAction),
88 reloadTransmissionPower: () => dispatcher.dispatch(transmissionPowerReloadAction),
89 reloadAdaptiveModulation: () => dispatcher.dispatch(adaptiveModulationReloadAction),
90 reloadTemperature: () => dispatcher.dispatch(temperatureReloadAction),
91 reloadSignalToInterference: () => dispatcher.dispatch(signalToInterferenceReloadAction),
92 reloadCrossPolarDiscrimination: () => dispatcher.dispatch(crossPolarDiscriminationReloadAction),
93 performanceDataPreActions: createPerformanceDataPreActions(dispatcher.dispatch),
94 receiveLevelPreActions: createReceiveLevelPreActions(dispatcher.dispatch),
95 transmissionPowerPreActions: createTransmissionPowerPreActions(dispatcher.dispatch),
96 adaptiveModulationPreActions: createAdaptiveModulationPreActions(dispatcher.dispatch),
97 temperaturePreActions: createTemperaturePreActions(dispatcher.dispatch),
98 signalToInterferencePreActions: createSignalToInterferencePreActions(dispatcher.dispatch),
99 crossPolarDiscriminationPreActions: createCrossPolarDiscriminationPreActions(dispatcher.dispatch),
100 getAllDevicesPMdata: async () => {
101 await dispatcher.dispatch(loadAllDeviceListAsync);
103 getDistinctLtpsIds: (
104 selectedNetworkElement: string,
105 selectedTimePeriod: string,
107 selectFirstLtp?: Function,
109 ) => dispatcher.dispatch(loadDistinctLtpsbyNetworkElementAsync(selectedNetworkElement, selectedTimePeriod, selectedLtp, selectFirstLtp, resetLTP)),
110 setCurrentPanel: (panelId: PanelId) => dispatcher.dispatch(new SetPanelAction(panelId)),
111 timeIntervalChange: (time: PmDataInterval) => dispatcher.dispatch(new TimeChangeAction(time)),
112 changeNode: (nodeId: string) => dispatcher.dispatch((dispatch: Dispatch) => {
113 dispatch(new NavigateToApplication('performanceHistory', nodeId));
115 resetLtps: () => dispatcher.dispatch((dispatch: Dispatch) => { dispatch(new ResetLtpsAction()); }),
116 resetSubViews: () => dispatcher.dispatch(new ResetAllSubViewsAction()),
117 setShouldReload: (show: boolean) => dispatcher.dispatch(new ReloadAction(show)),
120 export type NetworkElementType = {
124 const NetworkElementTable = MaterialTable as MaterialTableCtorType<NetworkElementType>;
126 type PerformanceHistoryComponentProps = Connect<typeof mapProps, typeof mapDispatcher> & WithStyles<typeof PerformanceHistoryComponentStyles>;
128 type PerformanceHistoryComponentState = {
129 selectedNetworkElement: string;
130 selectedTimePeriod: string;
132 showNetworkElementsTable: boolean;
138 'uuid-interface': string;
143 * Represents the component for Performance history application.
145 class PerformanceHistoryComponent extends React.Component<PerformanceHistoryComponentProps, PerformanceHistoryComponentState> {
147 * Initialises this instance
149 constructor(props: PerformanceHistoryComponentProps) {
152 selectedNetworkElement: props.nodeId !== '' ? props.nodeId : '-1',
153 selectedTimePeriod: '15min',
155 showNetworkElementsTable: true,
162 onChangeTabs = (event: React.SyntheticEvent, newValue: PanelId) => {
163 const nextActivePanel = newValue;
164 this.changeTabs(nextActivePanel);
167 changeTabs = (nextActivePanel: PanelId) => {
168 this.props.setCurrentPanel(nextActivePanel);
169 const preFilter = this.state.preFilter;
170 switch (nextActivePanel) {
171 case 'PerformanceData':
172 if (this.props.performanceData.preFilter !== {} && this.props.performanceData.preFilter === preFilter) {
173 this.props.reloadPerformanceData();
175 this.props.performanceDataPreActions.onPreFilterChanged(preFilter);
179 if (this.props.receiveLevel.preFilter !== {} && this.props.receiveLevel.preFilter === preFilter) {
180 this.props.reloadReceiveLevel();
182 this.props.receiveLevelPreActions.onPreFilterChanged(preFilter);
185 case 'TransmissionPower':
186 if (this.props.transmissionPower.preFilter !== {} && this.props.transmissionPower.preFilter === preFilter) {
187 this.props.reloadTransmissionPower();
189 this.props.transmissionPowerPreActions.onPreFilterChanged(preFilter);
192 case 'AdaptiveModulation':
193 if (this.props.adaptiveModulation.preFilter !== {} && this.props.adaptiveModulation.preFilter === preFilter) {
194 this.props.reloadAdaptiveModulation();
196 this.props.adaptiveModulationPreActions.onPreFilterChanged(preFilter);
200 if (this.props.temperature.preFilter !== {} && this.props.temperature.preFilter === preFilter) {
201 this.props.reloadTemperature();
203 this.props.temperaturePreActions.onPreFilterChanged(preFilter);
207 if (this.props.signalToInterference.preFilter !== {} && this.props.signalToInterference.preFilter === preFilter) {
208 this.props.reloadSignalToInterference();
210 this.props.signalToInterferencePreActions.onPreFilterChanged(preFilter);
214 if (this.props.crossPolarDiscrimination.preFilter !== {} && this.props.crossPolarDiscrimination.preFilter === preFilter) {
215 this.props.reloadCrossPolarDiscrimination();
217 this.props.crossPolarDiscriminationPreActions.onPreFilterChanged(preFilter);
221 // do nothing if all panels are closed
226 render(): JSX.Element {
227 const { activePanel, nodeId } = this.props;
231 <NetworkElementTable tableId="performance-data-element-selection-table" defaultSortColumn={'nodeId'} defaultSortOrder="asc" stickyHeader title={'Please select the network element!'} idProperty={'nodeId'} rows={this.props.networkElements} asynchronus
232 onHandleClick={(event, rowData) => { this.handleNetworkElementSelect(rowData.nodeId); }} columns={
233 [{ property: 'nodeId', title: 'Node Name' }]
238 this.handleURLChange(nodeId);
241 {this.state.showLtps &&
243 <LtpSelection error={this.props.error} selectedNE={this.state.selectedNetworkElement} selectedLtp={this.state.selectedLtp} selectedTimePeriod={this.state.selectedTimePeriod}
244 availableLtps={this.props.availableLtps} finishedLoading={this.props.initialLoaded} onChangeTimePeriod={this.handleTimePeriodChange}
245 onChangeLtp={this.handleLtpChange}
248 {this.state.showPanels &&
251 <AppBar enableColorOnDark position="static" >
252 <Tabs indicatorColor="secondary" textColor="inherit" value={activePanel} onChange={this.onChangeTabs} variant="scrollable" scrollButtons="auto" aria-label="performance-data-tabs">
253 <Tab label="Performance Data" value="PerformanceData" aria-label="performance-data" />
254 <Tab label="Receive Level" value="ReceiveLevel" aria-label="receive-level" />
255 <Tab label="Transmission Power" value="TransmissionPower" aria-label="transmission-power" />
256 <Tab label="Adaptive Modulation" value="AdaptiveModulation" aria-label="adaptive-modulation" />
257 <Tab label="Temperature" value="Temperature" aria-label="temperature" />
258 <Tab label="Signal-to-interference-plus-noise ratio (SINR)" value="SINR" aria-label="sinr" />
259 <Tab label="Cross Polar Discrimination" value="CPD" aria-label="cross-polar-discrimination" />
263 activePanel === 'PerformanceData' &&
264 <PerformanceData selectedTimePeriod={this.state.selectedTimePeriod} />
268 activePanel === 'ReceiveLevel' &&
269 <ReceiveLevel selectedTimePeriod={this.state.selectedTimePeriod} />
273 activePanel === 'TransmissionPower' &&
274 <TransmissionPower selectedTimePeriod={this.state.selectedTimePeriod} />
278 activePanel === 'AdaptiveModulation' &&
279 <AdaptiveModulation selectedTimePeriod={this.state.selectedTimePeriod} />
282 activePanel === 'Temperature' &&
283 <Temperature selectedTimePeriod={this.state.selectedTimePeriod} />
287 activePanel === 'SINR' &&
288 <SignalToInterference selectedTimePeriod={this.state.selectedTimePeriod} />
292 activePanel === 'CPD' &&
293 <CrossPolarDiscrimination selectedTimePeriod={this.state.selectedTimePeriod} />
303 public componentDidMount() {
304 this.props.setCurrentPanel(null);
305 this.props.getAllDevicesPMdata();
309 * Function which selects the first ltp returned from the database on selection of network element.
311 private selectFirstLtp = (firstLtp: string) => {
314 selectedLtp: firstLtp,
316 this.preFilterChangeAndReload(this.state.selectedNetworkElement, this.state.selectedTimePeriod, firstLtp);
317 this.changeTabs('PerformanceData');
321 * A function which reloads the visible table, if available, based on prefilters defined by network element and ltp on selected time period.
323 private preFilterChangeAndReload = (networkElement: string, timePeriod: string, ltp: string) => {
324 const newPreFilter = {
325 'node-name': networkElement,
326 'uuid-interface': ltp,
329 const activePanel = this.props.activePanel;
331 if (this.props.activePanel !== null) {
332 // set prefilter and reload data if panel is open
334 switch (activePanel) {
335 case 'PerformanceData':
336 this.props.performanceDataPreActions.onPreFilterChanged(newPreFilter);
339 this.props.receiveLevelPreActions.onPreFilterChanged(newPreFilter);
341 case 'TransmissionPower':
342 this.props.transmissionPowerPreActions.onPreFilterChanged(newPreFilter);
344 case 'AdaptiveModulation':
345 this.props.adaptiveModulationPreActions.onPreFilterChanged(newPreFilter);
348 this.props.temperaturePreActions.onPreFilterChanged(newPreFilter);
351 this.props.signalToInterferencePreActions.onPreFilterChanged(newPreFilter);
354 this.props.crossPolarDiscriminationPreActions.onPreFilterChanged(newPreFilter);
357 // do nothing if all panels are closed
363 this.setState({ preFilter: newPreFilter });
368 * Function which handles network element changes.
370 private handleNetworkElementSelect = (selectedNetworkElement: string) => {
374 selectedNetworkElement: selectedNetworkElement,
375 showNetworkElementsTable: false,
380 this.props.resetSubViews();
381 this.props.resetLtps();
382 this.setState({ preFilter: {} });
383 this.props.changeNode(selectedNetworkElement);
384 this.props.getDistinctLtpsIds(selectedNetworkElement, this.state.selectedTimePeriod, '-1', this.selectFirstLtp);
387 private handleURLChange = (selectedNetworkElement: string) => {
389 if (this.props.shouldReload) {
393 selectedNetworkElement: selectedNetworkElement,
397 this.props.getDistinctLtpsIds(selectedNetworkElement, this.state.selectedTimePeriod, '-1', this.selectFirstLtp);
398 this.props.setShouldReload(false);
403 * Function which resets the ltps to "--select--" in the state if the passed parameter @ltpNotSelected is true.
404 * @param ltpNotSelected: true, if existing selected is not available in the given time period, else false
406 private resetLtpDropdown = (ltpNotSelected: boolean) => {
407 if (ltpNotSelected) {
416 * Function which handles the time period changes.
418 private handleTimePeriodChange = (event: SelectChangeEvent<HTMLSelectElement>) => {
420 const selectedTimeInterval = event.target.value === '15min'
421 ? PmDataInterval.pmInterval15Min
422 : PmDataInterval.pmInterval24Hours;
425 selectedTimePeriod: event.target.value as string,
428 this.props.timeIntervalChange(selectedTimeInterval);
429 this.props.getDistinctLtpsIds(this.state.selectedNetworkElement, event.target.value as string, this.state.selectedLtp, undefined, this.resetLtpDropdown);
430 this.preFilterChangeAndReload(this.state.selectedNetworkElement, event.target.value as string, this.state.selectedLtp);
434 * Function which handles the ltp changes.
436 private handleLtpChange = (event:SelectChangeEvent<HTMLSelectElement> ) => {
438 if (event.target.value === '-1') {
441 selectedLtp: event.target.value,
444 } else if (event.target.value !== this.state.selectedLtp) {
447 selectedLtp: event.target.value as string,
449 this.preFilterChangeAndReload(this.state.selectedNetworkElement, this.state.selectedTimePeriod, event.target.value as string);
455 const PerformanceHistoryApplication = withStyles(PerformanceHistoryComponentStyles)(connect(mapProps, mapDispatcher)(PerformanceHistoryComponent));
456 export default PerformanceHistoryApplication;