diff --git a/www/js/controllers/wallets-controllers.js b/www/js/controllers/wallets-controllers.js index f958aeacdc88384df7f3cebb066444dadb773cbd..c2afb865cdbe8217dd0666973d4d8636cd2ae4c7 100644 --- a/www/js/controllers/wallets-controllers.js +++ b/www/js/controllers/wallets-controllers.js @@ -84,10 +84,12 @@ function WalletListController($scope, $controller, $state, $timeout, $q, $transl // Override defaults $scope.formData.name = undefined; $scope.motion = UIUtils.motion.default; + $scope.entered = false; $scope.enter = function(e, state) { // First enter - if ($scope.loading) { + if (!$scope.entered) { + $scope.entered = true; $scope.setParameters({ showDefault: true, showBalance: true @@ -105,11 +107,20 @@ function WalletListController($scope, $controller, $state, $timeout, $q, $transl else { // Re-add listeners $scope.addListeners(); + if ($scope.formData.stopped) { + $scope.loading = false; + $scope.formData.stopped = false; + $scope.formData.updatingWalletId = undefined; + $scope.updateView(); + } } }; $scope.$on('$ionicView.enter', $scope.enter); $scope.leave = function() { + $scope.formData.stopped = true; + $scope.formData.updatingWalletId = undefined; + $scope.loading = false; $scope.removeListeners(); }; $scope.$on('$ionicView.leave', $scope.leave); @@ -120,7 +131,12 @@ function WalletListController($scope, $controller, $state, $timeout, $q, $transl $scope.select = function(event, wallet) { if (event.isDefaultPrevented()) return; - $state.go('app.view_wallet_by_id', {id: wallet.id}); + if (wallet.isDefault()) { + $state.go('app.view_wallet'); + } + else { + $state.go('app.view_wallet_by_id', {id: wallet.id}); + } }; $scope.editWallet = function(event, wallet) { @@ -449,14 +465,15 @@ function WalletListController($scope, $controller, $state, $timeout, $q, $transl function WalletSelectModalController($scope, $q, $timeout, UIUtils, filterTranslations, csSettings, csCurrency, csWallet, parameters){ 'ngInject'; - var loadWalletWaitTime = 100; $scope.loading = true; $scope.wallets = null; $scope.formData = { useRelative: csSettings.data.useRelative, showDefault: true, showBalance: false, - balance: undefined + balance: undefined, + updatingWalletId: undefined, + stopped: false }; $scope.motion = null; // no animation @@ -473,23 +490,30 @@ function WalletSelectModalController($scope, $q, $timeout, UIUtils, filterTransl $scope.load = function(options) { options = options || {}; - $scope.loading = !options.silent; + $scope.loading = angular.isUndefined(options.silent) || !options.silent; + $scope.formData.balance = undefined; + $scope.formData.updatingWalletId = undefined; + $scope.formData.stopped = false; // Load currency, and filter translations (need by 'formatAmount' filter) - var jobs = [ - csCurrency.name() - .then(function(name) { - $scope.currency = name; - return filterTranslations.ready(); - }) - ]; + var jobs = []; + + jobs.push(csCurrency.name() + .then(function(currency) { + $scope.currency = currency; + return filterTranslations.ready(); + })); // Get children wallets + var tempWallets; if (!$scope.wallets) { jobs.push( csWallet.children.all() .then(function(children) { - $scope.wallets = $scope.formData.showDefault ? [csWallet].concat(children) : children; + $scope.wallets = []; + tempWallets = $scope.formData.showDefault ? [csWallet].concat(children) : children; + UIUtils.loading.hide(); + $scope.updateView(); }) ); } @@ -497,7 +521,7 @@ function WalletSelectModalController($scope, $q, $timeout, UIUtils, filterTransl // Prepare load options var walletLoadOptions = { silent: true, - minData: true, + minData: !$scope.formData.showBalance, sources: $scope.formData.showBalance, tx: { enable: false @@ -508,34 +532,43 @@ function WalletSelectModalController($scope, $q, $timeout, UIUtils, filterTransl var loadCounter = 0; var now = Date.now(); var balance = 0; - return $q.all(jobs) + return (jobs.length ? $q.all(jobs) : $q.when()) // Load wallet data (apply a timeout between each wallet) .then(function() { console.debug("[wallets] Loading {0} wallets...".format($scope.wallets.length)); - return $scope.wallets.reduce(function(res, wallet) { + return (tempWallets || $scope.wallets).reduce(function(res, wallet) { var skip= !options.refresh && wallet.isDataLoaded(walletLoadOptions); if (skip) { console.debug("[wallets] Wallet #{0} already loaded. Skipping".format(wallet.id), walletLoadOptions); - balance += wallet.data.balance; - return res; + return res.then(function(){ + balance += wallet.data.balance; + if (tempWallets) { + $scope.wallets.push(wallet); + $scope.updateView(); + } + }); } loadCounter++; return res.then(function() { + if ($scope.formData.stopped) return; // skip if stopped // Loading next wallet, after waiting some time - return $timeout(function() { + $scope.formData.updatingWalletId = wallet.id; return (!options.refresh ? wallet.loadData(walletLoadOptions) : wallet.refreshData(angular.merge({ requirements: wallet.requirements && (wallet.requirements.isMember || wallet.requirements.wasMember || wallet.requirements.pendingMembership) }, walletLoadOptions)) ).then(function(walletData) { + if (tempWallets) { + $scope.wallets.push(wallet); + $scope.updateView(); + } balance += walletData.balance; }) .catch(function(err) { console.error("[wallets] Error while loading data of wallet #{0}".format(wallet.id), err); hasLoadError = true; }); - }, loadWalletWaitTime); }); }, $q.when()); }) @@ -547,10 +580,16 @@ function WalletSelectModalController($scope, $q, $timeout, UIUtils, filterTransl $scope.cancel(); }); } + if ($scope.formData.stopped) { + // Make sure to keep all wallets + if (tempWallets) $scope.wallets = tempWallets; + return; + } if (loadCounter) { console.debug("[wallets] Loaded data of {0} wallet(s) in {1}ms".format(loadCounter, (Date.now() - now))); } $scope.formData.balance = balance; + $scope.formData.updatingWalletId = undefined; $scope.loading = false; UIUtils.loading.hide(); $scope.updateView(); @@ -579,6 +618,7 @@ function WalletSelectModalController($scope, $q, $timeout, UIUtils, filterTransl $scope.wallets = null; $scope.loading = true; $scope.formData.balance = undefined; + $scope.formData.updatingWalletId = undefined; }; $scope.updateView = function() { @@ -592,8 +632,8 @@ function WalletSelectModalController($scope, $q, $timeout, UIUtils, filterTransl } }; - $scope.doUpdate = function(silent) { - if ($scope.loading || !$scope.wallets || !$scope.wallets.length) return $q.when(); + $scope.doUpdate = function(silent, event) { + if ($scope.loading || !$scope.wallets || !$scope.wallets.length || $scope.formData.updatingWalletId) return $q.when(); return $scope.load({silent: silent, refresh: true}) .then(function() { diff --git a/www/templates/wallet/list/item_wallet.html b/www/templates/wallet/list/item_wallet.html index 1800c5f4e7099e5084c83e97a9b06c83e9d43f2c..1317ab65f4d66f4bbeb374525558675ab30dcb47 100644 --- a/www/templates/wallet/list/item_wallet.html +++ b/www/templates/wallet/list/item_wallet.html @@ -28,8 +28,10 @@ <span class="badge" ng-if="formData.showBalance" ng-class=":rebind:{'badge-assertive': (walletData.balance <= 0), 'badge-balanced': (walletData.balance > 0) }"> - <span ng-bind-html=":rebind:walletData.balance|formatAmount:{useRelative: formData.useRelative, currency: currency}"></span> + <ion-spinner class="ion-spinner-small" ng-if="formData.updatingWalletId==wallet.id" icon="android"></ion-spinner> + <span ng-bind-html=":rebind:walletData.balance|formatAmount:{useRelative: formData.useRelative, currency: currency}"></span> </span> + <i class="icon ion-ios-arrow-right "></i> </div> diff --git a/www/templates/wallet/list/view_wallets.html b/www/templates/wallet/list/view_wallets.html index a4e708a144cdc6de20c7bdf1456d19eff4bd1d3f..94508c90911054f51e68a3e5ed614a7874262f48 100644 --- a/www/templates/wallet/list/view_wallets.html +++ b/www/templates/wallet/list/view_wallets.html @@ -24,7 +24,7 @@ <div class="hidden-xs hidden-sm padding text-center"> <button class="button button-stable button-small-padding icon ion-loop ink" - ng-click="doUpdate()" + ng-click="doUpdate(true)" title="{{:locale:'COMMON.BTN_REFRESH' | translate}}"> </button> @@ -42,32 +42,34 @@ </div> - <div class="padding-top padding-xs" style="display: block; height: 60px;" ng-if="formData.showBalance"> - <div class="pull-left" ng-if="!loading && formData.balance"> + <div class="padding-top padding-xs hidden-xs hidden-sm" style="display: block; height: 60px;"> + <div class="pull-left"> <h4> <span translate>ACCOUNT.WALLET_LIST.TITLE</span> <small class="gray" ng-if="formData.balance">(<span translate>ACCOUNT.WALLET_LIST.TOTAL_DOTS</span> - <span ng-bind-html="formData.balance|formatAmount:{useRelative: formData.useRelative, currency: currency}"></span>)</small> - </span> + <span ng-bind-html="formData.balance|formatAmount:{useRelative: formData.useRelative, currency: currency}"></span>) + </small> + <ion-spinner class="ion-spinner-small" icon="android" ng-if="loading || formData.updatingWalletId"></ion-spinner> </h4> </div> </div> - <div class="center padding" ng-if="loading"> - <ion-spinner icon="android"></ion-spinner> - </div> + <div class="center padding gray" ng-if="!loading && wallets && !wallets.length"> {{:locale:'ACCOUNT.WALLET_LIST.NO_WALLET'|translate}} </div> - <ion-list ng-if="!loading" class="{{::motion.ionListClass}}"> + <ion-list ng-if="wallets" class="{{::motion.ionListClass}}"> <ng-include ng-repeat="wallet in wallets track by wallet.id" src="'templates/wallet/list/item_wallet.html'"> </ng-include> </ion-list> + <div class="center padding visible-xs visible-sm" ng-if="loading"> + <ion-spinner icon="android"></ion-spinner> + </div> </ion-content> <button id="fab-add-wallet"