diff --git a/js/controllers/copayers.js b/js/controllers/copayers.js index c239beff1..8ca238111 100644 --- a/js/controllers/copayers.js +++ b/js/controllers/copayers.js @@ -15,7 +15,7 @@ angular.module('copayApp.controllers').controller('CopayersController', } $scope.goToWallet = function() { - $location.path('/addresses'); + $location.path('/receive'); }; $scope.deleteWallet = function() { diff --git a/js/controllers/send.js b/js/controllers/send.js index a87e5c256..dbf98b6aa 100644 --- a/js/controllers/send.js +++ b/js/controllers/send.js @@ -2,13 +2,25 @@ var bitcore = require('bitcore'); angular.module('copayApp.controllers').controller('SendController', - function($scope, $rootScope, $window, $timeout, $anchorScroll, $modal, isMobile, notification) { + function($scope, $rootScope, $window, $timeout, $anchorScroll, $modal, isMobile, notification, controllerUtils) { $scope.title = 'Send'; $scope.loading = false; var satToUnit = 1 / config.unitToSatoshi; $scope.defaultFee = bitcore.TransactionBuilder.FEE_PER_1000B_SAT * satToUnit; $scope.unitToBtc = config.unitToSatoshi / bitcore.util.COIN; + $scope.loadTxs = function() { + var opts = { + pending: true, + skip: null + }; + controllerUtils.updateTxs(opts); + setTimeout(function() { + $scope.loading = false; + $rootScope.$digest(); + }, 0); + } + $scope.showAddressBook = function() { var w = $rootScope.wallet; var flag; @@ -54,7 +66,7 @@ angular.module('copayApp.controllers').controller('SendController', $scope.loading = false; var message = 'The transaction proposal has been created'; notification.success('Success!', message); - $rootScope.$digest(); + $scope.loadTxs(); } else { w.sendTx(ntxid, function(txid) { if (txid) { @@ -63,6 +75,7 @@ angular.module('copayApp.controllers').controller('SendController', notification.error('Error', 'There was an error sending the transaction.'); } $scope.loading = false; + $scope.loadTxs(); }); } $rootScope.pendingPayment = null; @@ -280,4 +293,51 @@ angular.module('copayApp.controllers').controller('SendController', $scope.amount = $scope.getAvailableAmount(); form.amount.$pristine = false; }; + + + $scope.send = function(ntxid, cb) { + $scope.loading = true; + $rootScope.txAlertCount = 0; + var w = $rootScope.wallet; + w.sendTx(ntxid, function(txid) { + if (!txid) { + notification.error('Error', 'There was an error sending the transaction'); + } else { + notification.success('Transaction broadcast', 'Transaction id: '+txid); + } + + if (cb) return cb(); + else $scope.loadTxs(); + }); + }; + + $scope.sign = function(ntxid) { + $scope.loading = true; + var w = $rootScope.wallet; + w.sign(ntxid, function(ret) { + if (!ret) { + notification.error('Error', 'There was an error signing the transaction'); + $scope.loadTxs(); + } else { + var p = w.txProposals.getTxProposal(ntxid); + if (p.builder.isFullySigned()) { + $scope.send(ntxid, function() { + $scope.loadTxs(); + }); + } else + $scope.loadTxs(); + } + }); + }; + + $scope.reject = function(ntxid) { + $scope.loading = true; + $rootScope.txAlertCount = 0; + var w = $rootScope.wallet; + w.reject(ntxid); + notification.warning('Transaction rejected', 'You rejected the transaction successfully'); + $scope.loading = false; + $scope.loadTxs(); + }; + }); diff --git a/js/controllers/sidebar.js b/js/controllers/sidebar.js index ea185383e..f90b13f01 100644 --- a/js/controllers/sidebar.js +++ b/js/controllers/sidebar.js @@ -4,17 +4,17 @@ angular.module('copayApp.controllers').controller('SidebarController', function($scope, $rootScope, $sce, $location, $http, notification, controllerUtils) { $scope.menu = [{ - 'title': 'Addresses', - 'icon': 'fi-address-book', - 'link': 'addresses' - }, { - 'title': 'Transactions', - 'icon': 'fi-clipboard-pencil', - 'link': 'transactions' + 'title': 'Receive', + 'icon': 'fi-arrow-left', + 'link': 'receive' }, { 'title': 'Send', 'icon': 'fi-arrow-right', 'link': 'send' + }, { + 'title': 'History', + 'icon': 'fi-clipboard-pencil', + 'link': 'history' }, { 'title': 'More', 'icon': 'fi-download', diff --git a/js/controllers/transactions.js b/js/controllers/transactions.js index 7a8185d9c..a8fb8f7d8 100644 --- a/js/controllers/transactions.js +++ b/js/controllers/transactions.js @@ -6,7 +6,6 @@ angular.module('copayApp.controllers').controller('TransactionsController', $scope.title = 'Transactions'; $scope.loading = false; - $scope.onlyPending = true; $scope.lastShowed = false; $scope.txpCurrentPage = 1; @@ -19,16 +18,17 @@ angular.module('copayApp.controllers').controller('TransactionsController', $scope.loading = false; var from = ($scope.txpCurrentPage - 1) * $scope.txpItemsPerPage; var opts = { - onlyPending: $scope.onlyPending, - skip: !$scope.onlyPending ? [from, from + $scope.txpItemsPerPage] : null + pending: false, + skip: [from, from + $scope.txpItemsPerPage] }; controllerUtils.updateTxs(opts); - $rootScope.$digest(); + setTimeout(function() { + $rootScope.$digest(); + }, 0); }; - $scope.show = function(onlyPending) { + $scope.show = function() { $scope.loading = true; - $scope.onlyPending = onlyPending; setTimeout(function() { $scope.update(); }, 10); @@ -102,40 +102,6 @@ angular.module('copayApp.controllers').controller('TransactionsController', } }; - $scope.send = function(ntxid, cb) { - $scope.loading = true; - $rootScope.txAlertCount = 0; - var w = $rootScope.wallet; - w.sendTx(ntxid, function(txid) { - if (!txid) { - notification.error('Error', 'There was an error sending the transaction'); - } else { - notification.success('Transaction broadcast', 'Transaction id: '+txid); - } - if (cb) return cb(); - else $scope.update(); - }); - }; - - $scope.sign = function(ntxid) { - $scope.loading = true; - var w = $rootScope.wallet; - w.sign(ntxid, function(ret) { - if (!ret) { - notification.error('Error', 'There was an error signing the transaction'); - $scope.update(); - } else { - var p = w.txProposals.getTxProposal(ntxid); - if (p.builder.isFullySigned()) { - $scope.send(ntxid, function() { - $scope.update(); - }); - } else - $scope.update(); - } - }); - }; - $scope.getTransactions = function() { var w = $rootScope.wallet; $scope.loading = true; @@ -174,15 +140,6 @@ angular.module('copayApp.controllers').controller('TransactionsController', return config.networkName.substring(0, 4); }; - $scope.reject = function(ntxid) { - $scope.loading = true; - $rootScope.txAlertCount = 0; - var w = $rootScope.wallet; - w.reject(ntxid); - notification.warning('Transaction rejected', 'You rejected the transaction successfully'); - $scope.loading = false; - }; - // Autoload transactions on 1-of-1 if ($rootScope.wallet && $rootScope.wallet.totalCopayers == 1) { $scope.lastShowed = true; diff --git a/js/routes.js b/js/routes.js index 00ab8b185..712bbda17 100644 --- a/js/routes.js +++ b/js/routes.js @@ -30,11 +30,11 @@ angular templateUrl: 'views/copayers.html', validate: true }) - .when('/addresses', { + .when('/receive', { templateUrl: 'views/addresses.html', validate: true }) - .when('/transactions', { + .when('/history', { templateUrl: 'views/transactions.html', validate: true }) diff --git a/js/services/controllerUtils.js b/js/services/controllerUtils.js index 50c51c4af..f70cdb87c 100644 --- a/js/services/controllerUtils.js +++ b/js/services/controllerUtils.js @@ -58,7 +58,7 @@ angular.module('copayApp.services') }); wallet.on('serverError', function(m) { var message = m || 'The PeerJS server is not responding, please try again'; - $location.path('addresses'); + $location.path('receive'); root.onErrorDigest($scope, message); }); wallet.on('ready', function() { @@ -130,7 +130,7 @@ angular.module('copayApp.services') if ($rootScope.pendingPayment) { $location.path('send'); } else { - $location.path('addresses'); + $location.path('receive'); } if (!config.disableVideo) video.setOwnPeer(myPeerID, w, handlePeerVideo); @@ -143,9 +143,7 @@ angular.module('copayApp.services') } }); w.on('txProposalsUpdated', function(dontDigest) { - root.updateTxs({ - onlyPending: true - }); + root.updateTxs(); // give sometime to the tx to propagate. $timeout(function() { root.updateBalance(function() { @@ -238,7 +236,7 @@ angular.module('copayApp.services') root.updateTxs = function(opts) { var w = $rootScope.wallet; if (!w) return; - opts = opts || {}; + opts = opts || $rootScope.txsOpts || {}; var satToUnit = 1 / config.unitToSatoshi; var myCopayerId = w.getMyCopayerId(); @@ -259,7 +257,8 @@ angular.module('copayApp.services') if (!i.finallyRejected && !i.sentTs) { i.isPending = 1; } - if (!opts.onlyPending || i.isPending) { + + if (!!opts.pending == !!i.isPending) { var tx = i.builder.build(); var outs = []; tx.outs.forEach(function(o) { @@ -283,6 +282,7 @@ angular.module('copayApp.services') }); $rootScope.txs = txs; + $rootScope.txsOpts = opts; if ($rootScope.pendingTxCount < pendingForUs) { $rootScope.txAlertCount = pendingForUs; } diff --git a/test/unit/controllers/controllersSpec.js b/test/unit/controllers/controllersSpec.js index 02aa8c804..9a8447000 100644 --- a/test/unit/controllers/controllersSpec.js +++ b/test/unit/controllers/controllersSpec.js @@ -194,9 +194,12 @@ describe("Unit: Controllers", function() { var spy = sinon.spy(scope.wallet, 'createTx'); var spy2 = sinon.spy(scope.wallet, 'sendTx'); + scope.loadTxs = sinon.spy(); + scope.submitForm(sendForm); sinon.assert.callCount(spy, 1); sinon.assert.callCount(spy2, 0); + sinon.assert.callCount(scope.loadTxs, 1); }); it('should create and send a transaction proposal', function() { @@ -206,10 +209,12 @@ describe("Unit: Controllers", function() { scope.wallet.totalCopayers = scope.wallet.requiredCopayers = 1; var spy = sinon.spy(scope.wallet, 'createTx'); var spy2 = sinon.spy(scope.wallet, 'sendTx'); + scope.loadTxs = sinon.spy(); scope.submitForm(sendForm); sinon.assert.callCount(spy, 1); sinon.assert.callCount(spy2, 1); + sinon.assert.callCount(scope.loadTxs, 1); }); }); diff --git a/views/includes/sidebar-mobile.html b/views/includes/sidebar-mobile.html index ef78fecf9..6d1613595 100644 --- a/views/includes/sidebar-mobile.html +++ b/views/includes/sidebar-mobile.html @@ -1,7 +1,7 @@
- +
@@ -40,12 +40,12 @@
  • - Signout + Close
  • diff --git a/views/includes/sidebar.html b/views/includes/sidebar.html index 4896d9dc6..7803e25bd 100644 --- a/views/includes/sidebar.html +++ b/views/includes/sidebar.html @@ -1,14 +1,14 @@
    - + {{$root.wallet.getName()}} {{item.title}} - {{$root.pendingTxCount}} + {{$root.pendingTxCount}}
  • - Signout + Close
  • diff --git a/views/includes/transaction.html b/views/includes/transaction.html new file mode 100644 index 000000000..874907aba --- /dev/null +++ b/views/includes/transaction.html @@ -0,0 +1,122 @@ +
    + +
    +

    + {{tx.comment}} - + {{$root.wallet.publicKeyRing.nicknameForCopayer(tx.creator)}} +

    +
    +
    +
    +
    +

    {{out.value | noFractionNumber}} {{$root.unitName}}

    +

    {{out.value | noFractionNumber}} {{$root.unitName}}

    +
    +
    +
    + +
    +
    +
    +
    +

    {{tx.createdTs | amCalendar}}

    +
    +
    + +
    +
    + + {{c.cId}} + +
    + + + + + + + + + + + + + + + + + + + + + +
    + +
    +

    + {{c.cId === $root.wallet.getMyCopayerId() ? 'Me' : $root.wallet.publicKeyRing.nicknameForCopayer(c.cId)}} +

    +
    +
    +
    + + diff --git a/views/send.html b/views/send.html index 816b02e3f..a3c719162 100644 --- a/views/send.html +++ b/views/send.html @@ -1,5 +1,12 @@ -
    +
    + +

    Send Proposals

    +
    +
    +
    +
    +

    {{title}}

    diff --git a/views/transactions.html b/views/transactions.html index 4fa9d2eb8..020ea96f9 100644 --- a/views/transactions.html +++ b/views/transactions.html @@ -1,138 +1,13 @@ -
    +
    -

    Transaction proposals ({{txs.length}})

    +

    Transaction Proposals ({{txs.length}})

    - +
    -
    - -
    -

    - {{tx.comment}} - - {{$root.wallet.publicKeyRing.nicknameForCopayer(tx.creator)}} -

    -
    -
    -
    -
    -

    {{out.value | noFractionNumber}} {{$root.unitName}}

    -

    {{out.value | noFractionNumber}} {{$root.unitName}}

    -
    -
    -
    - -
    -
    -
    -
    -

    {{tx.createdTs | amCalendar}}

    -
    -
    - -
    -
    - - {{c.cId}} - -
    - - - - - - - - - - - - - - - - - - - - - -
    - -
    -

    - {{c.cId === $root.wallet.getMyCopayerId() ? 'Me' : $root.wallet.publicKeyRing.nicknameForCopayer(c.cId)}} -

    -
    -
    -
    - - +
    -

    No pending transactions proposals.

    -

    No transactions proposals yet.

    - +

    No transactions proposals yet.

    +