From c112b1c7e59cf4d746b917a030e1ae8b9ba1b92d Mon Sep 17 00:00:00 2001 From: Mario Colque Date: Tue, 21 Jan 2014 12:55:38 -0300 Subject: [PATCH 1/2] lazy load for transactions list --- app/controllers/transactions.js | 62 ++++++++++++++++-------- public/js/controllers/transactions.js | 70 +++++++++++++++++++-------- public/js/directives.js | 26 +++++++++- public/views/footer.html | 7 +-- public/views/transaction/list.html | 10 ++-- 5 files changed, 123 insertions(+), 52 deletions(-) diff --git a/app/controllers/transactions.js b/app/controllers/transactions.js index 5676790e..10128159 100644 --- a/app/controllers/transactions.js +++ b/app/controllers/transactions.js @@ -52,8 +52,12 @@ var getTransaction = function(txid, cb) { */ exports.list = function(req, res, next) { var bId = req.query.block; - var aId = req.query.address; - var limit = req.query.limit || 1000; + var addrStr = req.query.address; + var page = req.query.pageNum; + var pageLength = 20; + var pagesTotal = 1; + var txLength; + var txs; if (bId) { Block.fromHashWithInfo(bId, function(err, block) { @@ -63,14 +67,28 @@ exports.list = function(req, res, next) { return next(); } - async.mapSeries(block.info.tx, getTransaction, + txLength = block.info.tx.length; + + if (page) { + var spliceInit = page * pageLength; + txs = block.info.tx.splice(spliceInit, pageLength); + pagesTotal = Math.ceil(txLength / pageLength); + } + else { + txs = block.info.tx; + } + + async.mapSeries(txs, getTransaction, function(err, results) { - res.jsonp(results); + res.jsonp({ + pagesTotal: pagesTotal, + txs: results + }); }); }); } - else if (aId) { - var a = Address.new(aId); + else if (addrStr) { + var a = Address.new(addrStr); a.update(function(err) { if (err && !a.totalReceivedSat) { @@ -79,23 +97,25 @@ exports.list = function(req, res, next) { return next(); } - async.mapSeries(a.transactions, getTransaction, + txLength = a.transactions.length; + + if (page) { + var spliceInit = page * pageLength; + txs = a.transactions.splice(spliceInit, pageLength); + pagesTotal = Math.ceil(txLength / pageLength); + } + else { + txs = a.transactions; + } + + async.mapSeries(txs, getTransaction, function(err, results) { - res.jsonp(results); + res.jsonp({ + pagesTotal: pagesTotal, + txs: results + }); }); }); } - else { - Transaction - .find() - .limit(limit) - .sort('-time') - .exec(function(err, txs) { - if (err) { - res.status(500).send(err); - } else { - res.jsonp(txs); - } - }); - } + }; diff --git a/public/js/controllers/transactions.js b/public/js/controllers/transactions.js index 28efee2a..f657dea6 100644 --- a/public/js/controllers/transactions.js +++ b/public/js/controllers/transactions.js @@ -3,12 +3,16 @@ angular.module('insight.transactions').controller('transactionsController', function ($scope, $rootScope, $routeParams, $location, Global, Transaction, TransactionsByBlock, TransactionsByAddress, get_socket) { $scope.global = Global; + $scope.loading = false; + $scope.loadedBy = null; + + var pageNum = 0; + var pagesTotal = 1; $scope.findThis = function() { $scope.findTx($routeParams.txId); }; - $scope.aggregateItems = function(items) { var l = items.length; @@ -16,12 +20,12 @@ angular.module('insight.transactions').controller('transactionsController', var tmp = {}; var u=0; // TODO multiple output address - // + // for(var i=0; i < l; i++) { var notAddr = false; - // non standard input + // non standard input if (items[i].scriptSig && !items[i].addr) { items[i].addr = 'Unparsed address [' + u++ + ']'; items[i].notAddr = true; @@ -57,7 +61,6 @@ angular.module('insight.transactions').controller('transactionsController', return (ret); }; - $scope.processTX = function(tx) { tx.vinSimple = $scope.aggregateItems(tx.vin); tx.voutSimple = $scope.aggregateItems(tx.vout); @@ -84,27 +87,54 @@ angular.module('insight.transactions').controller('transactionsController', }); }; - $scope.byBlock = function(bId) { - TransactionsByBlock.query({ - block: bId - }, function(txs) { - angular.forEach(txs, function(tx) { - $scope.processTX(tx); - }); - $scope.txs = txs; + $scope.byBlock = function() { + TransactionsByBlock.get({ + block: $routeParams.blockHash, + pageNum: pageNum + }, function(data) { + $scope.paginate(data); }); }; - $scope.byAddress = function(aId) { - TransactionsByAddress.query({ - address: aId - }, function(txs) { - angular.forEach(txs, function(tx) { - $scope.processTX(tx); - }); - $scope.txs = txs; + $scope.byAddress = function () { + TransactionsByAddress.get({ + address: $routeParams.addrStr, + pageNum: pageNum + }, function(data) { + $scope.paginate(data); }); }; + + $scope.paginate = function (data) { + $scope.loading = false; + + pagesTotal = data.pagesTotal; + pageNum += 1; + + data.txs.forEach(function(tx) { + $scope.processTX(tx); + $scope.txs.push(tx); + }); + }; + + $scope.load = function(from) { + $scope.loadedBy = from; + $scope.loadMore(); + }; + + $scope.loadMore = function() { + if (pageNum < pagesTotal && !$scope.loading) { + $scope.loading = true; + + if ($scope.loadedBy === 'address') { + $scope.byAddress(); + } + else { + $scope.byBlock(); + } + } + }; + var socket = get_socket($scope); socket.on('atx', function(tx) { console.log('atx '+tx.txid); diff --git a/public/js/directives.js b/public/js/directives.js index a726efc4..d0fe4877 100755 --- a/public/js/directives.js +++ b/public/js/directives.js @@ -1 +1,25 @@ -'use strict'; \ No newline at end of file +'use strict'; + +angular.module('insight.address').directive('whenScrolled', ['$window', function($window) { + return { + link: function(scope, elm, attr) { + var pageHeight, clientHeight, scrollPos; + $window = angular.element($window); + + var handler = function() { + pageHeight = window.document.documentElement.scrollHeight; + clientHeight = window.document.documentElement.clientHeight; + scrollPos = window.pageYOffset; + + if (pageHeight - (scrollPos + clientHeight) === 0) { + scope.$apply(attr.whenScrolled); + } + }; + + $window.on('scroll', handler); + scope.$on('$destroy', function() { + return $window.off('scroll', handler); + }); + } + }; +}]); diff --git a/public/views/footer.html b/public/views/footer.html index 7401eaee..24a739e8 100644 --- a/public/views/footer.html +++ b/public/views/footer.html @@ -1,6 +1,3 @@ -
-
-

Insight

-
+ - diff --git a/public/views/transaction/list.html b/public/views/transaction/list.html index bd9b7555..c1262f2d 100644 --- a/public/views/transaction/list.html +++ b/public/views/transaction/list.html @@ -1,9 +1,9 @@ -
-
- Loading... -
-
There are not transactions
+
+
+ Loading... +
+
From 038ab3c12a3ae2f94894ed337cc863e897cc59ee Mon Sep 17 00:00:00 2001 From: Mario Colque Date: Tue, 21 Jan 2014 13:01:35 -0300 Subject: [PATCH 2/2] added the directive for loadMore --- public/views/address.html | 8 ++++---- public/views/block.html | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/public/views/address.html b/public/views/address.html index 71ec54e8..2736b03e 100644 --- a/public/views/address.html +++ b/public/views/address.html @@ -7,7 +7,7 @@

Address

{{address.addrStr}}
- +

Summary

@@ -33,11 +33,11 @@ - +
-
+

Transactions Transactions contained within this block

-
+
diff --git a/public/views/block.html b/public/views/block.html index 16447eb4..88cc2313 100644 --- a/public/views/block.html +++ b/public/views/block.html @@ -33,7 +33,7 @@ - +

Summary

@@ -84,9 +84,9 @@
-
+

Transactions Transactions contained within this block

-
+