From 03eacd91c3b08b3d889ff2af93332a51317d4c74 Mon Sep 17 00:00:00 2001
From: blavenie <benoit.lavenier@e-is.pro>
Date: Tue, 6 Nov 2018 11:10:17 +0100
Subject: [PATCH] [fix] Clicking 'Certify' failed - fix #750 [fix] Display a
 specific message if not a member anymore, because membersjip cancelled for
 lack of certifications - fix #649 [enh] Better message when new membership,
 and waiting for certifications

---
 www/i18n/locale-en-GB.json                      |  4 +++-
 www/i18n/locale-en.json                         |  4 +++-
 www/i18n/locale-fr-FR.json                      |  6 ++++--
 www/js/controllers/wallet-controllers.js        |  6 +++++-
 www/js/controllers/wot-controllers.js           |  6 +++---
 www/js/services/utils-services.js               |  4 ++--
 www/js/services/wallet-services.js              | 17 ++++++++++++++++-
 www/js/services/wot-services.js                 | 14 ++++++++------
 www/plugins/es/i18n/locale-en-GB.json           |  2 +-
 www/plugins/es/i18n/locale-en.json              |  2 +-
 www/plugins/es/i18n/locale-es-ES.json           |  2 +-
 www/plugins/es/i18n/locale-fr-FR.json           |  2 +-
 www/plugins/es/i18n/locale-it-IT.json           |  5 ++---
 www/plugins/es/i18n/locale-nl-NL.json           |  2 +-
 .../es/js/controllers/app-controllers.js        |  3 ++-
 .../es/js/controllers/invitation-controllers.js |  2 +-
 www/templates/modal_about.html                  |  2 +-
 17 files changed, 55 insertions(+), 28 deletions(-)

diff --git a/www/i18n/locale-en-GB.json b/www/i18n/locale-en-GB.json
index f44dd03c..c73976f0 100644
--- a/www/i18n/locale-en-GB.json
+++ b/www/i18n/locale-en-GB.json
@@ -466,10 +466,12 @@
     "PENDING_TX_RECEIVED": "Transactions awaiting receipt",
     "EVENTS": "Events",
     "WAITING_MEMBERSHIP": "Membership application sent. Waiting validation.",
-    "WAITING_CERTIFICATIONS": "You need {{needCertificationCount}} certification(s) to become a member",
+    "WAITING_CERTIFICATIONS": "You need {{needCertificationCount}} certification(s) to become a member and produce the <a ng-click=\"showHelpModal('ud')\">Universal Dividend</a>. Your account is however already operational, to receive and send payments.",
+    "WAITING_CERTIFICATIONS_HELP": "To get your certifications, only request members <b>who know you enough</b>, as required by <a ng-click=\"showLicenseModal()\">the currency license</a> that you have accepted.<br/>If you do not know enough members, let them know on <a ng-click=\"openLink($event, $root.settings.userForumUrl)\">the user forum</a>.",
     "WILL_MISSING_CERTIFICATIONS": "You will <b>lack certifications</b> soon (at least {{willNeedCertificationCount}} more are needed)",
     "WILL_NEED_RENEW_MEMBERSHIP": "Your membership <b>will expire {{membershipExpiresIn|formatDurationTo}}</b>. Remember to <a ng-click=\"doQuickFix('renew')\">renew your membership</a> before then.",
     "NEED_RENEW_MEMBERSHIP": "You are no longer a member because your membership <b>has expired</b>. Remember to <a ng-click=\"doQuickFix('renew')\">renew your membership</a>.",
+    "NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED": "You are no longer a member because your membership <b>has been cancelled</b> for lack of certifications. Remember to <a ng-click=\"doQuickFix('renew')\">renew your membership</a>.",
     "NO_WAITING_MEMBERSHIP": "No membership application pending. If you'd like to <b>become a member</ b>, please <a ng-click=\"doQuickFix('membership')\">send the membership application</a>.",
     "CERTIFICATION_COUNT": "Received certifications",
     "CERTIFICATION_COUNT_SHORT": "Certifications",
diff --git a/www/i18n/locale-en.json b/www/i18n/locale-en.json
index fa6e5bdc..23bcb7bd 100644
--- a/www/i18n/locale-en.json
+++ b/www/i18n/locale-en.json
@@ -466,10 +466,12 @@
     "PENDING_TX_RECEIVED": "Transactions awaiting receipt",
     "EVENTS": "Events",
     "WAITING_MEMBERSHIP": "Membership application sent. Waiting validation.",
-    "WAITING_CERTIFICATIONS": "You need {{needCertificationCount}} certification(s) to become a member",
+    "WAITING_CERTIFICATIONS": "You need {{needCertificationCount}} certification(s) to become a member and produce the <a ng-click=\"showHelpModal('ud')\">Universal Dividend</a>. Your account is however already operational, to receive and send payments.",
+    "WAITING_CERTIFICATIONS_HELP": "To get your certifications, only request members <b>who know you enough</b>, as required by <a ng-click=\"showLicenseModal()\">the currency license</a> that you have accepted.<br/>If you do not know enough members, let them know on <a ng-click=\"openLink($event, $root.settings.userForumUrl)\">the user forum</a>.",
     "WILL_MISSING_CERTIFICATIONS": "You will <b>lack certifications</b> soon (at least {{willNeedCertificationCount}} more are needed)",
     "WILL_NEED_RENEW_MEMBERSHIP": "Your membership <b>will expire {{membershipExpiresIn|formatDurationTo}}</b>. Remember to <a ng-click=\"doQuickFix('renew')\">renew your membership</a> before then.",
     "NEED_RENEW_MEMBERSHIP": "You are no longer a member because your membership <b>has expired</b>. Remember to <a ng-click=\"doQuickFix('renew')\">renew your membership</a>.",
+    "NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED": "You are no longer a member because your membership <b>has been canceled</b> for lack of certifications. Remember to <a ng-click=\"doQuickFix('renew')\">renew your membership</a>.",
     "NO_WAITING_MEMBERSHIP": "No membership application pending. If you'd like to <b>become a member</ b>, please <a ng-click=\"doQuickFix('membership')\">send the membership application</a>.",
     "CERTIFICATION_COUNT": "Received certifications",
     "CERTIFICATION_COUNT_SHORT": "Certifications",
diff --git a/www/i18n/locale-fr-FR.json b/www/i18n/locale-fr-FR.json
index 3fae4074..c5acaa0f 100644
--- a/www/i18n/locale-fr-FR.json
+++ b/www/i18n/locale-fr-FR.json
@@ -466,10 +466,12 @@
     "PENDING_TX_RECEIVED": "Transactions en attente de réception",
     "EVENTS": "Evénements",
     "WAITING_MEMBERSHIP": "Demande d'adhésion envoyée. En attente d'acceptation.",
-    "WAITING_CERTIFICATIONS": "Vous devez obtenir {{needCertificationCount}} certification(s) pour devenir membre.",
+    "WAITING_CERTIFICATIONS": "Vous devez <b>obtenir {{needCertificationCount}} certification(s)</b> pour devenir membre et produire le <a ng-click=\"showHelpModal('ud')\">Dividende Universel</a>. Votre compte est cependant déjà opếrationnel, pour recevoir et effectuer des paiements.",
+    "WAITING_CERTIFICATIONS_HELP": "Pour obtenir vos certifications, sollicitez uniquement des membres <b>qui vous connaissent suffisamment</b>, comme l'exige <a ng-click=\"showLicenseModal()\">la licence de la monnaie</a> que vous avez acceptée.<br/>Si vous ne connaissez pas suffisamment de membres, faites le savoir sur <a ng-click=\"openLink($event, $root.settings.userForumUrl)\">le forum utilisateur</a>.",
     "WILL_MISSING_CERTIFICATIONS": "Vous allez bientôt <b>manquer de certification</b> (au moins {{willNeedCertificationCount}} sont requises)",
     "WILL_NEED_RENEW_MEMBERSHIP": "Votre adhésion comme membre <b>va expirer {{membershipExpiresIn|formatDurationTo}}</b>. Pensez à <a ng-click=\"doQuickFix('renew')\">renouveler votre adhésion</a> d'ici là.",
-    "NEED_RENEW_MEMBERSHIP": "Vous n'êtes plus membre, car votre adhésion <b>a expiré</b>. Pensez à <a ng-click=\"doQuickFix('renew')\">renouveler votre adhésion</a>.",
+    "NEED_RENEW_MEMBERSHIP": "Vous n'êtes plus membre de la monnaie, car <b>votre adhésion a expiré</b>. Pensez à <a ng-click=\"doQuickFix('renew')\">renouveler votre adhésion</a>.",
+    "NEED_RENEW_CANCELLED_MEMBERSHIP": "Vous n'êtes plus membre de la monnaie, <b>pour manque de certification</b>. Pensez à <a ng-click=\"doQuickFix('renew')\">renouveler votre adhésion</a>.",
     "NO_WAITING_MEMBERSHIP": "Aucune demande d'adhésion en attente. Si vous souhaitez <b>devenir membre</b>, pensez à <a ng-click=\"doQuickFix('membership')\">envoyer la demande d'adhésion</a>.",
     "CERTIFICATION_COUNT": "Certifications reçues",
     "CERTIFICATION_COUNT_SHORT": "Certifications",
diff --git a/www/js/controllers/wallet-controllers.js b/www/js/controllers/wallet-controllers.js
index 88dc2510..c5978d01 100644
--- a/www/js/controllers/wallet-controllers.js
+++ b/www/js/controllers/wallet-controllers.js
@@ -58,7 +58,7 @@ angular.module('cesium.wallet.controllers', ['cesium.services', 'cesium.currency
 ;
 
 function WalletController($scope, $rootScope, $q, $ionicPopup, $timeout, $state, $translate, $ionicPopover, $location,
-                          UIUtils, Modals, csPopovers, BMA, csConfig, csSettings, csWallet, csHelp) {
+                          UIUtils, ModalUtils, Modals, csPopovers, BMA, csConfig, csSettings, csWallet, csHelp) {
   'ngInject';
 
   $scope.loading = true;
@@ -541,6 +541,10 @@ function WalletController($scope, $rootScope, $q, $ionicPopup, $timeout, $state,
     });
   };
 
+  $scope.showLicenseModal = function() {
+    return ModalUtils.show('templates/currency/modal_license.html','CurrencyLicenseModalCtrl');
+  };
+
   /* -- modals -- */
 
   // Transfer
diff --git a/www/js/controllers/wot-controllers.js b/www/js/controllers/wot-controllers.js
index ce71c927..3d29a6fe 100644
--- a/www/js/controllers/wot-controllers.js
+++ b/www/js/controllers/wot-controllers.js
@@ -751,8 +751,8 @@ function WotIdentityAbstractController($scope, $rootScope, $state, $translate, $
                 UIUtils.loading.show();
                 wallet.certify($scope.formData.uid,
                   $scope.formData.pubkey,
-                  $scope.formData.timestamp,
-                  $scope.formData.sig,
+                  $scope.formData.blockUid,
+                  $scope.formData.requirements.meta.sig,
                   $scope.formData.isMember,
                   $scope.formData.wasMember)
                   .then(function(cert) {
@@ -760,7 +760,7 @@ function WotIdentityAbstractController($scope, $rootScope, $state, $translate, $
                     if (cert) {
                       $scope.prepareNewCert(wallet, cert);
                       $scope.alreadyCertified = true;
-                      UIUtils.alert.info('INFO.CERTIFICATION_DONE');
+                      UIUtils.toast.show('INFO.CERTIFICATION_DONE');
                       $scope.formData.received_cert_pending.unshift(cert);
                       $scope.formData.requirements.pendingCertificationCount++;
                       $scope.doMotion();
diff --git a/www/js/services/utils-services.js b/www/js/services/utils-services.js
index 20c30791..af46cf9b 100644
--- a/www/js/services/utils-services.js
+++ b/www/js/services/utils-services.js
@@ -445,8 +445,8 @@ angular.module('cesium.utils.services', [])
           popover.isResolved = false;
 
           popover.scope.closePopover = function(result) {
-            var autoremove = popover.options.autoremove;
-            delete popover.options.autoremove; // remove to avoid to trigger 'popover.hidden'
+            var autoremove = popover.options && popover.options.autoremove;
+            if (popover.options) delete popover.options.autoremove; // remove to avoid to trigger 'popover.hidden'
             popover.hide()
               .then(function() {
                 if (autoremove) {
diff --git a/www/js/services/wallet-services.js b/www/js/services/wallet-services.js
index ce29d15b..911267cc 100644
--- a/www/js/services/wallet-services.js
+++ b/www/js/services/wallet-services.js
@@ -743,9 +743,15 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
           addEvent({type:'warn', message: 'ACCOUNT.NO_WAITING_MEMBERSHIP', context: 'requirements'});
         }
         if (data.requirements.needRenew) {
-          if (data.requirements.membershipExpiresIn > 0) {
+          // Still a member: WILL need renew
+          if (data.isMember && data.requirements.membershipExpiresIn > 0) {
             addEvent({type:'warn', message: 'ACCOUNT.WILL_NEED_RENEW_MEMBERSHIP', messageParams: data.requirements, context: 'requirements'});
           }
+          // Fix #649: Not a member anymore, even if membership NOT expired, because membersjip cancelled for lack of certifications
+          else if (!data.isMember && data.requirements.membershipExpiresIn > 0 && data.requirements.needCertificationCount > 0) {
+            addEvent({type:'warn', message: 'ACCOUNT.NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED', messageParams: data.requirements, context: 'requirements'});
+          }
+          // Not a member anymore
           else {
             addEvent({type:'warn', message: 'ACCOUNT.NEED_RENEW_MEMBERSHIP', messageParams: data.requirements, context: 'requirements'});
           }
@@ -754,6 +760,15 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
         {
           if (data.requirements.needCertificationCount > 0) {
             addEvent({type:'info', message: 'ACCOUNT.WAITING_CERTIFICATIONS', messageParams: data.requirements, context: 'requirements'});
+            // Add a help message, if user has never been a member
+            if (!data.requirements.wasMember) {
+              addEvent({
+                type: 'help',
+                message: 'ACCOUNT.WAITING_CERTIFICATIONS_HELP',
+                messageParams: data.requirements,
+                context: 'requirements'
+              });
+            }
           }
           if (data.requirements.willNeedCertificationCount > 0) {
             addEvent({type:'warn', message: 'ACCOUNT.WILL_MISSING_CERTIFICATIONS', messageParams: data.requirements, context: 'requirements'});
diff --git a/www/js/services/wot-services.js b/www/js/services/wot-services.js
index bd681a90..19c8f279 100644
--- a/www/js/services/wot-services.js
+++ b/www/js/services/wot-services.js
@@ -78,7 +78,7 @@ angular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.c
 
       _fillRequirements = function(requirements, currencyParameters) {
         // Add useful custom fields
-        requirements.hasSelf = requirements.meta && requirements.meta.timestamp;
+        requirements.hasSelf = requirements.meta && !!requirements.meta.timestamp;
         requirements.needSelf = !requirements.hasSelf || requirements.meta.invalid;
         requirements.wasMember = angular.isDefined(requirements.wasMember) ? requirements.wasMember : false; // Compat with Duniter 0.9
         requirements.needMembership = (!requirements.revoked && requirements.membershipExpiresIn <= 0 && requirements.membershipPendingExpiresIn <= 0 && !requirements.wasMember);
@@ -92,7 +92,7 @@ angular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.c
         requirements.isMember = (!requirements.revoked && requirements.membershipExpiresIn > 0);
         requirements.blockUid = requirements.meta.timestamp;
         // Force certification count to 0, is not a member yet - fix #269
-        requirements.certificationCount = (requirements.isMember && requirements.certifications) ? requirements.certifications.length : 0;
+        requirements.certificationCount = ((requirements.isMember || (requirements.wasMember && !requirements.expired)) && requirements.certifications) ? requirements.certifications.length : 0;
         requirements.willExpireCertificationCount = requirements.certifications ? requirements.certifications.reduce(function(count, cert){
           return count + (cert.expiresIn <= csSettings.data.timeWarningExpire ? 1 : 0);
         }, 0) : 0;
@@ -122,7 +122,7 @@ angular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.c
         return requirements;
       },
 
-      _fillIdentitiesTime = function(identities) {
+      _fillIdentitiesMeta = function(identities) {
         if (!identities) return $q.when(identities);
 
         var blocks = [];
@@ -130,6 +130,8 @@ angular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.c
           var blockUid = identity.meta.timestamp.split('-', 2);
           identity.meta.number = parseInt(blockUid[0]);
           identity.meta.hash = blockUid[1];
+          identity.meta.sig = identity.meta.sig || identity.sig;
+          delete identity.sig;
           blocks.push(identity.meta.number);
           if (identity.revocationNumber) {
             blocks.push(identity.revocationNumber);
@@ -191,7 +193,7 @@ angular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.c
           // Get requirements
           BMA.wot.requirements({pubkey: data.pubkey||data.uid})
             .then(function(res) {
-              return _fillIdentitiesTime(res && res.identities);
+              return _fillIdentitiesMeta(res && res.identities);
             })
         ])
           .then(function(res){
@@ -299,8 +301,8 @@ angular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.c
               }, []));
             }, []);
 
-            // Fill identities time
-            return _fillIdentitiesTime(identities)
+            // Fill identities meta (self)
+            return _fillIdentitiesMeta(identities)
               .then(function(identities) {
                 return {
                   identities: identities,
diff --git a/www/plugins/es/i18n/locale-en-GB.json b/www/plugins/es/i18n/locale-en-GB.json
index a50da553..af713d01 100644
--- a/www/plugins/es/i18n/locale-en-GB.json
+++ b/www/plugins/es/i18n/locale-en-GB.json
@@ -35,7 +35,7 @@
       "ORGANIZATION_ACCOUNT_HELP": "If you represent a company, association, etc.<br/>No universal dividend will be created by this account."
     },
     "EVENT": {
-      "MEMBER_WITHOUT_PROFILE": "To obtain your certification more quickly, fill in <a ui-sref=\"app.user_edit_profile\">your user profile</a>. Members will more easily put their trust in a verifiable identity."
+      "MEMBER_WITHOUT_PROFILE": "To obtain your certification more quickly, fill in <a ui-sref=\"app.edit_profile\">your user profile</a>. Members will more easily put their trust in a verifiable identity."
     },
     "ERROR": {
       "WS_CONNECTION_FAILED": "Cesium can not receive notifications because of a technical error (connection to the Cesium + data node).<br/><br/>If the problem persists, please <b>choose another data node</b> in Cesium+ settings."
diff --git a/www/plugins/es/i18n/locale-en.json b/www/plugins/es/i18n/locale-en.json
index a50da553..af713d01 100644
--- a/www/plugins/es/i18n/locale-en.json
+++ b/www/plugins/es/i18n/locale-en.json
@@ -35,7 +35,7 @@
       "ORGANIZATION_ACCOUNT_HELP": "If you represent a company, association, etc.<br/>No universal dividend will be created by this account."
     },
     "EVENT": {
-      "MEMBER_WITHOUT_PROFILE": "To obtain your certification more quickly, fill in <a ui-sref=\"app.user_edit_profile\">your user profile</a>. Members will more easily put their trust in a verifiable identity."
+      "MEMBER_WITHOUT_PROFILE": "To obtain your certification more quickly, fill in <a ui-sref=\"app.edit_profile\">your user profile</a>. Members will more easily put their trust in a verifiable identity."
     },
     "ERROR": {
       "WS_CONNECTION_FAILED": "Cesium can not receive notifications because of a technical error (connection to the Cesium + data node).<br/><br/>If the problem persists, please <b>choose another data node</b> in Cesium+ settings."
diff --git a/www/plugins/es/i18n/locale-es-ES.json b/www/plugins/es/i18n/locale-es-ES.json
index 7b663445..8bd5909a 100644
--- a/www/plugins/es/i18n/locale-es-ES.json
+++ b/www/plugins/es/i18n/locale-es-ES.json
@@ -31,7 +31,7 @@
       "ORGANIZATION_ACCOUNT_HELP": "Si representa una empresa, una asociación, etc.<br/>Ningún dividendo universal será creído por esta cuenta."
     },
     "EVENT": {
-      "MEMBER_WITHOUT_PROFILE": "Para obtener sus certificaciónes más rapidamente, completa <a ui-sref=\"app.user_edit_profile\">su perfil usuario</a>. Los miembros concederán más fácilmente su confianza a una identidad verificable."
+      "MEMBER_WITHOUT_PROFILE": "Para obtener sus certificaciónes más rapidamente, completa <a ui-sref=\"app.edit_profile\">su perfil usuario</a>. Los miembros concederán más fácilmente su confianza a una identidad verificable."
     },
     "ERROR": {
       "WS_CONNECTION_FAILED": "Cesium no puede recibir las notificaciónes, a causa de un error técnico (conexión al nodo de datos Cesium+).<br/><br/>Si el problema persiste, por favor <b>elige un otro nodo de datos</b> en las configuraciónes Cesium+."
diff --git a/www/plugins/es/i18n/locale-fr-FR.json b/www/plugins/es/i18n/locale-fr-FR.json
index 7f99399f..5ccd8d7b 100644
--- a/www/plugins/es/i18n/locale-fr-FR.json
+++ b/www/plugins/es/i18n/locale-fr-FR.json
@@ -35,7 +35,7 @@
       "ORGANIZATION_ACCOUNT_HELP": "Si vous représentez une entreprise, une association, etc.<br/>Aucun dividende universel ne sera créé par ce compte."
     },
     "EVENT": {
-      "MEMBER_WITHOUT_PROFILE": "Pour obtenir vos certifications plus rapidement, completez <a ui-sref=\"app.user_edit_profile\">votre profil utilisateur</a>. Les membres accorderont plus facilement leur confiance à une identité vérifiable."
+      "MEMBER_WITHOUT_PROFILE": "Vous pouvez <a ui-sref=\"app.edit_profile\">saisir votre profil</a> (optionnel) pour offrir une meilleure visibilité de votre compte."
     },
     "ERROR": {
       "WS_CONNECTION_FAILED": "Cesium ne peut pas recevoir les notifications, à cause d'une erreur technique (connexion au noeud de données Cesium+).<br/><br/>Si le problème persiste, veuillez <b>choisir un autre noeud de données</b> dans les paramètres Cesium+."
diff --git a/www/plugins/es/i18n/locale-it-IT.json b/www/plugins/es/i18n/locale-it-IT.json
index a0670942..37f4c3a6 100644
--- a/www/plugins/es/i18n/locale-it-IT.json
+++ b/www/plugins/es/i18n/locale-it-IT.json
@@ -31,7 +31,7 @@
        "ORGANIZATION_ACCOUNT_HELP": "Se rappresenta un'azienda, un'associazione, etc.<br/>Questo conto non potrà creare il Dividendo Universale."
      },
      "EVENT": {
-       "MEMBER_WITHOUT_PROFILE": "Per ottenere sue certificazioni più velocemente, riempire le informazioni<a ui-sref=\"app.user_edit_profile\">del suo profilo</a>. I membri della rete si fidano più volontieri di profili verificabili."
+       "MEMBER_WITHOUT_PROFILE": "Per ottenere sue certificazioni più velocemente, riempire le informazioni<a ui-sref=\"app.edit_profile\">del suo profilo</a>. I membri della rete si fidano più volontieri di profili verificabili."
      },
      "ERROR": {
        "WS_CONNECTION_FAILED": "Cesium non può ricevere notifiche a causa di un problema tecnico (di conessione al data node Cesium+).<br/><br/>Se il problema persiste, le chiediamo di <b>scegliere un'altro data node</b> nelle impostazioni di Cesium+."
@@ -529,8 +529,7 @@
     "ES_USE_FALLBACK_NODE": "Nodo<b>{{old}}</b> irraggiungibile o indirizzo sbagliato.<br/><br/>Vuoi utilizzare temporaneamente il nodo di dati <b>{{new}}</b> ?"
   },
    "ERROR": {
-    "ES_CONNECTION_ERROR": "Nodo di dati<b>{{server}}</b>  irraggiungibile o indirizzo sbagliato.<br/><br/>Cesium continuerà a funzionare <b>senza l'estensione Cesium+</b> (profili utenti, messaggi privati, mappe e grafici)<br/><br/>Verifica tua connessione o cambia nodo <a class=\"positive\" ng-click=\"doQuickFix('settings')\">impostazioni dell'estensione</a>.",     
+    "ES_CONNECTION_ERROR": "Nodo di dati<b>{{server}}</b>  irraggiungibile o indirizzo sbagliato.<br/><br/>Cesium continuerà a funzionare <b>senza l'estensione Cesium+</b> (profili utenti, messaggi privati, mappe e grafici)<br/><br/>Verifica tua connessione o cambia nodo <a class=\"positive\" ng-click=\"doQuickFix('settings')\">impostazioni dell'estensione</a>.",
      "ES_MAX_UPLOAD_BODY_SIZE": "Il volume di data da inviare supera il limite imposto dal server.<br/><br/>Suggeriamo di riprovare dopo aver eliminato delle foto, per esempio."
    }
  }
- 
\ No newline at end of file
diff --git a/www/plugins/es/i18n/locale-nl-NL.json b/www/plugins/es/i18n/locale-nl-NL.json
index c8f0e349..ac55a62b 100644
--- a/www/plugins/es/i18n/locale-nl-NL.json
+++ b/www/plugins/es/i18n/locale-nl-NL.json
@@ -28,7 +28,7 @@
       "ORGANIZATION_ACCOUNT_HELP": "Als je een onderneming, vereniging etc. vertegenwoordigd.<br/>Deze rekening zal geen dividend créeren."
     },
     "EVENT": {
-      "MEMBER_WITHOUT_PROFILE": "Vul <a ui-sref=\"app.user_edit_profile\"je gebruikersprofiel</a> in om sneller een certificering te verkrijgen. Leden zullen een verfifieerbare identiteit eerder vertrouwen."
+      "MEMBER_WITHOUT_PROFILE": "Vul <a ui-sref=\"app.edit_profile\"je gebruikersprofiel</a> in om sneller een certificering te verkrijgen. Leden zullen een verfifieerbare identiteit eerder vertrouwen."
     }
   },
   "COMMENTS": {
diff --git a/www/plugins/es/js/controllers/app-controllers.js b/www/plugins/es/js/controllers/app-controllers.js
index f61d1821..03429e6d 100644
--- a/www/plugins/es/js/controllers/app-controllers.js
+++ b/www/plugins/es/js/controllers/app-controllers.js
@@ -109,8 +109,9 @@ function ESMenuExtendController($scope, $state, $controller, UIUtils, csWallet)
       autoremove: false, // reuse popover
       // Auto-close if open when un-authenticate
       afterShow: function(popover) {
-        csWallet.api.data.on.unauth(popover.scope, function() {
+        var listener = csWallet.api.data.on.unauth(popover.scope, function() {
           popover.scope.closePopover();
+          listener();
         });
       }
     });
diff --git a/www/plugins/es/js/controllers/invitation-controllers.js b/www/plugins/es/js/controllers/invitation-controllers.js
index 2115260f..d735cb86 100644
--- a/www/plugins/es/js/controllers/invitation-controllers.js
+++ b/www/plugins/es/js/controllers/invitation-controllers.js
@@ -40,7 +40,7 @@ angular.module('cesium.es.invitation.controllers', ['cesium.es.services'])
   .controller('ESNewInvitationModalCtrl', NewInvitationModalController)
 ;
 
-function InvitationsController($scope, $q, $ionicPopover, $state, $timeout, UIUtils, csSettings, csWallet,
+function InvitationsController($scope, $q, $ionicPopover, $state, $timeout, UIUtils, csWallet,
                                esHttp, esModals, esNotification, esInvitation) {
   'ngInject';
 
diff --git a/www/templates/modal_about.html b/www/templates/modal_about.html
index 30c952e2..fb73558c 100644
--- a/www/templates/modal_about.html
+++ b/www/templates/modal_about.html
@@ -42,7 +42,7 @@
       <ion-item class="item-icon-left">
         <i class="item-image icon ion-network"></i>
         {{'ABOUT.CODE' | translate}}
-        <h3><a ng-click="openLink($event, 'https://git.duniter.org/clients/cesium/cesium')">https://git.duniter.org/clients/cesium/cesium</a></h3>
+        <h3><a ng-click="openLink($event, 'https://git.duniter.org/clients/cesium-grp/cesium')">https://git.duniter.org/clients/cesium-grp/cesium</a></h3>
       </ion-item>
 
       <!-- forum -->
-- 
GitLab