From c3574d96d7dd7340f1f255b9809ce8b2e7992bc3 Mon Sep 17 00:00:00 2001 From: Charles Date: Wed, 1 Jun 2022 16:44:07 +0100 Subject: [PATCH] 2.7.0 --- package-lock.json | 149 ++++++++++---- package.json | 3 +- public/locales/de/translation.json | 9 +- public/locales/en/translation.json | 9 +- public/locales/es/translation.json | 9 +- public/locales/fr/translation.json | 9 +- public/locales/pt/translation.json | 9 +- src/components/CommandHistory/index.js | 1 + src/components/DeviceListTable/Table/index.js | 2 + src/components/DeviceListTable/index.js | 14 +- .../StatisticsChartList.js | 12 +- src/components/InterfaceStatistics/index.js | 77 ++++++-- src/components/WifiAnalysis/index.js | 6 +- src/components/WifiScanModal/IE_OPTIONS.json | 187 ++++++++++++++++++ src/components/WifiScanModal/index.js | 107 ++++++---- .../WifiScanResultModal/IeDisplay.js | 90 +++++++++ .../WifiScanResultModal/WifiChannelCard.js | 77 +++++++- .../WifiScanResultModal/WifiChannelTable.js | 9 +- src/components/WifiScanResultModal/index.js | 24 ++- 19 files changed, 674 insertions(+), 129 deletions(-) create mode 100644 src/components/WifiScanModal/IE_OPTIONS.json create mode 100644 src/components/WifiScanResultModal/IeDisplay.js diff --git a/package-lock.json b/package-lock.json index d8154b1..a39fa65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ucentral-client", - "version": "2.6.25", + "version": "2.7.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "ucentral-client", - "version": "2.6.25", + "version": "2.7.0", "dependencies": { "@coreui/coreui": "^3.4.0", "@coreui/icons": "^2.0.1", @@ -16,6 +16,7 @@ "apexcharts": "^3.27.1", "axios": "^0.21.1", "axios-retry": "^3.1.9", + "buffer": "^6.0.3", "dagre": "^0.8.5", "i18next": "^20.3.1", "i18next-browser-languagedetector": "^6.1.2", @@ -2960,7 +2961,7 @@ "node_modules/ansi-html": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "integrity": "sha512-JoAxEa1DfP9m2xfB/y2r/aKcwXNlltr4+0QSBC4TrLfcxyvepX2Pv0t/xpgGV5bGsDzCYV8SzjWgyCW0T9yYbA==", "dev": true, "engines": [ "node >= 0.8.0" @@ -3432,6 +3433,25 @@ "node": ">=0.10.0" } }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -3574,6 +3594,29 @@ "url": "https://opencollective.com/browserslist" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -6221,9 +6264,9 @@ } }, "node_modules/eventsource": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", - "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.1.tgz", + "integrity": "sha512-qV5ZC0h7jYIAOhArFJgSfdyz6rALJyb270714o7ZtNnw2WSJ+eexhKtE0O8LYPRsHZHf2osHKZBxGPvm3kPkCA==", "dev": true, "dependencies": { "original": "^1.0.0" @@ -7786,6 +7829,25 @@ "postcss": "^8.1.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -8445,12 +8507,6 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "node_modules/json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, "node_modules/json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", @@ -12244,17 +12300,22 @@ } }, "node_modules/sockjs-client": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.2.tgz", - "integrity": "sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.0.tgz", + "integrity": "sha512-qVHJlyfdHFht3eBFZdKEXKTlb7I4IV41xnVNo8yUKA1UHcPJwgW2SvTq9LhnjjCywSkSK7c/e4nghU0GOoMCRQ==", "dev": true, "dependencies": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", + "debug": "^3.2.7", + "eventsource": "^1.1.0", + "faye-websocket": "^0.11.4", "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.5.3" + "url-parse": "^1.5.10" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://tidelift.com/funding/github/npm/sockjs-client" } }, "node_modules/sockjs-client/node_modules/debug": { @@ -17039,7 +17100,7 @@ "ansi-html": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "integrity": "sha512-JoAxEa1DfP9m2xfB/y2r/aKcwXNlltr4+0QSBC4TrLfcxyvepX2Pv0t/xpgGV5bGsDzCYV8SzjWgyCW0T9yYbA==", "dev": true }, "ansi-html-community": { @@ -17392,6 +17453,11 @@ } } }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -17511,6 +17577,15 @@ "picocolors": "^1.0.0" } }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -19522,9 +19597,9 @@ "dev": true }, "eventsource": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", - "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.1.tgz", + "integrity": "sha512-qV5ZC0h7jYIAOhArFJgSfdyz6rALJyb270714o7ZtNnw2WSJ+eexhKtE0O8LYPRsHZHf2osHKZBxGPvm3kPkCA==", "dev": true, "requires": { "original": "^1.0.0" @@ -20730,6 +20805,11 @@ "dev": true, "requires": {} }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -21199,12 +21279,6 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, "json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", @@ -24042,17 +24116,16 @@ } }, "sockjs-client": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.2.tgz", - "integrity": "sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.0.tgz", + "integrity": "sha512-qVHJlyfdHFht3eBFZdKEXKTlb7I4IV41xnVNo8yUKA1UHcPJwgW2SvTq9LhnjjCywSkSK7c/e4nghU0GOoMCRQ==", "dev": true, "requires": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", + "debug": "^3.2.7", + "eventsource": "^1.1.0", + "faye-websocket": "^0.11.4", "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.5.3" + "url-parse": "^1.5.10" }, "dependencies": { "debug": { diff --git a/package.json b/package.json index 40aad15..7d97d7b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ucentral-client", - "version": "2.6.25", + "version": "2.7.0", "dependencies": { "@coreui/coreui": "^3.4.0", "@coreui/icons": "^2.0.1", @@ -10,6 +10,7 @@ "apexcharts": "^3.27.1", "axios": "^0.21.1", "axios-retry": "^3.1.9", + "buffer": "^6.0.3", "dagre": "^0.8.5", "i18next": "^20.3.1", "i18next-browser-languagedetector": "^6.1.2", diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index fd970b0..1e84bfb 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -8,6 +8,7 @@ "factory_reset": "Auf Werkseinstellungen zurückgesetzt", "firmware_upgrade": "Firmware Aktualisierung", "reboot": "Gerät neustarten", + "request_ie": "Fordern Sie IEs an", "telemetry": "Telemetrie", "title": "Geräte Administrations", "trace": "Tcpdump starten", @@ -27,6 +28,7 @@ "error": "Fehler beim Senden des Befehls!", "error_delete_log": "Fehler beim Versuch zu löschen: {{error}}", "event_queue": "Ereigniswarteschlange", + "reboot_start": "Der Neustartvorgang hat begonnen!", "success": "Befehl wurde erfolgreich übermittelt", "title": "Gerätebefehle", "unable_queue": "Anfrage für Ereigniswarteschlange kann nicht abgeschlossen werden: {{error}}" @@ -148,6 +150,7 @@ "need_date": "Du brauchst ein Datum...", "no": "Nein", "no_addresses_found": "Keine Adressen gefunden", + "no_clients_found": "Keine Kunden gefunden", "no_devices_found": "Keine Geräte gefunden", "no_items": "Keine Gegenstände", "none": "Keiner", @@ -326,11 +329,13 @@ "blacklisted_on": "Datum", "capabilities": "Fähigkeiten", "certificate_explanation": "Zertifikate der angeschlossenen Geräte", + "count_explanation": "Geräte, die auf diese Gateway-Instanz verweisen", "edit_blacklist": "Gerät auf der schwarzen Liste bearbeiten", "error_adding_blacklist": "Fehler beim Hinzufügen des Geräts zur Blacklist: {{error}}", "error_edit_blacklist": "Fehler beim Bearbeiten der schwarzen Liste: {{error}}", "error_fetching_device": "Fehler beim Abrufen der Geräteinformationen: {{error}}", "error_fetching_devices": "Fehler beim Abrufen von Geräten: {{error}}", + "firmware_count_explanation": "Dies ist die Gesamtzahl der Geräte, die diesem Firmware-Server hinzugefügt wurden, einschließlich der Geräte, die derzeit nicht auf den zugehörigen Gateway-Server verweisen.", "health_explanation": "Zustand der verbundenen Geräte ((Geräte = 100 % * 100 + Geräte > 90 % * 95 + Geräte > 60 % * 75 + Geräte < 60 % * 35) / Verbundene Geräte)", "memory_explanation": "Anzahl verbundener Geräte mit entsprechendem belegtem Speicher %", "remove_from_blacklist": "Von der schwarzen Liste entfernen", @@ -424,7 +429,7 @@ "to_release": "Zu", "unknown_firmware_status": "Unbekannter Firmware-Status", "upgrade": "Aktualisierung", - "upgrade_command_submitted": "Upgrade-Befehl erfolgreich gesendet", + "upgrade_command_submitted": "Aktualisierung läuft...", "upgrade_to_latest": "Neueste", "upgrade_to_version": "Upgrade auf diese Revision", "upgrading": "Upgrade durchführen..." @@ -725,7 +730,7 @@ "title": "Tcpdump", "trace": "Spur", "trace_not_successful": "Trace nicht erfolgreich: Gateway hat folgenden Fehler gemeldet: {{error}}", - "wait_for_file": "Möchten Sie warten, bis die Trace-Datei fertig ist?", + "wait_for_file": "Warten, bis die Trace-Datei fertig ist?", "waiting_directions": "Bitte warten Sie auf die Trace-Datendatei. Dies könnte eine Weile dauern. Sie können das Warten beenden und die Ablaufverfolgungsdatei später aus der Befehlstabelle abrufen.", "waiting_seconds": "Verstrichene Zeit: {{seconds}} Sekunden" }, diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index b747566..92ad203 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -8,6 +8,7 @@ "factory_reset": "Factory Reset", "firmware_upgrade": "Firmware Upgrade", "reboot": "Reboot", + "request_ie": "Request IEs", "telemetry": "Telemetry", "title": "Commands", "trace": "Trace", @@ -27,6 +28,7 @@ "error": "Error while submitting command!", "error_delete_log": "Error while trying to delete: {{error}}", "event_queue": "Event Queue", + "reboot_start": "Reboot process has started!", "success": "Command submitted successfully, you can look at the Commands log for the result", "title": "Command History", "unable_queue": "Unable to complete event queue request: {{error}}" @@ -148,6 +150,7 @@ "need_date": "You need a date...", "no": "No", "no_addresses_found": "No Addresses Found", + "no_clients_found": "No Clients Found", "no_devices_found": "No Devices Found", "no_items": "No Items", "none": "None", @@ -326,11 +329,13 @@ "blacklisted_on": "Date", "capabilities": "Capabilities", "certificate_explanation": "Certificates of connected devices", + "count_explanation": "Devices pointing at this gateway instance", "edit_blacklist": "Edit Blacklisted Device", "error_adding_blacklist": "Error adding device to blacklist: {{error}}", "error_edit_blacklist": "Error editing blacklist: {{error}}", "error_fetching_device": "Error fetching device information: {{error}}", "error_fetching_devices": "Error while fetching devices: {{error}}", + "firmware_count_explanation": "This is the total amount of devices that were added to this firmware server, including devices not currently pointing at the related gateway server.", "health_explanation": "Health of connected devices ((Devices=100% * 100 + Devices>90% * 95 + Devices>60% * 75 + Devices<60% * 35) / ConnectedDevices)", "memory_explanation": "Amount of connected devices with corresponding memory used percentage", "remove_from_blacklist": "Remove from blacklist", @@ -424,7 +429,7 @@ "to_release": "To", "unknown_firmware_status": "Unknown Firmware Status", "upgrade": "Upgrade", - "upgrade_command_submitted": "Upgrade Command Submitted Successfully", + "upgrade_command_submitted": "Upgrade in progress...", "upgrade_to_latest": "Latest", "upgrade_to_version": "Upgrade to this Revision", "upgrading": "Upgrading..." @@ -725,7 +730,7 @@ "title": "Trace", "trace": "Trace", "trace_not_successful": "Trace not successful: gateway reported the following error : {{error}}", - "wait_for_file": "Would you like to wait until the trace file is ready?", + "wait_for_file": "Wait until the trace file is ready?", "waiting_directions": "Please wait for the trace data file. This may take some time. You can exit the wait and retrieve the trace file from the commands table later.", "waiting_seconds": "Time Elapsed: {{seconds}} seconds" }, diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index 4675e6a..e433180 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -8,6 +8,7 @@ "factory_reset": "Restablecimiento De Fábrica", "firmware_upgrade": "Actualización de firmware", "reboot": "Reiniciar", + "request_ie": "Solicitar IE", "telemetry": "Telemetria", "title": "Comandos", "trace": "Rastro", @@ -27,6 +28,7 @@ "error": "¡Error al enviar el comando!", "error_delete_log": "Error al intentar eliminar: {{error}}", "event_queue": "Cola de eventos", + "reboot_start": "¡El proceso de reinicio ha comenzado!", "success": "Comando enviado con éxito, puede consultar el registro de Comandos para ver el resultado", "title": "Historial de Comandos", "unable_queue": "No se pudo completar la solicitud de cola de eventos: {{error}}" @@ -148,6 +150,7 @@ "need_date": "Necesitas una cita ...", "no": "No", "no_addresses_found": "No se encontraron direcciones", + "no_clients_found": "No se encontraron clientes", "no_devices_found": "No se encontraron dispositivos", "no_items": "No hay articulos", "none": "Ninguna", @@ -326,11 +329,13 @@ "blacklisted_on": "Fecha", "capabilities": "capacidades", "certificate_explanation": "Certificados de dispositivos conectados", + "count_explanation": "Dispositivos que apuntan a esta instancia de puerta de enlace", "edit_blacklist": "Editar dispositivo incluido en la lista negra", "error_adding_blacklist": "Error al agregar el dispositivo a la lista negra: {{error}}", "error_edit_blacklist": "Error al editar la lista negra: {{error}}", "error_fetching_device": "Error al obtener la información del dispositivo: {{error}}", "error_fetching_devices": "Error al recuperar dispositivos: {{error}}", + "firmware_count_explanation": "Esta es la cantidad total de dispositivos que se agregaron a este servidor de firmware, incluidos los dispositivos que actualmente no apuntan al servidor de puerta de enlace relacionado.", "health_explanation": "Estado de los dispositivos conectados ((Dispositivos = 100% * 100 + Dispositivos> 90% * 95 + Dispositivos> 60% * 75 + Dispositivos <60% * 35) / Dispositivos conectados)", "memory_explanation": "Cantidad de dispositivos conectados con la memoria correspondiente utilizada%", "remove_from_blacklist": "ELIMINAR DE LA LISTA NEGRA", @@ -424,7 +429,7 @@ "to_release": "A", "unknown_firmware_status": "Estado de firmware desconocido", "upgrade": "Mejorar", - "upgrade_command_submitted": "El comando de actualización se envió correctamente", + "upgrade_command_submitted": "Actualización en curso...", "upgrade_to_latest": "último", "upgrade_to_version": "Actualizar a esta revisión", "upgrading": "Actualizando ..." @@ -725,7 +730,7 @@ "title": "Rastro", "trace": "Rastro", "trace_not_successful": "Seguimiento fallido: la puerta de enlace informó el siguiente error: {{error}}", - "wait_for_file": "¿Le gustaría esperar hasta que el archivo de seguimiento esté listo?", + "wait_for_file": "¿Esperar hasta que el archivo de rastreo esté listo?", "waiting_directions": "Espere el archivo de datos de seguimiento. Esto puede tomar algo de tiempo. Puede salir de la espera y recuperar el archivo de seguimiento de la tabla de comandos más tarde.", "waiting_seconds": "Tiempo transcurrido: {{seconds}} segundos" }, diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index 13682f7..4f2ac0a 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -8,6 +8,7 @@ "factory_reset": "Retour aux paramètres d'usine", "firmware_upgrade": "Mise à jour du firmware", "reboot": "Redémarrer", + "request_ie": "Demander des IE", "telemetry": "Télémétrie", "title": "Les commandes", "trace": "Trace", @@ -27,6 +28,7 @@ "error": "Erreur lors de la soumission de la commande !", "error_delete_log": "Erreur lors de la tentative de suppression : {{error}}", "event_queue": "File d'attente d'événements", + "reboot_start": "Le processus de redémarrage a commencé !", "success": "Commande soumise avec succès, vous pouvez consulter le journal des commandes pour le résultat", "title": "Historique des commandes", "unable_queue": "Impossible de terminer la demande de file d'attente d'événements: {{error}}" @@ -148,6 +150,7 @@ "need_date": "Vous avez besoin d'un rendez-vous...", "no": "Non", "no_addresses_found": "Aucune adresse trouvée", + "no_clients_found": "Aucun client trouvé", "no_devices_found": "Aucun périphérique trouvé", "no_items": "Pas d'objet", "none": "Aucun", @@ -326,11 +329,13 @@ "blacklisted_on": "Rendez-vous amoureux", "capabilities": "Capacités", "certificate_explanation": "Certificats des appareils connectés", + "count_explanation": "Périphériques pointant vers cette instance de passerelle", "edit_blacklist": "Modifier l'appareil sur liste noire", "error_adding_blacklist": "Erreur lors de l'ajout de l'appareil à la liste noire : {{error}}", "error_edit_blacklist": "Erreur lors de la modification de la liste noire : {{error}}", "error_fetching_device": "Erreur lors de la récupération des informations sur l'appareil : {{error}}", "error_fetching_devices": "Erreur lors de la récupération des appareils : {{error}}", + "firmware_count_explanation": "Il s'agit du nombre total d'appareils qui ont été ajoutés à ce serveur de micrologiciel, y compris les appareils qui ne pointent pas actuellement vers le serveur de passerelle associé.", "health_explanation": "Santé des appareils connectés ((Appareils = 100 % * 100 + Appareils> 90 % * 95 + Appareils> 60 % * 75 + Appareils < 60 % * 35) / Appareils connectés)", "memory_explanation": "Nombre d'appareils connectés avec la mémoire correspondante utilisée %", "remove_from_blacklist": "Supprimer de la liste noire", @@ -424,7 +429,7 @@ "to_release": "à", "unknown_firmware_status": "État du micrologiciel inconnu", "upgrade": "Améliorer", - "upgrade_command_submitted": "Commande de mise à niveau soumise avec succès", + "upgrade_command_submitted": "Mise à jour en cours...", "upgrade_to_latest": "Dernier", "upgrade_to_version": "Mettre à niveau vers cette révision", "upgrading": "Mise à niveau..." @@ -725,7 +730,7 @@ "title": "Trace", "trace": "Trace", "trace_not_successful": "Trace non réussie : la passerelle a signalé l'erreur suivante : {{error}}", - "wait_for_file": "Souhaitez-vous attendre que le fichier de trace soit prêt ?", + "wait_for_file": "Attendre que le fichier de trace soit prêt ?", "waiting_directions": "Veuillez attendre le fichier de données de trace. Cela peut prendre un certain temps. Vous pouvez quitter l'attente et récupérer le fichier de trace de la table des commandes plus tard.", "waiting_seconds": "Temps écoulé : {{seconds}} secondes" }, diff --git a/public/locales/pt/translation.json b/public/locales/pt/translation.json index 2a5b000..b19503e 100644 --- a/public/locales/pt/translation.json +++ b/public/locales/pt/translation.json @@ -8,6 +8,7 @@ "factory_reset": "Restauração de fábrica", "firmware_upgrade": "Atualização de firmware", "reboot": "Reiniciar", + "request_ie": "Solicitar IEs", "telemetry": "Telemetria", "title": "Comandos", "trace": "Vestígio", @@ -27,6 +28,7 @@ "error": "Erro ao enviar comando!", "error_delete_log": "Erro ao tentar excluir: {{error}}", "event_queue": "Fila de Eventos", + "reboot_start": "O processo de reinicialização foi iniciado!", "success": "Comando enviado com sucesso, você pode consultar o log de Comandos para ver o resultado", "title": "Histórico de Comandos", "unable_queue": "Incapaz de completar o pedido de fila de eventos: {{error}}" @@ -148,6 +150,7 @@ "need_date": "Você precisa de um encontro ...", "no": "Não", "no_addresses_found": "Nenhum endereço encontrado", + "no_clients_found": "Nenhum cliente encontrado", "no_devices_found": "Nenhum dispositivo encontrado", "no_items": "Nenhum item", "none": "Nenhum", @@ -326,11 +329,13 @@ "blacklisted_on": "Encontro", "capabilities": "Recursos", "certificate_explanation": "Certificados de dispositivos conectados", + "count_explanation": "Dispositivos apontando para esta instância de gateway", "edit_blacklist": "Editar dispositivo na lista negra", "error_adding_blacklist": "Erro ao adicionar dispositivo à lista negra: {{error}}", "error_edit_blacklist": "Erro ao editar a lista negra: {{error}}", "error_fetching_device": "Erro ao buscar informações do dispositivo: {{error}}", "error_fetching_devices": "Erro ao buscar dispositivos: {{error}}", + "firmware_count_explanation": "Esta é a quantidade total de dispositivos que foram adicionados a este servidor de firmware, incluindo dispositivos que não estão apontando para o servidor de gateway relacionado.", "health_explanation": "Integridade dos dispositivos conectados ((Dispositivos = 100% * 100 + Dispositivos> 90% * 95 + Dispositivos> 60% * 75 + Dispositivos <60% * 35) / Dispositivos Conectados)", "memory_explanation": "Quantidade de dispositivos conectados com a memória correspondente usada%", "remove_from_blacklist": "Remover da lista negra", @@ -424,7 +429,7 @@ "to_release": "Para", "unknown_firmware_status": "Status de firmware desconhecido", "upgrade": "Melhorar", - "upgrade_command_submitted": "Comando de atualização enviado com sucesso", + "upgrade_command_submitted": "Atualização em andamento...", "upgrade_to_latest": "Mais recentes", "upgrade_to_version": "Atualize para esta revisão", "upgrading": "Atualizando ..." @@ -725,7 +730,7 @@ "title": "Vestígio", "trace": "Vestígio", "trace_not_successful": "O rastreamento não foi bem-sucedido: o gateway relatou o seguinte erro: {{error}}", - "wait_for_file": "Você gostaria de esperar até que o arquivo de rastreamento esteja pronto?", + "wait_for_file": "Esperar até que o arquivo de rastreamento esteja pronto?", "waiting_directions": "Aguarde o arquivo de dados de rastreamento. Isto pode tomar algum tempo. Você pode sair da espera e recuperar o arquivo de rastreamento da tabela de comandos mais tarde.", "waiting_seconds": "Tempo decorrido: {{seconds}} segundos" }, diff --git a/src/components/CommandHistory/index.js b/src/components/CommandHistory/index.js index dbb6013..6075518 100644 --- a/src/components/CommandHistory/index.js +++ b/src/components/CommandHistory/index.js @@ -358,6 +358,7 @@ const DeviceCommands = () => { shape="square" size="sm" className="mx-2" + disabled={item.completed === 0} onClick={() => { toggleDetails(item); }} diff --git a/src/components/DeviceListTable/Table/index.js b/src/components/DeviceListTable/Table/index.js index 10713dd..421dad7 100644 --- a/src/components/DeviceListTable/Table/index.js +++ b/src/components/DeviceListTable/Table/index.js @@ -414,6 +414,8 @@ const DeviceListTable = ({ nextClassName="page-item" nextLinkClassName="page-link" activeClassName="active" + pageRangeDisplayed={5} + marginPagesDisplayed={1} />

{t('common.items_per_page')}

diff --git a/src/components/DeviceListTable/index.js b/src/components/DeviceListTable/index.js index 8e8ed7e..c0e26d3 100644 --- a/src/components/DeviceListTable/index.js +++ b/src/components/DeviceListTable/index.js @@ -21,6 +21,7 @@ const DeviceList = () => { const [overrides, setOverrides] = useState({}); const [page, setPage] = useState(parseInt(sessionStorage.getItem('deviceTable') ?? 0, 10)); const { currentToken, endpoints } = useAuth(); + const [deviceToRefresh, setDeviceToRefresh] = useState(undefined); const [upgradeStatus, setUpgradeStatus] = useState({ loading: false, }); @@ -372,14 +373,17 @@ const DeviceList = () => { getCount(); }, []); + useEffect(() => { + if (deviceToRefresh) refreshDevice(deviceToRefresh.serial); + }, [deviceToRefresh?.timestamp]); + useEffect(() => { if (lastMessage && lastMessage.type === 'DEVICE') { - const { serialNumber: msgSerial, isConnected } = lastMessage; - if (overrides[msgSerial] === undefined || overrides[msgSerial] !== isConnected) { - setOverrides({ ...overrides, [msgSerial]: isConnected }); - } + const { serialNumber: msgSerial, timestamp } = lastMessage; + if (timestamp !== deviceToRefresh?.timestamp) + setDeviceToRefresh({ serial: msgSerial, timestamp }); } - }, [lastMessage, overrides]); + }, [lastMessage, deviceToRefresh]); useEffect(() => { if (upgradeStatus.result !== undefined) { diff --git a/src/components/InterfaceStatistics/StatisticsChartList.js b/src/components/InterfaceStatistics/StatisticsChartList.js index 568d32b..13f8189 100644 --- a/src/components/InterfaceStatistics/StatisticsChartList.js +++ b/src/components/InterfaceStatistics/StatisticsChartList.js @@ -4,7 +4,7 @@ import { CSpinner } from '@coreui/react'; import { useTranslation } from 'react-i18next'; import { v4 as createUuid } from 'uuid'; import axiosInstance from 'utils/axiosInstance'; -import { useAuth, useDevice } from 'ucentral-libs'; +import { useAuth } from 'ucentral-libs'; import { capitalizeFirstLetter, datesSameDay, @@ -14,11 +14,10 @@ import { } from 'utils/helper'; import DeviceStatisticsChart from './DeviceStatisticsChart'; -const StatisticsChartList = ({ setOptions, section, setStart, setEnd, time }) => { +const StatisticsChartList = ({ deviceSerialNumber, setOptions, section, time }) => { const { t } = useTranslation(); const [loading, setLoading] = useState(false); const { currentToken, endpoints } = useAuth(); - const { deviceSerialNumber } = useDevice(); const [statOptions, setStatOptions] = useState({ interfaceList: [], memory: [], @@ -244,10 +243,6 @@ const StatisticsChartList = ({ setOptions, section, setStart, setEnd, time }) => })); setOptions([...sectionOptions, { value: 'memory', label: t('statistics.memory') }]); setStatOptions({ ...newOptions }); - if (sortedData.length > 0) { - setStart(new Date(sortedData[0].recorded * 1000)); - setEnd(new Date(sortedData[sortedData.length - 1].recorded * 1000)); - } } }; @@ -358,11 +353,10 @@ const StatisticsChartList = ({ setOptions, section, setStart, setEnd, time }) => }; StatisticsChartList.propTypes = { + deviceSerialNumber: PropTypes.string.isRequired, setOptions: PropTypes.func.isRequired, section: PropTypes.string.isRequired, time: PropTypes.instanceOf(Object).isRequired, - setStart: PropTypes.func.isRequired, - setEnd: PropTypes.func.isRequired, }; export default React.memo(StatisticsChartList); diff --git a/src/components/InterfaceStatistics/index.js b/src/components/InterfaceStatistics/index.js index 2b3cb7e..848c65c 100644 --- a/src/components/InterfaceStatistics/index.js +++ b/src/components/InterfaceStatistics/index.js @@ -12,55 +12,98 @@ import { } from '@coreui/react'; import DatePicker from 'react-widgets/DatePicker'; import { cilSync } from '@coreui/icons'; +import { useDevice } from 'ucentral-libs'; import CIcon from '@coreui/icons-react'; +import { useGlobalWebSocket } from 'contexts/WebSocketProvider'; import StatisticsChartList from './StatisticsChartList'; import LatestStatisticsmodal from './LatestStatisticsModal'; +const getStart = () => { + const date = new Date(); + date.setHours(date.getHours() - 1); + return date; +}; const DeviceStatisticsCard = () => { const { t } = useTranslation(); const [showLatestModal, setShowLatestModal] = useState(false); const [options, setOptions] = useState([]); const [section, setSection] = useState(''); - const [start, setStart] = useState(null); const [startError, setStartError] = useState(false); - const [end, setEnd] = useState(null); const [endError, setEndError] = useState(false); - const [time, setTime] = useState({ refreshId: '0', start: null, end: null }); + const { deviceSerialNumber } = useDevice(); + const [nextUpdate, setNextUpdate] = useState(undefined); + const { addDeviceListener, removeDeviceListener } = useGlobalWebSocket(); + const [time, setTime] = useState({ + refreshId: '0', + start: getStart(), + end: new Date().toISOString(), + }); const toggleLatestModal = () => { setShowLatestModal(!showLatestModal); }; - const modifyStart = (value) => { + const modifyStart = (value, refresh = true) => { try { new Date(value).toISOString(); setStartError(false); - setStart(value); + if (refresh) setTime({ ...time, refreshId: createUuid(), start: value, isChosen: true }); + else setTime({ ...time, start: value, isChosen: true }); } catch (e) { - setStart(''); setStartError(true); } }; - const modifyEnd = (value) => { + const modifyEnd = (value, refresh = true) => { try { new Date(value).toISOString(); setEndError(false); - setEnd(value); + if (refresh) setTime({ ...time, refreshId: createUuid(), end: value, isChosen: true }); + else setTime({ ...time, end: value, isChosen: true }); } catch (e) { - setEnd(''); setEndError(true); } }; const refresh = () => { - setTime({ refreshId: createUuid(), start, end }); + setTime({ refreshId: createUuid(), start: getStart(), end: new Date().toISOString() }); + }; + + const handleRefreshClick = () => { + refresh(); }; useEffect(() => { if (section === '' && options.length > 0) setSection(options[0].value); }, [options]); + useEffect(() => { + if (nextUpdate && !time.isChosen) { + setTime({ refreshId: createUuid(), start: getStart(), end: new Date().toISOString() }); + setNextUpdate(undefined); + } + }, [nextUpdate, time]); + + useEffect(() => { + setNextUpdate(undefined); + if (deviceSerialNumber) { + addDeviceListener({ + serialNumber: deviceSerialNumber, + types: ['device_statistics'], + onTrigger: () => setNextUpdate(1), + }); + refresh(); + } + + return () => { + if (deviceSerialNumber) { + removeDeviceListener({ + serialNumber: deviceSerialNumber, + }); + } + }; + }, [deviceSerialNumber]); + return (
@@ -68,7 +111,12 @@ const DeviceStatisticsCard = () => {
- + @@ -77,7 +125,7 @@ const DeviceStatisticsCard = () => { modifyEnd(date)} - value={end ? new Date(end) : undefined} + value={time.end ? new Date(time.end) : undefined} />