Merge pull request #1059 from yemel/feature/change-menu
Refactor menu, split transactions tab into send and history
This commit is contained in:
commit
fe53f1b87c
12 changed files with 235 additions and 209 deletions
|
|
@ -15,7 +15,7 @@ angular.module('copayApp.controllers').controller('CopayersController',
|
||||||
}
|
}
|
||||||
|
|
||||||
$scope.goToWallet = function() {
|
$scope.goToWallet = function() {
|
||||||
$location.path('/addresses');
|
$location.path('/receive');
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.deleteWallet = function() {
|
$scope.deleteWallet = function() {
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,25 @@
|
||||||
var bitcore = require('bitcore');
|
var bitcore = require('bitcore');
|
||||||
|
|
||||||
angular.module('copayApp.controllers').controller('SendController',
|
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.title = 'Send';
|
||||||
$scope.loading = false;
|
$scope.loading = false;
|
||||||
var satToUnit = 1 / config.unitToSatoshi;
|
var satToUnit = 1 / config.unitToSatoshi;
|
||||||
$scope.defaultFee = bitcore.TransactionBuilder.FEE_PER_1000B_SAT * satToUnit;
|
$scope.defaultFee = bitcore.TransactionBuilder.FEE_PER_1000B_SAT * satToUnit;
|
||||||
$scope.unitToBtc = config.unitToSatoshi / bitcore.util.COIN;
|
$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() {
|
$scope.showAddressBook = function() {
|
||||||
var w = $rootScope.wallet;
|
var w = $rootScope.wallet;
|
||||||
var flag;
|
var flag;
|
||||||
|
|
@ -54,7 +66,7 @@ angular.module('copayApp.controllers').controller('SendController',
|
||||||
$scope.loading = false;
|
$scope.loading = false;
|
||||||
var message = 'The transaction proposal has been created';
|
var message = 'The transaction proposal has been created';
|
||||||
notification.success('Success!', message);
|
notification.success('Success!', message);
|
||||||
$rootScope.$digest();
|
$scope.loadTxs();
|
||||||
} else {
|
} else {
|
||||||
w.sendTx(ntxid, function(txid) {
|
w.sendTx(ntxid, function(txid) {
|
||||||
if (txid) {
|
if (txid) {
|
||||||
|
|
@ -63,6 +75,7 @@ angular.module('copayApp.controllers').controller('SendController',
|
||||||
notification.error('Error', 'There was an error sending the transaction.');
|
notification.error('Error', 'There was an error sending the transaction.');
|
||||||
}
|
}
|
||||||
$scope.loading = false;
|
$scope.loading = false;
|
||||||
|
$scope.loadTxs();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
$rootScope.pendingPayment = null;
|
$rootScope.pendingPayment = null;
|
||||||
|
|
@ -280,4 +293,51 @@ angular.module('copayApp.controllers').controller('SendController',
|
||||||
$scope.amount = $scope.getAvailableAmount();
|
$scope.amount = $scope.getAvailableAmount();
|
||||||
form.amount.$pristine = false;
|
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();
|
||||||
|
};
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -4,17 +4,17 @@ angular.module('copayApp.controllers').controller('SidebarController',
|
||||||
function($scope, $rootScope, $sce, $location, $http, notification, controllerUtils) {
|
function($scope, $rootScope, $sce, $location, $http, notification, controllerUtils) {
|
||||||
|
|
||||||
$scope.menu = [{
|
$scope.menu = [{
|
||||||
'title': 'Addresses',
|
'title': 'Receive',
|
||||||
'icon': 'fi-address-book',
|
'icon': 'fi-arrow-left',
|
||||||
'link': 'addresses'
|
'link': 'receive'
|
||||||
}, {
|
|
||||||
'title': 'Transactions',
|
|
||||||
'icon': 'fi-clipboard-pencil',
|
|
||||||
'link': 'transactions'
|
|
||||||
}, {
|
}, {
|
||||||
'title': 'Send',
|
'title': 'Send',
|
||||||
'icon': 'fi-arrow-right',
|
'icon': 'fi-arrow-right',
|
||||||
'link': 'send'
|
'link': 'send'
|
||||||
|
}, {
|
||||||
|
'title': 'History',
|
||||||
|
'icon': 'fi-clipboard-pencil',
|
||||||
|
'link': 'history'
|
||||||
}, {
|
}, {
|
||||||
'title': 'More',
|
'title': 'More',
|
||||||
'icon': 'fi-download',
|
'icon': 'fi-download',
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ angular.module('copayApp.controllers').controller('TransactionsController',
|
||||||
|
|
||||||
$scope.title = 'Transactions';
|
$scope.title = 'Transactions';
|
||||||
$scope.loading = false;
|
$scope.loading = false;
|
||||||
$scope.onlyPending = true;
|
|
||||||
$scope.lastShowed = false;
|
$scope.lastShowed = false;
|
||||||
|
|
||||||
$scope.txpCurrentPage = 1;
|
$scope.txpCurrentPage = 1;
|
||||||
|
|
@ -19,16 +18,17 @@ angular.module('copayApp.controllers').controller('TransactionsController',
|
||||||
$scope.loading = false;
|
$scope.loading = false;
|
||||||
var from = ($scope.txpCurrentPage - 1) * $scope.txpItemsPerPage;
|
var from = ($scope.txpCurrentPage - 1) * $scope.txpItemsPerPage;
|
||||||
var opts = {
|
var opts = {
|
||||||
onlyPending: $scope.onlyPending,
|
pending: false,
|
||||||
skip: !$scope.onlyPending ? [from, from + $scope.txpItemsPerPage] : null
|
skip: [from, from + $scope.txpItemsPerPage]
|
||||||
};
|
};
|
||||||
controllerUtils.updateTxs(opts);
|
controllerUtils.updateTxs(opts);
|
||||||
$rootScope.$digest();
|
setTimeout(function() {
|
||||||
|
$rootScope.$digest();
|
||||||
|
}, 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.show = function(onlyPending) {
|
$scope.show = function() {
|
||||||
$scope.loading = true;
|
$scope.loading = true;
|
||||||
$scope.onlyPending = onlyPending;
|
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
$scope.update();
|
$scope.update();
|
||||||
}, 10);
|
}, 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() {
|
$scope.getTransactions = function() {
|
||||||
var w = $rootScope.wallet;
|
var w = $rootScope.wallet;
|
||||||
$scope.loading = true;
|
$scope.loading = true;
|
||||||
|
|
@ -174,15 +140,6 @@ angular.module('copayApp.controllers').controller('TransactionsController',
|
||||||
return config.networkName.substring(0, 4);
|
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
|
// Autoload transactions on 1-of-1
|
||||||
if ($rootScope.wallet && $rootScope.wallet.totalCopayers == 1) {
|
if ($rootScope.wallet && $rootScope.wallet.totalCopayers == 1) {
|
||||||
$scope.lastShowed = true;
|
$scope.lastShowed = true;
|
||||||
|
|
|
||||||
|
|
@ -30,11 +30,11 @@ angular
|
||||||
templateUrl: 'views/copayers.html',
|
templateUrl: 'views/copayers.html',
|
||||||
validate: true
|
validate: true
|
||||||
})
|
})
|
||||||
.when('/addresses', {
|
.when('/receive', {
|
||||||
templateUrl: 'views/addresses.html',
|
templateUrl: 'views/addresses.html',
|
||||||
validate: true
|
validate: true
|
||||||
})
|
})
|
||||||
.when('/transactions', {
|
.when('/history', {
|
||||||
templateUrl: 'views/transactions.html',
|
templateUrl: 'views/transactions.html',
|
||||||
validate: true
|
validate: true
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ angular.module('copayApp.services')
|
||||||
});
|
});
|
||||||
wallet.on('serverError', function(m) {
|
wallet.on('serverError', function(m) {
|
||||||
var message = m || 'The PeerJS server is not responding, please try again';
|
var message = m || 'The PeerJS server is not responding, please try again';
|
||||||
$location.path('addresses');
|
$location.path('receive');
|
||||||
root.onErrorDigest($scope, message);
|
root.onErrorDigest($scope, message);
|
||||||
});
|
});
|
||||||
wallet.on('ready', function() {
|
wallet.on('ready', function() {
|
||||||
|
|
@ -130,7 +130,7 @@ angular.module('copayApp.services')
|
||||||
if ($rootScope.pendingPayment) {
|
if ($rootScope.pendingPayment) {
|
||||||
$location.path('send');
|
$location.path('send');
|
||||||
} else {
|
} else {
|
||||||
$location.path('addresses');
|
$location.path('receive');
|
||||||
}
|
}
|
||||||
if (!config.disableVideo)
|
if (!config.disableVideo)
|
||||||
video.setOwnPeer(myPeerID, w, handlePeerVideo);
|
video.setOwnPeer(myPeerID, w, handlePeerVideo);
|
||||||
|
|
@ -143,9 +143,7 @@ angular.module('copayApp.services')
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
w.on('txProposalsUpdated', function(dontDigest) {
|
w.on('txProposalsUpdated', function(dontDigest) {
|
||||||
root.updateTxs({
|
root.updateTxs();
|
||||||
onlyPending: true
|
|
||||||
});
|
|
||||||
// give sometime to the tx to propagate.
|
// give sometime to the tx to propagate.
|
||||||
$timeout(function() {
|
$timeout(function() {
|
||||||
root.updateBalance(function() {
|
root.updateBalance(function() {
|
||||||
|
|
@ -238,7 +236,7 @@ angular.module('copayApp.services')
|
||||||
root.updateTxs = function(opts) {
|
root.updateTxs = function(opts) {
|
||||||
var w = $rootScope.wallet;
|
var w = $rootScope.wallet;
|
||||||
if (!w) return;
|
if (!w) return;
|
||||||
opts = opts || {};
|
opts = opts || $rootScope.txsOpts || {};
|
||||||
|
|
||||||
var satToUnit = 1 / config.unitToSatoshi;
|
var satToUnit = 1 / config.unitToSatoshi;
|
||||||
var myCopayerId = w.getMyCopayerId();
|
var myCopayerId = w.getMyCopayerId();
|
||||||
|
|
@ -259,7 +257,8 @@ angular.module('copayApp.services')
|
||||||
if (!i.finallyRejected && !i.sentTs) {
|
if (!i.finallyRejected && !i.sentTs) {
|
||||||
i.isPending = 1;
|
i.isPending = 1;
|
||||||
}
|
}
|
||||||
if (!opts.onlyPending || i.isPending) {
|
|
||||||
|
if (!!opts.pending == !!i.isPending) {
|
||||||
var tx = i.builder.build();
|
var tx = i.builder.build();
|
||||||
var outs = [];
|
var outs = [];
|
||||||
tx.outs.forEach(function(o) {
|
tx.outs.forEach(function(o) {
|
||||||
|
|
@ -283,6 +282,7 @@ angular.module('copayApp.services')
|
||||||
});
|
});
|
||||||
|
|
||||||
$rootScope.txs = txs;
|
$rootScope.txs = txs;
|
||||||
|
$rootScope.txsOpts = opts;
|
||||||
if ($rootScope.pendingTxCount < pendingForUs) {
|
if ($rootScope.pendingTxCount < pendingForUs) {
|
||||||
$rootScope.txAlertCount = pendingForUs;
|
$rootScope.txAlertCount = pendingForUs;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -194,9 +194,12 @@ describe("Unit: Controllers", function() {
|
||||||
|
|
||||||
var spy = sinon.spy(scope.wallet, 'createTx');
|
var spy = sinon.spy(scope.wallet, 'createTx');
|
||||||
var spy2 = sinon.spy(scope.wallet, 'sendTx');
|
var spy2 = sinon.spy(scope.wallet, 'sendTx');
|
||||||
|
scope.loadTxs = sinon.spy();
|
||||||
|
|
||||||
scope.submitForm(sendForm);
|
scope.submitForm(sendForm);
|
||||||
sinon.assert.callCount(spy, 1);
|
sinon.assert.callCount(spy, 1);
|
||||||
sinon.assert.callCount(spy2, 0);
|
sinon.assert.callCount(spy2, 0);
|
||||||
|
sinon.assert.callCount(scope.loadTxs, 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should create and send a transaction proposal', function() {
|
it('should create and send a transaction proposal', function() {
|
||||||
|
|
@ -206,10 +209,12 @@ describe("Unit: Controllers", function() {
|
||||||
scope.wallet.totalCopayers = scope.wallet.requiredCopayers = 1;
|
scope.wallet.totalCopayers = scope.wallet.requiredCopayers = 1;
|
||||||
var spy = sinon.spy(scope.wallet, 'createTx');
|
var spy = sinon.spy(scope.wallet, 'createTx');
|
||||||
var spy2 = sinon.spy(scope.wallet, 'sendTx');
|
var spy2 = sinon.spy(scope.wallet, 'sendTx');
|
||||||
|
scope.loadTxs = sinon.spy();
|
||||||
|
|
||||||
scope.submitForm(sendForm);
|
scope.submitForm(sendForm);
|
||||||
sinon.assert.callCount(spy, 1);
|
sinon.assert.callCount(spy, 1);
|
||||||
sinon.assert.callCount(spy2, 1);
|
sinon.assert.callCount(spy2, 1);
|
||||||
|
sinon.assert.callCount(scope.loadTxs, 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
<div ng-controller="SidebarController">
|
<div ng-controller="SidebarController">
|
||||||
<header class="text-center">
|
<header class="text-center">
|
||||||
<div class="text-white m10v">
|
<div class="text-white m10v">
|
||||||
<a href="#!/addresses" class="db">
|
<a href="#!/receive" class="db">
|
||||||
<img src="img/logo-negative-beta.svg" alt="" width="80">
|
<img src="img/logo-negative-beta.svg" alt="" width="80">
|
||||||
</a>
|
</a>
|
||||||
<div ng-include="'views/includes/version.html'"></div>
|
<div ng-include="'views/includes/version.html'"></div>
|
||||||
|
|
@ -40,12 +40,12 @@
|
||||||
<li data-ng-repeat="item in menu" ui-route="{{item.link}}" class="nav-item" data-ng-class="{active: isActive(item)}">
|
<li data-ng-repeat="item in menu" ui-route="{{item.link}}" class="nav-item" data-ng-class="{active: isActive(item)}">
|
||||||
<a href="#!/{{item.link}}" ng-click="toggleCollapse()" class="db p20h">
|
<a href="#!/{{item.link}}" ng-click="toggleCollapse()" class="db p20h">
|
||||||
<i class="size-24 m20r {{item.icon}}"></i> {{item.title}}
|
<i class="size-24 m20r {{item.icon}}"></i> {{item.title}}
|
||||||
<span class="label alert round" ng-if="item.link=='transactions' && $root.pendingTxCount > 0">{{$root.pendingTxCount}}</span>
|
<span class="label alert round" ng-if="item.link=='send' && $root.pendingTxCount > 0">{{$root.pendingTxCount}}</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="#" class="db p20h" title="Signout"
|
<a href="#" class="db p20h" title="Close"
|
||||||
ng-click="signout()"><i class="size-24 m20r fi-power"></i> Signout</a>
|
ng-click="signout()"><i class="size-24 m20r fi-power"></i> Close</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
<div ng-controller="SidebarController">
|
<div ng-controller="SidebarController">
|
||||||
<header class="p20">
|
<header class="p20">
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<a href="#!/addresses" class="db">
|
<a href="#!/receive" class="db">
|
||||||
<img src="img/logo-negative-beta.svg" alt="" width="100">
|
<img src="img/logo-negative-beta.svg" alt="" width="100">
|
||||||
</a>
|
</a>
|
||||||
<div ng-include="'views/includes/version.html'"></div>
|
<div ng-include="'views/includes/version.html'"></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="line-sidebar"></div>
|
<div class="line-sidebar"></div>
|
||||||
<div>
|
<div>
|
||||||
<a href="#!/addresses" class="name-wallet" tooltip-placement="bottom" tooltip="ID: {{$root.wallet.id}}">
|
<a href="#!/receive" class="name-wallet" tooltip-placement="bottom" tooltip="ID: {{$root.wallet.id}}">
|
||||||
<span>{{$root.wallet.getName()}}</span>
|
<span>{{$root.wallet.getName()}}</span>
|
||||||
</a>
|
</a>
|
||||||
<a class="button gray small side-bar right" title="Manual Refresh"
|
<a class="button gray small side-bar right" title="Manual Refresh"
|
||||||
|
|
@ -50,13 +50,13 @@
|
||||||
<a href="#!/{{item.link}}" ng-click="toggleCollapse()" class="db p20h">
|
<a href="#!/{{item.link}}" ng-click="toggleCollapse()" class="db p20h">
|
||||||
<i class="size-21 m20r {{item.icon}}"></i> {{item.title}}
|
<i class="size-21 m20r {{item.icon}}"></i> {{item.title}}
|
||||||
<span class="right">
|
<span class="right">
|
||||||
<span class="label alert" ng-if="item.link=='transactions' && $root.pendingTxCount > 0">{{$root.pendingTxCount}}</span>
|
<span class="label alert" ng-if="item.link=='send' && $root.pendingTxCount > 0">{{$root.pendingTxCount}}</span>
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="#!/" class="db p20h" title="Signout"
|
<a href="#!/" class="db p20h" title="Close"
|
||||||
ng-click="signout()"><i class="size-21 m20r fi-power"></i> Signout</a>
|
ng-click="signout()"><i class="size-21 m20r fi-power"></i> Close</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
|
||||||
122
views/includes/transaction.html
Normal file
122
views/includes/transaction.html
Normal file
|
|
@ -0,0 +1,122 @@
|
||||||
|
<div class="last-transactions-header">
|
||||||
|
<div class="hide-for-small-only large-1 medium-1 columns">
|
||||||
|
<a class="text-black" ng-show="tx.comment">
|
||||||
|
<i class="fi-comment-quotes size-24" Popover-animation="true" popover="{{$root.wallet.publicKeyRing.nicknameForCopayer(tx.creator)}}" popover-title="{{tx.comment}}" popover-placement="right" popover-trigger="mouseenter"></i>
|
||||||
|
</a>
|
||||||
|
<a class="disable" ng-show="!tx.comment">
|
||||||
|
<i class="fi-comment-quotes size-24 text-gray"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="show-for-small-only small-12 columns m10b" ng-show="tx.comment">
|
||||||
|
<p class="size-14 label" >
|
||||||
|
{{tx.comment}} -
|
||||||
|
{{$root.wallet.publicKeyRing.nicknameForCopayer(tx.creator)}}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="large-8 medium-8 small-8 columns">
|
||||||
|
<div ng-repeat="out in tx.outs">
|
||||||
|
<div class="large-3 medium-3 small-3 columns">
|
||||||
|
<p class="size-14 hide-for-small-only">{{out.value | noFractionNumber}} {{$root.unitName}}</p>
|
||||||
|
<p class="size-12 show-for-small-only">{{out.value | noFractionNumber}} {{$root.unitName}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="large-1 medium-1 small-2 columns fi-arrow-right"> </div>
|
||||||
|
<div class="large-8 medium-8 small-7 columns ellipsis">
|
||||||
|
<contact address="{{out.address}}" tooltip-popup-delay="500" tooltip tooltip-placement="right"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="large-3 medium-3 small-4 columns text-right">
|
||||||
|
<p class="size-12">{{tx.createdTs | amCalendar}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="last-transactions-content">
|
||||||
|
<div class="box-copayer" ng-repeat="c in tx.actionList">
|
||||||
|
<a class="has-tip">
|
||||||
|
<img class="copayer-ico br100" src="./img/satoshi.gif" alt="{{c.cId}}">
|
||||||
|
</a>
|
||||||
|
<div class="box-status">
|
||||||
|
<a ng-if="c.actions.create" tooltip-popup-delay="1000" tooltip="Created {{c.actions.create | amTimeAgo}}">
|
||||||
|
<i class="fi-crown icon-status icon-active"></i>
|
||||||
|
</a>
|
||||||
|
<a ng-if="!c.actions.create"><i class="fi-crown icon-status"></i></a>
|
||||||
|
|
||||||
|
<a ng-if="c.actions.seen" tooltip-popup-delay="1000" tooltip="Seen {{c.actions.seen | amTimeAgo}}">
|
||||||
|
<i class="fi-eye icon-status icon-active"></i>
|
||||||
|
</a>
|
||||||
|
<a ng-if="!c.actions.seen"><i class="fi-eye icon-status"></i></a>
|
||||||
|
|
||||||
|
<a ng-if="c.actions.rejected" tooltip-popup-delay="1000" tooltip="Rejected {{c.actions.rejected | amTimeAgo}}">
|
||||||
|
<i class="fi-x icon-status icon-active-x"></i>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a ng-if="c.actions.sign" tooltip-popup-delay="1000" tooltip="Signed {{c.actions.sign | amTimeAgo}}">
|
||||||
|
<i class="fi-check icon-status icon-active-check"></i>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a ng-if="!c.actions.sign && !c.actions.rejected" class="icon-status">
|
||||||
|
<i class="fi-loop icon-rotate"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="text-center">
|
||||||
|
<p class="size-12 text-gray ellipsis">
|
||||||
|
{{c.cId === $root.wallet.getMyCopayerId() ? 'Me' : $root.wallet.publicKeyRing.nicknameForCopayer(c.cId)}}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="last-transactions-footer">
|
||||||
|
<div class="large-5 medium-7 small-12 columns" ng-show="!tx.sentTs">
|
||||||
|
<div ng-show="!tx.signedByUs && !tx.rejectedByUs && !tx.finallyRejected && tx.missingSignatures">
|
||||||
|
<div class="hide-for-small-only">
|
||||||
|
<button class="primary m15r" ng-click="sign(tx.ntxid)" ng-disabled="loading" loading="Signing">
|
||||||
|
<i class="fi-check"></i> Sign
|
||||||
|
</button>
|
||||||
|
<button class="warning" ng-click="reject(tx.ntxid)" ng-disabled="loading" loading="Rejecting">
|
||||||
|
<i class="fi-x" ></i> Reject
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="show-for-small-only row m10b">
|
||||||
|
<button class="primary small-5 columns" ng-click="sign(tx.ntxid)" ng-disabled="loading" loading="Signing">
|
||||||
|
<i class="fi-check"></i> Sign
|
||||||
|
</button>
|
||||||
|
<button class="warning small-5 columns" ng-click="reject(tx.ntxid)" ng-disabled="loading" loading="Rejecting">
|
||||||
|
<i class="fi-x" ></i> Reject
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div ng-show="!tx.missingSignatures && !tx.sentTs">
|
||||||
|
<button class="primary" ng-click="send(tx.ntxid)" ng-disabled="loading" loading="Broadcasting"> <i class=".fi-upload-cloud"></i>
|
||||||
|
Broadcast Transaction
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="large-7 medium-5 small-12 columns text-right">
|
||||||
|
<div ng-show="tx.finallyRejected" class="has-error m10b">
|
||||||
|
Transaction finally rejected
|
||||||
|
</div>
|
||||||
|
<div ng-show="!tx.missingSignatures && tx.sentTs">
|
||||||
|
<div class="is-valid m10b">
|
||||||
|
<strong>Sent</strong> <span class="text-gray" am-time-ago="tx.sentTs"></span>
|
||||||
|
</div>
|
||||||
|
<div class="ellipsis small">
|
||||||
|
Transaction ID:
|
||||||
|
<a href="http://{{getShortNetworkName()}}.insight.is/tx/{{tx.sentTxid}}" target="_blank">
|
||||||
|
{{tx.sentTxid}}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p class="text-gray m5b" ng-show="!tx.finallyRejected && tx.missingSignatures==1">
|
||||||
|
One signature missing
|
||||||
|
</p>
|
||||||
|
<p class="text-gray m5b" ng-show="!tx.finallyRejected && tx.missingSignatures>1">
|
||||||
|
{{tx.missingSignatures}} signatures missing</p>
|
||||||
|
<div class="ellipsis small text-gray">
|
||||||
|
<strong>Fee:</strong> {{tx.fee|noFractionNumber}} {{$root.unitName}}
|
||||||
|
<strong>Proposal ID:</strong> {{tx.ntxid}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
@ -1,5 +1,12 @@
|
||||||
<div class="send" data-ng-controller="SendController">
|
<div class="send" data-ng-controller="SendController" data-ng-init="loadTxs()">
|
||||||
<div ng-show='$root.wallet.isReady()'>
|
<div ng-show='$root.wallet.isReady()'>
|
||||||
|
|
||||||
|
<h1 ng-show="txs.length != 0">Send Proposals</h1>
|
||||||
|
<div class="last-transactions" ng-repeat="tx in txs | paged">
|
||||||
|
<div ng-include="'views/includes/transaction.html'"></div>
|
||||||
|
</div>
|
||||||
|
<div ng-show="txs.length != 0" class="large-12 line-dashed" style="padding: 0;"></div>
|
||||||
|
|
||||||
<h1>{{title}}</h1>
|
<h1>{{title}}</h1>
|
||||||
<div class="large-6 columns">
|
<div class="large-6 columns">
|
||||||
<form name="sendForm" ng-submit="submitForm(sendForm)" novalidate>
|
<form name="sendForm" ng-submit="submitForm(sendForm)" novalidate>
|
||||||
|
|
|
||||||
|
|
@ -1,138 +1,13 @@
|
||||||
<div class="transactions" data-ng-controller="TransactionsController">
|
<div class="transactions" data-ng-controller="TransactionsController" data-ng-init="update()">
|
||||||
<div ng-show='$root.wallet.isReady()'>
|
<div ng-show='$root.wallet.isReady()'>
|
||||||
<h1 ng-show="wallet.isShared()"> Transaction proposals <small>({{txs.length}})</small></h1>
|
<h1 ng-show="wallet.isShared()"> Transaction Proposals <small>({{txs.length}})</small></h1>
|
||||||
<div class="large-12" ng-show="wallet.isShared()">
|
<div class="large-12" ng-show="wallet.isShared()">
|
||||||
<ul class="inline-list">
|
|
||||||
<li> <a class="text-gray size-12" ng-click="show(true)" ng-disabled="loading || onlyPending" loading="Updating" ng-class="{'active' : onlyPending}"> [ Pending ] </a> </li>
|
|
||||||
<li> <a class="text-gray size-12" ng-click="show()" ng-disabled="loading || !onlyPending" loading="Updating" ng-class="{'active' : !onlyPending}"> [ All ] </a> </li>
|
|
||||||
</ul>
|
|
||||||
<div class="last-transactions" ng-repeat="tx in txs | paged">
|
<div class="last-transactions" ng-repeat="tx in txs | paged">
|
||||||
<div class="last-transactions-header">
|
<div ng-include="'views/includes/transaction.html'"></div>
|
||||||
<div class="hide-for-small-only large-1 medium-1 columns">
|
|
||||||
<a class="text-black" ng-show="tx.comment">
|
|
||||||
<i class="fi-comment-quotes size-24" Popover-animation="true" popover="{{$root.wallet.publicKeyRing.nicknameForCopayer(tx.creator)}}" popover-title="{{tx.comment}}" popover-placement="right" popover-trigger="mouseenter"></i>
|
|
||||||
</a>
|
|
||||||
<a class="disable" ng-show="!tx.comment">
|
|
||||||
<i class="fi-comment-quotes size-24 text-gray"></i>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="show-for-small-only small-12 columns m10b" ng-show="tx.comment">
|
|
||||||
<p class="size-14 label" >
|
|
||||||
{{tx.comment}} -
|
|
||||||
{{$root.wallet.publicKeyRing.nicknameForCopayer(tx.creator)}}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="large-8 medium-8 small-8 columns">
|
|
||||||
<div ng-repeat="out in tx.outs">
|
|
||||||
<div class="large-3 medium-3 small-3 columns">
|
|
||||||
<p class="size-14 hide-for-small-only">{{out.value | noFractionNumber}} {{$root.unitName}}</p>
|
|
||||||
<p class="size-12 show-for-small-only">{{out.value | noFractionNumber}} {{$root.unitName}}</p>
|
|
||||||
</div>
|
|
||||||
<div class="large-1 medium-1 small-2 columns fi-arrow-right"> </div>
|
|
||||||
<div class="large-8 medium-8 small-7 columns ellipsis">
|
|
||||||
<contact address="{{out.address}}" tooltip-popup-delay="500" tooltip tooltip-placement="right"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="large-3 medium-3 small-4 columns text-right">
|
|
||||||
<p class="size-12">{{tx.createdTs | amCalendar}}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="last-transactions-content">
|
|
||||||
<div class="box-copayer" ng-repeat="c in tx.actionList">
|
|
||||||
<a href="#!/transactions" class="has-tip">
|
|
||||||
<img class="copayer-ico br100" src="./img/satoshi.gif" alt="{{c.cId}}">
|
|
||||||
</a>
|
|
||||||
<div class="box-status">
|
|
||||||
<a ng-if="c.actions.create" tooltip-popup-delay="1000" tooltip="Created {{c.actions.create | amTimeAgo}}">
|
|
||||||
<i class="fi-crown icon-status icon-active"></i>
|
|
||||||
</a>
|
|
||||||
<a ng-if="!c.actions.create"><i class="fi-crown icon-status"></i></a>
|
|
||||||
|
|
||||||
<a ng-if="c.actions.seen" tooltip-popup-delay="1000" tooltip="Seen {{c.actions.seen | amTimeAgo}}">
|
|
||||||
<i class="fi-eye icon-status icon-active"></i>
|
|
||||||
</a>
|
|
||||||
<a ng-if="!c.actions.seen"><i class="fi-eye icon-status"></i></a>
|
|
||||||
|
|
||||||
<a ng-if="c.actions.rejected" tooltip-popup-delay="1000" tooltip="Rejected {{c.actions.rejected | amTimeAgo}}">
|
|
||||||
<i class="fi-x icon-status icon-active-x"></i>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a ng-if="c.actions.sign" tooltip-popup-delay="1000" tooltip="Signed {{c.actions.sign | amTimeAgo}}">
|
|
||||||
<i class="fi-check icon-status icon-active-check"></i>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a ng-if="!c.actions.sign && !c.actions.rejected" href="#!/transactions" class="icon-status">
|
|
||||||
<i class="fi-loop icon-rotate"></i>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="text-center">
|
|
||||||
<p class="size-12 text-gray ellipsis">
|
|
||||||
{{c.cId === $root.wallet.getMyCopayerId() ? 'Me' : $root.wallet.publicKeyRing.nicknameForCopayer(c.cId)}}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="last-transactions-footer">
|
|
||||||
<div class="large-5 medium-7 small-12 columns" ng-show="!tx.sentTs">
|
|
||||||
<div ng-show="!tx.signedByUs && !tx.rejectedByUs && !tx.finallyRejected && tx.missingSignatures">
|
|
||||||
<div class="hide-for-small-only">
|
|
||||||
<button class="primary m15r" ng-click="sign(tx.ntxid)" ng-disabled="loading" loading="Signing">
|
|
||||||
<i class="fi-check"></i> Sign
|
|
||||||
</button>
|
|
||||||
<button class="warning" ng-click="reject(tx.ntxid)" ng-disabled="loading" loading="Rejecting">
|
|
||||||
<i class="fi-x" ></i> Reject
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<div class="show-for-small-only row m10b">
|
|
||||||
<button class="primary small-5 columns" ng-click="sign(tx.ntxid)" ng-disabled="loading" loading="Signing">
|
|
||||||
<i class="fi-check"></i> Sign
|
|
||||||
</button>
|
|
||||||
<button class="warning small-5 columns" ng-click="reject(tx.ntxid)" ng-disabled="loading" loading="Rejecting">
|
|
||||||
<i class="fi-x" ></i> Reject
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div ng-show="!tx.missingSignatures && !tx.sentTs">
|
|
||||||
<button class="primary" ng-click="send(tx.ntxid)" ng-disabled="loading" loading="Broadcasting"> <i class=".fi-upload-cloud"></i>
|
|
||||||
Broadcast Transaction
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="large-7 medium-5 small-12 columns text-right">
|
|
||||||
<div ng-show="tx.finallyRejected" class="has-error m10b">
|
|
||||||
Transaction finally rejected
|
|
||||||
</div>
|
|
||||||
<div ng-show="!tx.missingSignatures && tx.sentTs">
|
|
||||||
<div class="is-valid m10b">
|
|
||||||
<strong>Sent</strong> <span class="text-gray" am-time-ago="tx.sentTs"></span>
|
|
||||||
</div>
|
|
||||||
<div class="ellipsis small">
|
|
||||||
Transaction ID:
|
|
||||||
<a href="http://{{getShortNetworkName()}}.insight.is/tx/{{tx.sentTxid}}" target="_blank">
|
|
||||||
{{tx.sentTxid}}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<p class="text-gray m5b" ng-show="!tx.finallyRejected && tx.missingSignatures==1">
|
|
||||||
One signature missing
|
|
||||||
</p>
|
|
||||||
<p class="text-gray m5b" ng-show="!tx.finallyRejected && tx.missingSignatures>1">
|
|
||||||
{{tx.missingSignatures}} signatures missing</p>
|
|
||||||
<div class="ellipsis small text-gray">
|
|
||||||
<strong>Fee:</strong> {{tx.fee|noFractionNumber}} {{$root.unitName}}
|
|
||||||
<strong>Proposal ID:</strong> {{tx.ntxid}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<p ng-show="onlyPending && txs.length == 0">No pending transactions proposals.</p>
|
<p ng-show="txs.length == 0">No transactions proposals yet.</p>
|
||||||
<p ng-show="!onlyPending && txs.length == 0">No transactions proposals yet.</p>
|
<pagination ng-show="txs.length > txpItemsPerPage" total-items="txs.length" items-per-page="txpItemsPerPage" page="txpCurrentPage" on-select-page="show()" class="pagination-small primary"></pagination>
|
||||||
<pagination ng-show="!onlyPending && txs.length > txpItemsPerPage" total-items="txs.length" items-per-page="txpItemsPerPage" page="txpCurrentPage" on-select-page="show()" class="pagination-small primary"></pagination>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h1 ng-class="{'line-dashed': wallet.isShared()}">
|
<h1 ng-class="{'line-dashed': wallet.isShared()}">
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue