Device page now uses tabs

This commit is contained in:
Charles
2021-10-25 15:55:02 -04:00
parent 531b240990
commit 996e9c2e4b
14 changed files with 327 additions and 51 deletions

18
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "ucentral-client", "name": "ucentral-client",
"version": "2.2.12", "version": "2.2.13",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "ucentral-client", "name": "ucentral-client",
"version": "2.2.12", "version": "2.2.13",
"dependencies": { "dependencies": {
"@coreui/coreui": "^3.4.0", "@coreui/coreui": "^3.4.0",
"@coreui/icons": "^2.0.1", "@coreui/icons": "^2.0.1",
@@ -32,7 +32,7 @@
"react-tooltip": "^4.2.21", "react-tooltip": "^4.2.21",
"react-widgets": "^5.1.1", "react-widgets": "^5.1.1",
"sass": "^1.35.1", "sass": "^1.35.1",
"ucentral-libs": "^0.9.71", "ucentral-libs": "^0.9.83",
"uuid": "^8.3.2" "uuid": "^8.3.2"
}, },
"devDependencies": { "devDependencies": {
@@ -14842,9 +14842,9 @@
} }
}, },
"node_modules/ucentral-libs": { "node_modules/ucentral-libs": {
"version": "0.9.71", "version": "0.9.83",
"resolved": "https://registry.npmjs.org/ucentral-libs/-/ucentral-libs-0.9.71.tgz", "resolved": "https://registry.npmjs.org/ucentral-libs/-/ucentral-libs-0.9.83.tgz",
"integrity": "sha512-5TqSqbya2WO9wzfTnpVemVhG2sOoB8PwdXlU/XvVGKCUFuGBYbeDIcW2O5VRwSZsuwQkaB3r6SdAeOMdIZ9Obw==", "integrity": "sha512-MLJ2+3/RlSpecI0ad1/hQogNLyaoKQewwheC1Chn4tjzra/nrwxV2d1REyb8jDNlC+VvyJbZiEG7cgGrHWk3uA==",
"dependencies": { "dependencies": {
"@coreui/coreui": "^3.4.0", "@coreui/coreui": "^3.4.0",
"@coreui/icons": "^2.0.1", "@coreui/icons": "^2.0.1",
@@ -27711,9 +27711,9 @@
} }
}, },
"ucentral-libs": { "ucentral-libs": {
"version": "0.9.71", "version": "0.9.83",
"resolved": "https://registry.npmjs.org/ucentral-libs/-/ucentral-libs-0.9.71.tgz", "resolved": "https://registry.npmjs.org/ucentral-libs/-/ucentral-libs-0.9.83.tgz",
"integrity": "sha512-5TqSqbya2WO9wzfTnpVemVhG2sOoB8PwdXlU/XvVGKCUFuGBYbeDIcW2O5VRwSZsuwQkaB3r6SdAeOMdIZ9Obw==", "integrity": "sha512-MLJ2+3/RlSpecI0ad1/hQogNLyaoKQewwheC1Chn4tjzra/nrwxV2d1REyb8jDNlC+VvyJbZiEG7cgGrHWk3uA==",
"requires": { "requires": {
"@coreui/coreui": "^3.4.0", "@coreui/coreui": "^3.4.0",
"@coreui/icons": "^2.0.1", "@coreui/icons": "^2.0.1",

View File

@@ -1,6 +1,6 @@
{ {
"name": "ucentral-client", "name": "ucentral-client",
"version": "2.2.12", "version": "2.2.13",
"dependencies": { "dependencies": {
"@coreui/coreui": "^3.4.0", "@coreui/coreui": "^3.4.0",
"@coreui/icons": "^2.0.1", "@coreui/icons": "^2.0.1",
@@ -26,7 +26,7 @@
"react-tooltip": "^4.2.21", "react-tooltip": "^4.2.21",
"react-widgets": "^5.1.1", "react-widgets": "^5.1.1",
"sass": "^1.35.1", "sass": "^1.35.1",
"ucentral-libs": "^0.9.71", "ucentral-libs": "^0.9.83",
"uuid": "^8.3.2" "uuid": "^8.3.2"
}, },
"main": "index.js", "main": "index.js",

View File

@@ -125,6 +125,7 @@
"na": "(unbekannt)", "na": "(unbekannt)",
"need_date": "Du brauchst ein Datum...", "need_date": "Du brauchst ein Datum...",
"no": "Nein", "no": "Nein",
"no_addresses_found": "Keine Adressen gefunden",
"no_devices_found": "Keine Geräte gefunden", "no_devices_found": "Keine Geräte gefunden",
"no_items": "Keine Gegenstände", "no_items": "Keine Gegenstände",
"none": "Keiner", "none": "Keiner",
@@ -150,6 +151,7 @@
"second": "zweite", "second": "zweite",
"seconds": "sekunden", "seconds": "sekunden",
"seconds_elapsed": "Sekunden verstrichen", "seconds_elapsed": "Sekunden verstrichen",
"select": "wählen",
"serial_number": "Seriennummer", "serial_number": "Seriennummer",
"show_all": "Zeige alles", "show_all": "Zeige alles",
"socket_connection_closed": "Verbindung geschlossen!", "socket_connection_closed": "Verbindung geschlossen!",
@@ -226,6 +228,7 @@
"used_by": "Benutzt von", "used_by": "Benutzt von",
"used_by_details": "{{entities}} Entitäten, {{venues}} Veranstaltungsorte und {{devices}} Geräte", "used_by_details": "{{entities}} Entitäten, {{venues}} Veranstaltungsorte und {{devices}} Geräte",
"uuid": "Konfigurations-ID", "uuid": "Konfigurations-ID",
"view_config": "Konfiguration anzeigen",
"view_in_use": "In Verwendung anzeigen", "view_in_use": "In Verwendung anzeigen",
"view_json": "Rohe Konfiguration anzeigen" "view_json": "Rohe Konfiguration anzeigen"
}, },
@@ -243,13 +246,15 @@
"access_pin": "Zugangs-PIN", "access_pin": "Zugangs-PIN",
"add_contact": "Kontakt hinzufügen", "add_contact": "Kontakt hinzufügen",
"create_contact": "Kontakt erstellen", "create_contact": "Kontakt erstellen",
"delete": "Kontakt löschen?",
"error_assign": "Fehler beim Versuch, Kontakt zuzuweisen: {{error}}", "error_assign": "Fehler beim Versuch, Kontakt zuzuweisen: {{error}}",
"error_creation": "Fehler beim Versuch, einen Kontakt zu erstellen: {{error}}", "error_creation": "Fehler beim Versuch, einen Kontakt zu erstellen: {{error}}",
"error_delete": "Fehler beim Löschen", "error_delete": "Fehler beim Versuch, den Kontakt zu löschen: {{error}}",
"error_fetching_list": "Fehler beim Abrufen der Kontakte", "error_fetching_list": "Fehler beim Abrufen der Kontakte",
"error_fetching_single": "Fehler beim Abrufen des Kontakts: {{error}}", "error_fetching_single": "Fehler beim Abrufen des Kontakts: {{error}}",
"error_unassign": "Fehler beim Versuch, die Zuweisung des Kontakts aufzuheben: {{error}}", "error_unassign": "Fehler beim Versuch, die Zuweisung des Kontakts aufzuheben: {{error}}",
"first_name": "Vorname", "first_name": "Vorname",
"identifier": "Identifikator",
"initials": "Initialen", "initials": "Initialen",
"last_name": "Nachname", "last_name": "Nachname",
"no_associated_contact": "Kein zugehöriger Kontakt", "no_associated_contact": "Kein zugehöriger Kontakt",
@@ -449,7 +454,28 @@
"venue": "Tagungsort" "venue": "Tagungsort"
}, },
"location": { "location": {
"title": "Standorte" "add": "Ort hinzufügen",
"building_name": "Gebäudename",
"city": "Stadt",
"country": "Land",
"create": "Standort erstellen",
"delete": "Ort löschen?",
"error_assign": "Fehler beim Versuch, den Standort zuzuweisen: {{error}}",
"error_creation": "Fehler beim Versuch, Standorte zu erstellen: {{error}}",
"error_delete": "Fehler beim Löschen des Standorts: {{error}}",
"error_fetching_single": "Fehler beim Versuch, den Standort abzurufen: {{error}}",
"geocode": "GeoCode",
"no_associated": "Kein zugeordneter Standort",
"postal": "Postleitzahl",
"search": "Suchen Sie nach Standorten, um die Felder unten automatisch auszufüllen",
"state": "Zustand",
"street_address": "Adresse",
"successful_creation": "Standort erfolgreich erstellt!",
"successful_delete": "Standort erfolgreich gelöscht!",
"successful_update": "Standort erfolgreich aktualisiert!",
"successfully_assigned": "Standort erfolgreich zugewiesen!",
"title": "Standorte",
"update_error": "Fehler beim Aktualisieren des Standorts: {{error}}"
}, },
"login": { "login": {
"account_verification": "Bestätigung des Kontos", "account_verification": "Bestätigung des Kontos",

View File

@@ -125,6 +125,7 @@
"na": "N/A", "na": "N/A",
"need_date": "You need a date...", "need_date": "You need a date...",
"no": "No", "no": "No",
"no_addresses_found": "No Addresses Found",
"no_devices_found": "No Devices Found", "no_devices_found": "No Devices Found",
"no_items": "No Items", "no_items": "No Items",
"none": "None", "none": "None",
@@ -150,6 +151,7 @@
"second": "second", "second": "second",
"seconds": "seconds", "seconds": "seconds",
"seconds_elapsed": "Seconds elapsed", "seconds_elapsed": "Seconds elapsed",
"select": "Select",
"serial_number": "Serial Number", "serial_number": "Serial Number",
"show_all": "Show All", "show_all": "Show All",
"socket_connection_closed": "Connection closed!", "socket_connection_closed": "Connection closed!",
@@ -226,6 +228,7 @@
"used_by": "Used By", "used_by": "Used By",
"used_by_details": "{{entities}} Entities, {{venues}} Venues and {{devices}} Devices", "used_by_details": "{{entities}} Entities, {{venues}} Venues and {{devices}} Devices",
"uuid": "Config ID", "uuid": "Config ID",
"view_config": "View Configuration",
"view_in_use": "View In Use", "view_in_use": "View In Use",
"view_json": "View raw JSON" "view_json": "View raw JSON"
}, },
@@ -243,13 +246,15 @@
"access_pin": "Access PIN", "access_pin": "Access PIN",
"add_contact": "Add Contact", "add_contact": "Add Contact",
"create_contact": "Create Contact", "create_contact": "Create Contact",
"delete": "Delete Contact?",
"error_assign": "Error while trying to assign contact: {{error}}", "error_assign": "Error while trying to assign contact: {{error}}",
"error_creation": "Error while trying to create contact: {{error}}", "error_creation": "Error while trying to create contact: {{error}}",
"error_delete": "Error trying to delete", "error_delete": "Error trying to delete contact: {{error}}",
"error_fetching_list": "Error fetching contacts", "error_fetching_list": "Error fetching contacts",
"error_fetching_single": "Error fetching contact: {{error}}", "error_fetching_single": "Error fetching contact: {{error}}",
"error_unassign": "Error while trying to unassign contact: {{error}}", "error_unassign": "Error while trying to unassign contact: {{error}}",
"first_name": "First Name", "first_name": "First Name",
"identifier": "Identifier",
"initials": "Initials", "initials": "Initials",
"last_name": "Last Name", "last_name": "Last Name",
"no_associated_contact": "No Associated Contact", "no_associated_contact": "No Associated Contact",
@@ -449,7 +454,28 @@
"venue": "Venue" "venue": "Venue"
}, },
"location": { "location": {
"title": "Locations" "add": "Add Location",
"building_name": "Building Name",
"city": "City",
"country": "Country",
"create": "Create Location",
"delete": "Delete Location?",
"error_assign": "Error while trying to assign location: {{error}}",
"error_creation": "Error while trying to create locations: {{error}}",
"error_delete": "Error while deleting location: {{error}}",
"error_fetching_single": "Error while trying to fetch location: {{error}}",
"geocode": "GeoCode",
"no_associated": "No Associated Location",
"postal": "ZIP/Postal Code",
"search": "Search locations to auto fill the fields below",
"state": "State",
"street_address": "Street Address",
"successful_creation": "Location Successfully Created!",
"successful_delete": "Successfully Deleted Location!",
"successful_update": "Successfully updated location!",
"successfully_assigned": "Location Successfully Assigned!",
"title": "Locations",
"update_error": "Error updating location: {{error}}"
}, },
"login": { "login": {
"account_verification": "Account Verification", "account_verification": "Account Verification",

View File

@@ -125,6 +125,7 @@
"na": "N / A", "na": "N / A",
"need_date": "Necesitas una cita ...", "need_date": "Necesitas una cita ...",
"no": "No", "no": "No",
"no_addresses_found": "No se encontraron direcciones",
"no_devices_found": "No se encontraron dispositivos", "no_devices_found": "No se encontraron dispositivos",
"no_items": "No hay articulos", "no_items": "No hay articulos",
"none": "Ninguna", "none": "Ninguna",
@@ -150,6 +151,7 @@
"second": "segundo", "second": "segundo",
"seconds": "segundos", "seconds": "segundos",
"seconds_elapsed": "Segundos transcurridos", "seconds_elapsed": "Segundos transcurridos",
"select": "Seleccionar",
"serial_number": "Número de serie", "serial_number": "Número de serie",
"show_all": "Mostrar todo", "show_all": "Mostrar todo",
"socket_connection_closed": "¡Conexión cerrada!", "socket_connection_closed": "¡Conexión cerrada!",
@@ -226,6 +228,7 @@
"used_by": "Usado por", "used_by": "Usado por",
"used_by_details": "{{entities}} Entidades, {{venues}} lugares y {{devices}} dispositivos", "used_by_details": "{{entities}} Entidades, {{venues}} lugares y {{devices}} dispositivos",
"uuid": "ID de configuración", "uuid": "ID de configuración",
"view_config": "Ver configuración",
"view_in_use": "Ver en uso", "view_in_use": "Ver en uso",
"view_json": "Ver JSON sin procesar" "view_json": "Ver JSON sin procesar"
}, },
@@ -243,13 +246,15 @@
"access_pin": "PIN de acceso", "access_pin": "PIN de acceso",
"add_contact": "Agregar contacto", "add_contact": "Agregar contacto",
"create_contact": "Crear contacto", "create_contact": "Crear contacto",
"delete": "¿Borrar contacto?",
"error_assign": "Error al intentar asignar el contacto: {{error}}", "error_assign": "Error al intentar asignar el contacto: {{error}}",
"error_creation": "Error al intentar crear contacto: {{error}}", "error_creation": "Error al intentar crear contacto: {{error}}",
"error_delete": "Error al intentar eliminar", "error_delete": "Error al intentar eliminar el contacto: {{error}}",
"error_fetching_list": "Error al obtener los contactos", "error_fetching_list": "Error al obtener los contactos",
"error_fetching_single": "Error al obtener el contacto: {{error}}", "error_fetching_single": "Error al obtener el contacto: {{error}}",
"error_unassign": "Error al intentar anular la asignación del contacto: {{error}}", "error_unassign": "Error al intentar anular la asignación del contacto: {{error}}",
"first_name": "Nombre de pila", "first_name": "Nombre de pila",
"identifier": "Identificador",
"initials": "Iniciales", "initials": "Iniciales",
"last_name": "Apellido", "last_name": "Apellido",
"no_associated_contact": "Sin contacto asociado", "no_associated_contact": "Sin contacto asociado",
@@ -449,7 +454,28 @@
"venue": "Lugar de encuentro" "venue": "Lugar de encuentro"
}, },
"location": { "location": {
"title": "Ubicaciones" "add": "Añade una ubicación",
"building_name": "Nombre del edificio",
"city": "ciudad",
"country": "País",
"create": "Crear ubicación",
"delete": "¿Eliminar ubicación?",
"error_assign": "Error al intentar asignar la ubicación: {{error}}",
"error_creation": "Error al intentar crear ubicaciones: {{error}}",
"error_delete": "Error al eliminar la ubicación: {{error}}",
"error_fetching_single": "Error al intentar obtener la ubicación: {{error}}",
"geocode": "Geocode",
"no_associated": "Sin ubicación asociada",
"postal": "código postal",
"search": "Busque ubicaciones para completar automáticamente los campos a continuación",
"state": "Estado",
"street_address": "Dirección",
"successful_creation": "¡Ubicación creada con éxito!",
"successful_delete": "¡Ubicación eliminada con éxito!",
"successful_update": "¡Ubicación actualizada con éxito!",
"successfully_assigned": "¡Ubicación asignada correctamente!",
"title": "Ubicaciones",
"update_error": "Error al actualizar la ubicación: {{error}}"
}, },
"login": { "login": {
"account_verification": "Verificación de la cuenta", "account_verification": "Verificación de la cuenta",

View File

@@ -125,6 +125,7 @@
"na": "N / A", "na": "N / A",
"need_date": "Vous avez besoin d'un rendez-vous...", "need_date": "Vous avez besoin d'un rendez-vous...",
"no": "Non", "no": "Non",
"no_addresses_found": "Aucune adresse trouvée",
"no_devices_found": "Aucun périphérique trouvé", "no_devices_found": "Aucun périphérique trouvé",
"no_items": "Pas d'objet", "no_items": "Pas d'objet",
"none": "Aucun", "none": "Aucun",
@@ -150,6 +151,7 @@
"second": "seconde", "second": "seconde",
"seconds": "secondes", "seconds": "secondes",
"seconds_elapsed": "Secondes écoulées", "seconds_elapsed": "Secondes écoulées",
"select": "sélectionner",
"serial_number": "Numéro de série", "serial_number": "Numéro de série",
"show_all": "Montre tout", "show_all": "Montre tout",
"socket_connection_closed": "Connexion fermée !", "socket_connection_closed": "Connexion fermée !",
@@ -226,6 +228,7 @@
"used_by": "Utilisé par", "used_by": "Utilisé par",
"used_by_details": "{{entities}} Entités, {{venues}} Lieux et {{devices}} Appareils", "used_by_details": "{{entities}} Entités, {{venues}} Lieux et {{devices}} Appareils",
"uuid": "Identifiant de configuration", "uuid": "Identifiant de configuration",
"view_config": "Afficher la configuration",
"view_in_use": "Afficher en cours d'utilisation", "view_in_use": "Afficher en cours d'utilisation",
"view_json": "Afficher le JSON brut" "view_json": "Afficher le JSON brut"
}, },
@@ -243,13 +246,15 @@
"access_pin": "NIP d'accès", "access_pin": "NIP d'accès",
"add_contact": "Ajouter le contact", "add_contact": "Ajouter le contact",
"create_contact": "Créer un contact", "create_contact": "Créer un contact",
"delete": "Effacer le contact?",
"error_assign": "Erreur lors de la tentative d'attribution du contact : {{error}}", "error_assign": "Erreur lors de la tentative d'attribution du contact : {{error}}",
"error_creation": "Erreur lors de la tentative de création du contact : {{error}}", "error_creation": "Erreur lors de la tentative de création du contact : {{error}}",
"error_delete": "Erreur lors de la tentative de suppression", "error_delete": "Erreur lors de la tentative de suppression du contact : {{error}}",
"error_fetching_list": "Erreur lors de la récupération des contacts", "error_fetching_list": "Erreur lors de la récupération des contacts",
"error_fetching_single": "Erreur lors de la récupération du contact : {{error}}", "error_fetching_single": "Erreur lors de la récupération du contact : {{error}}",
"error_unassign": "Erreur lors de la tentative de désattribution du contact : {{error}}", "error_unassign": "Erreur lors de la tentative de désattribution du contact : {{error}}",
"first_name": "Prénom", "first_name": "Prénom",
"identifier": "Identifiant",
"initials": "Initiales", "initials": "Initiales",
"last_name": "Nom de famille", "last_name": "Nom de famille",
"no_associated_contact": "Aucun contact associé", "no_associated_contact": "Aucun contact associé",
@@ -449,7 +454,28 @@
"venue": "Lieu" "venue": "Lieu"
}, },
"location": { "location": {
"title": "Emplacements" "add": "Ajouter un emplacement",
"building_name": "Nom du bâtiment",
"city": "Ville",
"country": "Pays",
"create": "Créer un lieu",
"delete": "Supprimer le lieu?",
"error_assign": "Erreur lors de la tentative d'attribution de l'emplacement : {{error}}",
"error_creation": "Erreur lors de la tentative de création d'établissements : {{error}}",
"error_delete": "Erreur lors de la suppression de l'emplacement : {{error}}",
"error_fetching_single": "Erreur lors de la tentative de récupération de l'emplacement : {{error}}",
"geocode": "Géocode",
"no_associated": "Aucun emplacement associé",
"postal": "Zip / code postal",
"search": "Recherchez des emplacements pour remplir automatiquement les champs ci-dessous",
"state": "Etat",
"street_address": "Adresse de rue",
"successful_creation": "Emplacement créé avec succès !",
"successful_delete": "Emplacement supprimé avec succès !",
"successful_update": "Emplacement mis à jour avec succès !",
"successfully_assigned": "Emplacement attribué avec succès !",
"title": "Emplacements",
"update_error": "Erreur lors de la mise à jour de l'emplacement : {{error}}"
}, },
"login": { "login": {
"account_verification": "Vérification de compte", "account_verification": "Vérification de compte",

View File

@@ -125,6 +125,7 @@
"na": "N / D", "na": "N / D",
"need_date": "Você precisa de um encontro ...", "need_date": "Você precisa de um encontro ...",
"no": "Não", "no": "Não",
"no_addresses_found": "Nenhum endereço encontrado",
"no_devices_found": "Nenhum dispositivo encontrado", "no_devices_found": "Nenhum dispositivo encontrado",
"no_items": "Nenhum item", "no_items": "Nenhum item",
"none": "Nenhum", "none": "Nenhum",
@@ -150,6 +151,7 @@
"second": "segundo", "second": "segundo",
"seconds": "segundos", "seconds": "segundos",
"seconds_elapsed": "Segundos decorridos", "seconds_elapsed": "Segundos decorridos",
"select": "Selecione",
"serial_number": "Número de série", "serial_number": "Número de série",
"show_all": "mostre tudo", "show_all": "mostre tudo",
"socket_connection_closed": "Conexão fechada!", "socket_connection_closed": "Conexão fechada!",
@@ -226,6 +228,7 @@
"used_by": "Usado por", "used_by": "Usado por",
"used_by_details": "{{entities}} Entidades, {{venues}} Locais e {{devices}} Dispositivos", "used_by_details": "{{entities}} Entidades, {{venues}} Locais e {{devices}} Dispositivos",
"uuid": "ID de configuração", "uuid": "ID de configuração",
"view_config": "Ver configuração",
"view_in_use": "Visualização em uso", "view_in_use": "Visualização em uso",
"view_json": "Exibir JSON bruto" "view_json": "Exibir JSON bruto"
}, },
@@ -243,13 +246,15 @@
"access_pin": "PIN de acesso", "access_pin": "PIN de acesso",
"add_contact": "Adicionar contato", "add_contact": "Adicionar contato",
"create_contact": "Criar Contato", "create_contact": "Criar Contato",
"delete": "Excluir contato?",
"error_assign": "Erro ao tentar atribuir contato: {{error}}", "error_assign": "Erro ao tentar atribuir contato: {{error}}",
"error_creation": "Erro ao tentar criar contato: {{error}}", "error_creation": "Erro ao tentar criar contato: {{error}}",
"error_delete": "Erro ao tentar excluir", "error_delete": "Erro ao tentar excluir contato: {{error}}",
"error_fetching_list": "Erro ao buscar contatos", "error_fetching_list": "Erro ao buscar contatos",
"error_fetching_single": "Erro ao buscar contato: {{error}}", "error_fetching_single": "Erro ao buscar contato: {{error}}",
"error_unassign": "Erro ao tentar cancelar a atribuição do contato: {{error}}", "error_unassign": "Erro ao tentar cancelar a atribuição do contato: {{error}}",
"first_name": "Primeiro nome", "first_name": "Primeiro nome",
"identifier": "Identificador",
"initials": "Iniciais", "initials": "Iniciais",
"last_name": "Último nome", "last_name": "Último nome",
"no_associated_contact": "Nenhum contato associado", "no_associated_contact": "Nenhum contato associado",
@@ -449,7 +454,28 @@
"venue": "Local" "venue": "Local"
}, },
"location": { "location": {
"title": "Localizações" "add": "Adicionar Local",
"building_name": "nome do edifício",
"city": "Cidade",
"country": "País",
"create": "Criar local",
"delete": "Excluir localização?",
"error_assign": "Erro ao tentar atribuir local: {{error}}",
"error_creation": "Erro ao tentar criar locais: {{error}}",
"error_delete": "Erro ao excluir localização: {{error}}",
"error_fetching_single": "Erro ao tentar buscar localização: {{error}}",
"geocode": "GeoCode",
"no_associated": "Sem localização associada",
"postal": "CEP / Código Postal",
"search": "Pesquise locais para preencher automaticamente os campos abaixo",
"state": "Estado",
"street_address": "Endereço",
"successful_creation": "Local criado com sucesso!",
"successful_delete": "Local excluído com sucesso!",
"successful_update": "Local atualizado com sucesso!",
"successfully_assigned": "Local atribuído com sucesso!",
"title": "Localizações",
"update_error": "Erro ao atualizar local: {{error}}"
}, },
"login": { "login": {
"account_verification": "Verificação de conta", "account_verification": "Verificação de conta",

View File

@@ -244,6 +244,7 @@ const DeviceCommands = () => {
return ( return (
<div> <div>
<CWidgetDropdown <CWidgetDropdown
className="m-0"
inverse="true" inverse="true"
color="gradient-primary" color="gradient-primary"
header={t('commands.title')} header={t('commands.title')}

View File

@@ -122,7 +122,7 @@ const DeviceActions = () => {
return ( return (
<CCard> <CCard>
<CCardHeader> <CCardHeader className="p-1">
<div className="text-value-lg">{t('actions.title')}</div> <div className="text-value-lg">{t('actions.title')}</div>
</CCardHeader> </CCardHeader>
<CCardBody> <CCardBody>
@@ -138,7 +138,7 @@ const DeviceActions = () => {
</CButton> </CButton>
</CCol> </CCol>
</CRow> </CRow>
<CRow className="mt-4"> <CRow className="my-1">
<CCol> <CCol>
<CButton block color="primary" onClick={toggleUpgradeModal}> <CButton block color="primary" onClick={toggleUpgradeModal}>
{t('actions.firmware_upgrade')} {t('actions.firmware_upgrade')}
@@ -150,7 +150,7 @@ const DeviceActions = () => {
</CButton> </CButton>
</CCol> </CCol>
</CRow> </CRow>
<CRow className="mt-4"> <CRow className="my-1">
<CCol> <CCol>
<CButton block color="primary" onClick={toggleScanModal}> <CButton block color="primary" onClick={toggleScanModal}>
{t('actions.wifi_scan')} {t('actions.wifi_scan')}
@@ -162,7 +162,7 @@ const DeviceActions = () => {
</CButton> </CButton>
</CCol> </CCol>
</CRow> </CRow>
<CRow className="mt-4"> <CRow className="my-1">
<CCol> <CCol>
<LoadingButton <LoadingButton
isLoading={connectLoading} isLoading={connectLoading}
@@ -177,7 +177,7 @@ const DeviceActions = () => {
</CButton> </CButton>
</CCol> </CCol>
</CRow> </CRow>
<CRow className="mt-4"> <CRow className="my-1">
<CCol> <CCol>
<CButton block color="primary" onClick={toggleQueueModal}> <CButton block color="primary" onClick={toggleQueueModal}>
{t('commands.event_queue')} {t('commands.event_queue')}

View File

@@ -184,6 +184,7 @@ const DeviceHealth = () => {
return ( return (
<CWidgetDropdown <CWidgetDropdown
className="m-0"
header={t('health.title')} header={t('health.title')}
text={sanityLevel ? `${sanityLevel}%` : t('common.unknown')} text={sanityLevel ? `${sanityLevel}%` : t('common.unknown')}
value={sanityLevel ?? 100} value={sanityLevel ?? 100}

View File

@@ -167,6 +167,7 @@ const DeviceLogs = () => {
return ( return (
<div> <div>
<CWidgetDropdown <CWidgetDropdown
className="m-0"
inverse="true" inverse="true"
color="gradient-info" color="gradient-info"
header={t('device_logs.title')} header={t('device_logs.title')}

View File

@@ -34,35 +34,34 @@ const DeviceStatisticsCard = () => {
return ( return (
<div> <div>
<CCard> <CCard className="m-0">
<CCardHeader> <CCardHeader className="p-1">
<div className="d-flex flex-row-reverse align-items-center"> <div className="d-flex flex-row-reverse align-items-center">
<div className="pl-2"> <div className="pl-2">
<CPopover content={t('common.refresh')}> <CPopover content={t('common.refresh')}>
<CButton color="primary" variant="outline" onClick={refresh}> <CButton size="sm" color="primary" variant="outline" onClick={refresh}>
<CIcon content={cilSync} /> <CIcon content={cilSync} />
</CButton> </CButton>
</CPopover> </CPopover>
</div> </div>
<div className="pl-2"> <div className="pl-2">
<CButton color="primary" variant="outline" onClick={toggleLifetimeModal}> <CButton size="sm" color="primary" variant="outline" onClick={toggleLifetimeModal}>
Lifetime Statistics Lifetime Statistics
</CButton> </CButton>
</div> </div>
<div className="pl-2"> <div className="pl-2">
<CButton color="primary" variant="outline" onClick={toggleLatestModal}> <CButton size="sm" color="primary" variant="outline" onClick={toggleLatestModal}>
{t('statistics.show_latest')} {t('statistics.show_latest')}
</CButton> </CButton>
</div> </div>
<div> <div>
<CButton color="primary" variant="outline" onClick={goToAnalysis}> <CButton size="sm" color="primary" variant="outline" onClick={goToAnalysis}>
{t('wifi_analysis.title')} {t('wifi_analysis.title')}
</CButton> </CButton>
</div> </div>
<div className="text-value-lg mr-auto">{t('statistics.title')}</div>
</div> </div>
</CCardHeader> </CCardHeader>
<CCardBody className="p-5"> <CCardBody className="p-1">
<StatisticsChartList /> <StatisticsChartList />
</CCardBody> </CCardBody>
</CCard> </CCard>

View File

@@ -1,41 +1,186 @@
import React from 'react'; import React, { useEffect, useState } from 'react';
import { useParams } from 'react-router-dom'; import { useParams } from 'react-router-dom';
import { CRow, CCol } from '@coreui/react'; import { CRow, CCol, CCard, CCardBody, CNav, CNavLink, CTabPane, CTabContent } from '@coreui/react';
import DeviceHealth from 'components/DeviceHealth'; import DeviceHealth from 'components/DeviceHealth';
import DeviceStatusCard from 'components/DeviceStatusCard';
import CommandHistory from 'components/CommandHistory'; import CommandHistory from 'components/CommandHistory';
import DeviceLogs from 'components/DeviceLogs'; import DeviceLogs from 'components/DeviceLogs';
import DeviceStatisticsCard from 'components/InterfaceStatistics'; import DeviceStatisticsCard from 'components/InterfaceStatistics';
import DeviceActionCard from 'components/DeviceActionCard'; import DeviceActionCard from 'components/DeviceActionCard';
import axiosInstance from 'utils/axiosInstance'; import axiosInstance from 'utils/axiosInstance';
import { DeviceProvider } from 'ucentral-libs'; import { DeviceProvider, DeviceStatusCard, DeviceDetails, useAuth, useToast } from 'ucentral-libs';
import { useTranslation } from 'react-i18next';
const DevicePage = () => { const DevicePage = () => {
const { t } = useTranslation();
const { deviceId } = useParams(); const { deviceId } = useParams();
const [index, setIndex] = useState(0);
const { currentToken, endpoints } = useAuth();
const { addToast } = useToast();
const [lastStats, setLastStats] = useState(null);
const [status, setStatus] = useState(null);
const [deviceConfig, setDeviceConfig] = useState(null);
const [error, setError] = useState(false);
const [loading, setLoading] = useState(false);
const getDevice = () => {
const options = {
headers: {
Accept: 'application/json',
Authorization: `Bearer ${currentToken}`,
},
};
axiosInstance
.get(`${endpoints.owgw}/api/v1/device/${encodeURIComponent(deviceId)}`, options)
.then((response) => {
setDeviceConfig(response.data);
})
.catch((e) => {
addToast({
title: t('common.error'),
body: t('device.error_fetching_device', { error: e.response?.data?.ErrorDescription }),
color: 'danger',
autohide: true,
});
});
};
const getData = () => {
setLoading(true);
const options = {
headers: {
Accept: 'application/json',
Authorization: `Bearer ${currentToken}`,
},
};
const lastStatsRequest = axiosInstance.get(
`${endpoints.owgw}/api/v1/device/${encodeURIComponent(deviceId)}/statistics?lastOnly=true`,
options,
);
const statusRequest = axiosInstance.get(
`${endpoints.owgw}/api/v1/device/${encodeURIComponent(deviceId)}/status`,
options,
);
Promise.all([lastStatsRequest, statusRequest])
.then(([newStats, newStatus]) => {
setLastStats(newStats.data);
setStatus(newStatus.data);
})
.catch(() => {
setError(true);
})
.finally(() => {
setLoading(false);
});
};
const refresh = () => {
getData();
getDevice();
};
useEffect(() => {
setError(false);
if (deviceId) {
getDevice();
getData();
}
}, [deviceId]);
return ( return (
<div className="App"> <div className="App">
<DeviceProvider axiosInstance={axiosInstance} serialNumber={deviceId}> <DeviceProvider axiosInstance={axiosInstance} serialNumber={deviceId}>
<CRow>
<CCol>
<DeviceStatusCard />
</CCol>
</CRow>
<CRow> <CRow>
<CCol lg="12" xl="6"> <CCol lg="12" xl="6">
<CommandHistory /> <DeviceStatusCard
t={t}
loading={loading}
error={error}
deviceSerialNumber={deviceId}
getData={refresh}
deviceConfig={deviceConfig}
status={status}
lastStats={lastStats}
/>
</CCol> </CCol>
<CCol lg="12" xl="6"> <CCol lg="12" xl="6">
<DeviceActionCard /> <DeviceActionCard />
</CCol> </CCol>
</CRow> </CRow>
<CRow> <CRow>
<CCol lg="12" xl="6"> <CCol>
<DeviceStatisticsCard /> <CCard>
</CCol> <CCardBody className="p-0">
<CCol lg="12" xl="6"> <CNav variant="tabs">
<DeviceHealth /> <CNavLink
<DeviceLogs /> className="font-weight-bold"
href="#"
active={index === 0}
onClick={() => setIndex(0)}
>
{t('statistics.title')}
</CNavLink>
<CNavLink
className="font-weight-bold"
href="#"
active={index === 1}
onClick={() => setIndex(1)}
>
{t('configuration.title')}
</CNavLink>
<CNavLink
className="font-weight-bold"
href="#"
active={index === 2}
onClick={() => setIndex(2)}
>
{t('commands.title')}
</CNavLink>
<CNavLink
className="font-weight-bold"
href="#"
active={index === 3}
onClick={() => setIndex(3)}
>
{t('health.title')}
</CNavLink>
<CNavLink
className="font-weight-bold"
href="#"
active={index === 4}
onClick={() => setIndex(4)}
>
{t('device_logs.title')}
</CNavLink>
</CNav>
<CTabContent>
<CTabPane active={index === 0}>
<DeviceStatisticsCard />
</CTabPane>
<CTabPane active={index === 1}>
<DeviceDetails
t={t}
loading={loading}
getData={refresh}
deviceConfig={deviceConfig}
status={status}
lastStats={lastStats}
/>
</CTabPane>
<CTabPane active={index === 2}>
<CommandHistory />
</CTabPane>
<CTabPane active={index === 3}>
<DeviceHealth />
</CTabPane>
<CTabPane active={index === 4}>
<DeviceLogs />
</CTabPane>
</CTabContent>
</CCardBody>
</CCard>
</CCol> </CCol>
</CRow> </CRow>
</DeviceProvider> </DeviceProvider>

View File

@@ -21,7 +21,6 @@ const SystemPage = () => {
processors: t('common.unknown'), processors: t('common.unknown'),
uptime: t('common.unknown'), uptime: t('common.unknown'),
version: t('common.unknown'), version: t('common.unknown'),
start: t('common.unknown'),
certificates: [], certificates: [],
subsystems: [], subsystems: [],
}; };