mirror of
				https://github.com/Telecominfraproject/wlan-cloud-ucentralgw-ui.git
				synced 2025-10-30 18:27:53 +00:00 
			
		
		
		
	
							
								
								
									
										94
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										94
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -1,12 +1,12 @@ | ||||
| { | ||||
|   "name": "ucentral-client", | ||||
|   "version": "2.2.5", | ||||
|   "version": "2.2.8", | ||||
|   "lockfileVersion": 2, | ||||
|   "requires": true, | ||||
|   "packages": { | ||||
|     "": { | ||||
|       "name": "ucentral-client", | ||||
|       "version": "2.2.5", | ||||
|       "version": "2.2.8", | ||||
|       "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.58", | ||||
|         "ucentral-libs": "^0.9.62", | ||||
|         "uuid": "^8.3.2" | ||||
|       }, | ||||
|       "devDependencies": { | ||||
| @@ -9279,6 +9279,11 @@ | ||||
|         "node": ">= 0.8.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/libphonenumber-js": { | ||||
|       "version": "1.9.37", | ||||
|       "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.9.37.tgz", | ||||
|       "integrity": "sha512-RnUR4XwiVhMLnT7uFSdnmLeprspquuDtaShAgKTA+g/ms9/S4hQU3/QpFdh3iXPHtxD52QscXLm2W2+QBmvYAg==" | ||||
|     }, | ||||
|     "node_modules/lilconfig": { | ||||
|       "version": "2.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz", | ||||
| @@ -9518,14 +9523,12 @@ | ||||
|     "node_modules/lodash.debounce": { | ||||
|       "version": "4.0.8", | ||||
|       "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", | ||||
|       "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", | ||||
|       "dev": true | ||||
|       "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" | ||||
|     }, | ||||
|     "node_modules/lodash.memoize": { | ||||
|       "version": "4.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", | ||||
|       "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", | ||||
|       "dev": true | ||||
|       "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" | ||||
|     }, | ||||
|     "node_modules/lodash.merge": { | ||||
|       "version": "4.6.2", | ||||
| @@ -9533,6 +9536,16 @@ | ||||
|       "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/lodash.reduce": { | ||||
|       "version": "4.6.0", | ||||
|       "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", | ||||
|       "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" | ||||
|     }, | ||||
|     "node_modules/lodash.startswith": { | ||||
|       "version": "4.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/lodash.startswith/-/lodash.startswith-4.2.1.tgz", | ||||
|       "integrity": "sha1-xZjErc4YiiflMUVzHNxsDnF3YAw=" | ||||
|     }, | ||||
|     "node_modules/lodash.truncate": { | ||||
|       "version": "4.4.2", | ||||
|       "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", | ||||
| @@ -12189,6 +12202,23 @@ | ||||
|         "react": "^16.0.0 || ^17.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/react-phone-input-2": { | ||||
|       "version": "2.14.0", | ||||
|       "resolved": "https://registry.npmjs.org/react-phone-input-2/-/react-phone-input-2-2.14.0.tgz", | ||||
|       "integrity": "sha512-gOY3jUpwO7ulryXPEdqzH7L6DPqI9RQxKfBxZbgqAwXyALGsmwLWFyi2RQwXlBLWN/EPPT4Nv6I9TESVY2YBcg==", | ||||
|       "dependencies": { | ||||
|         "classnames": "^2.2.6", | ||||
|         "lodash.debounce": "^4.0.8", | ||||
|         "lodash.memoize": "^4.1.2", | ||||
|         "lodash.reduce": "^4.6.0", | ||||
|         "lodash.startswith": "^4.2.1", | ||||
|         "prop-types": "^15.7.2" | ||||
|       }, | ||||
|       "peerDependencies": { | ||||
|         "react": "^16.12.0 || ^17.0.0", | ||||
|         "react-dom": "^16.12.0 || ^17.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/react-redux": { | ||||
|       "version": "7.2.4", | ||||
|       "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.4.tgz", | ||||
| @@ -14812,18 +14842,20 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/ucentral-libs": { | ||||
|       "version": "0.9.58", | ||||
|       "resolved": "https://registry.npmjs.org/ucentral-libs/-/ucentral-libs-0.9.58.tgz", | ||||
|       "integrity": "sha512-K0bacVDGzjK//pddaMNVh2WDOep0/22tV1EhEfMKBAzaXgYEx2Ir3fg/GQzswCkfwg9i0kDWKiAXqRQ8pWLblg==", | ||||
|       "version": "0.9.62", | ||||
|       "resolved": "https://registry.npmjs.org/ucentral-libs/-/ucentral-libs-0.9.62.tgz", | ||||
|       "integrity": "sha512-teqIoFOkALEFzqRwdEuLWoDgIOiLhUt+ZDiS2ygYmqVsbCQZWUk/iOEpfLr1ZkRcEUtOPdrjqIRF5HrMopAPHA==", | ||||
|       "dependencies": { | ||||
|         "@coreui/coreui": "^3.4.0", | ||||
|         "@coreui/icons": "^2.0.1", | ||||
|         "@coreui/icons-react": "^1.1.0", | ||||
|         "@coreui/react": "^3.4.6", | ||||
|         "@coreui/react-chartjs": "^1.1.0", | ||||
|         "libphonenumber-js": "^1.9.37", | ||||
|         "lodash": "^4.17.21", | ||||
|         "react-flow-renderer": "^9.6.6", | ||||
|         "react-paginate": "^7.1.3", | ||||
|         "react-phone-input-2": "^2.14.0", | ||||
|         "react-router-dom": "^5.2.0", | ||||
|         "react-select": "^4.3.1", | ||||
|         "react-tooltip": "^4.2.21", | ||||
| @@ -23416,6 +23448,11 @@ | ||||
|         "type-check": "~0.4.0" | ||||
|       } | ||||
|     }, | ||||
|     "libphonenumber-js": { | ||||
|       "version": "1.9.37", | ||||
|       "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.9.37.tgz", | ||||
|       "integrity": "sha512-RnUR4XwiVhMLnT7uFSdnmLeprspquuDtaShAgKTA+g/ms9/S4hQU3/QpFdh3iXPHtxD52QscXLm2W2+QBmvYAg==" | ||||
|     }, | ||||
|     "lilconfig": { | ||||
|       "version": "2.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz", | ||||
| @@ -23598,14 +23635,12 @@ | ||||
|     "lodash.debounce": { | ||||
|       "version": "4.0.8", | ||||
|       "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", | ||||
|       "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", | ||||
|       "dev": true | ||||
|       "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" | ||||
|     }, | ||||
|     "lodash.memoize": { | ||||
|       "version": "4.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", | ||||
|       "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", | ||||
|       "dev": true | ||||
|       "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" | ||||
|     }, | ||||
|     "lodash.merge": { | ||||
|       "version": "4.6.2", | ||||
| @@ -23613,6 +23648,16 @@ | ||||
|       "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "lodash.reduce": { | ||||
|       "version": "4.6.0", | ||||
|       "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", | ||||
|       "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" | ||||
|     }, | ||||
|     "lodash.startswith": { | ||||
|       "version": "4.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/lodash.startswith/-/lodash.startswith-4.2.1.tgz", | ||||
|       "integrity": "sha1-xZjErc4YiiflMUVzHNxsDnF3YAw=" | ||||
|     }, | ||||
|     "lodash.truncate": { | ||||
|       "version": "4.4.2", | ||||
|       "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", | ||||
| @@ -25559,6 +25604,19 @@ | ||||
|         "prop-types": "^15.6.1" | ||||
|       } | ||||
|     }, | ||||
|     "react-phone-input-2": { | ||||
|       "version": "2.14.0", | ||||
|       "resolved": "https://registry.npmjs.org/react-phone-input-2/-/react-phone-input-2-2.14.0.tgz", | ||||
|       "integrity": "sha512-gOY3jUpwO7ulryXPEdqzH7L6DPqI9RQxKfBxZbgqAwXyALGsmwLWFyi2RQwXlBLWN/EPPT4Nv6I9TESVY2YBcg==", | ||||
|       "requires": { | ||||
|         "classnames": "^2.2.6", | ||||
|         "lodash.debounce": "^4.0.8", | ||||
|         "lodash.memoize": "^4.1.2", | ||||
|         "lodash.reduce": "^4.6.0", | ||||
|         "lodash.startswith": "^4.2.1", | ||||
|         "prop-types": "^15.7.2" | ||||
|       } | ||||
|     }, | ||||
|     "react-redux": { | ||||
|       "version": "7.2.4", | ||||
|       "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.4.tgz", | ||||
| @@ -27653,18 +27711,20 @@ | ||||
|       } | ||||
|     }, | ||||
|     "ucentral-libs": { | ||||
|       "version": "0.9.58", | ||||
|       "resolved": "https://registry.npmjs.org/ucentral-libs/-/ucentral-libs-0.9.58.tgz", | ||||
|       "integrity": "sha512-K0bacVDGzjK//pddaMNVh2WDOep0/22tV1EhEfMKBAzaXgYEx2Ir3fg/GQzswCkfwg9i0kDWKiAXqRQ8pWLblg==", | ||||
|       "version": "0.9.62", | ||||
|       "resolved": "https://registry.npmjs.org/ucentral-libs/-/ucentral-libs-0.9.62.tgz", | ||||
|       "integrity": "sha512-teqIoFOkALEFzqRwdEuLWoDgIOiLhUt+ZDiS2ygYmqVsbCQZWUk/iOEpfLr1ZkRcEUtOPdrjqIRF5HrMopAPHA==", | ||||
|       "requires": { | ||||
|         "@coreui/coreui": "^3.4.0", | ||||
|         "@coreui/icons": "^2.0.1", | ||||
|         "@coreui/icons-react": "^1.1.0", | ||||
|         "@coreui/react": "^3.4.6", | ||||
|         "@coreui/react-chartjs": "^1.1.0", | ||||
|         "libphonenumber-js": "^1.9.37", | ||||
|         "lodash": "^4.17.21", | ||||
|         "react-flow-renderer": "^9.6.6", | ||||
|         "react-paginate": "^7.1.3", | ||||
|         "react-phone-input-2": "^2.14.0", | ||||
|         "react-router-dom": "^5.2.0", | ||||
|         "react-select": "^4.3.1", | ||||
|         "react-tooltip": "^4.2.21", | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "ucentral-client", | ||||
|   "version": "2.2.5", | ||||
|   "version": "2.2.8", | ||||
|   "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.58", | ||||
|     "ucentral-libs": "^0.9.62", | ||||
|     "uuid": "^8.3.2" | ||||
|   }, | ||||
|   "main": "index.js", | ||||
|   | ||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 202 KiB | 
| @@ -369,6 +369,7 @@ | ||||
| 		"error_create_venue": "Fehler beim Erstellen des Veranstaltungsortes", | ||||
| 		"error_delete_tag": "Fehler beim Löschen des Inventar-Tags", | ||||
| 		"error_get_venue": "Fehler beim Abrufen von Veranstaltungsorten", | ||||
| 		"error_pushing_config": "Fehler beim Versuch, die Konfiguration auf das Gerät zu übertragen: {{error}}", | ||||
| 		"error_retrieving": "Beim Abrufen von Inventar-Tags ist ein Fehler aufgetreten", | ||||
| 		"error_unassign": "Fehler beim Aufheben der Zuweisung", | ||||
| 		"error_update_venue": "Fehler beim Aktualisieren des Veranstaltungsorts", | ||||
| @@ -417,12 +418,15 @@ | ||||
| 		"venue": "Tagungsort" | ||||
| 	}, | ||||
| 	"login": { | ||||
| 		"account_verification": "Bestätigung des Kontos", | ||||
| 		"authentication_expired": "Authentifizierung abgelaufen, bitte starten Sie den Anmeldevorgang erneut", | ||||
| 		"change_password": "Ändere das Passwort", | ||||
| 		"change_password_error": "Fehler beim Ändern des Passworts. Stellen Sie sicher, dass das neue Passwort gültig ist, indem Sie die Seite \"Passwortrichtlinie\" besuchen", | ||||
| 		"change_password_instructions": "Geben Sie Ihr neues Passwort ein und bestätigen Sie es", | ||||
| 		"changing_password": "Passwort ändern...", | ||||
| 		"confirm_new_password": "Bestätige neues Passwort", | ||||
| 		"different_passwords": "Sie müssen das gleiche Passwort zweimal eingeben", | ||||
| 		"email_code_validation": "Bitte überprüfen Sie Ihr E-Mail-Postfach und geben Sie den Bestätigungscode, den wir Ihnen gerade gesendet haben, in das Feld unten ein", | ||||
| 		"forgot_password_error": "Fehler beim Versuch, eine E-Mail mit vergessenem Passwort zu senden. Stellen Sie sicher, dass diese Benutzer-ID mit einem Konto verknüpft ist.", | ||||
| 		"forgot_password_explanation": "Geben Sie Ihren Benutzernamen ein, um eine E-Mail mit Anweisungen zum Zurücksetzen Ihres Passworts zu erhalten", | ||||
| 		"forgot_password_success": "Sie sollten in Kürze eine E-Mail mit Anweisungen zum Zurücksetzen Ihres Passworts erhalten. Bitte überprüfen Sie Ihren Spam, wenn Sie die E-Mail nicht finden können", | ||||
| @@ -431,6 +435,7 @@ | ||||
| 		"login_error": "Anmeldefehler, stellen Sie sicher, dass die von Ihnen angegebenen Informationen gültig sind", | ||||
| 		"new_password": "Neues Kennwort", | ||||
| 		"password": "Passwort", | ||||
| 		"phone_validation_explanation": "Bitte überprüfen Sie Ihr Mobilgerät und geben Sie den Bestätigungscode, den wir Ihnen gerade gesendet haben, in das Feld unten ein", | ||||
| 		"please_enter_gateway": "Bitte geben Sie eine uCentralSec-URL ein", | ||||
| 		"please_enter_password": "Bitte geben Sie Ihr Passwort ein", | ||||
| 		"please_enter_username": "Bitte geben Sie Ihren Benutzernamen ein", | ||||
| @@ -439,7 +444,9 @@ | ||||
| 		"sending_ellipsis": "Senden…", | ||||
| 		"sign_in_to_account": "Melden Sie sich bei Ihrem Konto an", | ||||
| 		"url": "uCentralSec-URL", | ||||
| 		"username": "Benutzername" | ||||
| 		"username": "Benutzername", | ||||
| 		"verification_code": "Geben Sie hier Ihre Bestätigung ein", | ||||
| 		"wrong_code": "Der eingegebene Bestätigungscode ist ungültig." | ||||
| 	}, | ||||
| 	"reboot": { | ||||
| 		"directions": "Wann möchten Sie dieses Gerät neu starten?", | ||||
| @@ -530,6 +537,7 @@ | ||||
| 		"add_phone_number": "Telefonnummer hinzufügen", | ||||
| 		"avatar": "Dein Avatar", | ||||
| 		"avatar_file": "Dein Avatar (max. 2 MB)", | ||||
| 		"check_phone": "Bitte überprüfen Sie Ihr Telefon auf Ihren Validierungscode", | ||||
| 		"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_success": "Benutzer erfolgreich erstellt", | ||||
| @@ -543,13 +551,16 @@ | ||||
| 		"description": "Beschreibung", | ||||
| 		"edit": "Benutzer bearbeiten", | ||||
| 		"email_address": "E-Mail-Addresse", | ||||
| 		"enter_new_phone": "Geben Sie Ihre neue Telefonnummer ein:", | ||||
| 		"error_fetching_users": "Fehler beim Abrufen der Nutzer: {{error}}", | ||||
| 		"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.", | ||||
| 		"last_login": "Letzte Anmeldung", | ||||
| 		"login_id": "Anmelde-ID.", | ||||
| 		"my_profile": "Mein Profil", | ||||
| 		"name": "Name", | ||||
| 		"new_code_sent": "Neuer Code gesendet!", | ||||
| 		"nickname": "Spitzname", | ||||
| 		"nickname_explanation": "Spitzname (optional)", | ||||
| 		"not_validated": "Nicht validiert", | ||||
| @@ -559,14 +570,19 @@ | ||||
| 		"provide_email": "Bitte geben Sie eine gültige E-Mail Adresse an", | ||||
| 		"provide_password": "Bitte geben Sie ein gültiges Passwort ein", | ||||
| 		"save_avatar": "Avatar speichern", | ||||
| 		"send_code": "Code senden", | ||||
| 		"send_code_again": "Code nochmal senden", | ||||
| 		"show_hide_password": "Passwort anzeigen/verbergen", | ||||
| 		"successful_validation": "Telefonnummer bestätigt! Klicken Sie auf die Schaltfläche Speichern, um es mit Ihrem Profil zu verknüpfen", | ||||
| 		"update_failure": "Fehler beim Aktualisieren: {{error}}", | ||||
| 		"update_failure_title": "Update fehlgeschlagen", | ||||
| 		"update_success": "Benutzer erfolgreich aktualisiert", | ||||
| 		"update_success_title": "Erfolg", | ||||
| 		"user_role": "Rolle", | ||||
| 		"users": "Benutzer", | ||||
| 		"validated": "Bestätigt" | ||||
| 		"validate_phone": "Bestätigen", | ||||
| 		"validated": "Bestätigt", | ||||
| 		"wrong_validation_code": "Sie haben keinen gültigen Code eingegeben. Bitte versuchen Sie es erneut und vergewissern Sie sich, dass Sie die richtige Telefonnummer eingegeben haben" | ||||
| 	}, | ||||
| 	"wifi_analysis": { | ||||
| 		"association": "Verband", | ||||
|   | ||||
| @@ -369,6 +369,7 @@ | ||||
| 		"error_create_venue": "Error while creating venue", | ||||
| 		"error_delete_tag": "Error while deleting inventory tag", | ||||
| 		"error_get_venue": "Error while retrieving venues", | ||||
| 		"error_pushing_config": "Error while trying to push configuration to device: {{error}}", | ||||
| 		"error_retrieving": "Error occurred while retrieving inventory tags", | ||||
| 		"error_unassign": "Error during unassign operation", | ||||
| 		"error_update_venue": "Error while updating venue", | ||||
| @@ -417,12 +418,15 @@ | ||||
| 		"venue": "Venue" | ||||
| 	}, | ||||
| 	"login": { | ||||
| 		"account_verification": "Account Verification", | ||||
| 		"authentication_expired": "Authentication expired, please start the login process again", | ||||
| 		"change_password": "Change Password", | ||||
| 		"change_password_error": "Error while changing password. Make sure the new password is valid by visiting the 'Password Policy' page", | ||||
| 		"change_password_instructions": "Enter and confirm your new password", | ||||
| 		"changing_password": "Changing Password... ", | ||||
| 		"confirm_new_password": "Confirm New Password", | ||||
| 		"different_passwords": "You need to enter the same password twice", | ||||
| 		"email_code_validation": "Please check your email box and enter the verification code we have just sent you in the box below", | ||||
| 		"forgot_password_error": "Error while trying to send Forgot Password email. Please make sure this userId is associated to an account.", | ||||
| 		"forgot_password_explanation": "Enter your username  to receive an email containing the instructions to reset your password", | ||||
| 		"forgot_password_success": "You should soon receive an email containing the instructions to reset your password. Please make sure to check your spam if you can't find the email", | ||||
| @@ -431,6 +435,7 @@ | ||||
| 		"login_error": "Login error, make sure the information you are providing is valid", | ||||
| 		"new_password": "New Password", | ||||
| 		"password": "Password", | ||||
| 		"phone_validation_explanation": "Please check your mobile device and enter the verification code we have just sent you in the box below", | ||||
| 		"please_enter_gateway": "Please enter a uCentralSec URL", | ||||
| 		"please_enter_password": "Please enter your password", | ||||
| 		"please_enter_username": "Please enter your username", | ||||
| @@ -439,7 +444,9 @@ | ||||
| 		"sending_ellipsis": "Sending... ", | ||||
| 		"sign_in_to_account": "Sign in to your account", | ||||
| 		"url": "uCentralSec URL", | ||||
| 		"username": "Username" | ||||
| 		"username": "Username", | ||||
| 		"verification_code": "Enter your verification here", | ||||
| 		"wrong_code": "The verification code that was entered is not valid. " | ||||
| 	}, | ||||
| 	"reboot": { | ||||
| 		"directions": "When would you like to reboot this device?", | ||||
| @@ -530,6 +537,7 @@ | ||||
| 		"add_phone_number": "Add Phone Number", | ||||
| 		"avatar": "Your Avatar", | ||||
| 		"avatar_file": "Your Avatar (max. of 2 MB)", | ||||
| 		"check_phone": "Please check your phone for your validation code", | ||||
| 		"create": "Create User", | ||||
| 		"create_failure": "Error while creating user. Please make sure this email address is not already linked to an account.", | ||||
| 		"create_success": "User Created Successfully", | ||||
| @@ -543,13 +551,16 @@ | ||||
| 		"description": "Description", | ||||
| 		"edit": "Edit User", | ||||
| 		"email_address": "Email Address", | ||||
| 		"enter_new_phone": "Enter your new phone number: ", | ||||
| 		"error_fetching_users": "Error fetching users: {{error}}", | ||||
| 		"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.", | ||||
| 		"last_login": "Last Login", | ||||
| 		"login_id": "Login Id.", | ||||
| 		"my_profile": "My Profile", | ||||
| 		"name": "Name", | ||||
| 		"new_code_sent": "New Code Sent!", | ||||
| 		"nickname": "Nickname", | ||||
| 		"nickname_explanation": "Nickname (optional)", | ||||
| 		"not_validated": "Not Validated", | ||||
| @@ -559,14 +570,19 @@ | ||||
| 		"provide_email": "Please provide a valid email address", | ||||
| 		"provide_password": "Please provide a valid password", | ||||
| 		"save_avatar": "Save Avatar", | ||||
| 		"send_code": "Send Code", | ||||
| 		"send_code_again": "Send Code Again", | ||||
| 		"show_hide_password": "Show/Hide Password", | ||||
| 		"successful_validation": "Phone Number Validated! Click the save button to link it to your profile", | ||||
| 		"update_failure": "Error while trying to update: {{error}}", | ||||
| 		"update_failure_title": "Update Failed", | ||||
| 		"update_success": "User Updated Successfully", | ||||
| 		"update_success_title": "Success", | ||||
| 		"user_role": "Role", | ||||
| 		"users": "Users", | ||||
| 		"validated": "Validated" | ||||
| 		"validate_phone": "Validate", | ||||
| 		"validated": "Validated", | ||||
| 		"wrong_validation_code": "You have not entered a valid code. Please try again and make sure you have entered the right phone number" | ||||
| 	}, | ||||
| 	"wifi_analysis": { | ||||
| 		"association": "Association", | ||||
|   | ||||
| @@ -369,6 +369,7 @@ | ||||
| 		"error_create_venue": "Error al crear el lugar", | ||||
| 		"error_delete_tag": "Error al eliminar la etiqueta de inventario", | ||||
| 		"error_get_venue": "Error al recuperar lugares", | ||||
| 		"error_pushing_config": "Error al intentar enviar la configuración al dispositivo: {{error}}", | ||||
| 		"error_retrieving": "Se produjo un error al recuperar las etiquetas de inventario", | ||||
| 		"error_unassign": "Error durante la operación de anulación de asignación", | ||||
| 		"error_update_venue": "Error al actualizar el lugar", | ||||
| @@ -417,12 +418,15 @@ | ||||
| 		"venue": "Lugar de encuentro" | ||||
| 	}, | ||||
| 	"login": { | ||||
| 		"account_verification": "Verificación de la cuenta", | ||||
| 		"authentication_expired": "Autenticación caducada, vuelva a iniciar el proceso de inicio de sesión", | ||||
| 		"change_password": "Cambia la contraseña", | ||||
| 		"change_password_error": "Error al cambiar la contraseña. Asegúrese de que la nueva contraseña sea válida visitando la página 'Política de contraseñas'", | ||||
| 		"change_password_instructions": "Ingrese y confirme su nueva contraseña", | ||||
| 		"changing_password": "Cambio de contraseña ...", | ||||
| 		"confirm_new_password": "confirmar nueva contraseña", | ||||
| 		"different_passwords": "Debes ingresar la misma contraseña dos veces", | ||||
| 		"email_code_validation": "Por favor, marque su casilla de correo electrónico e ingrese el código de verificación que le acabamos de enviar en la casilla a continuación.", | ||||
| 		"forgot_password_error": "Error al intentar enviar el correo electrónico de Olvidé mi contraseña. Asegúrese de que este ID de usuario esté asociado a una cuenta.", | ||||
| 		"forgot_password_explanation": "Ingrese su nombre de usuario para recibir un correo electrónico con las instrucciones para restablecer su contraseña", | ||||
| 		"forgot_password_success": "Pronto debería recibir un correo electrónico con las instrucciones para restablecer su contraseña. Asegúrese de verificar su correo no deseado si no puede encontrar el correo electrónico", | ||||
| @@ -431,6 +435,7 @@ | ||||
| 		"login_error": "Error de inicio de sesión, asegúrese de que la información que proporciona sea válida", | ||||
| 		"new_password": "Nueva contraseña", | ||||
| 		"password": "Contraseña", | ||||
| 		"phone_validation_explanation": "Verifique su dispositivo móvil e ingrese el código de verificación que le acabamos de enviar en el cuadro a continuación", | ||||
| 		"please_enter_gateway": "Ingrese una URL de uCentralSec", | ||||
| 		"please_enter_password": "Por favor, introduzca su contraseña", | ||||
| 		"please_enter_username": "Por favor, ingrese su nombre de usuario", | ||||
| @@ -439,7 +444,9 @@ | ||||
| 		"sending_ellipsis": "Enviando...", | ||||
| 		"sign_in_to_account": "Iniciar sesión en su cuenta", | ||||
| 		"url": "URL de uCentralSec", | ||||
| 		"username": "Nombre de usuario" | ||||
| 		"username": "Nombre de usuario", | ||||
| 		"verification_code": "Ingrese su verificación aquí", | ||||
| 		"wrong_code": "El código de verificación que se ingresó no es válido." | ||||
| 	}, | ||||
| 	"reboot": { | ||||
| 		"directions": "¿Cuándo le gustaría reiniciar este dispositivo?", | ||||
| @@ -530,6 +537,7 @@ | ||||
| 		"add_phone_number": "Agregar el número de teléfono", | ||||
| 		"avatar": "Tu avatar", | ||||
| 		"avatar_file": "Tu avatar (máx. De 2 MB)", | ||||
| 		"check_phone": "Por favor revise su teléfono para su código de validación", | ||||
| 		"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_success": "Usuario creado con éxito", | ||||
| @@ -543,13 +551,16 @@ | ||||
| 		"description": "Descripción", | ||||
| 		"edit": "editar usuario", | ||||
| 		"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_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", | ||||
| 		"last_login": "Último acceso", | ||||
| 		"login_id": "Ingresar identificación.", | ||||
| 		"my_profile": "Mi perfil", | ||||
| 		"name": "Nombre", | ||||
| 		"new_code_sent": "¡Nuevo código enviado!", | ||||
| 		"nickname": "Apodo", | ||||
| 		"nickname_explanation": "Apodo (opcional)", | ||||
| 		"not_validated": "No validado", | ||||
| @@ -559,14 +570,19 @@ | ||||
| 		"provide_email": "Por favor ingrese su dirección de correo electrónico válida", | ||||
| 		"provide_password": "Proporcione una contraseña válida", | ||||
| 		"save_avatar": "Guardar avatar", | ||||
| 		"send_code": "Enviar código", | ||||
| 		"send_code_again": "Enviar Código De nuevo", | ||||
| 		"show_hide_password": "Mostrar / Ocultar contraseña", | ||||
| 		"successful_validation": "¡Número de teléfono validado! Haga clic en el botón guardar para vincularlo a su perfil", | ||||
| 		"update_failure": "Error al intentar actualizar: {{error}}", | ||||
| 		"update_failure_title": "Actualización fallida", | ||||
| 		"update_success": "Usuario actualizado con éxito", | ||||
| 		"update_success_title": "Éxito", | ||||
| 		"user_role": "papel", | ||||
| 		"users": "Usuarios", | ||||
| 		"validated": "Validado" | ||||
| 		"validate_phone": "validar", | ||||
| 		"validated": "Validado", | ||||
| 		"wrong_validation_code": "No ha introducido un código válido. Vuelve a intentarlo y asegúrate de haber ingresado el número de teléfono correcto." | ||||
| 	}, | ||||
| 	"wifi_analysis": { | ||||
| 		"association": "Asociación", | ||||
|   | ||||
| @@ -369,6 +369,7 @@ | ||||
| 		"error_create_venue": "Erreur lors de la création du lieu", | ||||
| 		"error_delete_tag": "Erreur lors de la suppression de la balise d'inventaire", | ||||
| 		"error_get_venue": "Erreur lors de la récupération des lieux", | ||||
| 		"error_pushing_config": "Erreur lors de la tentative d'envoi de la configuration sur l'appareil : {{error}}", | ||||
| 		"error_retrieving": "Une erreur s'est produite lors de la récupération des balises d'inventaire", | ||||
| 		"error_unassign": "Erreur lors de l'opération de désaffectation", | ||||
| 		"error_update_venue": "Erreur lors de la mise à jour du lieu", | ||||
| @@ -417,12 +418,15 @@ | ||||
| 		"venue": "Lieu" | ||||
| 	}, | ||||
| 	"login": { | ||||
| 		"account_verification": "Vérification de compte", | ||||
| 		"authentication_expired": "Authentification expirée, veuillez recommencer le processus de connexion", | ||||
| 		"change_password": "Changer le mot de passe", | ||||
| 		"change_password_error": "Erreur lors du changement de mot de passe. Assurez-vous que le nouveau mot de passe est valide en visitant la page « Politique de mot de passe »", | ||||
| 		"change_password_instructions": "Saisissez et confirmez votre nouveau mot de passe", | ||||
| 		"changing_password": "Modification du mot de passe...", | ||||
| 		"confirm_new_password": "Confirmer le nouveau mot de passe", | ||||
| 		"different_passwords": "Vous devez saisir deux fois le même mot de passe", | ||||
| 		"email_code_validation": "Veuillez vérifier votre boîte e-mail et entrer le code de vérification que nous venons de vous envoyer dans la case ci-dessous", | ||||
| 		"forgot_password_error": "Erreur lors de la tentative d'envoi de l'e-mail Mot de passe oublié. Veuillez vous assurer que cet identifiant est associé à un compte.", | ||||
| 		"forgot_password_explanation": "Entrez votre nom d'utilisateur pour recevoir un e-mail contenant les instructions pour réinitialiser votre mot de passe", | ||||
| 		"forgot_password_success": "Vous devriez bientôt recevoir un e-mail contenant les instructions pour réinitialiser votre mot de passe. S'il vous plaît assurez-vous de vérifier vos spams si vous ne trouvez pas l'e-mail", | ||||
| @@ -431,6 +435,7 @@ | ||||
| 		"login_error": "Erreur de connexion, assurez-vous que les informations que vous fournissez sont valides", | ||||
| 		"new_password": "Nouveau mot de passe", | ||||
| 		"password": "Mot de passe", | ||||
| 		"phone_validation_explanation": "Veuillez vérifier votre appareil mobile et entrer le code de vérification que nous venons de vous envoyer dans la case ci-dessous", | ||||
| 		"please_enter_gateway": "Veuillez saisir une URL uCentralSec", | ||||
| 		"please_enter_password": "s'il vous plait entrez votre mot de passe", | ||||
| 		"please_enter_username": "s'il vous plaît entrez votre nom d'utilisateur", | ||||
| @@ -439,7 +444,9 @@ | ||||
| 		"sending_ellipsis": "Envoi...", | ||||
| 		"sign_in_to_account": "Connectez-vous à votre compte", | ||||
| 		"url": "URL uCentralSec", | ||||
| 		"username": "Nom d'utilisateur" | ||||
| 		"username": "Nom d'utilisateur", | ||||
| 		"verification_code": "Entrez votre vérification ici", | ||||
| 		"wrong_code": "Le code de vérification saisi n'est pas valide." | ||||
| 	}, | ||||
| 	"reboot": { | ||||
| 		"directions": "Quand souhaitez-vous redémarrer cet appareil ?", | ||||
| @@ -530,6 +537,7 @@ | ||||
| 		"add_phone_number": "Ajouter un numéro de téléphone", | ||||
| 		"avatar": "Votre avatar", | ||||
| 		"avatar_file": "Votre Avatar (max. de 2 Mo)", | ||||
| 		"check_phone": "Veuillez vérifier votre téléphone pour votre code de validation", | ||||
| 		"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_success": "L'utilisateur a été créé avec succès", | ||||
| @@ -543,13 +551,16 @@ | ||||
| 		"description": "La description", | ||||
| 		"edit": "Modifier l'utilisateur", | ||||
| 		"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_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.", | ||||
| 		"last_login": "Dernière connexion", | ||||
| 		"login_id": "Identifiant de connexion.", | ||||
| 		"my_profile": "Mon profil", | ||||
| 		"name": "Prénom", | ||||
| 		"new_code_sent": "Nouveau code envoyé !", | ||||
| 		"nickname": "Surnom", | ||||
| 		"nickname_explanation": "Surnom (optionnel)", | ||||
| 		"not_validated": "Pas valide", | ||||
| @@ -559,14 +570,19 @@ | ||||
| 		"provide_email": "Veuillez fournir une adresse email valide", | ||||
| 		"provide_password": "Veuillez fournir un mot de passe valide", | ||||
| 		"save_avatar": "Enregistrer l'avatar", | ||||
| 		"send_code": "Envoyer le code", | ||||
| 		"send_code_again": "Envoyer code à nouveau", | ||||
| 		"show_hide_password": "Afficher/Masquer le mot de passe", | ||||
| 		"successful_validation": "Numéro de téléphone validé ! Cliquez sur le bouton Enregistrer pour le lier à votre profil", | ||||
| 		"update_failure": "Erreur lors de la tentative de mise à jour : {{error}}", | ||||
| 		"update_failure_title": "mise à jour a échoué", | ||||
| 		"update_success": "L'utilisateur a bien été mis à jour", | ||||
| 		"update_success_title": "Succès", | ||||
| 		"user_role": "Rôle", | ||||
| 		"users": "Utilisateurs", | ||||
| 		"validated": "Validé" | ||||
| 		"validate_phone": "Valider", | ||||
| 		"validated": "Validé", | ||||
| 		"wrong_validation_code": "Vous n'avez pas entré de code valide. Veuillez réessayer et assurez-vous d'avoir entré le bon numéro de téléphone" | ||||
| 	}, | ||||
| 	"wifi_analysis": { | ||||
| 		"association": "Association", | ||||
|   | ||||
| @@ -369,6 +369,7 @@ | ||||
| 		"error_create_venue": "Erro ao criar local", | ||||
| 		"error_delete_tag": "Erro ao excluir tag de inventário", | ||||
| 		"error_get_venue": "Erro ao recuperar locais", | ||||
| 		"error_pushing_config": "Erro ao tentar enviar a configuração para o dispositivo: {{error}}", | ||||
| 		"error_retrieving": "Ocorreu um erro ao recuperar as tags de inventário", | ||||
| 		"error_unassign": "Erro durante operação de cancelamento de atribuição", | ||||
| 		"error_update_venue": "Erro ao atualizar o local", | ||||
| @@ -417,12 +418,15 @@ | ||||
| 		"venue": "Local" | ||||
| 	}, | ||||
| 	"login": { | ||||
| 		"account_verification": "Verificação de conta", | ||||
| 		"authentication_expired": "Autenticação expirada, reinicie o processo de login", | ||||
| 		"change_password": "Mudar senha", | ||||
| 		"change_password_error": "Erro ao alterar a senha. Certifique-se de que a nova senha é válida visitando a página 'Política de senha'", | ||||
| 		"change_password_instructions": "Digite e confirme sua nova senha", | ||||
| 		"changing_password": "Alterando senha ...", | ||||
| 		"confirm_new_password": "confirme a nova senha", | ||||
| 		"different_passwords": "Você precisa inserir a mesma senha duas vezes", | ||||
| 		"email_code_validation": "Verifique sua caixa de e-mail e insira o código de verificação que acabamos de enviar na caixa abaixo", | ||||
| 		"forgot_password_error": "Erro ao tentar enviar e-mail Esqueci a senha. Certifique-se de que este userId esteja associado a uma conta.", | ||||
| 		"forgot_password_explanation": "Digite seu nome de usuário para receber um e-mail contendo as instruções para redefinir sua senha", | ||||
| 		"forgot_password_success": "Em breve, você receberá um e-mail com as instruções para redefinir sua senha. Certifique-se de verificar o seu spam se você não conseguir encontrar o e-mail", | ||||
| @@ -431,6 +435,7 @@ | ||||
| 		"login_error": "Erro de login, certifique-se de que as informações que você está fornecendo são válidas", | ||||
| 		"new_password": "Nova senha", | ||||
| 		"password": "Senha", | ||||
| 		"phone_validation_explanation": "Verifique seu dispositivo móvel e insira o código de verificação que acabamos de enviar na caixa abaixo", | ||||
| 		"please_enter_gateway": "Insira um URL uCentralSec", | ||||
| 		"please_enter_password": "Por favor, insira sua senha", | ||||
| 		"please_enter_username": "Por favor insira seu nome de usuário", | ||||
| @@ -439,7 +444,9 @@ | ||||
| 		"sending_ellipsis": "Enviando ...", | ||||
| 		"sign_in_to_account": "Faça login em sua conta", | ||||
| 		"url": "URL uCentralSec", | ||||
| 		"username": "Nome de usuário" | ||||
| 		"username": "Nome de usuário", | ||||
| 		"verification_code": "Insira sua verificação aqui", | ||||
| 		"wrong_code": "O código de verificação inserido não é válido." | ||||
| 	}, | ||||
| 	"reboot": { | ||||
| 		"directions": "Quando você gostaria de reinicializar este dispositivo?", | ||||
| @@ -530,6 +537,7 @@ | ||||
| 		"add_phone_number": "ADICIONAR NÚMERO DE TELEFONE", | ||||
| 		"avatar": "Seu avatar", | ||||
| 		"avatar_file": "Seu avatar (máx. De 2 MB)", | ||||
| 		"check_phone": "Por favor, verifique o seu telefone para o seu código de validação", | ||||
| 		"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_success": "Usuário criado com sucesso", | ||||
| @@ -543,13 +551,16 @@ | ||||
| 		"description": "Descrição", | ||||
| 		"edit": "Editar usuário", | ||||
| 		"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_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.", | ||||
| 		"last_login": "Último login", | ||||
| 		"login_id": "Identificação de usuário.", | ||||
| 		"my_profile": "Meu perfil", | ||||
| 		"name": "Nome", | ||||
| 		"new_code_sent": "Novo código enviado!", | ||||
| 		"nickname": "Apelido", | ||||
| 		"nickname_explanation": "Apelido (opcional)", | ||||
| 		"not_validated": "Não validado", | ||||
| @@ -559,14 +570,19 @@ | ||||
| 		"provide_email": "Por favor, forneça um endereço de e-mail válido", | ||||
| 		"provide_password": "Forneça uma senha válida", | ||||
| 		"save_avatar": "Salvar Avatar", | ||||
| 		"send_code": "Enviar código", | ||||
| 		"send_code_again": "Envie o Código Novamente", | ||||
| 		"show_hide_password": "Mostrar / ocultar senha", | ||||
| 		"successful_validation": "Número de telefone validado! Clique no botão Salvar para vinculá-lo ao seu perfil", | ||||
| 		"update_failure": "Erro ao tentar atualizar: {{error}}", | ||||
| 		"update_failure_title": "Atualização falhou", | ||||
| 		"update_success": "Usuário atualizado com sucesso", | ||||
| 		"update_success_title": "Sucesso", | ||||
| 		"user_role": "Função", | ||||
| 		"users": "Comercial", | ||||
| 		"validated": "Validado" | ||||
| 		"validate_phone": "validar", | ||||
| 		"validated": "Validado", | ||||
| 		"wrong_validation_code": "Você não digitou um código válido. Por favor, tente novamente e certifique-se de ter inserido o número de telefone correto" | ||||
| 	}, | ||||
| 	"wifi_analysis": { | ||||
| 		"association": "Associação", | ||||
|   | ||||
| @@ -5,6 +5,7 @@ import Router from 'router'; | ||||
| import { AuthProvider } from 'ucentral-libs'; | ||||
| import { checkIfJson } from 'utils/helper'; | ||||
| import axiosInstance from 'utils/axiosInstance'; | ||||
| import { getItem } from 'utils/localStorageHelper'; | ||||
|  | ||||
| const loading = ( | ||||
|   <div className="pt-3 text-center"> | ||||
| @@ -13,9 +14,9 @@ const loading = ( | ||||
| ); | ||||
|  | ||||
| const App = () => { | ||||
|   const storageToken = sessionStorage.getItem('access_token'); | ||||
|   const apiEndpoints = checkIfJson(sessionStorage.getItem('gateway_endpoints')) | ||||
|     ? JSON.parse(sessionStorage.getItem('gateway_endpoints')) | ||||
|   const storageToken = getItem('access_token'); | ||||
|   const apiEndpoints = checkIfJson(getItem('gateway_endpoints')) | ||||
|     ? JSON.parse(getItem('gateway_endpoints')) | ||||
|     : {}; | ||||
|  | ||||
|   return ( | ||||
|   | ||||
| @@ -1,7 +1,8 @@ | ||||
| import React, { useState, useEffect } from 'react'; | ||||
| import { useTranslation } from 'react-i18next'; | ||||
| import * as axios from 'axios'; | ||||
| import { LoginPage, useFormFields, useAuth } from 'ucentral-libs'; | ||||
| import { LoginPage, useFormFields, useAuth, useToast } from 'ucentral-libs'; | ||||
| import { setItem } from 'utils/localStorageHelper'; | ||||
|  | ||||
| const initialFormState = { | ||||
|   username: { | ||||
| @@ -46,6 +47,7 @@ const initialResponseState = { | ||||
| const Login = () => { | ||||
|   const { t, i18n } = useTranslation(); | ||||
|   const { setCurrentToken, setEndpoints } = useAuth(); | ||||
|   const { addToast } = useToast(); | ||||
|   const [defaultConfig, setDefaultConfig] = useState({ | ||||
|     value: '', | ||||
|     error: false, | ||||
| @@ -61,8 +63,7 @@ const Login = () => { | ||||
|     passwordPattern: '', | ||||
|     accessPolicy: '', | ||||
|   }); | ||||
|   const [isLogin, setIsLogin] = useState(true); | ||||
|   const [isPasswordChange, setIsChangePassword] = useState(false); | ||||
|   const [formType, setFormType] = useState('login'); | ||||
|   const [fields, updateFieldWithId, updateField, setFormFields] = useFormFields(initialFormState); | ||||
|   const axiosInstance = axios.create(); | ||||
|   axiosInstance.defaults.timeout = 5000; | ||||
| @@ -76,7 +77,8 @@ const Login = () => { | ||||
|     }); | ||||
|     setLoginResponse(initialResponseState); | ||||
|     setForgotResponse(initialResponseState); | ||||
|     setIsLogin(!isLogin); | ||||
|     if (formType === 'login') setFormType('forgot-password'); | ||||
|     else setFormType('login'); | ||||
|   }; | ||||
|  | ||||
|   const cancelPasswordChange = () => { | ||||
| @@ -88,8 +90,7 @@ const Login = () => { | ||||
|     }); | ||||
|     setLoginResponse(initialResponseState); | ||||
|     setForgotResponse(initialResponseState); | ||||
|     setIsLogin(true); | ||||
|     setIsChangePassword(false); | ||||
|     setFormType('login'); | ||||
|   }; | ||||
|  | ||||
|   const signInValidation = () => { | ||||
| @@ -106,7 +107,10 @@ const Login = () => { | ||||
|       updateField('username', { error: true }); | ||||
|       valid = false; | ||||
|     } | ||||
|     if (isPasswordChange && fields.newpassword.value !== fields.confirmpassword.value) { | ||||
|     if ( | ||||
|       formType === 'change-password' && | ||||
|       fields.newpassword.value !== fields.confirmpassword.value | ||||
|     ) { | ||||
|       updateField('confirmpassword', { error: true }); | ||||
|       valid = false; | ||||
|     } | ||||
| @@ -172,6 +176,20 @@ const Login = () => { | ||||
|       .catch(); | ||||
|   }; | ||||
|  | ||||
|   const getGatewayUIUrl = (token, gwUrl) => { | ||||
|     axiosInstance | ||||
|       .get(`${gwUrl}/api/v1/system?command=info`, { | ||||
|         headers: { | ||||
|           Accept: 'application/json', | ||||
|           Authorization: `Bearer ${token}`, | ||||
|         }, | ||||
|       }) | ||||
|       .then((response) => { | ||||
|         if (response.data.UI) setItem('owgw-ui', response.data.UI); | ||||
|       }) | ||||
|       .catch(() => {}); | ||||
|   }; | ||||
|  | ||||
|   const SignIn = () => { | ||||
|     setLoginResponse(initialResponseState); | ||||
|     if (signInValidation()) { | ||||
| @@ -183,18 +201,23 @@ const Login = () => { | ||||
|         password: fields.password.value, | ||||
|       }; | ||||
|  | ||||
|       if (isPasswordChange) { | ||||
|       if (formType === 'change-password') { | ||||
|         parameters.newPassword = fields.newpassword.value; | ||||
|       } | ||||
|  | ||||
|       axiosInstance | ||||
|         .post(`${fields.ucentralsecurl.value}/api/v1/oauth2`, parameters) | ||||
|         .then((response) => { | ||||
|           if (response.data.userMustChangePassword) { | ||||
|             setIsChangePassword(true); | ||||
|           // If there's MFA to do | ||||
|           if (response.data.method && response.data.created) { | ||||
|             setFormType(`validation-${response.data.method}-${response.data.uuid}`); | ||||
|             return null; | ||||
|           } | ||||
|           sessionStorage.setItem('access_token', response.data.access_token); | ||||
|           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: { | ||||
| @@ -211,18 +234,19 @@ const Login = () => { | ||||
|             for (const endpoint of response.data.endpoints) { | ||||
|               endpoints[endpoint.type] = endpoint.uri; | ||||
|             } | ||||
|             sessionStorage.setItem('gateway_endpoints', JSON.stringify(endpoints)); | ||||
|             if (endpoints.owgw) getGatewayUIUrl(token, endpoints.owgw); | ||||
|             setItem('gateway_endpoints', JSON.stringify(endpoints)); | ||||
|             setEndpoints(endpoints); | ||||
|             setCurrentToken(token); | ||||
|           } | ||||
|         }) | ||||
|         .catch((error) => { | ||||
|           if (!isPasswordChange) { | ||||
|           if (formType !== 'change-password') { | ||||
|             if ( | ||||
|               error.response.status === 403 && | ||||
|               error.response?.data?.ErrorDescription === 'Password change expected.' | ||||
|             ) { | ||||
|               setIsChangePassword(true); | ||||
|               setFormType('change-password'); | ||||
|             } | ||||
|             setLoginResponse({ | ||||
|               text: t('login.login_error'), | ||||
| @@ -279,6 +303,95 @@ const Login = () => { | ||||
|     } | ||||
|   }; | ||||
|  | ||||
|   const validateCode = (code) => { | ||||
|     const options = { | ||||
|       headers: { | ||||
|         Accept: 'application/json', | ||||
|       }, | ||||
|     }; | ||||
|  | ||||
|     const parameters = { | ||||
|       uuid: formType.split('-').slice(2).join('-'), | ||||
|       answer: code, | ||||
|     }; | ||||
|  | ||||
|     let token = ''; | ||||
|  | ||||
|     return axiosInstance | ||||
|       .post( | ||||
|         `${fields.ucentralsecurl.value}/api/v1/oauth2?completeMFAChallenge=true`, | ||||
|         parameters, | ||||
|         options, | ||||
|       ) | ||||
|       .then((response) => { | ||||
|         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); | ||||
|           setItem('gateway_endpoints', JSON.stringify(endpoints)); | ||||
|           setEndpoints(endpoints); | ||||
|           setCurrentToken(token); | ||||
|         } | ||||
|       }) | ||||
|       .catch(() => false) | ||||
|       .finally(() => { | ||||
|         setLoading(false); | ||||
|         return true; | ||||
|       }); | ||||
|   }; | ||||
|  | ||||
|   const resendValidationCode = () => { | ||||
|     const options = { | ||||
|       headers: { | ||||
|         Accept: 'application/json', | ||||
|       }, | ||||
|     }; | ||||
|  | ||||
|     const parameters = { | ||||
|       uuid: formType.split('-').slice(2).join('-'), | ||||
|     }; | ||||
|  | ||||
|     return axiosInstance | ||||
|       .post(`${fields.ucentralsecurl.value}/api/v1/oauth2?resendMFACode=true`, parameters, options) | ||||
|       .then(() => { | ||||
|         addToast({ | ||||
|           title: t('common.success'), | ||||
|           body: t('user.new_code_sent'), | ||||
|           color: 'success', | ||||
|           autohide: true, | ||||
|         }); | ||||
|         return true; | ||||
|       }) | ||||
|       .catch((e) => { | ||||
|         addToast({ | ||||
|           title: t('common.error'), | ||||
|           body: t('login.authentication_expired'), | ||||
|           color: 'danger', | ||||
|           autohide: true, | ||||
|         }); | ||||
|         if (e.response?.data?.ErrorCode === 403) setFormType('login'); | ||||
|         return false; | ||||
|       }); | ||||
|   }; | ||||
|  | ||||
|   useEffect(() => { | ||||
|     getDefaultConfig(); | ||||
|   }, []); | ||||
| @@ -287,21 +400,22 @@ const Login = () => { | ||||
|     <LoginPage | ||||
|       t={t} | ||||
|       i18n={i18n} | ||||
|       logo="assets/OpenWiFi_LogoLockup_DarkGreyColour.svg" | ||||
|       signIn={SignIn} | ||||
|       loading={loading} | ||||
|       logo="assets/OpenWiFi_LogoLockup_DarkGreyColour.svg" | ||||
|       loginResponse={loginResponse} | ||||
|       forgotResponse={forgotResponse} | ||||
|       fields={fields} | ||||
|       updateField={updateFieldWithId} | ||||
|       toggleForgotPassword={toggleForgotPassword} | ||||
|       isLogin={isLogin} | ||||
|       isPasswordChange={isPasswordChange} | ||||
|       formType={formType} | ||||
|       onKeyDown={onKeyDown} | ||||
|       sendForgotPasswordEmail={sendForgotPasswordEmail} | ||||
|       changePasswordResponse={changePasswordResponse} | ||||
|       cancelPasswordChange={cancelPasswordChange} | ||||
|       policies={policies} | ||||
|       validateCode={validateCode} | ||||
|       resendValidationCode={resendValidationCode} | ||||
|     /> | ||||
|   ); | ||||
| }; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| import React, { useState, useEffect } from 'react'; | ||||
| import { useTranslation } from 'react-i18next'; | ||||
| import { CCard, CCardBody, CCardHeader, CButton, CPopover } from '@coreui/react'; | ||||
| import CIcon from '@coreui/icons-react'; | ||||
| import { cilSave } from '@coreui/icons'; | ||||
| import CIcon from '@coreui/icons-react'; | ||||
| import axiosInstance from 'utils/axiosInstance'; | ||||
| import { testRegex } from 'utils/helper'; | ||||
| import { useUser, EditMyProfile, useAuth, useToast } from 'ucentral-libs'; | ||||
| @@ -42,6 +42,14 @@ const initialState = { | ||||
|     value: [], | ||||
|     editable: false, | ||||
|   }, | ||||
|   userTypeProprietaryInfo: { | ||||
|     value: {}, | ||||
|     error: false, | ||||
|   }, | ||||
|   mfaMethod: { | ||||
|     value: '', | ||||
|     error: false, | ||||
|   }, | ||||
| }; | ||||
|  | ||||
| const ProfilePage = () => { | ||||
| @@ -49,7 +57,6 @@ const ProfilePage = () => { | ||||
|   const { currentToken, endpoints, user, getAvatar, avatar } = useAuth(); | ||||
|   const { addToast } = useToast(); | ||||
|   const [loading, setLoading] = useState(false); | ||||
|   const [initialUser, setInitialUser] = useState({}); | ||||
|   const [userForm, updateWithId, updateWithKey, setUser] = useUser(initialState); | ||||
|   const [newAvatar, setNewAvatar] = useState(''); | ||||
|   const [newAvatarFile, setNewAvatarFile] = useState(null); | ||||
| @@ -93,10 +100,24 @@ const ProfilePage = () => { | ||||
|             }; | ||||
|           } | ||||
|         } | ||||
|         setInitialUser({ ...initialState, ...newUser }); | ||||
|  | ||||
|         newUser.mfaMethod = { | ||||
|           value: response.data.userTypeProprietaryInfo.mfa.enabled | ||||
|             ? response.data.userTypeProprietaryInfo.mfa.method | ||||
|             : '', | ||||
|           error: false, | ||||
|         }; | ||||
|  | ||||
|         setUser({ ...initialState, ...newUser }); | ||||
|       }) | ||||
|       .catch(() => {}); | ||||
|       .catch((e) => { | ||||
|         addToast({ | ||||
|           title: t('common.error'), | ||||
|           body: t('user.error_fetching_users', { error: e }), | ||||
|           color: 'danger', | ||||
|           autohide: true, | ||||
|         }); | ||||
|       }); | ||||
|   }; | ||||
|  | ||||
|   const uploadAvatar = () => { | ||||
| @@ -124,10 +145,10 @@ const ProfilePage = () => { | ||||
|         setNewAvatarFile(null); | ||||
|         setFileInputKey(fileInputKey + 1); | ||||
|       }) | ||||
|       .catch((e) => { | ||||
|       .catch(() => { | ||||
|         addToast({ | ||||
|           title: t('user.update_failure_title'), | ||||
|           body: t('user.update_failure', { error: e.response?.data?.ErrorDescription }), | ||||
|           body: t('user.update_failure'), | ||||
|           color: 'danger', | ||||
|           autohide: true, | ||||
|         }); | ||||
| @@ -137,34 +158,38 @@ const ProfilePage = () => { | ||||
|   const updateUser = () => { | ||||
|     setLoading(true); | ||||
|  | ||||
|     const parameters = { | ||||
|       id: user.Id, | ||||
|     }; | ||||
|  | ||||
|     let newData = true; | ||||
|  | ||||
|     for (const key of Object.keys(userForm)) { | ||||
|       if (userForm[key].editable && userForm[key].value !== initialUser[key].value) { | ||||
|         if ( | ||||
|           key === 'currentPassword' && | ||||
|           !testRegex(userForm[key].value, policies.passwordPattern) | ||||
|         ) { | ||||
|           updateWithKey('currentPassword', { | ||||
|             error: true, | ||||
|           }); | ||||
|           newData = false; | ||||
|           break; | ||||
|         } else { | ||||
|           parameters[key] = userForm[key].value; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     if (newAvatarFile !== null) { | ||||
|       uploadAvatar(); | ||||
|     } | ||||
|  | ||||
|     if (newData) { | ||||
|     if ( | ||||
|       userForm.currentPassword.value !== '' && | ||||
|       !testRegex(userForm.currentPassword.value, policies.passwordPattern) | ||||
|     ) { | ||||
|       updateWithKey('currentPassword', { | ||||
|         error: true, | ||||
|       }); | ||||
|       setLoading(false); | ||||
|     } else { | ||||
|       const newNotes = []; | ||||
|  | ||||
|       for (let i = 0; i < userForm.notes.value.length; i += 1) { | ||||
|         if (userForm.notes.value[i].new) newNotes.push({ note: userForm.notes.value[i].note }); | ||||
|       } | ||||
|  | ||||
|       const propInfo = { ...userForm.userTypeProprietaryInfo.value }; | ||||
|       propInfo.mfa.method = userForm.mfaMethod.value === '' ? undefined : userForm.mfaMethod.value; | ||||
|       propInfo.mfa.enabled = userForm.mfaMethod.value !== ''; | ||||
|  | ||||
|       const parameters = { | ||||
|         id: user.Id, | ||||
|         description: userForm.description.value, | ||||
|         name: userForm.name.value, | ||||
|         userRole: userForm.userRole.value, | ||||
|         notes: newNotes, | ||||
|         userTypeProprietaryInfo: propInfo, | ||||
|       }; | ||||
|  | ||||
|       const options = { | ||||
|         headers: { | ||||
|           Accept: 'application/json', | ||||
| @@ -194,35 +219,18 @@ const ProfilePage = () => { | ||||
|           getUser(); | ||||
|           setLoading(false); | ||||
|         }); | ||||
|     } else { | ||||
|       setLoading(false); | ||||
|     } | ||||
|   }; | ||||
|  | ||||
|   const addNote = (currentNote) => { | ||||
|     setLoading(true); | ||||
|  | ||||
|     const parameters = { | ||||
|       id: user.Id, | ||||
|       notes: [{ note: currentNote }], | ||||
|     }; | ||||
|  | ||||
|     const options = { | ||||
|       headers: { | ||||
|         Accept: 'application/json', | ||||
|         Authorization: `Bearer ${currentToken}`, | ||||
|       }, | ||||
|     }; | ||||
|  | ||||
|     axiosInstance | ||||
|       .put(`${endpoints.owsec}/api/v1/user/${user.Id}`, parameters, options) | ||||
|       .then(() => { | ||||
|         getUser(); | ||||
|       }) | ||||
|       .catch(() => {}) | ||||
|       .finally(() => { | ||||
|         setLoading(false); | ||||
|       }); | ||||
|     const newNotes = [...userForm.notes.value]; | ||||
|     newNotes.unshift({ | ||||
|       note: currentNote, | ||||
|       new: true, | ||||
|       created: new Date().getTime() / 1000, | ||||
|       createdBy: '', | ||||
|     }); | ||||
|     updateWithKey('notes', { value: newNotes }); | ||||
|   }; | ||||
|  | ||||
|   const showPreview = (e) => { | ||||
| @@ -239,6 +247,7 @@ const ProfilePage = () => { | ||||
|         Authorization: `Bearer ${currentToken}`, | ||||
|       }, | ||||
|     }; | ||||
|  | ||||
|     return axiosInstance | ||||
|       .delete(`${endpoints.owsec}/api/v1/avatar/${user.Id}`, options) | ||||
|       .then(() => { | ||||
| @@ -250,6 +259,54 @@ const ProfilePage = () => { | ||||
|       }); | ||||
|   }; | ||||
|  | ||||
|   const sendPhoneNumberTest = async (phoneNumber) => { | ||||
|     const options = { | ||||
|       headers: { | ||||
|         Accept: 'application/json', | ||||
|         Authorization: `Bearer ${currentToken}`, | ||||
|       }, | ||||
|     }; | ||||
|  | ||||
|     return axiosInstance | ||||
|       .post(`${endpoints.owsec}/api/v1/sms?validateNumber=true`, { to: phoneNumber }, options) | ||||
|       .then(() => true) | ||||
|       .catch(() => { | ||||
|         addToast({ | ||||
|           title: t('common.error'), | ||||
|           body: t('user.error_sending_code'), | ||||
|           color: 'danger', | ||||
|           autohide: true, | ||||
|         }); | ||||
|         return false; | ||||
|       }); | ||||
|   }; | ||||
|  | ||||
|   const testVerificationCode = async (phoneNumber, code) => { | ||||
|     const options = { | ||||
|       headers: { | ||||
|         Accept: 'application/json', | ||||
|         Authorization: `Bearer ${currentToken}`, | ||||
|       }, | ||||
|     }; | ||||
|  | ||||
|     return axiosInstance | ||||
|       .post( | ||||
|         `${endpoints.owsec}/api/v1/sms?completeValidation=true&validationCode=${code}`, | ||||
|         { to: phoneNumber }, | ||||
|         options, | ||||
|       ) | ||||
|       .then(() => true) | ||||
|       .catch(() => { | ||||
|         addToast({ | ||||
|           title: t('common.error'), | ||||
|           body: t('user.wrong_validation_code'), | ||||
|           color: 'danger', | ||||
|           autohide: true, | ||||
|         }); | ||||
|         return false; | ||||
|       }); | ||||
|   }; | ||||
|  | ||||
|   useEffect(() => { | ||||
|     if (user.Id) { | ||||
|       getAvatar(); | ||||
| @@ -262,11 +319,12 @@ const ProfilePage = () => { | ||||
|  | ||||
|   return ( | ||||
|     <CCard> | ||||
|       <CCardHeader> | ||||
|         <div className="text-right"> | ||||
|       <CCardHeader className="p-1"> | ||||
|         <div className="text-value-lg float-left">{t('user.my_profile')}</div> | ||||
|         <div className="text-right float-right"> | ||||
|           <CPopover content={t('common.save')}> | ||||
|             <CButton onClick={updateUser} color="primary" variant="outline" disabled={loading}> | ||||
|               <CIcon content={cilSave} /> | ||||
|             <CButton color="primary" variant="outline" onClick={updateUser} className="mx-1"> | ||||
|               <CIcon name="cil-save" content={cilSave} /> | ||||
|             </CButton> | ||||
|           </CPopover> | ||||
|         </div> | ||||
| @@ -276,6 +334,7 @@ const ProfilePage = () => { | ||||
|           t={t} | ||||
|           user={userForm} | ||||
|           updateUserWithId={updateWithId} | ||||
|           updateWithKey={updateWithKey} | ||||
|           loading={loading} | ||||
|           policies={policies} | ||||
|           addNote={addNote} | ||||
| @@ -284,6 +343,8 @@ const ProfilePage = () => { | ||||
|           showPreview={showPreview} | ||||
|           deleteAvatar={deleteAvatar} | ||||
|           fileInputKey={fileInputKey} | ||||
|           sendPhoneNumberTest={sendPhoneNumberTest} | ||||
|           testVerificationCode={testVerificationCode} | ||||
|         /> | ||||
|       </CCardBody> | ||||
|     </CCard> | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| import { useAuth } from 'ucentral-libs'; | ||||
| import { useAuth, ToastProvider } from 'ucentral-libs'; | ||||
| import { Route } from 'react-router-dom'; | ||||
| import React from 'react'; | ||||
|  | ||||
| @@ -16,7 +16,9 @@ const Routes = () => { | ||||
|         currentToken !== '' && Object.keys(endpoints).length !== 0 ? ( | ||||
|           <TheLayout {...props} /> | ||||
|         ) : ( | ||||
|           <Login {...props} /> | ||||
|           <ToastProvider> | ||||
|             <Login {...props} /> | ||||
|           </ToastProvider> | ||||
|         ) | ||||
|       } | ||||
|     /> | ||||
|   | ||||
| @@ -20,6 +20,8 @@ axiosInstance.interceptors.response.use( | ||||
|       case 401: | ||||
|         break; | ||||
|       case 403: | ||||
|         localStorage.removeItem('access_token'); | ||||
|         localStorage.removeItem('gateway_endpoints'); | ||||
|         sessionStorage.clear(); | ||||
|         window.location.href = '/'; | ||||
|         break; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Charles
					Charles