diff --git a/www/i18n/locale-en-GB.json b/www/i18n/locale-en-GB.json index adc3ddfc00b88ddd03361be311a9e112a7038b8a..c79263a8df87e024190c1f5da6e2b15c120a570c 100644 --- a/www/i18n/locale-en-GB.json +++ b/www/i18n/locale-en-GB.json @@ -31,7 +31,7 @@ "BTN_ADD": "Add", "BTN_SEARCH": "Search", "BTN_REFRESH": "Refresh", - "BTN_RETRY": "Try again", + "BTN_RETRY": "Retry", "BTN_START": "Start", "BTN_CONTINUE": "Continue", "BTN_CREATE": "Create", @@ -571,6 +571,8 @@ "FIELD_TOO_SHORT_WITH_LENGTH": "This field value is too short.", "FIELD_TOO_LONG": "Value is exceeding max length.", "FIELD_TOO_LONG_WITH_LENGTH": "Value is too long (max {{maxLength}} characters).", + "FIELD_MIN": "Minimum value: {{min}}", + "FIELD_MAX": "Maximal value: {{max}}", "FIELD_ACCENT": "Commas and accent characters not allowed", "FIELD_NOT_NUMBER": "Value is not a number", "FIELD_NOT_INT": "Value is not an integer", diff --git a/www/i18n/locale-en.json b/www/i18n/locale-en.json index ffec30a4f462bbcea29d657f70222d2aa88769a4..17dcd1510fd4a289133e354c18a8e2a1cf4becb3 100644 --- a/www/i18n/locale-en.json +++ b/www/i18n/locale-en.json @@ -571,6 +571,8 @@ "FIELD_TOO_SHORT_WITH_LENGTH": "This field value is too short.", "FIELD_TOO_LONG": "Value is exceeding max length.", "FIELD_TOO_LONG_WITH_LENGTH": "Value is too long (max {{maxLength}} characters).", + "FIELD_MIN": "Minimum value: {{min}}", + "FIELD_MAX": "Maximal value: {{max}}", "FIELD_ACCENT": "Commas and accent characters not allowed", "FIELD_NOT_NUMBER": "Value is not a number", "FIELD_NOT_INT": "Value is not an integer", diff --git a/www/i18n/locale-es-ES.json b/www/i18n/locale-es-ES.json index ea791d926f3679e9954d0f1aaed3d57c4c25f64d..6741c10dea408981f2ee485904015a07e54dba6e 100644 --- a/www/i18n/locale-es-ES.json +++ b/www/i18n/locale-es-ES.json @@ -31,8 +31,10 @@ "BTN_ADD": "Añadir", "BTN_SEARCH": "Buscar", "BTN_REFRESH": "Actualisar", + "BTN_RETRY": "Empezar de nuevo", "BTN_START": "Empezar", "BTN_CONTINUE": "Continuar", + "BTN_CREATE": "Crear", "BTN_UNDERSTOOD": "He entendido", "BTN_OPTIONS": "Opciónes", "BTN_HELP_TOUR": "Visita guiada", @@ -40,6 +42,7 @@ "BTN_DOWNLOAD": "Descargar", "BTN_DOWNLOAD_ACCOUNT_STATEMENT": "Descargar el estado de cuenta", "BTN_MODIFY": "Cambio", + "CHOOSE_FILE": "Publique archivo<br/>o haga clic para seleccionar la", "DAYS": "Dias", "NO_ACCOUNT_QUESTION": "TodavÃa no miembre ? Creer una cuenta !", "SEARCH_NO_RESULT": "Ninguno resultado encontrado", @@ -84,7 +87,6 @@ "HOME": "Recepción", "WOT": "Anuario", "CURRENCY": "Moneda", - "CURRENCIES": "Monnaies", "ACCOUNT": "Mi cuenta", "TRANSFER": "Transferencia", "SCAN": "Escáner", @@ -274,6 +276,7 @@ "CURRENT_BLOCK" : "Bloque #", "POPOVER_FILTER_TITLE": "Filtro", "OFFLINE": "Nodos fuera de lÃnea", + "BTN_SHOW_PEER": "Ver nodo", "VIEW": { "TITLE": "Nodo", "OWNER": "Propiedad de ", @@ -360,6 +363,7 @@ "SHOW_SALT": "Visualizar el identificador secreto ?", "PASSWORD": "Contraseña", "PASSWORD_HELP": "Contraseña", + "PUBKEY_HELP": "Ejemplo : « AbsxSY4qoZRzyV2irfep1V9xw1EMNyKJw2TkuVD4N1mv »", "NO_ACCOUNT_QUESTION": "Ahora no tiene cuenta ?", "CREATE_ACCOUNT": "Creer una cuenta", "FORGOTTEN_ID": "Contraseña olvidada ?", @@ -382,7 +386,7 @@ "PENDING_TX": "Transacciónes en proceso de tratamiento", "ERROR_TX": "Transacciónes no ejecutadas", "ERROR_TX_SENT": "Transacciónes mandadas", - "ERROR_TX_RECEIVED": "Transacciónes recibidas", + "PENDING_TX_RECEIVED": "Tansacciones en espera de la recepción", "EVENTS": "Eventos", "WAITING_MEMBERSHIP": "Solicitud de adhesión mandada. En espera de aceptación.", "WAITING_CERTIFICATIONS": "Debe obtener {{needCertificationCount}} certificación(es) para estar miembro.", @@ -416,8 +420,10 @@ "REGISTRATION_NODE_HELP": "Si usted no confÃa en este nodo, <a ng-click=\"doQuickFix('settings')\">cambie la configuración</a> de Cesium.", "SELECT_ACCOUNT_TYPE": "Elegir el tipo de cuenta para crear:", "MEMBER_ACCOUNT": "Cuenta miembro", + "MEMBER_ACCOUNT_TITLE": "Crear de un cuenta de miembro", "MEMBER_ACCOUNT_HELP": "Si ya no está inscrito como un individuo (Solamente una cuenta posible por individuo).", "WALLET_ACCOUNT": "Simple monedero", + "WALLET_ACCOUNT_TITLE": "Crear de un simple cuenta", "WALLET_ACCOUNT_HELP": "Simple cartera por todos otros casos, por ejemplo si necesita una cuenta suplementaria.<br/>No Dividendo Universal sera creido por esta cuenta.", "SALT_WARNING": "Elige su identificador secreto.<br/>Se solicitará cada vez se conectará con esta cuenta.<br/><br/><b>Retiene bien este identificador secreto</b>.<br/>En caso de pérdida, nadie podrá acceder su cuenta !", "PASSWORD_WARNING": "Elige su contraseña.<br/>Se solicitará cada vez se conectará con esta cuenta.<br/><br/><b>Retiene bien esta contraseña</b>.<br/>En caso de pérdida, nadie podrá acceder su cuenta !", @@ -448,8 +454,6 @@ "ADD_QUESTION": "Añadir una pregunta personalizada ", "BTN_CLEAN": "Vaciar", "BTN_RESET": "Reinicializar", - "CHOOSE_FILE": "Dejar su fichero <br/>o hace un clic para seleccionarlo", - "DEFINITELY_REVOKE": "Revocar definitivamente esta identidad", "DOWNLOAD_REVOKE": "Salvar un fichero de revocación", "HELP_LEVEL": "Para generar un fichero de salvaguarda de sus identificadores, elige <strong> al menos {{nb}} preguntas :</strong>", "LEVEL": "Nivel de seguridad", @@ -475,10 +479,9 @@ "QUESTION_18": "Cuál es el nombre de su equipo de deporte preferido ?", "QUESTION_19": "Cuál fue el oficio de su abuelo ?", "RECOVER_ID": "Recuperar sus identificadores", - "REVOCATION": "Revocación ...", + "REVOCATION_WITH_FILE": "Revocar una identidad a partir de un fichero", "REVOCATION_FILENAME": "revocation-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt", - "REVOKE": "Revocar esta identidad", - "REVOKE_WITH_FILE": "Revocar una identidad a partir de un fichero", + "REVOCATION_WALLET": "Revocar esta identidad", "SAVE_ID": "Salvar sus identificadores", "STRONG_LEVEL": "Alto <span class=\"hidden-xs \">(6 preguntas mÃnimo)</span>", "TITLE": "Cuenta y seguridad" @@ -514,6 +517,8 @@ "FIELD_TOO_SHORT_WITH_LENGTH": "Valor demasiado corta ({{minLength}} carácteres mÃn)", "FIELD_TOO_LONG": "Valor demasiado larga", "FIELD_TOO_LONG_WITH_LENGTH": "Valor demasiado larga ({{maxLength}} carácteres máx)", + "FIELD_MIN": "Valor mÃnimo : {{min}}", + "FIELD_MAX": "Valor máximo : {{max}}", "FIELD_ACCENT": "Carácteres acentuados y comas no autorizados", "FIELD_NOT_NUMBER": "Valor numérica esperada", "FIELD_NOT_INT": "Valor entera esperada", @@ -574,11 +579,14 @@ "ONLY_SELF_CAN_EXECUTE_THIS_ACTION": "Debe haber <b>publicado su identidad</b> para poder realizar esta acción.", "GET_BLOCK_FAILED": "Fracaso en la recuperación del bloque", "INVALID_BLOCK_HASH": "Bloque no encontrado (hash diferente)", + "DOWNLOAD_REVOCATION_FAILED": "Debe seleccionar un fichero texto", "REVOCATION_FAILED": "Fracas en la revocación.", "SALT_OR_PASSWORD_NOT_CONFIRMED": "Identificador secreto o contraseña incorrectos", "RECOVER_ID_FAILED": "Fracaso en la recuperación de los identificadores", "LOAD_FILE_FAILED" : "Fracaso en la carga del fichero", - "ONLY_TEXT_FILE": "Debe seleccionar un fichero texto", + "NOT_VALID_REVOCATION_FILE": "Revocación archivo no válido (formato de archivo malo)", + "NOT_VALID_SAVE_ID_FILE": "Archivo no válido (formato de archivo malo)", + "NOT_VALID_KEY_FILE": "Archivo no válido (formato de archivo malo)", "EXISTING_ACCOUNT": "Su contraseña corresponde a una cuenta existente, la <a ng-click=\"showHelpModal('pubkey')\">clave pública</a> es:", "EXISTING_ACCOUNT_REQUEST": "Por favor, cambie su contraseña para que coincida con una cuenta sin usar.", "GET_LICENSE_FILE_FAILED": "Obtener el archivo de licencia no puede", diff --git a/www/i18n/locale-fr-FR.json b/www/i18n/locale-fr-FR.json index 7ccee6f2356d570c134d3e0f081b95a8e3c1bb88..5c92c4295f2b1c0276d7dfc45815bbcca5aef600 100644 --- a/www/i18n/locale-fr-FR.json +++ b/www/i18n/locale-fr-FR.json @@ -86,9 +86,7 @@ "MENU": { "HOME": "Accueil", "WOT": "Annuaire", - "MARKET": "Annonces", "CURRENCY": "Monnaie", - "CURRENCIES": "Monnaies", "ACCOUNT": "Mon compte", "TRANSFER": "Virement", "SCAN": "Scanner", @@ -571,6 +569,8 @@ "FIELD_TOO_SHORT_WITH_LENGTH": "Valeur trop courte ({{minLength}} caractères min)", "FIELD_TOO_LONG": "Valeur trop longue", "FIELD_TOO_LONG_WITH_LENGTH": "Valeur trop longue ({{maxLength}} caractères max)", + "FIELD_MIN": "Valeur minimale : {{min}}", + "FIELD_MAX": "Valeur maximale : {{max}}", "FIELD_ACCENT": "Caractères accentués et virgules non autorisés", "FIELD_NOT_NUMBER": "Valeur numérique attendue", "FIELD_NOT_INT": "Valeur entière attendue", diff --git a/www/plugins/es/js/controllers/profile-controllers.js b/www/plugins/es/js/controllers/profile-controllers.js index af5743f350b46fe2791ade8f88c8af664de68679..218ddd2f014d85a19d1b724bf6dcde42b934fcf9 100644 --- a/www/plugins/es/js/controllers/profile-controllers.js +++ b/www/plugins/es/js/controllers/profile-controllers.js @@ -76,15 +76,31 @@ function ESViewEditProfileController($scope, $rootScope, $q, $timeout, $state, $ .then(function(confirmSave) { $scope.loading = false; if (confirmSave) { - return $scope.save(); + $scope.form.$submitted=true; + return $scope.save(false/*silent*/, true/*haswait debounce*/) + .then(function(saved){ + if (saved) { + $scope.dirty = false; + } + return saved; // change state only if not error + }); + } + else { + $scope.dirty = false; + return true; // ok, change state } }) - .then(function() { - $scope.dirty = false; - $ionicHistory.nextViewOptions({ - historyRoot: true - }); - $state.go(next.name, nextParams); + .then(function(confirmGo) { + if (confirmGo) { + // continue to the order state + $ionicHistory.nextViewOptions({ + historyRoot: true + }); + $state.go(next.name, nextParams); + } + }) + .catch(function(err) { + }); } } @@ -125,6 +141,8 @@ function ESViewEditProfileController($scope, $rootScope, $q, $timeout, $state, $ if (profile.avatar) { $scope.avatarStyle={'background-image':'url("'+$scope.avatar.src+'")'}; } + $scope.formData.geoPoint = $scope.formData.geoPoint || {}; + $scope.motion.show(); UIUtils.loading.hide(); @@ -208,12 +226,12 @@ function ESViewEditProfileController($scope, $rootScope, $q, $timeout, $state, $ if (formData.position) { delete formData.position; } - if ($scope.formData.geoPoint && $scope.formData.geoPoint.lat && $scope.formData.geoPoint.lon) { - $scope.formData.geoPoint.lat = parseFloat($scope.formData.geoPoint.lat); - $scope.formData.geoPoint.lon = parseFloat($scope.formData.geoPoint.lon); + if (formData.geoPoint && formData.geoPoint.lat && formData.geoPoint.lon) { + formData.geoPoint.lat = parseFloat(formData.geoPoint.lat); + formData.geoPoint.lon = parseFloat(formData.geoPoint.lon); } else{ - $scope.formData.geoPoint = null; + formData.geoPoint = null; } if (!$scope.existing) { @@ -225,6 +243,7 @@ function ESViewEditProfileController($scope, $rootScope, $q, $timeout, $state, $ $scope.dirty = false; updateWallet(formData); showSuccessToast(); + return true; }) .catch(onError('PROFILE.ERROR.SAVE_PROFILE_FAILED')); } @@ -236,16 +255,17 @@ function ESViewEditProfileController($scope, $rootScope, $q, $timeout, $state, $ $scope.dirty = false; updateWallet(formData); showSuccessToast(); + return true; }) .catch(onError('PROFILE.ERROR.SAVE_PROFILE_FAILED')); } - }; + }; // end of doFinishSave if ($scope.avatar && $scope.avatar.src) { return UIUtils.image.resizeSrc($scope.avatar.src, true) // resize to thumbnail .then(function(imageSrc) { $scope.formData.avatar = esHttp.image.toAttachment({src: imageSrc}); - doFinishSave($scope.formData); + return doFinishSave($scope.formData); }); } else { @@ -255,9 +275,9 @@ function ESViewEditProfileController($scope, $rootScope, $q, $timeout, $state, $ }; $scope.saveAndClose = function() { - $scope.save() - .then(function() { - $scope.close(); + return $scope.save() + .then(function(saved) { + if (saved) $scope.close(); }); }; diff --git a/www/plugins/es/templates/user/edit_profile.html b/www/plugins/es/templates/user/edit_profile.html index 7fc1f170b2c79b9ce6dcdafa903f043f5b4e9622..5217f28dc80190ccf4531c790d6960c8fd97ef4b 100644 --- a/www/plugins/es/templates/user/edit_profile.html +++ b/www/plugins/es/templates/user/edit_profile.html @@ -118,13 +118,27 @@ <!-- lat --> <div class="col no-padding"> - <label class="item item-input item-floating-label"> + <label class="item item-input item-floating-label" + ng-class="{'item-input-error': form.$submitted && form.latitude.$invalid}"> <span class="input-label" translate>PROFILE.LATITUDE</span> - <input class="no-padding-right" type="number" placeholder="{{'PROFILE.LATITUDE_HELP'|translate}}" + <input class="no-padding-right" + name="latitude" + type="number" placeholder="{{'PROFILE.LATITUDE_HELP'|translate}}" ng-model="formData.geoPoint.lat" ng-model-options="{ debounce: 350 }" - ng-change="onGeoPointChanged()"> + ng-change="onFormDataChanged()" + min="-90" max="90"> </label> + <div class="form-errors" + ng-show="form.$submitted && form.latitude.$error" + ng-messages="form.latitude.$error"> + <div class="form-error" ng-message="min"> + <span translate="ERROR.FIELD_MIN" translate-values="{min: -90}"></span> + </div> + <div class="form-error" ng-message="max"> + <span translate="ERROR.FIELD_MAX" translate-values="{max: 90}"></span> + </div> + </div> </div> <div class="col-10 no-padding hidden-xs"> @@ -133,13 +147,27 @@ <!-- lon --> <div class="col no-padding"> - <label class="item item-input item-floating-label"> + <label class="item item-input item-floating-label" + ng-class="{'item-input-error': form.$submitted && form.longitude.$invalid}"> <span class="input-label" translate>PROFILE.LONGITUDE</span> - <input class="no-padding-right" type="number" placeholder="{{'PROFILE.LONGITUDE_HELP'|translate}}" + <input class="no-padding-right" + name="longitude" + type="number" placeholder="{{'PROFILE.LONGITUDE_HELP'|translate}}" ng-model="formData.geoPoint.lon" ng-model-options="{ debounce: 350 }" - ng-change="onGeoPointChanged()"> + ng-change="onFormDataChanged()" + min="-180" max="180"> </label> + <div class="form-errors" + ng-show="form.$submitted && form.longitude.$error" + ng-messages="form.longitude.$error"> + <div class="form-error" ng-message="min"> + <span translate="ERROR.FIELD_MIN" translate-values="{min: -180}"></span> + </div> + <div class="form-error" ng-message="max"> + <span translate="ERROR.FIELD_MAX" translate-values="{max: 180}"></span> + </div> + </div> </div> <div class="col col-40 no-padding">