Skip to content

Commit fefb835

Browse files
authored
Merge pull request #235 from Telecominfraproject/WIFI-15506-recognized-firmware
WIFI-15506 Add Recognized firmware in dashboard
2 parents 624b97d + 7a90e58 commit fefb835

9 files changed

Lines changed: 163 additions & 2 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@
1919

2020
npm-debug.log*
2121
.vscode/settings.json
22+
.env

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "ucentral-client",
3-
"version": "4.1.0",
3+
"version": "4.2.2",
44
"description": "",
55
"private": true,
66
"main": "index.tsx",

public/locales/de/translation.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,8 @@
533533
"show_dev_releases": "Entwicklerversionen",
534534
"status_explanation": "Verbindungsstatus von Geräten, die sich mit diesem Firmware-Server verbunden haben",
535535
"unrecognized": "Unbekannte Firmware",
536+
"recognized_firmware": "Bekannte Firmware",
537+
"recognized_firmware_explanation": "Firmware-Revisionen, die derzeit von Geräten verwendet werden und von diesem Firmware-Server erkannt werden",
536538
"unrecognized_firmware": "Unbekannte Firmware",
537539
"unrecognized_firmware_explanation": "Firmware, die derzeit von Geräten verwendet wird und von diesem Firmware-Server nicht erkannt wird",
538540
"up_to_date": "Aktuelle Geräte",

public/locales/en/translation.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,8 @@
540540
"show_dev_releases": "Dev Releases",
541541
"status_explanation": "Connection status of devices that have connected to this firmware server",
542542
"unrecognized": "Unrecognized Firmware",
543+
"recognized_firmware": "Recognized Firmware",
544+
"recognized_firmware_explanation": "Firmware revisions currently in use by devices that are recognized by this firmware server",
543545
"unrecognized_firmware": "Unrecognized Firmware",
544546
"unrecognized_firmware_explanation": "Firmware that is currently used by devices and is not recognized by this firmware server",
545547
"up_to_date": "Up To Date Devices",

public/locales/es/translation.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,8 @@
533533
"show_dev_releases": "Lanzamientos de desarrollo",
534534
"status_explanation": "Estado de conexión de los dispositivos que se han conectado a este servidor de firmware",
535535
"unrecognized": "Firmware no reconocido",
536+
"recognized_firmware": "Firmware reconocido",
537+
"recognized_firmware_explanation": "Revisiones de firmware actualmente en uso por dispositivos que son reconocidas por este servidor de firmware",
536538
"unrecognized_firmware": "Firmware no reconocido",
537539
"unrecognized_firmware_explanation": "Firmware que utilizan actualmente los dispositivos y no es reconocido por este servidor de firmware",
538540
"up_to_date": "Dispositivos actualizados",

public/locales/fr/translation.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,8 @@
533533
"show_dev_releases": "Versions de développement",
534534
"status_explanation": "État de connexion des appareils qui se sont connectés à ce serveur de micrologiciel",
535535
"unrecognized": "Micrologiciel non reconnu",
536+
"recognized_firmware": "Micrologiciel reconnu",
537+
"recognized_firmware_explanation": "Révisions de micrologiciel actuellement utilisées par les appareils et reconnues par ce serveur de firmware",
536538
"unrecognized_firmware": "Micrologiciel non reconnu",
537539
"unrecognized_firmware_explanation": "Firmware actuellement utilisé par les appareils et non reconnu par ce serveur de firmware",
538540
"up_to_date": "Appareils à jour",

public/locales/pt/translation.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,8 @@
533533
"show_dev_releases": "Lançamentos do desenvolvedor",
534534
"status_explanation": "Status da conexão dos dispositivos que se conectaram a este servidor de firmware",
535535
"unrecognized": "Firmware não reconhecido",
536+
"recognized_firmware": "Firmware reconhecido",
537+
"recognized_firmware_explanation": "Revisões de firmware atualmente em uso por dispositivos que são reconhecidas por este servidor de firmware",
536538
"unrecognized_firmware": "Firmware não reconhecido",
537539
"unrecognized_firmware_explanation": "Firmware que é usado atualmente por dispositivos e não é reconhecido por este servidor de firmware",
538540
"up_to_date": "Dispositivos atualizados",
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
import * as React from 'react';
2+
import { useColorMode } from '@chakra-ui/react';
3+
import {
4+
Chart as ChartJS,
5+
CategoryScale,
6+
LinearScale,
7+
Title,
8+
Tooltip,
9+
Legend,
10+
ChartData,
11+
BarElement,
12+
CoreChartOptions,
13+
ElementChartOptions,
14+
PluginChartOptions,
15+
DatasetChartOptions,
16+
ScaleChartOptions,
17+
BarControllerChartOptions,
18+
} from 'chart.js';
19+
import { _DeepPartialObject } from 'chart.js/types/utils';
20+
import { Bar } from 'react-chartjs-2';
21+
import { useTranslation } from 'react-i18next';
22+
import GraphStatDisplay from 'components/Containers/GraphStatDisplay';
23+
import { COLORS } from 'constants/colors';
24+
import {
25+
FirmwareDashboardRevision,
26+
} from 'hooks/Network/Firmware';
27+
28+
ChartJS.register(
29+
CategoryScale,
30+
LinearScale,
31+
BarElement,
32+
Title,
33+
Tooltip,
34+
Legend,
35+
);
36+
37+
const OPTIONS: (
38+
colorMode: string,
39+
) => _DeepPartialObject<
40+
CoreChartOptions<'bar'> &
41+
ElementChartOptions<'bar'> &
42+
PluginChartOptions<'bar'> &
43+
DatasetChartOptions<'bar'> &
44+
ScaleChartOptions<'bar'> &
45+
BarControllerChartOptions
46+
> = (colorMode) => ({
47+
responsive: true,
48+
indexAxis: 'y',
49+
interaction: {
50+
mode: 'nearest',
51+
axis: 'y',
52+
intersect: false,
53+
},
54+
scales: {
55+
xAxes: {
56+
ticks: {
57+
color: colorMode === 'dark' ? 'white' : undefined,
58+
},
59+
},
60+
yAxes: {
61+
ticks: {
62+
color: colorMode === 'dark' ? 'white' : undefined,
63+
callback(value) {
64+
return (
65+
this.getLabelForValue(value as number)
66+
?.split(' ')?.[0] ?? ''
67+
);
68+
},
69+
},
70+
},
71+
},
72+
plugins: {
73+
legend: { display: false },
74+
title: {
75+
display: false,
76+
},
77+
tooltip: {
78+
callbacks: {
79+
label: (context) =>
80+
`${context.label}: ${context.formattedValue} (${
81+
Math.round(
82+
// @ts-ignore
83+
(context.raw /
84+
context.dataset.data.reduce(
85+
(acc, curr) => acc + curr,
86+
0,
87+
)) *
88+
100 *
89+
100,
90+
) / 100
91+
}%)`,
92+
},
93+
},
94+
},
95+
});
96+
97+
type Props = {
98+
data: FirmwareDashboardRevision[];
99+
};
100+
const RecognizedFirmwareBarChart = ({ data }: Props) => {
101+
const { t } = useTranslation();
102+
const { colorMode } = useColorMode();
103+
104+
const parsedData: ChartData<'bar', number[], unknown> =
105+
React.useMemo(() => {
106+
const values: number[] = [];
107+
const labels: string[] = [];
108+
109+
for (const { tag, value } of data.sort(
110+
(a, b) => b.value - a.value,
111+
)) {
112+
values.push(value);
113+
const split = tag.split(' / ');
114+
if (split[1]) labels.push(split['1']);
115+
else labels.push(tag === '' ? t('common.unknown') : tag);
116+
}
117+
118+
return {
119+
labels,
120+
datasets: [
121+
{
122+
data: values,
123+
backgroundColor: COLORS,
124+
borderColor: COLORS,
125+
borderWidth: 1,
126+
},
127+
],
128+
};
129+
}, [data, colorMode]);
130+
131+
return (
132+
<GraphStatDisplay
133+
title={t('controller.firmware.recognized_firmware')}
134+
explanation={t(
135+
'controller.firmware.recognized_firmware_explanation',
136+
)}
137+
chart={
138+
<Bar
139+
data={parsedData}
140+
height="300px"
141+
options={OPTIONS(colorMode)}
142+
/>
143+
}
144+
/>
145+
);
146+
};
147+
148+
export default RecognizedFirmwareBarChart;

src/pages/Firmware/Dashboard/index.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import DeviceTypesPieChart from './DeviceTypesPieChart';
2222
import FirmwareDashboardEndpointDisplay from './EndpointsDisplay';
2323
import FirmwareLatestPieChart from './LatestPieChart';
2424
import OuisBarChart from './OuisBarChart';
25+
import RecognizedFirmwareBarChart from './RecognizedFirmwareBarChart';
2526
import UnknownFirmwareBarChart from './UnknownFirmwareBarChart';
2627
import UpToDateDevicesSimple from './UpToDateDevices';
2728
import { RefreshButton } from 'components/Buttons/RefreshButton';
@@ -93,11 +94,12 @@ const FirmwareDashboard = () => {
9394
<UpToDateDevicesSimple data={getDashboard.data} />
9495
<AverageFirmwareAge data={getDashboard.data} />
9596
<FirmwareLatestPieChart data={getDashboard.data} />
97+
<RecognizedFirmwareBarChart data={getDashboard.data.revisions} />
9698
<UnknownFirmwareBarChart data={getDashboard.data.unknownFirmwares} />
97-
<FirmwareDashboardEndpointDisplay data={getDashboard.data.endPoints} />
9899
<OuisBarChart data={getDashboard.data.ouis} />
99100
<ConnectedPieChart data={getDashboard.data} />
100101
<DeviceTypesPieChart data={getDashboard.data.deviceTypes} />
102+
<FirmwareDashboardEndpointDisplay data={getDashboard.data.endPoints} />
101103
</Masonry>
102104
)}
103105
</>

0 commit comments

Comments
 (0)