diff --git a/package-lock.json b/package-lock.json index 2216201..34282da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ucentral-client", - "version": "2.3.16", + "version": "2.3.18", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "ucentral-client", - "version": "2.3.16", + "version": "2.3.18", "dependencies": { "@coreui/coreui": "^3.4.0", "@coreui/icons": "^2.0.1", @@ -32,7 +32,7 @@ "react-tooltip": "^4.2.21", "react-widgets": "^5.1.1", "sass": "^1.35.1", - "ucentral-libs": "^1.0.22", + "ucentral-libs": "^1.0.29", "uuid": "^8.3.2" }, "devDependencies": { @@ -14842,9 +14842,9 @@ } }, "node_modules/ucentral-libs": { - "version": "1.0.23", - "resolved": "https://registry.npmjs.org/ucentral-libs/-/ucentral-libs-1.0.23.tgz", - "integrity": "sha512-R9GUTPFtCqvQte2csyZ0DUs2DAQ0T05chmU/6sh8gw3QTlaYPondj1F+SgXOuQUHYysKXf/+gwwRC1cEsTVT+g==", + "version": "1.0.29", + "resolved": "https://registry.npmjs.org/ucentral-libs/-/ucentral-libs-1.0.29.tgz", + "integrity": "sha512-yeuzfdk15YqUW7/BdAdR8PxF0IIGxubTfkJQBloZqOFWIfBb/b//lDWjQUKj2DkgxxAW3rY3XbmzwCU9UJuMPg==", "dependencies": { "@coreui/coreui": "^3.4.0", "@coreui/icons": "^2.0.1", @@ -27716,9 +27716,9 @@ } }, "ucentral-libs": { - "version": "1.0.23", - "resolved": "https://registry.npmjs.org/ucentral-libs/-/ucentral-libs-1.0.23.tgz", - "integrity": "sha512-R9GUTPFtCqvQte2csyZ0DUs2DAQ0T05chmU/6sh8gw3QTlaYPondj1F+SgXOuQUHYysKXf/+gwwRC1cEsTVT+g==", + "version": "1.0.29", + "resolved": "https://registry.npmjs.org/ucentral-libs/-/ucentral-libs-1.0.29.tgz", + "integrity": "sha512-yeuzfdk15YqUW7/BdAdR8PxF0IIGxubTfkJQBloZqOFWIfBb/b//lDWjQUKj2DkgxxAW3rY3XbmzwCU9UJuMPg==", "requires": { "@coreui/coreui": "^3.4.0", "@coreui/icons": "^2.0.1", diff --git a/package.json b/package.json index 43f247e..31bc583 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ucentral-client", - "version": "2.3.16", + "version": "2.3.18", "dependencies": { "@coreui/coreui": "^3.4.0", "@coreui/icons": "^2.0.1", @@ -26,7 +26,7 @@ "react-tooltip": "^4.2.21", "react-widgets": "^5.1.1", "sass": "^1.35.1", - "ucentral-libs": "^1.0.22", + "ucentral-libs": "^1.0.29", "uuid": "^8.3.2" }, "main": "index.js", diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index ac11ed7..43b41bb 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -52,6 +52,7 @@ "commands_executed": "Ausgeführte Befehle", "compatible": "kompatibel", "completed": "Abgeschlossen", + "concurrent_devices": "Gleichzeitige Geräte", "config_id": "Konfigurations ID", "confirm": "Bestätigen", "confirm_stop_editing": "Möchten Sie die Bearbeitung wirklich beenden? Dadurch werden alle nicht gespeicherten Änderungen, die Sie vorgenommen haben, verworfen.", @@ -108,7 +109,9 @@ "hour": "stunde", "hours": "std", "id": "ID", + "invalid_credentials": "Ungültiger Benutzername und / oder Passwort", "invalid_file": "Die ausgewählte Datei war ungültig, bitte lesen Sie die Anweisungen und passen Sie Ihre Datei entsprechend an", + "invalid_password": "Dieses Passwort entspricht nicht den grundlegenden Passwortregeln. Bitte besuchen Sie unsere Seite Passwortrichtlinien, um mehr zu erfahren", "invalid_pem": "Ihre PEM-Datei ist ungültig. Es sollte mit '-----BEGIN CERTIFICATE-----' ODER '-----BEGIN PRIVATE KEY-----' beginnen und mit '-----END CERTIFICATE--- enden. --' ODER '-----END PRIVATSCHLÜSSEL-----'", "ip_address": "IP Adresse", "ips": "IPs", @@ -297,8 +300,12 @@ "healthchecks_title": "Healthchecks löschen" }, "device": { + "certificate_explanation": "Zertifikate der angeschlossenen Geräte", "error_fetching_device": "Fehler beim Abrufen der Geräteinformationen: {{error}}", - "error_fetching_devices": "Fehler beim Abrufen von Geräten: {{error}}" + "error_fetching_devices": "Fehler beim Abrufen von Geräten: {{error}}", + "health_explanation": "Zustand der angeschlossenen Geräte", + "memory_explanation": "Von angeschlossenen Geräten belegter Speicher", + "uptimes_explanation": "Zeit, zu der verbundene Geräte aktiv und verbunden waren" }, "device_logs": { "log": "Protokoll", @@ -324,6 +331,7 @@ "entity": "Entität", "error_fetch_entity": "Fehler beim Abrufen von Entitätsinformationen", "error_fetching": "Fehler beim Abrufen von Entitäten", + "error_fetching_map": "Fehler beim Abrufen der Karte: {{error}}", "error_saving": "Fehler beim Speichern der Entität", "higher_priority": "Stellen Sie eine höhere Priorität ein", "ip_detection": "IP-Erkennung", @@ -335,6 +343,7 @@ "only_unassigned": "Nur nicht zugewiesen", "select_entity": "Wählen Sie diese Entität aus", "selected_entity": "Ausgewählte Einheit", + "selected_map": "Ausgewählte Karte", "update_failure_error": "Fehler beim Versuch, die Entität zu aktualisieren: {{error}}", "valid_serial": "Muss eine gültige Seriennummer sein (12 HEX-Zeichen)", "venues": "Veranstaltungsorte" @@ -347,6 +356,7 @@ "warning": "Achtung: Nach dem Absenden kann dies nicht rückgängig gemacht werden" }, "firmware": { + "age_explanation": "Durchschnittliche Anzahl der Tage für alle Geräte, von denen wir diesen Wert erhalten können", "average_age": "Durchschnittliches Firmware-Alter", "choose_custom": "Wählen", "details_title": "Bild #{{image}} Details", @@ -359,6 +369,7 @@ "image": "Bild", "image_date": "Bilddatum", "installed_firmware": "Installierte Firmware", + "latest_explanation": "Geräte, auf denen erkannte Firmware in der neuesten Version ausgeführt wird", "latest_version_installed": "Neueste Version installiert Version", "newer_firmware_available": "Neuere Versionen verfügbar", "reinstall_latest": "Neu installieren", diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index a9acfc5..34df257 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -52,6 +52,7 @@ "commands_executed": "Commands Executed", "compatible": "Compatible", "completed": "Completed", + "concurrent_devices": "Concurrent Devices", "config_id": "Config. Id", "confirm": "Confirm", "confirm_stop_editing": "Are you sure you want to stop editing? This will cancel any unsaved changes you have made.", @@ -108,7 +109,9 @@ "hour": "hour", "hours": "hours", "id": "Id", + "invalid_credentials": "Invalid username and/or password", "invalid_file": "The chosen file was invalid, please read the instructions and adjust your file accordingly", + "invalid_password": "This password does not confirm to basic password rules. Please visit our Password Policy page to learn more", "invalid_pem": "Your .pem file is invalid. It should start with '-----BEGIN CERTIFICATE-----' OR '-----BEGIN PRIVATE KEY-----' and it should end with '-----END CERTIFICATE-----' OR '-----END PRIVATE KEY-----'", "ip_address": "IP Address", "ips": "IPs", @@ -297,8 +300,12 @@ "healthchecks_title": "Delete Healthchecks" }, "device": { + "certificate_explanation": "Certificates of connected devices", "error_fetching_device": "Error fetching device information: {{error}}", - "error_fetching_devices": "Error while fetching devices: {{error}}" + "error_fetching_devices": "Error while fetching devices: {{error}}", + "health_explanation": "Health of connected devices", + "memory_explanation": "Memory used by connected devices", + "uptimes_explanation": "Time connected devices have been up and connected" }, "device_logs": { "log": "Log", @@ -324,6 +331,7 @@ "entity": "Entity", "error_fetch_entity": "Error while fetching entity information", "error_fetching": "Error while fetching entities", + "error_fetching_map": "Error fetching map: {{error}}", "error_saving": "Error while saving entity", "higher_priority": "Make Higher Priority", "ip_detection": "IP Detection", @@ -335,6 +343,7 @@ "only_unassigned": "Only Unassigned", "select_entity": "Select this Entity", "selected_entity": "Selected Entity", + "selected_map": "Selected Map", "update_failure_error": "Error while trying to update entity: {{error}}", "valid_serial": "Needs to be a valid serial number (12 HEX characters)", "venues": "Venues" @@ -347,6 +356,7 @@ "warning": "Warning: Once you submit this cannot be reverted" }, "firmware": { + "age_explanation": "Average number of days for all devices from which we can obtain that value", "average_age": "Average Firmware Age", "choose_custom": "Choose", "details_title": "Image #{{image}} Details", @@ -359,6 +369,7 @@ "image": "Image", "image_date": "Image Date", "installed_firmware": "Installed Firmware", + "latest_explanation": "Devices running recognized firmware at its latest version", "latest_version_installed": "Latest Version Installed", "newer_firmware_available": "Newer Revisions Available", "reinstall_latest": "Reinstall ", diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index 12c2835..35a59e6 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -52,6 +52,7 @@ "commands_executed": "Comandos ejecutados", "compatible": "Compatible", "completed": "terminado", + "concurrent_devices": "Dispositivos concurrentes", "config_id": "Config. Identificación", "confirm": "Confirmar", "confirm_stop_editing": "¿Estás seguro de que quieres dejar de editar? Esto cancelará cualquier cambio no guardado que haya realizado.", @@ -108,7 +109,9 @@ "hour": "hora", "hours": "horas", "id": "Carné de identidad", + "invalid_credentials": "Nombre de usuario y / o contraseña inválido", "invalid_file": "El archivo elegido no es válido, lea las instrucciones y ajuste su archivo en consecuencia", + "invalid_password": "Esta contraseña no confirma las reglas básicas de contraseña. Visite nuestra página de Política de contraseñas para obtener más información.", "invalid_pem": "Su archivo .pem no es válido. Debe comenzar con '----- BEGIN CERTIFICATE -----' O '----- BEGIN PRIVATE KEY -----' y debe terminar con '----- END CERTIFICATE --- - 'O' ----- FIN DE CLAVE PRIVADA ----- '", "ip_address": "Dirección IP", "ips": "IPs", @@ -297,8 +300,12 @@ "healthchecks_title": "Eliminar comprobaciones de estado" }, "device": { + "certificate_explanation": "Certificados de dispositivos conectados", "error_fetching_device": "Error al obtener la información del dispositivo: {{error}}", - "error_fetching_devices": "Error al recuperar dispositivos: {{error}}" + "error_fetching_devices": "Error al recuperar dispositivos: {{error}}", + "health_explanation": "Salud de los dispositivos conectados", + "memory_explanation": "Memoria utilizada por dispositivos conectados", + "uptimes_explanation": "Tiempo que los dispositivos conectados han estado en funcionamiento y conectados" }, "device_logs": { "log": "Iniciar sesión", @@ -324,6 +331,7 @@ "entity": "Entidad", "error_fetch_entity": "Error al obtener la información de la entidad", "error_fetching": "Error al recuperar entidades", + "error_fetching_map": "Error al obtener el mapa: {{error}}", "error_saving": "Error al guardar la entidad", "higher_priority": "Dar mayor prioridad", "ip_detection": "Detección de IP", @@ -335,6 +343,7 @@ "only_unassigned": "Solo sin asignar", "select_entity": "Seleccione esta entidad", "selected_entity": "Entidad seleccionada", + "selected_map": "Mapa seleccionado", "update_failure_error": "Error al intentar actualizar la entidad: {{error}}", "valid_serial": "Debe ser un número de serie válido (12 caracteres HEX)", "venues": "Sedes" @@ -347,6 +356,7 @@ "warning": "Advertencia: una vez que envíe, esto no se podrá revertir" }, "firmware": { + "age_explanation": "Número medio de días para todos los dispositivos de los que podemos obtener ese valor", "average_age": "Edad promedio del firmware", "choose_custom": "Escoger", "details_title": "Detalles de la imagen n. °{{image}} ", @@ -359,6 +369,7 @@ "image": "Imagen", "image_date": "Fecha de la imagen", "installed_firmware": "Firmware instalado", + "latest_explanation": "Dispositivos que ejecutan firmware reconocido en su última versión", "latest_version_installed": "Última versión instalada", "newer_firmware_available": "Nuevas revisiones disponibles", "reinstall_latest": "Reinstalar", diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index cca7610..9d818cc 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -52,6 +52,7 @@ "commands_executed": "commandes exécutées", "compatible": "Compatible", "completed": "Terminé", + "concurrent_devices": "Périphériques simultanés", "config_id": "Config. Identifiant", "confirm": "Confirmer", "confirm_stop_editing": "Voulez-vous vraiment arrêter la modification ? Cela annulera toutes les modifications non enregistrées que vous avez apportées.", @@ -108,7 +109,9 @@ "hour": "heure", "hours": "heures", "id": "Id", + "invalid_credentials": "Nom d'utilisateur et / ou mot de passe incorrect", "invalid_file": "Le fichier choisi n'était pas valide, veuillez lire les instructions et ajuster votre fichier en conséquence", + "invalid_password": "Ce mot de passe ne confirme pas les règles de base des mots de passe. Veuillez visiter notre page Politique de mot de passe pour en savoir plus", "invalid_pem": "Votre fichier .pem n'est pas valide. Il doit commencer par '-----BEGIN CERTIFICATE-----' OU '-----BEGIN PRIVATE KEY-----' et il doit se terminer par '-----END CERTIFICATE--- --' OU '-----FIN CLÉ PRIVÉE-----'", "ip_address": "Adresse IP", "ips": "IPS", @@ -297,8 +300,12 @@ "healthchecks_title": "Supprimer les vérifications d'état" }, "device": { + "certificate_explanation": "Certificats des appareils connectés", "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}}" + "error_fetching_devices": "Erreur lors de la récupération des appareils : {{error}}", + "health_explanation": "Santé des appareils connectés", + "memory_explanation": "Mémoire utilisée par les appareils connectés", + "uptimes_explanation": "Heure à laquelle les appareils connectés ont été activés et connectés" }, "device_logs": { "log": "Bûche", @@ -324,6 +331,7 @@ "entity": "Entité", "error_fetch_entity": "Erreur lors de la récupération des informations sur l'entité", "error_fetching": "Erreur lors de la récupération des entités", + "error_fetching_map": "Erreur lors de la récupération de la carte : {{error}}", "error_saving": "Erreur lors de l'enregistrement de l'entité", "higher_priority": "Faire une priorité plus élevée", "ip_detection": "Détection IP", @@ -335,6 +343,7 @@ "only_unassigned": "Uniquement non attribué", "select_entity": "Sélectionnez cette entité", "selected_entity": "Entité sélectionnée", + "selected_map": "Carte sélectionnée", "update_failure_error": "Erreur lors de la tentative de mise à jour de l'entité : {{error}}", "valid_serial": "Doit être un numéro de série valide (12 caractères HEX)", "venues": "Les lieux" @@ -347,6 +356,7 @@ "warning": "Avertissement : Une fois que vous avez soumis, cela ne peut pas être annulé" }, "firmware": { + "age_explanation": "Nombre moyen de jours pour tous les appareils à partir desquels nous pouvons obtenir cette valeur", "average_age": "Âge moyen du micrologiciel", "choose_custom": "Choisir", "details_title": "Image #{{image}} Détails", @@ -359,6 +369,7 @@ "image": "Image", "image_date": "Date de l'image", "installed_firmware": "Micrologiciel installé", + "latest_explanation": "Appareils exécutant un firmware reconnu dans sa dernière version", "latest_version_installed": "Dernière version installée", "newer_firmware_available": "Révisions plus récentes disponibles", "reinstall_latest": "Réinstaller", diff --git a/public/locales/pt/translation.json b/public/locales/pt/translation.json index 3a0c6d7..689ebc6 100644 --- a/public/locales/pt/translation.json +++ b/public/locales/pt/translation.json @@ -52,6 +52,7 @@ "commands_executed": "Comandos Executados", "compatible": "Compatível", "completed": "Concluído", + "concurrent_devices": "Dispositivos Simultâneos", "config_id": "Config. Identidade", "confirm": "confirme", "confirm_stop_editing": "Tem certeza que deseja parar de editar? Isso cancelará todas as alterações não salvas que você fez.", @@ -108,7 +109,9 @@ "hour": "hora", "hours": "horas", "id": "identidade", + "invalid_credentials": "Nome de usuário e / ou senha inválidos", "invalid_file": "O arquivo escolhido era inválido, por favor, leia as instruções e ajuste seu arquivo de acordo", + "invalid_password": "Esta senha não está de acordo com as regras básicas de senha. Visite nossa página de Política de Senha para saber mais", "invalid_pem": "Seu arquivo .pem é inválido. Deve começar com '----- BEGIN CERTIFICATE -----' OU '----- BEGIN PRIVATE KEY -----' e deve terminar com '----- END CERTIFICATE --- - 'OU' ----- END PRIVATE KEY ----- '", "ip_address": "Endereço de IP", "ips": "IPs", @@ -297,8 +300,12 @@ "healthchecks_title": "Excluir verificações de saúde" }, "device": { + "certificate_explanation": "Certificados de dispositivos conectados", "error_fetching_device": "Erro ao buscar informações do dispositivo: {{error}}", - "error_fetching_devices": "Erro ao buscar dispositivos: {{error}}" + "error_fetching_devices": "Erro ao buscar dispositivos: {{error}}", + "health_explanation": "Saúde de dispositivos conectados", + "memory_explanation": "Memória usada por dispositivos conectados", + "uptimes_explanation": "Há tempo em que os dispositivos conectados estão ativados e conectados" }, "device_logs": { "log": "Registro", @@ -324,6 +331,7 @@ "entity": "Entidade", "error_fetch_entity": "Erro ao buscar informações da entidade", "error_fetching": "Erro ao buscar entidades", + "error_fetching_map": "Erro ao buscar mapa: {{error}}", "error_saving": "Erro ao salvar entidade", "higher_priority": "Dê maior prioridade", "ip_detection": "Detecção de IP", @@ -335,6 +343,7 @@ "only_unassigned": "Apenas não atribuídos", "select_entity": "Selecione esta Entidade", "selected_entity": "Entidade Selecionada", + "selected_map": "Mapa Selecionado", "update_failure_error": "Erro ao tentar atualizar a entidade: {{error}}", "valid_serial": "Precisa ser um número de série válido (12 caracteres HEX)", "venues": "Locais" @@ -347,6 +356,7 @@ "warning": "Aviso: depois de enviar, isso não pode ser revertido" }, "firmware": { + "age_explanation": "Número médio de dias para todos os dispositivos dos quais podemos obter esse valor", "average_age": "Idade Média do Firmware", "choose_custom": "Escolher", "details_title": "Detalhes da imagem #{{image}} ", @@ -359,6 +369,7 @@ "image": "Imagem", "image_date": "Data da Imagem", "installed_firmware": "Firmware Instalado", + "latest_explanation": "Dispositivos executando firmware reconhecido em sua versão mais recente", "latest_version_installed": "Última versão instalada", "newer_firmware_available": "Novas revisões disponíveis", "reinstall_latest": "Reinstalar", diff --git a/src/components/EditUserModal/index.js b/src/components/EditUserModal/index.js index 531816e..2a1d8a9 100644 --- a/src/components/EditUserModal/index.js +++ b/src/components/EditUserModal/index.js @@ -13,7 +13,7 @@ const initialState = { changePassword: { value: false, error: false, - editable: false, + editable: true, }, currentPassword: { value: '', @@ -134,13 +134,14 @@ const EditUserModal = ({ show, toggle, userId, getUsers }) => { } const newNotes = []; + for (let i = 0; i < user.notes.value.length; i += 1) { if (user.notes.value[i].new) newNotes.push({ note: user.notes.value[i].note }); } parameters.notes = newNotes; - if (newData) { + if (newData || newNotes.length > 0) { const options = { headers: { Accept: 'application/json', @@ -207,6 +208,7 @@ const EditUserModal = ({ show, toggle, userId, getUsers }) => { useEffect(() => { if (show) { + getUser(); setEditing(false); } }, [show]); diff --git a/src/components/FirmwareDashboard/index.js b/src/components/FirmwareDashboard/index.js index 59250e6..d48e32c 100644 --- a/src/components/FirmwareDashboard/index.js +++ b/src/components/FirmwareDashboard/index.js @@ -151,13 +151,17 @@ const FirmwareDashboard = () => { : 0; const devicesForAverage = parsedData.numberOfDevices - usingUnknownFirmwareFromArray; - if (parsedData.totalSecondsOld.length > 0) { - parsedData.averageFirmwareAge = + if (devicesForAverage !== 0 && parsedData.totalSecondsOld.length > 0) { + parsedData.averageFirmwareAge = Math.round( parsedData.totalSecondsOld[0].value / - (devicesForAverage > 0 ? devicesForAverage : 1) / - (24 * 60 * 60); + (devicesForAverage > 0 ? devicesForAverage : 1) / + (24 * 60 * 60), + ); + parsedData.averageFirmwareAge = `${parsedData.averageFirmwareAge} ${ + Math.round(parsedData.averageFirmwareAge) > 0 ? t('common.days') : t('common.day') + }`; } else { - parsedData.averageFirmwareAge = 0; + parsedData.averageFirmwareAge = '-'; } // Latest firmware distribution diff --git a/src/pages/LoginPage/index.js b/src/pages/LoginPage/index.js index c9195d4..cd2b4a1 100644 --- a/src/pages/LoginPage/index.js +++ b/src/pages/LoginPage/index.js @@ -256,27 +256,47 @@ const Login = () => { } }) .catch((error) => { - if (formType !== 'change-password') { - if ( - error.response.status === 403 && - error.response?.data?.ErrorDescription === 'Password change expected.' - ) { - setFormType('change-password'); + if (formType === 'change-password') { + if (error.response?.data?.ErrorCode === 3) { + setChangeResponse({ + text: t('login.previously_used'), + error: true, + tried: true, + }); + } else if (error.response?.data?.ErrorCode === 5) { + setChangeResponse({ + text: t('common.invalid_password'), + error: true, + tried: true, + }); + } else { + setChangeResponse({ + text: t('login.change_password_error'), + error: true, + tried: true, + }); } + } else if (error.response.status === 403) { + if (error.response?.data?.ErrorCode === 1) setFormType('change-password'); + else if (error.response?.data?.ErrorCode === 2) { + setLoginResponse({ + text: t('common.invalid_credentials'), + error: true, + tried: true, + }); + } else { + setLoginResponse({ + text: t('login.login_error'), + error: true, + tried: true, + }); + } + } else { setLoginResponse({ text: t('login.login_error'), error: true, tried: true, }); - } else { - setChangeResponse({ - text: - fields.newpassword.value === fields.password.value - ? t('login.previously_used') - : t('login.change_password_error'), - error: true, - tried: true, - }); } }) .finally(() => {