Compare commits

...

37 Commits

Author SHA1 Message Date
Leonid Mirsky
c4cfc76b2d Update Helm values to v2.4.0-RC1
Signed-off-by: Leonid Mirsky <leonid@opsfleet.com>
2021-11-16 23:33:08 +02:00
Charles
e02f939cb8 Merge pull request #66 from stephb9959/main
Version 2.4.1
2021-11-15 17:27:26 -05:00
Charles
2deebea6c8 Merge branch 'main' of https://github.com/stephb9959/wlan-cloud-ucentralgw-ui into main 2021-11-15 17:22:42 -05:00
Charles
fc2b1bb23c Merge branch 'dev' into main 2021-11-15 17:21:17 -05:00
Charles
848d94bad1 Version 2.4.1 2021-11-15 17:20:32 -05:00
Charles
4bde6e2d1f Merge pull request #65 from stephb9959/main
Version 2.4.0
2021-11-15 16:58:40 -05:00
Charles
e7694b644f Merge pull request #99 from stephb9959/dev
Version 2.4.0
2021-11-15 16:58:18 -05:00
Charles
07b3ac967a Version 2.4.0 2021-11-15 16:49:41 -05:00
Charles
c955bd9126 Version 2.3.21 2021-11-15 10:45:12 -05:00
Charles
ee69783a66 Merge pull request #64 from stephb9959/main
Version 2.3.20
2021-11-13 07:43:45 -05:00
Charles
b43c86520f Merge branch 'main' of https://github.com/stephb9959/wlan-cloud-ucentralgw-ui into main 2021-11-13 07:31:29 -05:00
Charles
0952f62bf0 Merge branch 'dev' into main 2021-11-13 07:31:16 -05:00
Charles
44be7ec634 Closing edit user modal when 404 2021-11-13 07:30:30 -05:00
Charles
cddb0e94fa Merge pull request #63 from stephb9959/main
Version 2.3.18
2021-11-12 16:41:07 -05:00
Charles
1a9fb77361 Merge pull request #92 from stephb9959/dev
Login page changes, ucentral-libs upgrade
2021-11-12 13:52:06 -05:00
Charles
f7392461ad Login page changes, ucentral-libs upgrade 2021-11-12 12:01:42 -05:00
Charles
b567dc26f8 Merge pull request #90 from stephb9959/dev
Dashboard bugfixes, user modal fixes
2021-11-11 16:03:35 -05:00
Charles
a08f84f5b3 Dashboard bugfixes, user modal fixes 2021-11-11 15:58:59 -05:00
Charles
b1277ff2ac Merge pull request #62 from stephb9959/main
Version 2.3.16
2021-11-09 11:42:40 -05:00
Charles
aea1550a77 Merge pull request #83 from stephb9959/dev
Version 2.3.16
2021-11-09 11:34:29 -05:00
Max
262c1fe1e2 allow to set pod annotations (#61) 2021-11-09 13:29:16 +01:00
Charles
2d1e684c69 UI fixes 2021-11-08 14:25:25 -05:00
Charles
5c6fb8b9ec Merge pull request #81 from stephb9959/dev
Version 2.3.15
2021-11-08 11:55:19 -05:00
Charles
a6be8b08c3 Version 2.3.15 2021-11-08 11:44:23 -05:00
Charles
6503c1b84d Merge pull request #79 from stephb9959/dev
Version 2.3.14
2021-11-04 17:35:51 -04:00
Charles
1fc1588303 Version 2.3.14 2021-11-04 17:29:24 -04:00
Charles
ae03c5c33e Version 2.3.13 2021-11-04 17:21:04 -04:00
Charles
2d2603ff27 Merge pull request #60 from stephb9959/main
Version 2.3.12
2021-11-02 16:42:57 -04:00
Charles
55881b0c5e Merge pull request #73 from stephb9959/dev
Version 2.3.12
2021-11-02 16:42:32 -04:00
Charles
adf752db85 UI fixes 2021-11-02 11:47:45 -04:00
Charles
d211669244 Branding fix 2021-11-01 17:43:26 -04:00
Charles
99af39db69 Livinglab branding 2021-11-01 17:42:48 -04:00
Charles
e707239d12 Label 2021-11-01 17:38:24 -04:00
Charles
d349e43523 Merge pull request #59 from stephb9959/main
Version 2.3.11
2021-11-01 17:29:31 -04:00
Charles
d52df89ab3 Merge pull request #68 from stephb9959/dev
2.3.11
2021-11-01 17:29:01 -04:00
Charles
ae48518271 UI/Bugfixes, storage for device table 2021-11-01 15:31:24 -04:00
Charles
d7238881dc New labels 2021-10-29 08:31:22 -04:00
26 changed files with 762 additions and 146 deletions

View File

@@ -26,6 +26,12 @@ spec:
{{- with .Values.services.owgwui.labels }}
{{- toYaml . | nindent 8 }}
{{- end }}
{{- if .Values.podAnnotations }}
annotations:
{{- with .Values.podAnnotations }}
{{- toYaml . | nindent 8 }}
{{- end }}
{{- end }}
spec:
containers:

View File

@@ -7,7 +7,7 @@ fullnameOverride: ""
images:
owgwui:
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owgw-ui
tag: main
tag: v2.4.0-RC1
pullPolicy: Always
services:
@@ -69,6 +69,8 @@ tolerations: []
affinity: {}
podAnnotations: {}
# Application
public_env_variables:
DEFAULT_UCENTRALSEC_URL: https://ucentral.dpaas.arilia.com:16001

18
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "ucentral-client",
"version": "2.3.9",
"version": "2.4.1",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "ucentral-client",
"version": "2.3.9",
"version": "2.4.1",
"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": "^0.9.98",
"ucentral-libs": "^1.0.31",
"uuid": "^8.3.2"
},
"devDependencies": {
@@ -14842,9 +14842,9 @@
}
},
"node_modules/ucentral-libs": {
"version": "0.9.98",
"resolved": "https://registry.npmjs.org/ucentral-libs/-/ucentral-libs-0.9.98.tgz",
"integrity": "sha512-Fwn0sqFS2u5bIN5gtbslgAZnki2J4iz6ucGVJmKdvghm+E45+KYFC2yGWGNlBfBkKIsSDlSIIhQHFEo0JTTCZg==",
"version": "1.0.31",
"resolved": "https://registry.npmjs.org/ucentral-libs/-/ucentral-libs-1.0.31.tgz",
"integrity": "sha512-lTMPHkzXpWJrPJPUG1L9KsNPMiJGgZLJmblhh22OFQBSbjnrT28ub0Xt8LjAdRaSEAId+MfnGwA6coGMvpg6pA==",
"dependencies": {
"@coreui/coreui": "^3.4.0",
"@coreui/icons": "^2.0.1",
@@ -27716,9 +27716,9 @@
}
},
"ucentral-libs": {
"version": "0.9.98",
"resolved": "https://registry.npmjs.org/ucentral-libs/-/ucentral-libs-0.9.98.tgz",
"integrity": "sha512-Fwn0sqFS2u5bIN5gtbslgAZnki2J4iz6ucGVJmKdvghm+E45+KYFC2yGWGNlBfBkKIsSDlSIIhQHFEo0JTTCZg==",
"version": "1.0.31",
"resolved": "https://registry.npmjs.org/ucentral-libs/-/ucentral-libs-1.0.31.tgz",
"integrity": "sha512-lTMPHkzXpWJrPJPUG1L9KsNPMiJGgZLJmblhh22OFQBSbjnrT28ub0Xt8LjAdRaSEAId+MfnGwA6coGMvpg6pA==",
"requires": {
"@coreui/coreui": "^3.4.0",
"@coreui/icons": "^2.0.1",

View File

@@ -1,6 +1,6 @@
{
"name": "ucentral-client",
"version": "2.3.9",
"version": "2.4.1",
"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": "^0.9.98",
"ucentral-libs": "^1.0.31",
"uuid": "^8.3.2"
},
"main": "index.js",

View File

@@ -52,8 +52,10 @@
"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.",
"connected": "Verbindung wurde hergestellt",
"copied": "kopiert!",
"copy_to_clipboard": "In die Zwischenablage kopieren",
@@ -71,7 +73,7 @@
"details": "Einzelheiten",
"device": "Gerät #{{serialNumber}}",
"device_dashboard": "Geräte-Dashboard",
"device_delete": "Gerät Nr.{{serialNumber}}löschen",
"device_delete": "#{{serialNumber}}löschen",
"device_deleted": "Gerät erfolgreich gelöscht",
"device_health": "Gerätezustand",
"device_list": "Liste der Geräte",
@@ -102,17 +104,21 @@
"forgot_password_title": "Passwort vergessen",
"from": "Von",
"general_error": "API-Fehler, wenden Sie sich bitte an Ihren Administrator",
"go_back": "Geh zurück",
"hide": "verbergen",
"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",
"item": "Artikel",
"items": "Artikel",
"items_per_page": "Objekte pro Seite:",
"key": "Schlüssel",
"last_dashboard_refresh": "Letzte Dashboard-Aktualisierung",
"later_tonight": "Später am Abend",
"latest": "Neueste",
@@ -121,8 +127,10 @@
"loading_more_ellipsis": "Mehr laden ...",
"logout": "Ausloggen",
"mac": "MAC-Adresse",
"main": "Main",
"manufacturer": "Hersteller",
"memory_used": "Verwendeter Speicher",
"min_max": "Min: {{min}}, Max: {{max}}",
"minute": "Minute",
"minutes": "protokoll",
"modified": "Geändert",
@@ -155,7 +163,9 @@
"second": "zweite",
"seconds": "sekunden",
"seconds_elapsed": "Sekunden verstrichen",
"see_details": "Siehe Einzelheiten",
"select": "wählen",
"serial_num": "Seriennummer",
"serial_number": "Seriennummer",
"show_all": "Zeige alles",
"socket_connection_closed": "Verbindung geschlossen!",
@@ -205,6 +215,7 @@
"device_password": "Passwort",
"device_type": "Gerätetyp",
"device_types": "Gerätetypen",
"devices_affected": "Von dieser Konfiguration betroffene Geräte:",
"edit_configuration": "Konfiguration bearbeiten",
"error_delete": "Fehler beim Versuch zu löschen: {{error}}",
"error_fetching_config": "Fehler beim Abrufen der Konfiguration",
@@ -232,6 +243,7 @@
"used_by": "Benutzt von",
"used_by_details": "{{entities}} Entitäten, {{venues}} Veranstaltungsorte und {{devices}} Geräte",
"uuid": "Konfigurations-ID",
"view_affected_devices": "Betroffene Geräte anzeigen",
"view_config": "Konfiguration anzeigen",
"view_in_use": "In Verwendung anzeigen",
"view_json": "Rohe Konfiguration anzeigen"
@@ -250,6 +262,7 @@
"access_pin": "Zugangs-PIN",
"add_contact": "Kontakt hinzufügen",
"create_contact": "Kontakt erstellen",
"currently_selected_contact": "Aktuell ausgewählter Kontakt: {{contact}}",
"delete": "Kontakt löschen?",
"error_assign": "Fehler beim Versuch, Kontakt zuzuweisen: {{error}}",
"error_creation": "Fehler beim Versuch, einen Kontakt zu erstellen: {{error}}",
@@ -287,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",
@@ -309,10 +326,12 @@
"delete_warning": "Achtung: Dieser Vorgang kann nicht rückgängig gemacht werden",
"edit_failure": "Aktualisierung fehlgeschlagen : {{error}}",
"enter_here": "Geben Sie hier die IP(s) ein, die Sie hinzufügen möchten",
"entire_tree": "Seitenverzeichnis",
"entities": "Entitäten",
"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",
@@ -324,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"
@@ -336,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",
@@ -348,9 +369,11 @@
"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",
"release": "Veröffentlichung",
"revision": "Revision",
"show_dev": "Dev-Releases anzeigen",
"size": "Größe",
@@ -457,7 +480,8 @@
"unassigned_deleted_devices": "{{number}} Geräte gelöscht und nicht zugewiesen",
"unassigned_tags": "Nicht zugewiesene Tags",
"validating_import_file": "Importdatei und -daten werden validiert...",
"venue": "Tagungsort"
"venue": "Tagungsort",
"view_in_gateway": "Im Gateway anzeigen"
},
"location": {
"add": "Ort hinzufügen",
@@ -465,13 +489,16 @@
"city": "Stadt",
"country": "Land",
"create": "Standort erstellen",
"currently_selected": "Aktuell ausgewählter Standort: {{location}}",
"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",
"mobiles": "MOBILES",
"no_associated": "Kein zugeordneter Standort",
"phones": "Telefone",
"postal": "Postleitzahl",
"search": "Suchen Sie nach Standorten, um die Felder unten automatisch auszufüllen",
"state": "Zustand",
@@ -533,6 +560,59 @@
"settings": {
"title": "die Einstellungen"
},
"simulation": {
"add": "Simulation hinzufügen",
"cancel": "Stornieren",
"cancel_success": "Simulationslauf erfolgreich abgebrochen!",
"check_ongoing_sims": "Folge laufender Sim",
"client_interval": "Kundenintervall",
"delete_simulation": "Sim löschen. {{name}}",
"end": "Endete",
"error_creating": "Fehler beim Erstellen der Simulation: {{error}}",
"error_delete": "Fehler beim Löschen der Simulation: {{error}}",
"error_devices": "Fehler Geräte",
"error_edit": "Fehler beim Versuch, die Simulation zu speichern: {{error}}",
"error_edit_run": "Fehler beim Versuch, den Ausführungsstatus zu ändern: {{error}}",
"error_fetching_simulations": "Fehler beim Abrufen der Simulationen: {{error}}",
"error_start_run": "Fehler beim Versuch, einen Simulationslauf zu starten: {{error}}",
"gateway": "Tor",
"healtcheck_interval": "Healthcheck-Intervall",
"keep_alive": "Bleib am Leben",
"last_refresh": "Letzte Aktualisierung",
"length": "Länge",
"live_devices": "Live-Geräte",
"mac_prefix": "MAC-Präfix",
"max_associations": "max. Verbände",
"max_clients": "Max. Kunden",
"messages_transmitted": "Gesendete Nachrichten",
"min_associations": "Mindest. Verbände",
"min_clients": "Mindest. Kunden",
"pause": "Pause",
"pause_success": "Lauf pausiert!",
"prefix_length": "Erforderlich, muss eine Länge von 6 Zeichen haben",
"previous_runs": "Vorherige Läufe",
"received": "empfangen",
"received_messages": "Erhaltene Nachrichten",
"reconnect_interval": "Wiederverbindungsintervall",
"resume": "Fortsetzen",
"resume_success": "Lauf wieder aufgenommen!",
"run": "Simulationslauf",
"run_simulation": "Simulation ausführen",
"started": "gestartet",
"state_interval": "Zustandsintervall",
"stop": "Halt",
"stop_success": "Lauf gestoppt!",
"success_creating": "Simulation erfolgreich erstellt!",
"success_run_start": "Erfolgreich gestarteter Lauf!",
"successful_delete": "Simulation erfolgreich gelöscht!",
"successful_edit": "Erfolgreich bearbeitete Simulation!",
"threads": "Themen",
"time_full_devices": "Zeit für volle Geräte",
"title": "Simulationen",
"transmitted": "Übertragen",
"valid_cert": "Gültiges Zertifikat",
"valid_key": "Gültiger Schlüssel"
},
"statistics": {
"data": "Daten (KB)",
"latest_statistics": "Neueste Statistiken",
@@ -606,7 +686,7 @@
"check_phone": "Bitte überprüfen Sie Ihr Telefon auf Ihren Validierungscode",
"confirm_new_password": "Bestätige neues Passwort",
"create": "Benutzer erstellen",
"create_failure": "Fehler beim Erstellen des Benutzers. Bitte stellen Sie sicher, dass diese E-Mail-Adresse nicht bereits mit einem Konto verknüpft ist.",
"create_failure": "Fehler beim Erstellen des Benutzers: {{error}}",
"create_success": "Benutzer erfolgreich erstellt",
"creating": "Benutzer erstellen ...",
"delete_avatar": "Avatar löschen",
@@ -620,6 +700,7 @@
"email_address": "E-Mail-Addresse",
"enter_new_phone": "Geben Sie Ihre neue Telefonnummer ein:",
"error_fetching_users": "Fehler beim Abrufen der Nutzer: {{error}}",
"error_retrieving": "Fehler beim Abrufen des Benutzers",
"error_sending_code": "Fehler beim Versuch, den Validierungscode zu senden. Bitte bestätigen Sie, dass Ihre Telefonnummer gültig ist.",
"force_password_change": "Passwortänderung bei der Anmeldung erzwingen",
"id": "Benutzeridentifikation.",

View File

@@ -52,8 +52,10 @@
"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.",
"connected": "Connected",
"copied": "Copied!",
"copy_to_clipboard": "Copy to clipboard",
@@ -71,7 +73,7 @@
"details": "Details",
"device": "Device #{{serialNumber}}",
"device_dashboard": "Device Dashboard",
"device_delete": "Delete Device #{{serialNumber}}",
"device_delete": "Delete #{{serialNumber}}",
"device_deleted": "Device Successfully Deleted",
"device_health": "Device Health",
"device_list": "List of Devices",
@@ -102,17 +104,21 @@
"forgot_password_title": "Forgot Password",
"from": "From",
"general_error": "API Error, please consult your administrator",
"go_back": "Go Back",
"hide": "Hide",
"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",
"item": "Item",
"items": "Items",
"items_per_page": "Items per page: ",
"key": "Key",
"last_dashboard_refresh": "Last Dashboard Refresh",
"later_tonight": "Later tonight",
"latest": "Latest",
@@ -121,8 +127,10 @@
"loading_more_ellipsis": "Loading more...",
"logout": "Logout",
"mac": "MAC Address",
"main": "Main",
"manufacturer": "Manufacturer",
"memory_used": "Memory Used",
"min_max": "Min: {{min}}, Max: {{max}}",
"minute": "minute",
"minutes": "minutes",
"modified": "Modified",
@@ -155,7 +163,9 @@
"second": "second",
"seconds": "seconds",
"seconds_elapsed": "Seconds elapsed",
"see_details": "See Details",
"select": "Select",
"serial_num": "Serial #",
"serial_number": "Serial Number",
"show_all": "Show All",
"socket_connection_closed": "Connection closed!",
@@ -205,6 +215,7 @@
"device_password": "Password",
"device_type": "Device Type",
"device_types": "Device Types",
"devices_affected": "Devices affected by this configuration: ",
"edit_configuration": "Edit Configuration",
"error_delete": "Error while trying to delete: {{error}}",
"error_fetching_config": "Error while fetching configuration",
@@ -232,6 +243,7 @@
"used_by": "Used By",
"used_by_details": "{{entities}} Entities, {{venues}} Venues and {{devices}} Devices",
"uuid": "Config ID",
"view_affected_devices": "View Affected Devices",
"view_config": "View Configuration",
"view_in_use": "View In Use",
"view_json": "View raw JSON"
@@ -250,6 +262,7 @@
"access_pin": "Access PIN",
"add_contact": "Add Contact",
"create_contact": "Create Contact",
"currently_selected_contact": "Currently Selected Contact: {{contact}}",
"delete": "Delete Contact?",
"error_assign": "Error while trying to assign contact: {{error}}",
"error_creation": "Error while trying to create contact: {{error}}",
@@ -287,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",
@@ -309,10 +326,12 @@
"delete_warning": "Warning: this operation cannot be reverted",
"edit_failure": "Update unsuccessful : {{error}}",
"enter_here": "Enter the IP(s) you'd like to add here",
"entire_tree": "Site Map",
"entities": "Entities",
"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",
@@ -324,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"
@@ -336,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",
@@ -348,9 +369,11 @@
"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 ",
"release": "Release",
"revision": "Revision",
"show_dev": "Show Dev Releases",
"size": "Size",
@@ -457,7 +480,8 @@
"unassigned_deleted_devices": "{{number}} Devices Deleted and Unassigned",
"unassigned_tags": "Unassigned tags",
"validating_import_file": "Validating import file and data...",
"venue": "Venue"
"venue": "Venue",
"view_in_gateway": "Details in Gateway"
},
"location": {
"add": "Add Location",
@@ -465,13 +489,16 @@
"city": "City",
"country": "Country",
"create": "Create Location",
"currently_selected": "Currently Selected Location: {{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",
"mobiles": "Mobiles",
"no_associated": "No Associated Location",
"phones": "Phones",
"postal": "ZIP/Postal Code",
"search": "Search locations to auto fill the fields below",
"state": "State",
@@ -533,6 +560,59 @@
"settings": {
"title": "Settings"
},
"simulation": {
"add": "Add Simulation",
"cancel": "Cancel",
"cancel_success": "Simulation Run Successfully Cancelled!",
"check_ongoing_sims": "Follow Ongoing Sim",
"client_interval": "Client Interval",
"delete_simulation": "Delete Sim. {{name}}",
"end": "Ended",
"error_creating": "Error creating simulation: {{error}}",
"error_delete": "Error while deleting simulation: {{error}}",
"error_devices": "Error Devices",
"error_edit": "Error while trying to save simulation: {{error}}",
"error_edit_run": "Error while trying to change run state: {{error}}",
"error_fetching_simulations": "Error fetching simulations: {{error}}",
"error_start_run": "Error while trying to start a simulation run: {{error}}",
"gateway": "Gateway",
"healtcheck_interval": "Healthcheck Interval",
"keep_alive": "Keep Alive",
"last_refresh": "Last Refresh",
"length": "Length",
"live_devices": "Live Devices",
"mac_prefix": "MAC Prefix",
"max_associations": "Max. Associations",
"max_clients": "Max. Clients",
"messages_transmitted": "Messages Transmitted",
"min_associations": "Min. Associations",
"min_clients": "Min. Clients",
"pause": "Pause",
"pause_success": "Run Paused!",
"prefix_length": "Required, needs to be of a length of 6 characters",
"previous_runs": "Previous Runs",
"received": "Received",
"received_messages": "Messages Received",
"reconnect_interval": "Reconnect Interval",
"resume": "Resume",
"resume_success": "Run Resumed!",
"run": "Simulation Run",
"run_simulation": "Run Simulation",
"started": "Started",
"state_interval": "State Interval",
"stop": "Stop",
"stop_success": "Run Stopped!",
"success_creating": "Simulation Successfully Created!",
"success_run_start": "Successfully Started Run!",
"successful_delete": "Successfully Deleted Simulation!",
"successful_edit": "Successfully Edited Simulation!",
"threads": "Threads",
"time_full_devices": "Time to Full Devices",
"title": "Simulations",
"transmitted": "Transmitted",
"valid_cert": "Valid Certificate",
"valid_key": "Valid Key"
},
"statistics": {
"data": "Data (KB)",
"latest_statistics": "Latest Statistics",
@@ -606,7 +686,7 @@
"check_phone": "Please check your phone for your validation code",
"confirm_new_password": "Confirm New Password",
"create": "Create User",
"create_failure": "Error while creating user. Please make sure this email address is not already linked to an account.",
"create_failure": "Error while creating user: {{error}}",
"create_success": "User Created Successfully",
"creating": "Creating User...",
"delete_avatar": "Delete Avatar",
@@ -620,6 +700,7 @@
"email_address": "Email Address",
"enter_new_phone": "Enter your new phone number: ",
"error_fetching_users": "Error fetching users: {{error}}",
"error_retrieving": "Error retrieving user",
"error_sending_code": "Error while trying to send validation code. Please confirm that your phone number is valid.",
"force_password_change": "Force Password Change on Login",
"id": "User Id.",

View File

@@ -52,8 +52,10 @@
"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.",
"connected": "Conectado",
"copied": "Copiado!",
"copy_to_clipboard": "Copiar al portapapeles",
@@ -71,7 +73,7 @@
"details": "Detalles",
"device": "Dispositivo n.º{{serialNumber}}",
"device_dashboard": "Panel de control del dispositivo",
"device_delete": "Eliminar dispositivo n.º{{serialNumber}}",
"device_delete": "Eliminar #{{serialNumber}}",
"device_deleted": "Dispositivo eliminado correctamente",
"device_health": "Salud del dispositivo",
"device_list": "Listado de dispositivos",
@@ -102,17 +104,21 @@
"forgot_password_title": "Se te olvidó tu contraseña",
"from": "Desde",
"general_error": "Error de API, consulte a su administrador",
"go_back": "Regresa",
"hide": "Esconder",
"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",
"item": "ít",
"items": "artículos",
"items_per_page": "Artículos por página:",
"key": "Llave",
"last_dashboard_refresh": "Última actualización del panel",
"later_tonight": "Más tarde esta noche",
"latest": "último",
@@ -121,8 +127,10 @@
"loading_more_ellipsis": "Cargando más ...",
"logout": "Cerrar sesión",
"mac": "Dirección MAC",
"main": "Principal",
"manufacturer": "Fabricante",
"memory_used": "Memoria usada",
"min_max": "Mín .: {{min}}, Máx .: {{max}}",
"minute": "minuto",
"minutes": "minutos",
"modified": "Modificado",
@@ -155,7 +163,9 @@
"second": "segundo",
"seconds": "segundos",
"seconds_elapsed": "Segundos transcurridos",
"see_details": "Ver detalles",
"select": "Seleccionar",
"serial_num": "Número de serie",
"serial_number": "Número de serie",
"show_all": "Mostrar todo",
"socket_connection_closed": "¡Conexión cerrada!",
@@ -205,6 +215,7 @@
"device_password": "Contraseña",
"device_type": "Tipo de dispositivo",
"device_types": "Tipos de dispositivos",
"devices_affected": "Dispositivos afectados por esta configuración:",
"edit_configuration": "Editar configuración",
"error_delete": "Error al intentar eliminar: {{error}}",
"error_fetching_config": "Error al obtener la configuración",
@@ -232,6 +243,7 @@
"used_by": "Usado por",
"used_by_details": "{{entities}} Entidades, {{venues}} lugares y {{devices}} dispositivos",
"uuid": "ID de configuración",
"view_affected_devices": "Ver dispositivos afectados",
"view_config": "Ver configuración",
"view_in_use": "Ver en uso",
"view_json": "Ver JSON sin procesar"
@@ -250,6 +262,7 @@
"access_pin": "PIN de acceso",
"add_contact": "Agregar contacto",
"create_contact": "Crear contacto",
"currently_selected_contact": "Contacto seleccionado actualmente: {{contact}}",
"delete": "¿Borrar contacto?",
"error_assign": "Error al intentar asignar el contacto: {{error}}",
"error_creation": "Error al intentar crear contacto: {{error}}",
@@ -287,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",
@@ -309,10 +326,12 @@
"delete_warning": "Advertencia: esta operación no se puede revertir",
"edit_failure": "Actualización fallida: {{error}}",
"enter_here": "Ingrese las IP que desea agregar aquí",
"entire_tree": "Site MAp",
"entities": "entidades",
"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",
@@ -324,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"
@@ -336,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}} ",
@@ -348,9 +369,11 @@
"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",
"release": "Lanzamiento",
"revision": "Revisión",
"show_dev": "Mostrar lanzamientos para desarrolladores",
"size": "Tamaño",
@@ -457,7 +480,8 @@
"unassigned_deleted_devices": "{{number}} Dispositivos eliminados y sin asignar",
"unassigned_tags": "Etiquetas sin asignar",
"validating_import_file": "Validando archivo y datos de importación ...",
"venue": "Lugar de encuentro"
"venue": "Lugar de encuentro",
"view_in_gateway": "Ver en Gateway"
},
"location": {
"add": "Añade una ubicación",
@@ -465,13 +489,16 @@
"city": "ciudad",
"country": "País",
"create": "Crear ubicación",
"currently_selected": "Ubicación seleccionada actualmente: {{location}}",
"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",
"mobiles": "MOBILES",
"no_associated": "Sin ubicación asociada",
"phones": "Los telefonos",
"postal": "código postal",
"search": "Busque ubicaciones para completar automáticamente los campos a continuación",
"state": "Estado",
@@ -533,6 +560,59 @@
"settings": {
"title": "Ajustes"
},
"simulation": {
"add": "Agregar simulación",
"cancel": "Cancelar",
"cancel_success": "¡La ejecución de la simulación se canceló con éxito!",
"check_ongoing_sims": "Seguir Sim en curso",
"client_interval": "Intervalo de cliente",
"delete_simulation": "Eliminar Sim. {{name}}",
"end": "Término",
"error_creating": "Error al crear la simulación: {{error}}",
"error_delete": "Error al eliminar la simulación: {{error}}",
"error_devices": "Dispositivos de error",
"error_edit": "Error al intentar guardar la simulación: {{error}}",
"error_edit_run": "Error al intentar cambiar el estado de ejecución: {{error}}",
"error_fetching_simulations": "Error al obtener simulaciones: {{error}}",
"error_start_run": "Error al intentar iniciar una ejecución de simulación: {{error}}",
"gateway": "Puerta",
"healtcheck_interval": "Intervalo de comprobación de estado",
"keep_alive": "Mantener viva",
"last_refresh": "Última actualización",
"length": "Longitud",
"live_devices": "Dispositivos en vivo",
"mac_prefix": "Prefijo MAC",
"max_associations": "Max. Asociaciones",
"max_clients": "Max. Clientela",
"messages_transmitted": "Mensajes transmitidos",
"min_associations": "Min. Asociaciones",
"min_clients": "Min. Clientela",
"pause": "pausa",
"pause_success": "¡Ejecutar en pausa!",
"prefix_length": "Obligatorio, debe tener una longitud de 6 caracteres",
"previous_runs": "Ejecuciones anteriores",
"received": "recibido",
"received_messages": "Mensajes recibidos",
"reconnect_interval": "Intervalo de reconexión",
"resume": "Currículum",
"resume_success": "¡Ejecutar reanudado!",
"run": "Ejecución de simulación",
"run_simulation": "Ejecutar simulación",
"started": "Empezado",
"state_interval": "Intervalo de estado",
"stop": "Detener",
"stop_success": "¡Corre, detenido!",
"success_creating": "¡Simulación creada con éxito!",
"success_run_start": "¡Ejecución iniciada con éxito!",
"successful_delete": "¡Simulación eliminada con éxito!",
"successful_edit": "¡Simulación editada con éxito!",
"threads": "Trapos",
"time_full_devices": "Tiempo para dispositivos completos",
"title": "Simulaciones",
"transmitted": "Transmitido",
"valid_cert": "Certificado válido",
"valid_key": "Clave válida"
},
"statistics": {
"data": "Datos (KB)",
"latest_statistics": "Últimas estadísticas",
@@ -606,7 +686,7 @@
"check_phone": "Por favor revise su teléfono para su código de validación",
"confirm_new_password": "confirmar nueva contraseña",
"create": "Crear usuario",
"create_failure": "Error al crear usuario. Asegúrese de que esta dirección de correo electrónico no esté vinculada a una cuenta.",
"create_failure": "Error al crear el usuario: {{error}}",
"create_success": "Usuario creado con éxito",
"creating": "Creando usuario ...",
"delete_avatar": "Eliminar avatar",
@@ -620,6 +700,7 @@
"email_address": "Dirección de correo electrónico",
"enter_new_phone": "Ingrese su nuevo número de teléfono:",
"error_fetching_users": "Error al obtener usuarios: {{error}}",
"error_retrieving": "Error al recuperar usuario",
"error_sending_code": "Error al intentar enviar el código de validación. Confirma que tu número de teléfono es válido.",
"force_password_change": "Forzar cambio de contraseña al iniciar sesión",
"id": "Id. De usuario",

View File

@@ -52,8 +52,10 @@
"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.",
"connected": "Connecté",
"copied": "Copié!",
"copy_to_clipboard": "Copier dans le presse-papier",
@@ -71,7 +73,7 @@
"details": "Détails",
"device": "N° d'appareil{{serialNumber}}",
"device_dashboard": "Tableau de bord de l'appareil",
"device_delete": "Supprimer l'appareil n°{{serialNumber}}",
"device_delete": "Supprimer #{{serialNumber}}",
"device_deleted": "Appareil supprimé avec succès",
"device_health": "Santé de l'appareil",
"device_list": "Liste des appareils",
@@ -102,17 +104,21 @@
"forgot_password_title": "Mot de passe oublié",
"from": "De",
"general_error": "Erreur API, veuillez consulter votre administrateur",
"go_back": "Retourner",
"hide": "Cacher",
"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",
"item": "article",
"items": "Articles",
"items_per_page": "Objets par page:",
"key": "Clé",
"last_dashboard_refresh": "Dernière actualisation du tableau de bord",
"later_tonight": "Plus tard ce soir",
"latest": "Dernier",
@@ -121,8 +127,10 @@
"loading_more_ellipsis": "Chargement plus ...",
"logout": "Connectez - Out",
"mac": "ADRESSE MAC",
"main": "Principale",
"manufacturer": "fabricant",
"memory_used": "Mémoire utilisée",
"min_max": "Min : {{min}}, Max : {{max}}",
"minute": "minute",
"minutes": "minutes",
"modified": "Modifié",
@@ -155,7 +163,9 @@
"second": "seconde",
"seconds": "secondes",
"seconds_elapsed": "Secondes écoulées",
"see_details": "Voir les détails",
"select": "sélectionner",
"serial_num": "Numéro de série",
"serial_number": "Numéro de série",
"show_all": "Montre tout",
"socket_connection_closed": "Connexion fermée !",
@@ -205,6 +215,7 @@
"device_password": "Mot de passe",
"device_type": "Type d'appareil",
"device_types": "Types d'appareils",
"devices_affected": "Appareils concernés par cette configuration :",
"edit_configuration": "Modifier la configuration",
"error_delete": "Erreur lors de la tentative de suppression : {{error}}",
"error_fetching_config": "Erreur lors de la récupération de la configuration",
@@ -232,6 +243,7 @@
"used_by": "Utilisé par",
"used_by_details": "{{entities}} Entités, {{venues}} Lieux et {{devices}} Appareils",
"uuid": "Identifiant de configuration",
"view_affected_devices": "Afficher les appareils concernés",
"view_config": "Afficher la configuration",
"view_in_use": "Afficher en cours d'utilisation",
"view_json": "Afficher le JSON brut"
@@ -250,6 +262,7 @@
"access_pin": "NIP d'accès",
"add_contact": "Ajouter le contact",
"create_contact": "Créer un contact",
"currently_selected_contact": "Contact actuellement sélectionné : {{contact}}",
"delete": "Effacer le contact?",
"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}}",
@@ -287,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",
@@ -309,10 +326,12 @@
"delete_warning": "Attention : cette opération ne peut pas être annulée",
"edit_failure": "Échec de la mise à jour : {{error}}",
"enter_here": "Entrez les IP que vous souhaitez ajouter ici",
"entire_tree": "Site MAp",
"entities": "Entités",
"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",
@@ -324,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"
@@ -336,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",
@@ -348,9 +369,11 @@
"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",
"release": "libération",
"revision": "Révision",
"show_dev": "Afficher les versions des développeurs",
"size": "Taille",
@@ -457,7 +480,8 @@
"unassigned_deleted_devices": "{{number}} appareils supprimés et non attribués",
"unassigned_tags": "Balises non attribuées",
"validating_import_file": "Validation du fichier d'importation et des données...",
"venue": "Lieu"
"venue": "Lieu",
"view_in_gateway": "Afficher dans la passerelle"
},
"location": {
"add": "Ajouter un emplacement",
@@ -465,13 +489,16 @@
"city": "Ville",
"country": "Pays",
"create": "Créer un lieu",
"currently_selected": "Emplacement actuellement sélectionné : {{location}}",
"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",
"mobiles": "MOBILES",
"no_associated": "Aucun emplacement associé",
"phones": "Téléphones",
"postal": "Zip / code postal",
"search": "Recherchez des emplacements pour remplir automatiquement les champs ci-dessous",
"state": "Etat",
@@ -533,6 +560,59 @@
"settings": {
"title": "Réglages"
},
"simulation": {
"add": "Ajouter une simulation",
"cancel": "annuler",
"cancel_success": "Exécution de la simulation annulée avec succès !",
"check_ongoing_sims": "Suivre le Sim en cours",
"client_interval": "Intervalle client",
"delete_simulation": "Supprimer Sim. {{name}}",
"end": "Terminé",
"error_creating": "Erreur lors de la création de la simulation : {{error}}",
"error_delete": "Erreur lors de la suppression de la simulation : {{error}}",
"error_devices": "Périphériques d'erreur",
"error_edit": "Erreur lors de la tentative d'enregistrement de la simulation : {{error}}",
"error_edit_run": "Erreur lors de la tentative de modification de l'état d'exécution : {{error}}",
"error_fetching_simulations": "Erreur lors de la récupération des simulations : {{error}}",
"error_start_run": "Erreur lors de la tentative de démarrage d'une simulation : {{error}}",
"gateway": "passerelle",
"healtcheck_interval": "Intervalle de vérification de l'état",
"keep_alive": "Rester en vie",
"last_refresh": "Dernier rafraîchissement",
"length": "Longueur",
"live_devices": "Appareils en direct",
"mac_prefix": "Préfixe MAC",
"max_associations": "Max. Les associations",
"max_clients": "Max. Clients",
"messages_transmitted": "Messages transmis",
"min_associations": "Min. Les associations",
"min_clients": "Min. Clients",
"pause": "Pause",
"pause_success": "Exécuter en pause !",
"prefix_length": "Obligatoire, doit être d'une longueur de 6 caractères",
"previous_runs": "Courses précédentes",
"received": "reçu",
"received_messages": "Messages reçus",
"reconnect_interval": "Intervalle de reconnexion",
"resume": "CV",
"resume_success": "Exécution reprise !",
"run": "Exécution de simulation",
"run_simulation": "Exécuter la simulation",
"started": "commencé",
"state_interval": "Intervalle d'état",
"stop": "Arrêtez",
"stop_success": "Exécution arrêtée !",
"success_creating": "Simulation créée avec succès !",
"success_run_start": "Exécution démarrée avec succès !",
"successful_delete": "Simulation supprimée avec succès !",
"successful_edit": "Simulation éditée avec succès !",
"threads": "Fils",
"time_full_devices": "Temps pour les appareils pleins",
"title": "Simulations",
"transmitted": "Transmis",
"valid_cert": "Certificat valide",
"valid_key": "Clé valide"
},
"statistics": {
"data": "Données (Ko)",
"latest_statistics": "Dernières statistiques",
@@ -606,7 +686,7 @@
"check_phone": "Veuillez vérifier votre téléphone pour votre code de validation",
"confirm_new_password": "Confirmer le nouveau mot de passe",
"create": "Créer un utilisateur",
"create_failure": "Erreur lors de la création de l'utilisateur. Veuillez vous assurer que cette adresse e-mail n'est pas déjà liée à un compte.",
"create_failure": "Erreur lors de la création de l'utilisateur : {{error}}",
"create_success": "L'utilisateur a été créé avec succès",
"creating": "Création de l'utilisateur...",
"delete_avatar": "Supprimer l'avatar",
@@ -620,6 +700,7 @@
"email_address": "Adresse électronique",
"enter_new_phone": "Saisissez votre nouveau numéro de téléphone :",
"error_fetching_users": "Erreur lors de la récupération des utilisateurs : {{error}}",
"error_retrieving": "Erreur lors de la récupération de l'utilisateur",
"error_sending_code": "Erreur lors de la tentative d'envoi du code de validation. Veuillez confirmer que votre numéro de téléphone est valide.",
"force_password_change": "Forcer le changement de mot de passe lors de la connexion",
"id": "Identifiant d'utilisateur.",

View File

@@ -52,8 +52,10 @@
"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.",
"connected": "Conectado",
"copied": "Copiado!",
"copy_to_clipboard": "Copiar para área de transferência",
@@ -71,7 +73,7 @@
"details": "Detalhes",
"device": "Dispositivo nº{{serialNumber}}",
"device_dashboard": "Painel do dispositivo",
"device_delete": "Excluir dispositivo nº{{serialNumber}}",
"device_delete": "Excluir #{{serialNumber}}",
"device_deleted": "Dispositivo excluído com sucesso",
"device_health": "Saúde do Dispositivo",
"device_list": "Lista de Dispositivos",
@@ -102,17 +104,21 @@
"forgot_password_title": "Esqueceu a senha",
"from": "De",
"general_error": "Erro de API, consulte o seu administrador",
"go_back": "Volte",
"hide": "Ocultar",
"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",
"item": "Item",
"items": "Unid",
"items_per_page": "Itens por página:",
"key": "Chave",
"last_dashboard_refresh": "Última atualização do painel",
"later_tonight": "Logo à noite",
"latest": "Mais recentes",
@@ -121,8 +127,10 @@
"loading_more_ellipsis": "Carregando mais ...",
"logout": "Sair",
"mac": "Endereço MAC",
"main": "a Principal",
"manufacturer": "Fabricante",
"memory_used": "Memória Usada",
"min_max": "Mín: {{min}}, Máx: {{max}}",
"minute": "minuto",
"minutes": "minutos",
"modified": "Modificado",
@@ -155,7 +163,9 @@
"second": "segundo",
"seconds": "segundos",
"seconds_elapsed": "Segundos decorridos",
"see_details": "Veja detalhes",
"select": "Selecione",
"serial_num": "Nº de série",
"serial_number": "Número de série",
"show_all": "mostre tudo",
"socket_connection_closed": "Conexão fechada!",
@@ -205,6 +215,7 @@
"device_password": "Senha",
"device_type": "Tipo de dispositivo",
"device_types": "Tipos de dispositivos",
"devices_affected": "Dispositivos afetados por esta configuração:",
"edit_configuration": "Editar configuração",
"error_delete": "Erro ao tentar excluir: {{error}}",
"error_fetching_config": "Erro ao buscar configuração",
@@ -232,6 +243,7 @@
"used_by": "Usado por",
"used_by_details": "{{entities}} Entidades, {{venues}} Locais e {{devices}} Dispositivos",
"uuid": "ID de configuração",
"view_affected_devices": "Exibir dispositivos afetados",
"view_config": "Ver configuração",
"view_in_use": "Visualização em uso",
"view_json": "Exibir JSON bruto"
@@ -250,6 +262,7 @@
"access_pin": "PIN de acesso",
"add_contact": "Adicionar contato",
"create_contact": "Criar Contato",
"currently_selected_contact": "Contato atualmente selecionado: {{contact}}",
"delete": "Excluir contato?",
"error_assign": "Erro ao tentar atribuir contato: {{error}}",
"error_creation": "Erro ao tentar criar contato: {{error}}",
@@ -287,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",
@@ -309,10 +326,12 @@
"delete_warning": "Aviso: esta operação não pode ser revertida",
"edit_failure": "Atualização malsucedida: {{error}}",
"enter_here": "Digite o (s) IP (s) que deseja adicionar aqui",
"entire_tree": "Mapa do Site",
"entities": "Entidades",
"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",
@@ -324,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"
@@ -336,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}} ",
@@ -348,9 +369,11 @@
"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",
"release": "LANÇAMENTO",
"revision": "Revisão",
"show_dev": "Mostrar lançamentos de desenvolvimento",
"size": "Tamanho",
@@ -457,7 +480,8 @@
"unassigned_deleted_devices": "{{number}} Dispositivos excluídos e não atribuídos",
"unassigned_tags": "Tags não atribuídas",
"validating_import_file": "Validando arquivo de importação e dados ...",
"venue": "Local"
"venue": "Local",
"view_in_gateway": "Ver no Gateway"
},
"location": {
"add": "Adicionar Local",
@@ -465,13 +489,16 @@
"city": "Cidade",
"country": "País",
"create": "Criar local",
"currently_selected": "Local selecionado atualmente: {{location}}",
"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",
"mobiles": "Móbiles",
"no_associated": "Sem localização associada",
"phones": "Telefones",
"postal": "CEP / Código Postal",
"search": "Pesquise locais para preencher automaticamente os campos abaixo",
"state": "Estado",
@@ -533,6 +560,59 @@
"settings": {
"title": "Definições"
},
"simulation": {
"add": "Adicionar Simulação",
"cancel": "Cancelar",
"cancel_success": "Simulação cancelada com sucesso!",
"check_ongoing_sims": "Seguir Sim em Curso",
"client_interval": "Intervalo do Cliente",
"delete_simulation": "Excluir Sim. {{name}}",
"end": "Terminado",
"error_creating": "Erro ao criar simulação: {{error}}",
"error_delete": "Erro ao excluir simulação: {{error}}",
"error_devices": "Dispositivos de Erro",
"error_edit": "Erro ao tentar salvar a simulação: {{error}}",
"error_edit_run": "Erro ao tentar alterar o estado de execução: {{error}}",
"error_fetching_simulations": "Erro ao buscar simulações: {{error}}",
"error_start_run": "Erro ao tentar iniciar uma simulação: {{error}}",
"gateway": "Gateway",
"healtcheck_interval": "Intervalo de verificação de saúde",
"keep_alive": "Mantenha vivo",
"last_refresh": "Última atualização",
"length": "Comprimento",
"live_devices": "Dispositivos Live",
"mac_prefix": "Prefixo MAC",
"max_associations": "Máx. Associações",
"max_clients": "Máx. Clientes",
"messages_transmitted": "Mensagens Transmitidas",
"min_associations": "Min. Associações",
"min_clients": "Min. Clientes",
"pause": "pausa",
"pause_success": "Executar em pausa!",
"prefix_length": "Obrigatório, deve ter 6 caracteres",
"previous_runs": "Execuções anteriores",
"received": "recebido",
"received_messages": "Mensagens recebidas",
"reconnect_interval": "Intervalo de reconexão",
"resume": "Currículo",
"resume_success": "Executar retomado!",
"run": "Simulação Rodada",
"run_simulation": "Executar Simulação",
"started": "Começado",
"state_interval": "Intervalo de estado",
"stop": "Pare",
"stop_success": "Run Stopped!",
"success_creating": "Simulação criada com sucesso!",
"success_run_start": "Execução iniciada com sucesso!",
"successful_delete": "Simulação excluída com sucesso!",
"successful_edit": "Simulação editada com sucesso!",
"threads": "Tópicos",
"time_full_devices": "Tempo para dispositivos completos",
"title": "Simulações",
"transmitted": "Transmitido",
"valid_cert": "Certificado Válido",
"valid_key": "Chave Válida"
},
"statistics": {
"data": "Dados (KB)",
"latest_statistics": "Estatísticas mais recentes",
@@ -606,7 +686,7 @@
"check_phone": "Por favor, verifique o seu telefone para o seu código de validação",
"confirm_new_password": "confirme a nova senha",
"create": "Criar usuário",
"create_failure": "Erro ao criar usuário. Certifique-se de que este endereço de e-mail ainda não esteja vinculado a uma conta.",
"create_failure": "Erro ao criar usuário: {{error}}",
"create_success": "Usuário criado com sucesso",
"creating": "Criando usuário ...",
"delete_avatar": "Apagar Avatar",
@@ -620,6 +700,7 @@
"email_address": "Endereço de e-mail",
"enter_new_phone": "Insira seu novo número de telefone:",
"error_fetching_users": "Erro ao buscar usuários: {{error}}",
"error_retrieving": "Erro ao recuperar usuário",
"error_sending_code": "Erro ao tentar enviar o código de validação. Por favor, confirme se o seu número de telefone é válido.",
"force_password_change": "Forçar mudança de senha no login",
"id": "ID do usuário.",

View File

@@ -17,7 +17,7 @@ const DetailsModal = ({ t, show, toggle, details, commandUuid }) => (
</div>
</CModalHeader>
<CModalBody>
<pre className="ignore">{JSON.stringify(details, null, 4)}</pre>
<pre className="ignore">{JSON.stringify(details, null, 2)}</pre>
</CModalBody>
</CModal>
);

View File

@@ -27,7 +27,7 @@ const initialState = {
error: false,
},
userRole: {
value: 'admin',
value: 'accounting',
error: false,
},
notes: {
@@ -42,16 +42,11 @@ const initialState = {
},
};
const CreateUserModal = ({ show, toggle, getUsers }) => {
const CreateUserModal = ({ show, toggle, getUsers, policies }) => {
const { t } = useTranslation();
const { currentToken, endpoints } = useAuth();
const { addToast } = useToast();
const [loading, setLoading] = useState(false);
const [policies, setPolicies] = useState({
passwordPolicy: '',
passwordPattern: '',
accessPolicy: '',
});
const [formFields, updateFieldWithId, updateField, setFormFields] = useFormFields(initialState);
const toggleChange = () => {
@@ -107,10 +102,10 @@ const CreateUserModal = ({ show, toggle, getUsers }) => {
});
toggle();
})
.catch(() => {
.catch((e) => {
addToast({
title: t('common.error'),
body: t('user.create_failure'),
body: t('user.create_failure', { error: e.response?.data?.ErrorDescription }),
color: 'danger',
autohide: true,
});
@@ -122,23 +117,6 @@ const CreateUserModal = ({ show, toggle, getUsers }) => {
setLoading(false);
}
};
const getPasswordPolicy = () => {
axiosInstance
.post(`${endpoints.owsec}/api/v1/oauth2?requirements=true`, {})
.then((response) => {
const newPolicies = response.data;
newPolicies.accessPolicy = `${endpoints.owsec}${newPolicies.accessPolicy}`;
newPolicies.passwordPolicy = `${endpoints.owsec}${newPolicies.passwordPolicy}`;
setPolicies(response.data);
})
.catch(() => {});
};
useEffect(() => {
if (policies.passwordPattern.length === 0) getPasswordPolicy();
}, []);
useEffect(() => {
setFormFields(initialState);
}, [show]);
@@ -177,6 +155,7 @@ CreateUserModal.propTypes = {
show: PropTypes.bool.isRequired,
toggle: PropTypes.func.isRequired,
getUsers: PropTypes.func.isRequired,
policies: PropTypes.instanceOf(Object).isRequired,
};
export default React.memo(CreateUserModal);

View File

@@ -19,7 +19,7 @@ const DeviceConfigurationModal = ({ show, toggle, configuration }) => (
<CModalTitle className="text-dark">{t('configuration.title')}</CModalTitle>
</CModalHeader>
<CModalBody>
<pre className="ignore">{JSON.stringify(configuration, null, 4)}</pre>
<pre className="ignore">{JSON.stringify(configuration, null, 2)}</pre>
</CModalBody>
<CModalFooter>
<CButton color="secondary" onClick={toggle}>

View File

@@ -1,6 +1,6 @@
import React, { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useHistory, useLocation } from 'react-router-dom';
import { useHistory } from 'react-router-dom';
import axiosInstance from 'utils/axiosInstance';
import { getItem, setItem } from 'utils/localStorageHelper';
import DeviceSearchBar from 'components/DeviceSearchBar';
@@ -16,8 +16,7 @@ const DeviceList = () => {
const { t } = useTranslation();
const { addToast } = useToast();
const history = useHistory();
const { search } = useLocation();
const page = new URLSearchParams(search).get('page');
const [page, setPage] = useState(parseInt(sessionStorage.getItem('deviceTable') ?? 0, 10));
const { currentToken, endpoints } = useAuth();
const [upgradeStatus, setUpgradeStatus] = useState({
loading: false,
@@ -225,13 +224,15 @@ const DeviceList = () => {
};
const updatePageCount = ({ selected: selectedPage }) => {
history.push(`/devices?page=${selectedPage}`);
sessionStorage.setItem('deviceTable', selectedPage);
setPage(selectedPage);
getDeviceInformation(selectedPage);
};
const upgradeToLatest = (device) => {
setUpgradeStatus({
loading: true,
serialNumber: device.serialNumber,
});
const options = {
@@ -354,9 +355,6 @@ const DeviceList = () => {
};
useEffect(() => {
if (page === undefined || page === null || Number.isNaN(page)) {
history.push(`/devices?page=0`);
}
getCount();
}, []);

View File

@@ -106,7 +106,7 @@ const DeviceLogs = () => {
const getDetails = (index, logDetails) => {
if (details.includes(index))
return <pre className="ignore">{JSON.stringify(logDetails, null, 4)}</pre>;
return <pre className="ignore">{JSON.stringify(logDetails, null, 2)}</pre>;
return <pre className="ignore" />;
};

View File

@@ -1,11 +1,28 @@
import React, { useEffect, useState } from 'react';
import PropTypes from 'prop-types';
import { useTranslation } from 'react-i18next';
import { CButton, CModal, CModalBody, CModalHeader, CModalTitle, CPopover } from '@coreui/react';
import {
CButton,
CModal,
CModalBody,
CModalHeader,
CModalTitle,
CPopover,
CNav,
CNavLink,
CTabPane,
CTabContent,
} from '@coreui/react';
import CIcon from '@coreui/icons-react';
import { cilPencil, cilSave, cilX } from '@coreui/icons';
import axiosInstance from 'utils/axiosInstance';
import { useFormFields, useAuth, useToast, FirmwareDetailsForm } from 'ucentral-libs';
import {
useFormFields,
useAuth,
useToast,
FirmwareDetailsForm,
DetailedNotesTable,
} from 'ucentral-libs';
const initialState = {
created: {
@@ -33,11 +50,6 @@ const initialState = {
error: false,
editable: true,
},
owner: {
value: '',
error: false,
editable: true,
},
revision: {
value: '',
error: false,
@@ -65,6 +77,7 @@ const EditFirmwareModal = ({ show, toggle, firmwareId, refreshTable }) => {
const { addToast } = useToast();
const [loading, setLoading] = useState(false);
const [editing, setEditing] = useState(false);
const [index, setIndex] = useState(0);
const [firmware, updateWithId, updateWithKey, setFirmware] = useFormFields(initialState);
const getFirmware = () => {
@@ -168,6 +181,7 @@ const EditFirmwareModal = ({ show, toggle, firmwareId, refreshTable }) => {
if (show) {
getFirmware();
setEditing(false);
setIndex(0);
}
}, [show]);
@@ -201,14 +215,48 @@ const EditFirmwareModal = ({ show, toggle, firmwareId, refreshTable }) => {
</CPopover>
</div>
</CModalHeader>
<CModalBody>
<FirmwareDetailsForm
t={t}
fields={firmware}
addNote={addNote}
updateFieldsWithId={updateWithId}
editing={editing}
/>
<CModalBody className="px-3 pt-0">
<CNav variant="tabs" className="mb-0 p-0">
<CNavLink
className="font-weight-bold"
href="#"
active={index === 0}
onClick={() => setIndex(0)}
>
{t('common.main')}
</CNavLink>
<CNavLink
className="font-weight-bold"
href="#"
active={index === 1}
onClick={() => setIndex(1)}
>
{t('configuration.notes')}
</CNavLink>
</CNav>
<CTabContent>
<CTabPane active={index === 0} className="pt-2">
{index === 0 ? (
<FirmwareDetailsForm
t={t}
fields={firmware}
updateFieldsWithId={updateWithId}
editing={editing}
/>
) : null}
</CTabPane>
<CTabPane active={index === 1}>
{index === 1 ? (
<DetailedNotesTable
t={t}
notes={firmware.notes.value}
addNote={addNote}
loading={loading}
editable={editing}
/>
) : null}
</CTabPane>
</CTabContent>
</CModalBody>
</CModal>
);

View File

@@ -13,7 +13,7 @@ const initialState = {
changePassword: {
value: false,
error: false,
editable: false,
editable: true,
},
currentPassword: {
value: '',
@@ -36,7 +36,7 @@ const initialState = {
editable: true,
},
userRole: {
value: '',
value: 'accounting',
error: false,
editable: true,
},
@@ -46,7 +46,7 @@ const initialState = {
},
};
const EditUserModal = ({ show, toggle, userId, getUsers }) => {
const EditUserModal = ({ show, toggle, userId, getUsers, policies }) => {
const { t } = useTranslation();
const { currentToken, endpoints } = useAuth();
const { addToast } = useToast();
@@ -54,23 +54,6 @@ const EditUserModal = ({ show, toggle, userId, getUsers }) => {
const [initialUser, setInitialUser] = useState({});
const [editing, setEditing] = useState(false);
const [user, updateWithId, updateWithKey, setUser] = useUser(initialState);
const [policies, setPolicies] = useState({
passwordPolicy: '',
passwordPattern: '',
accessPolicy: '',
});
const getPasswordPolicy = () => {
axiosInstance
.post(`${endpoints.owsec}/api/v1/oauth2?requirements=true`, {})
.then((response) => {
const newPolicies = response.data;
newPolicies.accessPolicy = `${endpoints.owsec}${newPolicies.accessPolicy}`;
newPolicies.passwordPolicy = `${endpoints.owsec}${newPolicies.passwordPolicy}`;
setPolicies(response.data);
})
.catch(() => {});
};
const getUser = () => {
const options = {
@@ -96,7 +79,15 @@ const EditUserModal = ({ show, toggle, userId, getUsers }) => {
setInitialUser({ ...initialState, ...newUser });
setUser({ ...initialState, ...newUser });
})
.catch(() => {});
.catch(() => {
addToast({
title: t('common.error'),
body: t('user.error_retrieving'),
color: 'danger',
autohide: true,
});
toggle();
});
};
const toggleEditing = () => {
@@ -134,13 +125,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',
@@ -200,13 +192,11 @@ const EditUserModal = ({ show, toggle, userId, getUsers }) => {
if (userId) {
getUser();
}
if (policies.passwordPattern.length === 0) {
getPasswordPolicy();
}
}, [userId]);
useEffect(() => {
if (show) {
getUser();
setEditing(false);
}
}, [show]);
@@ -233,6 +223,7 @@ EditUserModal.propTypes = {
show: PropTypes.bool.isRequired,
toggle: PropTypes.func.isRequired,
getUsers: PropTypes.func.isRequired,
policies: PropTypes.instanceOf(Object).isRequired,
};
export default React.memo(EditUserModal);

View File

@@ -134,7 +134,7 @@ const FirmwareDashboard = () => {
if (
parsedData.numberOfDevices === undefined ||
Number.isNaN(parsedData.numberOfDevices) ||
parsedData === 0
parsedData.numberOfDevices === 0
) {
parsedData.latestSoftwareRate = '-';
} else {
@@ -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

View File

@@ -51,7 +51,7 @@ const LatestStatisticsModal = ({ show, toggle }) => {
</div>
</CModalHeader>
<CModalBody>
<pre className="ignore">{JSON.stringify(latestStats, null, 4)}</pre>
<pre className="ignore">{JSON.stringify(latestStats, null, 2)}</pre>
</CModalBody>
</CModal>
);

View File

@@ -31,7 +31,7 @@ const ActionModal = ({ show, toggleModal }) => {
const [waiting, setWaiting] = useState(false);
const [result, setResult] = useState(null);
const [chosenDate, setChosenDate] = useState(new Date().toString());
const [isNow, setIsNow] = useState(false);
const [isNow, setIsNow] = useState(true);
const toggleNow = () => {
setIsNow(!isNow);
@@ -48,6 +48,7 @@ const ActionModal = ({ show, toggleModal }) => {
setResult(null);
setWaiting(false);
setChosenDate(new Date().toString());
setIsNow(true);
}
}, [show]);

View File

@@ -193,7 +193,7 @@ const TelemetryModal = ({ show, toggle }) => {
</CRow>
<CRow>
<CCol>
<pre>{JSON.stringify(lastMessage, null, '\t')}</pre>
<pre>{JSON.stringify(lastMessage, null, 2)}</pre>
</CCol>
</CRow>
<CRow>

View File

@@ -57,6 +57,7 @@ const TheLayout = () => {
endpoints={endpoints}
user={user}
avatar={avatar}
hideBreadcrumb
/>
<div className="c-body">
<ToastProvider>

View File

@@ -1,22 +1,44 @@
import React, { useState } from 'react';
import React, { useEffect, useState } from 'react';
import DeviceList from 'components/DeviceListTable';
import DeviceDashboard from 'components/DeviceDashboard';
import { CCard, CCardBody, CNav, CNavLink, CTabPane, CTabContent } from '@coreui/react';
import {
CCard,
CCardBody,
CNav,
CNavLink,
CTabPane,
CTabContent,
CCardHeader,
} from '@coreui/react';
import { useTranslation } from 'react-i18next';
const DeviceListPage = () => {
const { t } = useTranslation();
const [index, setIndex] = useState(0);
const updateNav = (target) => {
sessionStorage.setItem('devicePage', target);
setIndex(target);
};
useEffect(() => {
const target = sessionStorage.getItem('devicePage');
if (target !== null) setIndex(parseInt(target, 10));
}, []);
return (
<CCard>
<CCardHeader className="dark-header">
<div className="text-value-lg mr-auto">{t('common.devices')}</div>
</CCardHeader>
<CCardBody className="p-0">
<CNav variant="tabs">
<CNavLink
className="font-weight-bold"
href="#"
active={index === 0}
onClick={() => setIndex(0)}
onClick={() => updateNav(0)}
>
{t('common.dashboard')}
</CNavLink>
@@ -24,9 +46,9 @@ const DeviceListPage = () => {
className="font-weight-bold"
href="#"
active={index === 1}
onClick={() => setIndex(1)}
onClick={() => updateNav(1)}
>
{t('common.devices')}
{t('common.table')}
</CNavLink>
</CNav>
<CTabContent>

View File

@@ -2,7 +2,15 @@
import React, { useState, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import axiosInstance from 'utils/axiosInstance';
import { CCard, CCardBody, CNav, CNavLink, CTabPane, CTabContent } from '@coreui/react';
import {
CCard,
CCardBody,
CNav,
CNavLink,
CTabPane,
CTabContent,
CCardHeader,
} from '@coreui/react';
import { FirmwareList, useAuth, useToast } from 'ucentral-libs';
import FirmwareDashboard from 'components/FirmwareDashboard';
import EditFirmwareModal from 'components/EditFirmwareModal';
@@ -161,6 +169,9 @@ const FirmwareListPage = () => {
return (
<CCard>
<CCardHeader className="dark-header">
<div className="text-value-lg mr-auto">{t('common.firmware')}</div>
</CCardHeader>
<CCardBody className="p-0">
<CNav variant="tabs">
<CNavLink
@@ -177,7 +188,7 @@ const FirmwareListPage = () => {
active={index === 1}
onClick={() => setIndex(1)}
>
{t('common.firmware')}
{t('common.table')}
</CNavLink>
</CNav>
<CTabContent>

View File

@@ -133,7 +133,7 @@ const Login = () => {
const onKeyDown = (event, action) => {
if (event.code === 'Enter') {
action();
action(event);
}
};
@@ -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(() => {
@@ -285,6 +305,107 @@ const Login = () => {
}
};
const submitForm = (event) => {
event.preventDefault();
setLoginResponse(initialResponseState);
setLoading(true);
let token = '';
const parameters = {
userId: event.target?.username?.value,
password: event.target?.password?.value,
};
if (formType === 'change-password') {
parameters.newPassword = fields.newpassword.value;
}
axiosInstance
.post(`${fields.ucentralsecurl.value}/api/v1/oauth2`, parameters)
.then((response) => {
// If there's MFA to do
if (response.data.method && response.data.created) {
setFormType(`validation-${response.data.method}-${response.data.uuid}`);
return null;
}
if (response.data.userMustChangePassword) {
setFormType('change-password');
return null;
}
setItem('access_token', response.data.access_token);
token = response.data.access_token;
return axiosInstance.get(`${fields.ucentralsecurl.value}/api/v1/systemEndpoints`, {
headers: {
Accept: 'application/json',
Authorization: `Bearer ${response.data.access_token}`,
},
});
})
.then((response) => {
if (response) {
const endpoints = {
owsec: fields.ucentralsecurl.value,
};
for (const endpoint of response.data.endpoints) {
endpoints[endpoint.type] = endpoint.uri;
}
if (endpoints.owgw) getGatewayUIUrl(token, endpoints.owgw);
if (endpoints.owprov) getProvUIUrl(token, endpoints.owprov);
setItem('gateway_endpoints', JSON.stringify(endpoints));
setEndpoints(endpoints);
setCurrentToken(token);
}
})
.catch((error) => {
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,
});
}
})
.finally(() => {
setLoading(false);
});
};
const sendForgotPasswordEmail = () => {
setForgotResponse(initialResponseState);
@@ -426,6 +547,7 @@ const Login = () => {
toggleForgotPassword={toggleForgotPassword}
formType={formType}
onKeyDown={onKeyDown}
submitForm={submitForm}
sendForgotPasswordEmail={sendForgotPasswordEmail}
changePasswordResponse={changePasswordResponse}
cancelPasswordChange={cancelPasswordChange}

View File

@@ -20,6 +20,23 @@ const UserListPage = () => {
const [loading, setLoading] = useState(true);
const [deleteLoading, setDeleteLoading] = useState(false);
const [usersPerPage, setUsersPerPage] = useState(getItem('devicesPerPage') || '10');
const [policies, setPolicies] = useState({
passwordPolicy: '',
passwordPattern: '',
accessPolicy: '',
});
const getPasswordPolicy = () => {
axiosInstance
.post(`${endpoints.owsec}/api/v1/oauth2?requirements=true`, {})
.then((response) => {
const newPolicies = response.data;
newPolicies.accessPolicy = `${endpoints.owsec}${newPolicies.accessPolicy}`;
newPolicies.passwordPolicy = `${endpoints.owsec}${newPolicies.passwordPolicy}`;
setPolicies(response.data);
})
.catch(() => {});
};
const toggleCreateModal = () => {
setShowCreateModal(!showCreateModal);
@@ -180,6 +197,7 @@ const UserListPage = () => {
useEffect(() => {
getUsers();
getPasswordPolicy();
}, []);
useEffect(() => {
@@ -193,7 +211,7 @@ const UserListPage = () => {
<div>
<UserListTable
t={t}
users={usersToDisplay}
users={usersToDisplay.sort((a, b) => a.email > b.email)}
loading={loading}
usersPerPage={usersPerPage}
setUsersPerPage={updateUsersPerPage}
@@ -206,12 +224,18 @@ const UserListPage = () => {
toggleEdit={toggleEditModal}
refreshUsers={getUsers}
/>
<CreateUserModal show={showCreateModal} toggle={toggleCreateModal} getUsers={getUsers} />
<CreateUserModal
show={showCreateModal}
toggle={toggleCreateModal}
getUsers={getUsers}
policies={policies}
/>
<EditUserModal
show={showEditModal}
toggle={toggleEditModal}
userId={userToEdit}
getUsers={getUsers}
policies={policies}
/>
</div>
);

View File

@@ -20,10 +20,12 @@ axiosInstance.interceptors.response.use(
case 401:
break;
case 403:
localStorage.removeItem('access_token');
localStorage.removeItem('gateway_endpoints');
sessionStorage.clear();
window.location.href = '/';
if (error.response.data?.ErrorCode === 9) {
localStorage.removeItem('access_token');
localStorage.removeItem('gateway_endpoints');
sessionStorage.clear();
window.location.href = '/';
}
break;
default:
break;