diff --git a/js/controllers/history.js b/js/controllers/history.js index 72a1e5b93..ff8f41ebc 100644 --- a/js/controllers/history.js +++ b/js/controllers/history.js @@ -11,8 +11,9 @@ angular.module('copayApp.controllers').controller('HistoryController', $scope.loading = false; $scope.lastShowed = false; - $scope.txpCurrentPage = 1; - $scope.txpItemsPerPage = 4; + $scope.currentPage = 1; + $scope.itemsPerPage = 10; + $scope.nbPages = 0; $scope.blockchain_txs = []; $scope.alternativeCurrency = []; @@ -24,19 +25,38 @@ angular.module('copayApp.controllers').controller('HistoryController', $scope.loading = true; setTimeout(function() { $scope.update(); - }, 10); + }, 1); }; + $scope.nextPage = function() { + $scope.currentPage++; + $scope.update(); + }; + + $scope.previousPage = function() { + $scope.currentPage--; + $scope.update(); + }; + + $scope.hasNextPage = function() { + return $scope.currentPage < $scope.nbPages; + }; + + $scope.hasPreviousPage = function() { + return $scope.currentPage > 1; + }; $scope.getTransactions = function() { - var w = $rootScope.wallet; if (!w) return; $scope.blockchain_txs = w.cached_txs || []; $scope.loading = true; - w.getTransactionHistory(function(err, res) { + w.getTransactionHistory({ + currentPage: $scope.currentPage, + itemsPerPage: $scope.itemsPerPage, + }, function(err, res) { if (err) throw err; if (!res) { @@ -45,10 +65,15 @@ angular.module('copayApp.controllers').controller('HistoryController', return; } - _.each(res, function(r) { + var items = res.items; + + _.each(items, function(r) { r.ts = r.minedTs || r.sentTs; }); - $scope.blockchain_txs = w.cached_txs = res; + $scope.blockchain_txs = w.cached_txs = items; + $scope.nbPages = res.nbPages; + + $scope.loading = false; setTimeout(function() { $scope.$digest(); diff --git a/js/controllers/send.js b/js/controllers/send.js index 7461609a6..7b2e76b15 100644 --- a/js/controllers/send.js +++ b/js/controllers/send.js @@ -73,7 +73,7 @@ angular.module('copayApp.controllers').controller('SendController', $scope.loadTxs = function() { controllerUtils.updateTxs(); - + setTimeout(function() { $scope.loading = false; $rootScope.$digest(); @@ -625,32 +625,4 @@ angular.module('copayApp.controllers').controller('SendController', '.' + ' Message: ' + merchantData.pr.pd.memo); }); }; - - controllerUtils.redirIfNotComplete(); - - var w = $rootScope.wallet; - preconditions.checkState(w); - preconditions.checkState(w.settings.unitToSatoshi); - - $rootScope.title = 'Send'; - $scope.loading = false; - var satToUnit = 1 / w.settings.unitToSatoshi; - $scope.defaultFee = bitcore.TransactionBuilder.FEE_PER_1000B_SAT * satToUnit; - $scope.unitToBtc = w.settings.unitToSatoshi / bitcore.util.COIN; - $scope.unitToSatoshi = w.settings.unitToSatoshi; - - $scope.alternativeName = w.settings.alternativeName; - $scope.alternativeIsoCode = w.settings.alternativeIsoCode; - - $scope.isRateAvailable = false; - $scope.rateService = rateService; - $scope.availableBalance = $scope.getAvailableAmount(); - - rateService.whenAvailable(function() { - $scope.isRateAvailable = true; - $scope.$digest(); - }); - - - }); diff --git a/js/models/Wallet.js b/js/models/Wallet.js index 38ace1a9a..53f8a1b94 100644 --- a/js/models/Wallet.js +++ b/js/models/Wallet.js @@ -1289,7 +1289,7 @@ Wallet.prototype._getActionList = function(actions) { var peers = Object.keys(actions).map(function(i) { return { cId: i, - actions: actions[i] + actions: actions[i] } }); @@ -2836,9 +2836,22 @@ Wallet.request = function(options, callback) { }; -Wallet.prototype.getTransactionHistory = function(cb) { +/** + * @desc Return a list of past transactions + * + * @param {number} opts.currentPage - the desired page in the dataset + * @param {number} opts.itemsPerPage - number of items per page + * @return {Object} the list of transactions + */ +Wallet.prototype.getTransactionHistory = function(opts, cb) { var self = this; + if (_.isFunction(opts)) { + cb = opts; + opts = {}; + } + opts = opts || {}; + var addresses = self.getAddressesInfo(); var proposals = self.getTxProposals(); var satToUnit = 1 / self.settings.unitToSatoshi; @@ -2948,6 +2961,21 @@ Wallet.prototype.getTransactionHistory = function(cb) { } }; + function paginate(list, currentPage, itemsPerPage) { + var res = { + itemsPerPage: itemsPerPage || list.length, + currentPage: currentPage || 1, + nbItems: list.length, + }; + res.nbPages = res.itemsPerPage != 0 ? Math.ceil(res.nbItems / res.itemsPerPage) : 1; + + var from = (res.currentPage - 1) * res.itemsPerPage; + var to = Math.min(from + res.itemsPerPage, res.nbItems); + res.items = list.slice(from, to); + + return res; + }; + if (addresses.length > 0) { var addressesStr = _.pluck(addresses, 'addressStr'); self.blockchain.getTransactions(addressesStr, function(err, txs) { @@ -2957,7 +2985,11 @@ Wallet.prototype.getTransactionHistory = function(cb) { decorateTx(tx); return tx; }); - return cb(null, history); + history.sort(function(a, b) { + return (b.sentTs || b.minedTs) - (a.sentTs || a.minedTs); + }); + + return cb(null, paginate(history, opts.currentPage, opts.itemsPerPage)); }); } }; diff --git a/test/Wallet.js b/test/Wallet.js index 0a4f25890..201f37abe 100644 --- a/test/Wallet.js +++ b/test/Wallet.js @@ -1976,13 +1976,102 @@ describe('Wallet model', function() { w.getTransactionHistory(function(err, res) { res.should.exist; - res.length.should.equal(3); - res[0].action.should.equal('sent'); - res[0].amountSat.should.equal(900); - res[1].action.should.equal('received'); - res[1].amountSat.should.equal(1900); - res[2].action.should.equal('moved'); - res[2].amountSat.should.equal(2900); + res.items.should.exist; + var items = res.items; + items.length.should.equal(3); + items[0].action.should.equal('sent'); + items[0].amountSat.should.equal(900); + items[1].action.should.equal('received'); + items[1].amountSat.should.equal(1900); + items[2].action.should.equal('moved'); + items[2].amountSat.should.equal(2900); + done(); + }); + }); + it('should return paginated list of txs', function(done) { + var w = cachedCreateW2(); + var txs = [{ + txid: 'id1', + vin: [{ + addr: 'addr_in_1', + valueSat: 1000 + }], + vout: [{ + scriptPubKey: { + addresses: ['addr_out_1'], + }, + value: '0.00000900', + }], + fees: 0.00000100 + }, { + txid: 'id2', + vin: [{ + addr: 'addr_in_2', + valueSat: 2000 + }], + vout: [{ + scriptPubKey: { + addresses: ['addr_out_2'], + }, + value: '0.00001900', + }], + fees: 0.00000100 + }, { + txid: 'id3', + vin: [{ + addr: 'addr_in_1', + valueSat: 3000 + + }], + vout: [{ + scriptPubKey: { + addresses: ['addr_out_2'], + }, + value: '0.00002900', + + }], + fees: 0.00000100 + }]; + + w.blockchain.getTransactions = sinon.stub().yields(null, txs); + w.getAddressesInfo = sinon.stub().returns([{ + addressStr: 'addr_in_1' + }, { + addressStr: 'addr_out_2' + }]); + + w.getTransactionHistory({ + currentPage: 2, + itemsPerPage: 2 + }, function(err, res) { + res.should.exist; + res.nbItems.should.equal(3); + res.nbPages.should.equal(2); + res.currentPage.should.equal(2); + res.items.should.exist; + res.items.length.should.equal(1); + res.items[0].txid.should.equal('id3'); + done(); + }); + }); + it('should paginate empty list', function(done) { + var w = cachedCreateW2(); + w.blockchain.getTransactions = sinon.stub().yields(null, []); + w.getAddressesInfo = sinon.stub().returns([{ + addressStr: 'addr_in_1' + }, { + addressStr: 'addr_out_2' + }]); + + w.getTransactionHistory({ + currentPage: 2, + itemsPerPage: 2 + }, function(err, res) { + res.should.exist; + res.nbItems.should.equal(0); + res.nbPages.should.equal(0); + res.items.should.exist; + res.items.length.should.equal(0); done(); }); }); @@ -2022,8 +2111,10 @@ describe('Wallet model', function() { w.getTransactionHistory(function(err, res) { res.should.exist; - res[0].action.should.equal('sent'); - res[0].amountSat.should.equal(3900); + res.items.should.exist; + var items = res.items; + items[0].action.should.equal('sent'); + items[0].amountSat.should.equal(3900); done(); }); }); @@ -2063,8 +2154,10 @@ describe('Wallet model', function() { w.getTransactionHistory(function(err, res) { res.should.exist; - res[0].action.should.equal('moved'); - res[0].amountSat.should.equal(3900); + res.items.should.exist; + var items = res.items; + items[0].action.should.equal('moved'); + items[0].amountSat.should.equal(3900); done(); }); }); @@ -2110,7 +2203,8 @@ describe('Wallet model', function() { w.getTransactionHistory(function(err, res) { res.should.exist; - res[0].labelTo.should.equal('Address out one'); + res.items.should.exist; + res.items[0].labelTo.should.equal('Address out one'); done(); }); }); @@ -2158,7 +2252,8 @@ describe('Wallet model', function() { }]); w.getTransactionHistory(function(err, res) { res.should.exist; - res[0].comment.should.equal('Another comment'); + res.items.should.exist; + res.items[0].comment.should.equal('Another comment'); done(); }); }); diff --git a/views/history.html b/views/history.html index 750292d6f..deac8c694 100644 --- a/views/history.html +++ b/views/history.html @@ -100,6 +100,8 @@ + +