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 { RouteComponentProps, withRouter } from 'react-router-dom';
21 import { WithStyles } from '@mui/styles';
22 import createStyles from '@mui/styles/createStyles';
23 import { Doughnut } from 'react-chartjs-2';
24 import { connect, Connect, IDispatcher } from '../../../../framework/src/flux/connect';
26 import { NavigateToApplication } from '../../../../framework/src/actions/navigationActions';
27 import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
29 const styles = () => createStyles({
36 const scrollbar = { overflow: 'auto', paddingRight: '20px' };
38 let connectionStatusinitialLoad = true;
39 let connectionStatusinitialStateChanged = false;
40 let connectionStatusDataLoad: number[] = [0, 0, 0, 0];
41 let connectionTotalCount = 0;
43 let alarmStatusinitialLoad = true;
44 let alarmStatusinitialStateChanged = false;
45 let alarmStatusDataLoad: number[] = [0, 0, 0, 0];
46 let alarmTotalCount = 0;
48 const mapProps = (state: IApplicationStoreState) => ({
49 alarmStatus: state.fault.faultStatus,
52 const mapDispatch = (dispatcher: IDispatcher) => ({
53 navigateToApplication: (applicationName: string, path?: string) => dispatcher.dispatch(new NavigateToApplication(applicationName, path)),
56 type HomeComponentProps = RouteComponentProps & Connect<typeof mapProps, typeof mapDispatch> & WithStyles<typeof styles>;
58 class DashboardHome extends React.Component<HomeComponentProps> {
59 constructor(props: HomeComponentProps) {
65 render(): JSX.Element {
67 if (!this.props.alarmStatus.isLoadingConnectionStatusChart) {
68 connectionStatusDataLoad = [
69 this.props.alarmStatus.Connected,
70 this.props.alarmStatus.Connecting,
71 this.props.alarmStatus.Disconnected,
72 this.props.alarmStatus.UnableToConnect,
73 this.props.alarmStatus.Undefined,
75 connectionTotalCount = this.props.alarmStatus.Connected + this.props.alarmStatus.Connecting
76 + this.props.alarmStatus.Disconnected + this.props.alarmStatus.UnableToConnect + this.props.alarmStatus.Undefined;
80 if (!this.props.alarmStatus.isLoadingAlarmStatusChart) {
81 alarmStatusDataLoad = [
82 this.props.alarmStatus.critical,
83 this.props.alarmStatus.major,
84 this.props.alarmStatus.minor,
85 this.props.alarmStatus.warning,
87 alarmTotalCount = this.props.alarmStatus.critical + this.props.alarmStatus.major
88 + this.props.alarmStatus.minor + this.props.alarmStatus.warning;
91 /** Available Network Connection Status chart data */
92 const connectionStatusData = {
94 'Connected: ' + this.props.alarmStatus.Connected,
95 'Connecting: ' + this.props.alarmStatus.Connecting,
96 'Disconnected: ' + this.props.alarmStatus.Disconnected,
97 'UnableToConnect: ' + this.props.alarmStatus.UnableToConnect,
98 'Undefined: ' + this.props.alarmStatus.Undefined,
101 labels: ['Connected', 'Connecting', 'Disconnected', 'UnableToConnect', 'Undefined'],
102 data: connectionStatusDataLoad,
106 'rgb(191, 191, 191)',
107 'rgb(191, 191, 191)',
108 'rgb(242, 240, 240)',
114 /** No Devices available */
115 const connectionStatusUnavailableData = {
116 labels: ['No Devices available'],
120 'rgb(255, 255, 255)',
125 /** Loading Connection Status chart */
126 const connectionStatusisLoading = {
127 labels: ['Loading chart...'],
131 'rgb(255, 255, 255)',
136 /** Loading Alarm Status chart */
137 const alarmStatusisLoading = {
138 labels: ['Loading chart...'],
142 'rgb(255, 255, 255)',
147 /** Connection status options */
148 let labels: String[] = ['Connected', 'Connecting', 'Disconnected', 'UnableToConnect', 'Undefined'];
149 const connectionStatusOptions = {
152 label: (tooltipItem: any, data: any) => {
154 (data.datasets[tooltipItem.datasetIndex].labels &&
155 data.datasets[tooltipItem.datasetIndex].labels[
158 data.labels[tooltipItem.index] ||
164 data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index] +
165 (data.datasets[tooltipItem.datasetIndex].labelSuffix || '');
172 maintainAspectRatio: false,
182 onClick: (event: MouseEvent, item: any) => {
185 let connectionStatus = labels[item[0]._index] + '';
186 this.props.navigateToApplication('connect', '/connectionStatus/' + connectionStatus);
192 /** Connection status unavailable options */
193 const connectionStatusUnavailableOptions = {
195 maintainAspectRatio: false,
210 /** Add text inside the doughnut chart for Connection Status */
211 const connectionStatusPlugins = [{
212 beforeDraw: function (chart: any) {
213 var width = chart.width,
214 height = chart.height,
217 var fontSize = (height / 480).toFixed(2);
218 ctx.font = fontSize + 'em sans-serif';
219 ctx.textBaseline = 'top';
220 var text = 'Network Connection Status',
221 textX = Math.round((width - ctx.measureText(text).width) / 2),
223 ctx.fillText(text, textX, textY);
228 /** Alarm status Data */
229 const alarmStatusData = {
231 'Critical : ' + this.props.alarmStatus.critical,
232 'Major : ' + this.props.alarmStatus.major,
233 'Minor : ' + this.props.alarmStatus.minor,
234 'Warning : ' + this.props.alarmStatus.warning,
237 labels: ['Critical', 'Major', 'Minor', 'Warning'],
238 data: alarmStatusDataLoad,
248 /** No Alarm status available */
249 const alarmStatusUnavailableData = {
250 labels: ['No Alarms available'],
259 /** Alarm status Options */
260 let alarmLabels: String[] = ['Critical', 'Major', 'Minor', 'Warning'];
261 const alarmStatusOptions = {
264 label: (tooltipItem: any, data: any) => {
266 (data.datasets[tooltipItem.datasetIndex].labels &&
267 data.datasets[tooltipItem.datasetIndex].labels[
270 data.labels[tooltipItem.index] ||
276 data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index] +
277 (data.datasets[tooltipItem.datasetIndex].labelSuffix || '');
284 maintainAspectRatio: false,
294 onClick: (event: MouseEvent, item: any) => {
297 let severity = alarmLabels[item[0]._index] + '';
298 this.props.navigateToApplication('fault', '/alarmStatus/' + severity);
304 /** Alarm status unavailable options */
305 const alarmStatusUnavailableOptions = {
307 maintainAspectRatio: false,
321 /** Add text inside the doughnut chart for Alarm Status */
322 const alarmStatusPlugins = [{
323 beforeDraw: function (chart: any) {
324 var width = chart.width,
325 height = chart.height,
328 var fontSize = (height / 480).toFixed(2);
329 ctx.font = fontSize + 'em sans-serif';
330 ctx.textBaseline = 'top';
331 var text = 'Network Alarm Status',
332 textX = Math.round((width - ctx.measureText(text).width) / 2),
334 ctx.fillText(text, textX, textY);
341 <div style={scrollbar} >
342 <h1 aria-label="welcome-to-odlux">Welcome to ODLUX</h1>
343 <div style={{ width: '50%', float: 'left' }}>
344 {this.checkElementsAreLoaded() ?
345 this.checkConnectionStatus() && connectionTotalCount != 0 ?
347 data={connectionStatusData}
351 options={connectionStatusOptions}
352 plugins={connectionStatusPlugins}
355 data={connectionStatusUnavailableData}
359 options={connectionStatusUnavailableOptions}
360 plugins={connectionStatusPlugins} />
362 data={connectionStatusisLoading}
366 options={connectionStatusUnavailableOptions}
367 plugins={connectionStatusPlugins}
371 <div style={{ width: '50%', float: 'left' }}>
372 {this.checkAlarmsAreLoaded() ?
373 this.checkAlarmStatus() && alarmTotalCount != 0 ?
375 data={alarmStatusData}
379 options={alarmStatusOptions}
380 plugins={alarmStatusPlugins}
383 data={alarmStatusUnavailableData}
387 options={alarmStatusUnavailableOptions}
388 plugins={alarmStatusPlugins}
391 data={alarmStatusisLoading}
395 options={alarmStatusUnavailableOptions}
396 plugins={alarmStatusPlugins}
405 /** Check if connection status data available */
406 public checkConnectionStatus = () => {
407 let statusCount = this.props.alarmStatus;
408 if (statusCount.isLoadingConnectionStatusChart) {
411 if (statusCount.Connected == 0 && statusCount.Connecting == 0 && statusCount.Disconnected == 0
412 && statusCount.UnableToConnect == 0 && statusCount.Undefined == 0) {
419 /** Check if connection status chart data is loaded */
420 public checkElementsAreLoaded = () => {
421 let isLoadingCheck = this.props.alarmStatus;
422 if (connectionStatusinitialLoad && !isLoadingCheck.isLoadingConnectionStatusChart) {
423 if (this.checkConnectionStatus()) {
424 connectionStatusinitialLoad = false;
428 } else if (connectionStatusinitialLoad && isLoadingCheck.isLoadingConnectionStatusChart) {
429 connectionStatusinitialLoad = false;
430 connectionStatusinitialStateChanged = true;
431 return !isLoadingCheck.isLoadingConnectionStatusChart;
432 } else if (connectionStatusinitialStateChanged) {
433 if (!isLoadingCheck.isLoadingConnectionStatusChart) {
434 connectionStatusinitialStateChanged = false;
436 return !isLoadingCheck.isLoadingConnectionStatusChart;
441 /** Check if alarms data available */
442 public checkAlarmStatus = () => {
443 let alarmCount = this.props.alarmStatus;
444 if (alarmCount.isLoadingAlarmStatusChart) {
447 if (alarmCount.critical == 0 && alarmCount.major == 0 && alarmCount.minor == 0 && alarmCount.warning == 0) {
454 /** Check if alarm status chart data is loaded */
455 public checkAlarmsAreLoaded = () => {
456 let isLoadingCheck = this.props.alarmStatus;
457 if (alarmStatusinitialLoad && !isLoadingCheck.isLoadingAlarmStatusChart) {
458 if (this.checkAlarmStatus()) {
459 alarmStatusinitialLoad = false;
463 } else if (alarmStatusinitialLoad && isLoadingCheck.isLoadingAlarmStatusChart) {
464 alarmStatusinitialLoad = false;
465 alarmStatusinitialStateChanged = true;
466 return !isLoadingCheck.isLoadingAlarmStatusChart;
467 } else if (alarmStatusinitialStateChanged) {
468 if (!isLoadingCheck.isLoadingAlarmStatusChart) {
469 alarmStatusinitialStateChanged = false;
471 return !isLoadingCheck.isLoadingAlarmStatusChart;
477 export default (withRouter(connect(mapProps, mapDispatch)(DashboardHome)));