mirror of https://github.com/BTCPrivate/copay.git
commit
3fd0dee085
|
@ -11,8 +11,9 @@ angular.module('copayApp.controllers').controller('HistoryController',
|
||||||
$scope.loading = false;
|
$scope.loading = false;
|
||||||
$scope.lastShowed = false;
|
$scope.lastShowed = false;
|
||||||
|
|
||||||
$scope.txpCurrentPage = 1;
|
$scope.currentPage = 1;
|
||||||
$scope.txpItemsPerPage = 4;
|
$scope.itemsPerPage = 10;
|
||||||
|
$scope.nbPages = 0;
|
||||||
$scope.blockchain_txs = [];
|
$scope.blockchain_txs = [];
|
||||||
$scope.alternativeCurrency = [];
|
$scope.alternativeCurrency = [];
|
||||||
|
|
||||||
|
@ -24,19 +25,38 @@ angular.module('copayApp.controllers').controller('HistoryController',
|
||||||
$scope.loading = true;
|
$scope.loading = true;
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
$scope.update();
|
$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() {
|
$scope.getTransactions = function() {
|
||||||
|
|
||||||
var w = $rootScope.wallet;
|
var w = $rootScope.wallet;
|
||||||
if (!w) return;
|
if (!w) return;
|
||||||
|
|
||||||
$scope.blockchain_txs = w.cached_txs || [];
|
$scope.blockchain_txs = w.cached_txs || [];
|
||||||
$scope.loading = true;
|
$scope.loading = true;
|
||||||
|
|
||||||
w.getTransactionHistory(function(err, res) {
|
w.getTransactionHistory({
|
||||||
|
currentPage: $scope.currentPage,
|
||||||
|
itemsPerPage: $scope.itemsPerPage,
|
||||||
|
}, function(err, res) {
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
if (!res) {
|
if (!res) {
|
||||||
|
@ -45,10 +65,15 @@ angular.module('copayApp.controllers').controller('HistoryController',
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_.each(res, function(r) {
|
var items = res.items;
|
||||||
|
|
||||||
|
_.each(items, function(r) {
|
||||||
r.ts = r.minedTs || r.sentTs;
|
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;
|
$scope.loading = false;
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
$scope.$digest();
|
$scope.$digest();
|
||||||
|
|
|
@ -625,32 +625,4 @@ angular.module('copayApp.controllers').controller('SendController',
|
||||||
'.' + ' Message: ' + merchantData.pr.pd.memo);
|
'.' + ' 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();
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -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;
|
var self = this;
|
||||||
|
|
||||||
|
if (_.isFunction(opts)) {
|
||||||
|
cb = opts;
|
||||||
|
opts = {};
|
||||||
|
}
|
||||||
|
opts = opts || {};
|
||||||
|
|
||||||
var addresses = self.getAddressesInfo();
|
var addresses = self.getAddressesInfo();
|
||||||
var proposals = self.getTxProposals();
|
var proposals = self.getTxProposals();
|
||||||
var satToUnit = 1 / self.settings.unitToSatoshi;
|
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) {
|
if (addresses.length > 0) {
|
||||||
var addressesStr = _.pluck(addresses, 'addressStr');
|
var addressesStr = _.pluck(addresses, 'addressStr');
|
||||||
self.blockchain.getTransactions(addressesStr, function(err, txs) {
|
self.blockchain.getTransactions(addressesStr, function(err, txs) {
|
||||||
|
@ -2957,7 +2985,11 @@ Wallet.prototype.getTransactionHistory = function(cb) {
|
||||||
decorateTx(tx);
|
decorateTx(tx);
|
||||||
return 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));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
121
test/Wallet.js
121
test/Wallet.js
|
@ -1976,13 +1976,102 @@ describe('Wallet model', function() {
|
||||||
|
|
||||||
w.getTransactionHistory(function(err, res) {
|
w.getTransactionHistory(function(err, res) {
|
||||||
res.should.exist;
|
res.should.exist;
|
||||||
res.length.should.equal(3);
|
res.items.should.exist;
|
||||||
res[0].action.should.equal('sent');
|
var items = res.items;
|
||||||
res[0].amountSat.should.equal(900);
|
items.length.should.equal(3);
|
||||||
res[1].action.should.equal('received');
|
items[0].action.should.equal('sent');
|
||||||
res[1].amountSat.should.equal(1900);
|
items[0].amountSat.should.equal(900);
|
||||||
res[2].action.should.equal('moved');
|
items[1].action.should.equal('received');
|
||||||
res[2].amountSat.should.equal(2900);
|
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();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -2022,8 +2111,10 @@ describe('Wallet model', function() {
|
||||||
|
|
||||||
w.getTransactionHistory(function(err, res) {
|
w.getTransactionHistory(function(err, res) {
|
||||||
res.should.exist;
|
res.should.exist;
|
||||||
res[0].action.should.equal('sent');
|
res.items.should.exist;
|
||||||
res[0].amountSat.should.equal(3900);
|
var items = res.items;
|
||||||
|
items[0].action.should.equal('sent');
|
||||||
|
items[0].amountSat.should.equal(3900);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -2063,8 +2154,10 @@ describe('Wallet model', function() {
|
||||||
|
|
||||||
w.getTransactionHistory(function(err, res) {
|
w.getTransactionHistory(function(err, res) {
|
||||||
res.should.exist;
|
res.should.exist;
|
||||||
res[0].action.should.equal('moved');
|
res.items.should.exist;
|
||||||
res[0].amountSat.should.equal(3900);
|
var items = res.items;
|
||||||
|
items[0].action.should.equal('moved');
|
||||||
|
items[0].amountSat.should.equal(3900);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -2110,7 +2203,8 @@ describe('Wallet model', function() {
|
||||||
|
|
||||||
w.getTransactionHistory(function(err, res) {
|
w.getTransactionHistory(function(err, res) {
|
||||||
res.should.exist;
|
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();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -2158,7 +2252,8 @@ describe('Wallet model', function() {
|
||||||
}]);
|
}]);
|
||||||
w.getTransactionHistory(function(err, res) {
|
w.getTransactionHistory(function(err, res) {
|
||||||
res.should.exist;
|
res.should.exist;
|
||||||
res[0].comment.should.equal('Another comment');
|
res.items.should.exist;
|
||||||
|
res.items[0].comment.should.equal('Another comment');
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -100,6 +100,8 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<button ng-click="previousPage()" ng-disabled="!hasPreviousPage()">prev</button>
|
||||||
|
<button ng-click="nextPage()" ng-disabled="!hasNextPage()">next</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue