diff --git a/.gitignore b/.gitignore index deecde6..49b6841 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,5 @@ public/lib/* db/txs/* db/blocks/* +public/js/* +public/css/* diff --git a/Gruntfile.js b/Gruntfile.js index 3c90156..4b42475 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -2,10 +2,12 @@ module.exports = function(grunt) { - //Load NPM tasks grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-jshint'); + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-contrib-concat'); + grunt.loadNpmTasks('grunt-css'); grunt.loadNpmTasks('grunt-mocha-test'); grunt.loadNpmTasks('grunt-nodemon'); grunt.loadNpmTasks('grunt-concurrent'); @@ -48,19 +50,70 @@ module.exports = function(grunt) { }, jshint: { all: { - src: ['Gruntfile.js', 'insight.js', 'app/**/*.js', 'public/js/**','lib/*.js'], + src: ['Gruntfile.js', 'insight.js', 'app/**/*.js', 'public/src/js/**/*.js','lib/*.js'], options: { jshintrc: true } } }, + concat: { + options: { + process: function(src, filepath) { + if (filepath.substr(filepath.length - 2) === 'js') { + return '// Source: ' + filepath + '\n' + + src.replace(/(^|\n)[ \t]*('use strict'|"use strict");?\s*/g, '$1'); + } else { + return src; + } + } + }, + vendors: { + src: ['public/lib/momentjs/min/moment.min.js', 'public/lib/qrcode-generator/js/qrcode.js', 'public/lib/zeroclipboard/ZeroClipboard.min.js'], + dest: 'public/js/vendors.js' + }, + angular: { + src: ['public/lib/angular/angular.min.js', 'public/lib/angular-resource/angular-resource.min.js', 'public/lib/angular-route/angular-route.min.js', 'public/lib/angular-qrcode/qrcode.js', 'public/lib/angular-animate/angular-animate.min.js', 'public/lib/angular-bootstrap/ui-bootstrap.min.js', 'public/lib/angular-bootstrap/ui-bootstrap-tpls.min.js', 'public/lib/angular-ui-utils/ui-utils.min.js', 'public/lib/ngprogress/build/ngProgress.min.js'], + dest: 'public/js/angularjs-all.js' + }, + main: { + src: ['public/src/js/app.js', 'public/src/js/controllers/*.js', 'public/src/js/services/*.js', 'public/src/js/directives.js', 'public/src/js/filters.js', 'public/src/js/config.js', 'public/src/js/init.js'], + dest: 'public/js/main.js' + }, + css: { + src: ['public/lib/ngprogress/ngProgress.css', 'public/src/css/**/*.css'], + dest: 'public/css/main.css' + } + }, + uglify: { + options: { + banner: '/*! <%= pkg.name %> <%= pkg.version %> */\n', + mangle: false + }, + vendors: { + src: 'public/js/vendors.js', + dest: 'public/js/vendors.min.js' + }, + angular: { + src: 'public/js/angularjs-all.js', + dest: 'public/js/angularjs-all.min.js' + }, + main: { + src: 'public/js/main.js', + dest: 'public/js/main.min.js' + } + }, + cssmin: { + css: { + src: 'public/css/main.css', + dest: 'public/css/main.min.css' + } + }, mochaTest: { options: { reporter: 'spec', }, src: ['test/**/*.js'], }, - nodemon: { dev: { script: 'insight.js', @@ -93,8 +146,11 @@ module.exports = function(grunt) { grunt.option('force', true); //Default task(s). - grunt.registerTask('default', ['jshint','concurrent']); - + grunt.registerTask('default', ['jshint', 'concurrent']); + + //Compile task (concat + minify) + grunt.registerTask('compile', ['concat', 'uglify', 'cssmin']); + //Test task. grunt.registerTask('test', ['env:test', 'mochaTest']); }; diff --git a/app/controllers/blocks.js b/app/controllers/blocks.js index f66aa35..a2b6ca7 100644 --- a/app/controllers/blocks.js +++ b/app/controllers/blocks.js @@ -72,7 +72,6 @@ console.log('[blocks.js.60]: could not get %s from RPC. Orphan? Error?', blockha * List of blocks by date */ exports.list = function(req, res) { - var limit = req.query.limit || -1; var isToday = false; //helper to convert timestamps to yyyy-mm-dd format @@ -103,14 +102,18 @@ exports.list = function(req, res) { var prev = formatTimestamp(new Date((gte - 86400) * 1000)); var next = formatTimestamp(new Date(lte * 1000)); - bdb.getBlocksByDate(gte, lte, limit, function(err, blocks) { + bdb.getBlocksByDate(gte, lte, function(err, blocks) { if (err) { res.status(500).send(err); } else { var blockshashList = []; - for(var i=0;i .container { padding: 60px 15px 0; } -.container .text-muted a { color: #eee; } - #footer > .container { padding: auto 15px; } .code { font-size: 80%; } diff --git a/public/js/app.js b/public/src/js/app.js old mode 100755 new mode 100644 similarity index 97% rename from public/js/app.js rename to public/src/js/app.js index 279ea33..0fdc6c3 --- a/public/js/app.js +++ b/public/src/js/app.js @@ -4,6 +4,7 @@ angular.module('insight',[ 'ngAnimate', 'ngResource', 'ngRoute', + 'ngProgress', 'ui.bootstrap', 'ui.route', 'monospaced.qrcode', diff --git a/public/js/config.js b/public/src/js/config.js old mode 100755 new mode 100644 similarity index 90% rename from public/js/config.js rename to public/src/js/config.js index b5399ad..b1b66f8 --- a/public/js/config.js +++ b/public/src/js/config.js @@ -47,8 +47,14 @@ angular.module('insight') $locationProvider.html5Mode(true); $locationProvider.hashPrefix('!'); }) - .run(function($rootScope, $route) { + .run(function($rootScope, $route, ngProgress) { + $rootScope.$on('$routeChangeStart', function() { + ngProgress.start(); + }); + $rootScope.$on('$routeChangeSuccess', function() { + ngProgress.complete(); + //Change page title, based on Route information $rootScope.titleDetail = ''; $rootScope.title = $route.current.title; diff --git a/public/js/controllers/address.js b/public/src/js/controllers/address.js similarity index 100% rename from public/js/controllers/address.js rename to public/src/js/controllers/address.js diff --git a/public/js/controllers/blocks.js b/public/src/js/controllers/blocks.js similarity index 100% rename from public/js/controllers/blocks.js rename to public/src/js/controllers/blocks.js diff --git a/public/js/controllers/connection.js b/public/src/js/controllers/connection.js similarity index 100% rename from public/js/controllers/connection.js rename to public/src/js/controllers/connection.js diff --git a/public/js/controllers/currency.js b/public/src/js/controllers/currency.js similarity index 100% rename from public/js/controllers/currency.js rename to public/src/js/controllers/currency.js diff --git a/public/js/controllers/footer.js b/public/src/js/controllers/footer.js similarity index 100% rename from public/js/controllers/footer.js rename to public/src/js/controllers/footer.js diff --git a/public/js/controllers/header.js b/public/src/js/controllers/header.js old mode 100755 new mode 100644 similarity index 100% rename from public/js/controllers/header.js rename to public/src/js/controllers/header.js diff --git a/public/js/controllers/index.js b/public/src/js/controllers/index.js old mode 100755 new mode 100644 similarity index 69% rename from public/js/controllers/index.js rename to public/src/js/controllers/index.js index 687c491..0412c66 --- a/public/js/controllers/index.js +++ b/public/src/js/controllers/index.js @@ -4,9 +4,18 @@ var TRANSACTION_DISPLAYED = 5; var BLOCKS_DISPLAYED = 5; angular.module('insight.system').controller('IndexController', - function($scope, $rootScope, Global, getSocket, Blocks, Block, Transactions, Transaction) { + function($scope, $rootScope, Global, getSocket, Blocks, Transaction) { $scope.global = Global; + var _getBlocks = function() { + Blocks.get({ + limit: BLOCKS_DISPLAYED + }, function(res) { + $scope.blocks = res.blocks; + $scope.blocksLength = res.lenght; + }); + }; + var _getTransaction = function(txid, cb) { Transaction.get({ txId: txid @@ -15,14 +24,6 @@ angular.module('insight.system').controller('IndexController', }); }; - var _getBlock = function(hash) { - Block.get({ - blockHash: hash - }, function(res) { - $scope.blocks.unshift(res); - }); - }; - var socket = getSocket($scope); socket.emit('subscribe', 'inv'); @@ -42,14 +43,9 @@ angular.module('insight.system').controller('IndexController', }); socket.on('block', function(block) { - console.log('Block received! ' + JSON.stringify(block)); - var blockHash = block.toString(); - if (parseInt($scope.blocks.length, 10) > parseInt(BLOCKS_DISPLAYED, 10) - 1) { - $scope.blocks.pop(); - } - - _getBlock(blockHash); + console.log('Block received! ' + JSON.stringify(blockHash)); + _getBlocks(); }); $scope.humanSince = function(time) { @@ -58,18 +54,7 @@ angular.module('insight.system').controller('IndexController', }; $scope.index = function() { - Blocks.get({ - limit: BLOCKS_DISPLAYED - }, function(res) { - $scope.blocks = res.blocks; - $scope.blocksLength = res.lenght; - }); - - Transactions.get({ - limit: TRANSACTION_DISPLAYED - }, function(res) { - $scope.txs = res.txs; - }); + _getBlocks(); }; $scope.txs = []; diff --git a/public/js/controllers/search.js b/public/src/js/controllers/search.js similarity index 100% rename from public/js/controllers/search.js rename to public/src/js/controllers/search.js diff --git a/public/js/controllers/status.js b/public/src/js/controllers/status.js similarity index 100% rename from public/js/controllers/status.js rename to public/src/js/controllers/status.js diff --git a/public/js/controllers/transactions.js b/public/src/js/controllers/transactions.js similarity index 100% rename from public/js/controllers/transactions.js rename to public/src/js/controllers/transactions.js diff --git a/public/js/directives.js b/public/src/js/directives.js old mode 100755 new mode 100644 similarity index 100% rename from public/js/directives.js rename to public/src/js/directives.js diff --git a/public/js/filters.js b/public/src/js/filters.js old mode 100755 new mode 100644 similarity index 100% rename from public/js/filters.js rename to public/src/js/filters.js diff --git a/public/js/init.js b/public/src/js/init.js old mode 100755 new mode 100644 similarity index 100% rename from public/js/init.js rename to public/src/js/init.js diff --git a/public/js/services/address.js b/public/src/js/services/address.js similarity index 100% rename from public/js/services/address.js rename to public/src/js/services/address.js diff --git a/public/js/services/blocks.js b/public/src/js/services/blocks.js similarity index 100% rename from public/js/services/blocks.js rename to public/src/js/services/blocks.js diff --git a/public/js/services/currency.js b/public/src/js/services/currency.js similarity index 100% rename from public/js/services/currency.js rename to public/src/js/services/currency.js diff --git a/public/js/services/global.js b/public/src/js/services/global.js similarity index 100% rename from public/js/services/global.js rename to public/src/js/services/global.js diff --git a/public/js/services/socket.js b/public/src/js/services/socket.js similarity index 100% rename from public/js/services/socket.js rename to public/src/js/services/socket.js diff --git a/public/js/services/status.js b/public/src/js/services/status.js similarity index 100% rename from public/js/services/status.js rename to public/src/js/services/status.js diff --git a/public/js/services/transactions.js b/public/src/js/services/transactions.js similarity index 100% rename from public/js/services/transactions.js rename to public/src/js/services/transactions.js diff --git a/public/views/block_list.html b/public/views/block_list.html index 9b8f366..b88dfdf 100644 --- a/public/views/block_list.html +++ b/public/views/block_list.html @@ -33,19 +33,17 @@ Timestamp Transactions Size - Confirmations - Waiting for blocks... + Waiting for blocks... {{b.height}} {{b.time * 1000 | date:'medium'}} {{b.tx.length}} {{b.size}} - {{b.confirmations}} diff --git a/public/views/index.html b/public/views/index.html index cba1d2c..a6fb738 100644 --- a/public/views/index.html +++ b/public/views/index.html @@ -14,11 +14,10 @@ Age Transactions Size - Confirmations - Waiting for blocks... + Waiting for blocks... {{b.height}} @@ -26,14 +25,11 @@ {{humanSince(b.time)}} {{b.tx.length}} {{b.size}} - {{b.confirmations}}

About

-

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quas, sint, neque harum libero eos maiores rerum rem fuga quae architecto ea incidunt dolore optio ullam sit placeat vero perferendis beatae?

-

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis, unde quidem commodi dolor asperiores ullam molestias sit a sapiente ipsa!

-

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deserunt tempora fugiat dolorem cupiditate perspiciatis praesentium.

+

Insight is a bitcoin blockchain API for writing web wallets and other apps that need more advanced blockchain queries than provided by bitcoind RPC. Check out the source code.

@@ -48,43 +44,16 @@ - Waiting for transactions... + Waiting for transactions... {{tx.txid}} {{humanSince(tx.time)}} - {{tx.valueOut}} + {{tx.valueOut}} -

Other Bitcoin Links

-
diff --git a/test/integration/blocklist.js b/test/integration/blocklist.js index d1ed33d..628ef0d 100644 --- a/test/integration/blocklist.js +++ b/test/integration/blocklist.js @@ -3,11 +3,10 @@ process.env.NODE_ENV = process.env.NODE_ENV || 'development'; -var TESTING_BLOCK0 = '000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943'; -var TESTING_BLOCK1 = '00000000b873e79784647a6c82962c70d228557d24a747ea4d1b8bbe878e1206'; +var TESTING_BLOCK0 = '00000000b873e79784647a6c82962c70d228557d24a747ea4d1b8bbe878e1206'; +var TESTING_BLOCK1 = '000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943'; var START_TS = 1; var END_TS = '1296688928~'; // 2/2/2011 23:23PM -var LIMIT = 2; var assert = require('assert'), BlockDb = require('../../lib/BlockDb').class(); @@ -24,7 +23,7 @@ describe('BlockDb getBlocksByDate', function(){ it('Get Hash by Date', function(done) { - bDb.getBlocksByDate(START_TS, END_TS, LIMIT, function(err, list) { + bDb.getBlocksByDate(START_TS, END_TS, function(err, list) { if (err) done(err); assert(list, 'returns list'); assert.equal(list.length,2, 'list has 2 items');