Merge branch 'master' of https://github.com/bitpay/copay into bug/fix-parse-empty-bitpay-account-storage
|
@ -19,7 +19,7 @@ Copay is a Multisig HD Wallet. Copay app holds the extended private keys for the
|
|||
|
||||
### Wallet Recovery Scope
|
||||
* Basic Recovery: Wallet access is restored. It is possible to see wallet balance and past transactions. It is possible to send and receive payments.
|
||||
* Full Recovery: All the features of Partial Recovery + wallet name, copayer names are recovered, past payment proposal metadata (who signed, and notes) are recoved.
|
||||
* Full Recovery: All the features of Partial Recovery + wallet name, copayer names are recovered, past payment proposal metadata (who signed, and notes) are recovered.
|
||||
|
||||
## Wallet Restore Scenarios
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.controllers').controller('completeController', function($scope, $stateParams, $timeout, $log, platformInfo, configService, storageService) {
|
||||
angular.module('copayApp.controllers').controller('completeController', function($scope, $stateParams, $timeout, $log, $ionicHistory, $state, platformInfo, configService, storageService, lodash) {
|
||||
$scope.score = parseInt($stateParams.score);
|
||||
$scope.skipped = $stateParams.skipped == 'false' ? false : true;
|
||||
$scope.isCordova = platformInfo.isCordova;
|
||||
|
@ -31,8 +31,13 @@ angular.module('copayApp.controllers').controller('completeController', function
|
|||
};
|
||||
|
||||
$scope.$on("$ionicView.beforeEnter", function(event, data) {
|
||||
if(window.StatusBar){
|
||||
$log.debug('Hiding status bar...');
|
||||
StatusBar.hide();
|
||||
}
|
||||
|
||||
storageService.getFeedbackInfo(function(error, info) {
|
||||
var feedbackInfo = JSON.parse(info);
|
||||
var feedbackInfo = lodash.isString(info) ? JSON.parse(info) : null;
|
||||
feedbackInfo.sent = true;
|
||||
storageService.setFeedbackInfo(JSON.stringify(feedbackInfo), function() {});
|
||||
});
|
||||
|
@ -78,4 +83,22 @@ angular.module('copayApp.controllers').controller('completeController', function
|
|||
}
|
||||
}, 100);
|
||||
});
|
||||
|
||||
$scope.$on("$ionicView.afterLeave", function() {
|
||||
if(window.StatusBar){
|
||||
$log.debug('Showing status bar...');
|
||||
StatusBar.show();
|
||||
}
|
||||
});
|
||||
|
||||
$scope.close = function() {
|
||||
$ionicHistory.clearHistory();
|
||||
$ionicHistory.nextViewOptions({
|
||||
disableAnimate: true,
|
||||
historyRoot: true
|
||||
});
|
||||
$timeout(function() {
|
||||
$state.go('tabs.home');
|
||||
}, 100);
|
||||
};
|
||||
});
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.controllers').controller('rateAppController', function($scope, $state, $stateParams, lodash, externalLinkService, configService, gettextCatalog, platformInfo, feedbackService, ongoingProcess) {
|
||||
angular.module('copayApp.controllers').controller('rateAppController', function($scope, $state, $stateParams, lodash, externalLinkService, configService, gettextCatalog, platformInfo, feedbackService, ongoingProcess, popupService) {
|
||||
$scope.score = parseInt($stateParams.score);
|
||||
var isAndroid = platformInfo.isAndroid;
|
||||
var isIOS = platformInfo.isIOS;
|
||||
|
@ -22,28 +22,39 @@ angular.module('copayApp.controllers').controller('rateAppController', function(
|
|||
popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Could not send feedback'));
|
||||
return;
|
||||
}
|
||||
$state.go('feedback.complete', {
|
||||
$state.go('tabs.rate.complete', {
|
||||
score: $stateParams.score,
|
||||
skipped: true
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
$scope.$on("$ionicView.beforeEnter", function() {
|
||||
if(window.StatusBar){
|
||||
$log.debug('Hiding status bar...');
|
||||
StatusBar.hide();
|
||||
}
|
||||
});
|
||||
|
||||
$scope.$on("$ionicView.afterLeave", function() {
|
||||
if(window.StatusBar){
|
||||
$log.debug('Showing status bar...');
|
||||
StatusBar.show();
|
||||
}
|
||||
});
|
||||
|
||||
$scope.sendFeedback = function() {
|
||||
$state.go('feedback.send', {
|
||||
$state.go('tabs.rate.send', {
|
||||
score: $scope.score
|
||||
});
|
||||
};
|
||||
|
||||
$scope.goAppStore = function() {
|
||||
var defaults = configService.getDefaults();
|
||||
var url;
|
||||
if (isAndroid) url = config.rateApp.android;
|
||||
if (isIOS) url = config.rateApp.ios;
|
||||
// if (isWP) url = config.rateApp.ios; TODO
|
||||
var title = gettextCatalog.getString('Rate the app');
|
||||
var message = gettextCatalog.getString('You must go to the official website of the app to rate it');
|
||||
var okText = gettextCatalog.getString('Go');
|
||||
var cancelText = gettextCatalog.getString('Cancel');
|
||||
externalLinkService.open(url, true, title, message, okText, cancelText);
|
||||
if (isAndroid) url = defaults.rateApp.android;
|
||||
if (isIOS) url = defaults.rateApp.ios;
|
||||
// if (isWP) url = defaults.rateApp.windows; // TODO
|
||||
externalLinkService.open(url);
|
||||
};
|
||||
});
|
||||
|
|
|
@ -6,16 +6,12 @@ angular.module('copayApp.controllers').controller('rateCardController', function
|
|||
$scope.score = 0;
|
||||
|
||||
$scope.goFeedbackFlow = function() {
|
||||
if ($scope.isModal) {
|
||||
$scope.rateModal.hide();
|
||||
$scope.rateModal.remove();
|
||||
}
|
||||
if ($scope.isCordova && $scope.score == 5) {
|
||||
$state.go('feedback.rateApp', {
|
||||
$state.go('tabs.rate.rateApp', {
|
||||
score: $scope.score
|
||||
});
|
||||
} else {
|
||||
$state.go('feedback.send', {
|
||||
$state.go('tabs.rate.send', {
|
||||
score: $scope.score
|
||||
});
|
||||
}
|
||||
|
@ -25,7 +21,7 @@ angular.module('copayApp.controllers').controller('rateCardController', function
|
|||
$scope.score = score;
|
||||
switch ($scope.score) {
|
||||
case 1:
|
||||
$scope.button_title = gettextCatalog.getString("I think this app is terrible");
|
||||
$scope.button_title = gettextCatalog.getString("I think this app is terrible.");
|
||||
break;
|
||||
case 2:
|
||||
$scope.button_title = gettextCatalog.getString("I don't like it");
|
||||
|
@ -37,7 +33,7 @@ angular.module('copayApp.controllers').controller('rateCardController', function
|
|||
$scope.button_title = gettextCatalog.getString("I like the app");
|
||||
break;
|
||||
case 5:
|
||||
$scope.button_title = gettextCatalog.getString("This app is fantastic");
|
||||
$scope.button_title = gettextCatalog.getString("This app is fantastic!");
|
||||
break;
|
||||
}
|
||||
$timeout(function() {
|
||||
|
@ -46,21 +42,16 @@ angular.module('copayApp.controllers').controller('rateCardController', function
|
|||
};
|
||||
|
||||
$scope.hideCard = function() {
|
||||
if ($scope.isModal) {
|
||||
$scope.rateModal.hide();
|
||||
$scope.rateModal.remove();
|
||||
} else {
|
||||
storageService.getFeedbackInfo(function(error, info) {
|
||||
var feedbackInfo = JSON.parse(info);
|
||||
feedbackInfo.sent = true;
|
||||
storageService.setFeedbackInfo(JSON.stringify(feedbackInfo), function() {
|
||||
$scope.showRateCard.value = false;
|
||||
});
|
||||
storageService.getFeedbackInfo(function(error, info) {
|
||||
var feedbackInfo = JSON.parse(info);
|
||||
feedbackInfo.sent = true;
|
||||
storageService.setFeedbackInfo(JSON.stringify(feedbackInfo), function() {
|
||||
$scope.showRateCard.value = false;
|
||||
$timeout(function() {
|
||||
$scope.$apply();
|
||||
}, 100);
|
||||
});
|
||||
}
|
||||
$timeout(function() {
|
||||
$scope.$apply();
|
||||
}, 100);
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
|
|
@ -1,29 +1,6 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.controllers').controller('sendController', function($scope, $state, $log, $stateParams, gettextCatalog, popupService, configService, lodash, feedbackService, ongoingProcess) {
|
||||
$scope.score = parseInt($stateParams.score);
|
||||
switch ($scope.score) {
|
||||
case 1:
|
||||
$scope.reaction = gettextCatalog.getString("Ouch!");
|
||||
$scope.comment = gettextCatalog.getString("There's obviously something we're doing wrong.");
|
||||
break;
|
||||
case 2:
|
||||
$scope.reaction = gettextCatalog.getString("Oh no!");
|
||||
$scope.comment = gettextCatalog.getString("There's obviously something we're doing wrong.");
|
||||
break;
|
||||
case 3:
|
||||
$scope.reaction = gettextCatalog.getString("Thanks!");
|
||||
$scope.comment = gettextCatalog.getString("We're always looking for ways to improve BitPay wallet.");
|
||||
break;
|
||||
case 4:
|
||||
$scope.reaction = gettextCatalog.getString("Thanks!");
|
||||
$scope.comment = gettextCatalog.getString("That's exciting to hear. We'd love to earn that fifth star from you.");
|
||||
break;
|
||||
case 5:
|
||||
$scope.reaction = gettextCatalog.getString("Feedback!");
|
||||
$scope.comment = gettextCatalog.getString("We're always looking for ways to improve BitPay wallet.");
|
||||
break;
|
||||
}
|
||||
angular.module('copayApp.controllers').controller('sendController', function($scope, $state, $log, $timeout, $stateParams, $ionicNavBarDelegate, $ionicHistory, $ionicConfig, gettextCatalog, popupService, configService, lodash, feedbackService, ongoingProcess) {
|
||||
|
||||
$scope.sendFeedback = function(feedback, skip) {
|
||||
|
||||
|
@ -32,7 +9,7 @@ angular.module('copayApp.controllers').controller('sendController', function($sc
|
|||
var dataSrc = {
|
||||
"Email": lodash.values(config.emailFor)[0] || ' ',
|
||||
"Feedback": skip ? ' ' : feedback,
|
||||
"Score": $stateParams.score
|
||||
"Score": $stateParams.score || ' '
|
||||
};
|
||||
|
||||
ongoingProcess.set('sendingFeedback', true);
|
||||
|
@ -42,11 +19,63 @@ angular.module('copayApp.controllers').controller('sendController', function($sc
|
|||
popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Could not send feedback'));
|
||||
return;
|
||||
}
|
||||
$state.go('feedback.complete', {
|
||||
if (!$stateParams.score) {
|
||||
popupService.showAlert(gettextCatalog.getString('Thank you!'), gettextCatalog.getString('A member of the team will review your feedback as soon as possible.'), function() {
|
||||
$scope.feedback.value = '';
|
||||
$ionicHistory.nextViewOptions({
|
||||
disableAnimate: true,
|
||||
historyRoot: true
|
||||
});
|
||||
$ionicHistory.clearHistory();
|
||||
$timeout(function() {
|
||||
$state.go('tabs.settings');
|
||||
});
|
||||
});
|
||||
return;
|
||||
}
|
||||
$state.go('tabs.rate.complete', {
|
||||
score: $stateParams.score,
|
||||
skipped: skip
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
$scope.$on("$ionicView.beforeEnter", function(event, data) {
|
||||
$scope.score = (data.stateParams && data.stateParams.score) ? parseInt(data.stateParams.score) : null;
|
||||
$scope.feedback = {};
|
||||
|
||||
if ($scope.score) {
|
||||
$ionicNavBarDelegate.showBackButton(false);
|
||||
$ionicConfig.views.swipeBackEnabled(false);
|
||||
}
|
||||
else $ionicNavBarDelegate.showBackButton(true);
|
||||
|
||||
switch ($scope.score) {
|
||||
case 1:
|
||||
$scope.reaction = gettextCatalog.getString("Ouch!");
|
||||
$scope.comment = gettextCatalog.getString("There's obviously something we're doing wrong.") + ' ' + gettextCatalog.getString("How could we improve your experience?");
|
||||
break;
|
||||
case 2:
|
||||
$scope.reaction = gettextCatalog.getString("Oh no!");
|
||||
$scope.comment = gettextCatalog.getString("There's obviously something we're doing wrong.") + ' ' + gettextCatalog.getString("How could we improve your experience?");
|
||||
break;
|
||||
case 3:
|
||||
$scope.reaction = gettextCatalog.getString("Hmm...");
|
||||
$scope.comment = gettextCatalog.getString("We'd love to do better.") + ' ' + gettextCatalog.getString("How could we improve your experience?");
|
||||
break;
|
||||
case 4:
|
||||
$scope.reaction = gettextCatalog.getString("Thanks!");
|
||||
$scope.comment = gettextCatalog.getString("That's exciting to hear. We'd love to earn that fifth star from you – how could we improve your experience?");
|
||||
break;
|
||||
case 5:
|
||||
$scope.reaction = gettextCatalog.getString("Thank you!");
|
||||
$scope.comment = gettextCatalog.getString("We're always looking for ways to improve BitPay.") + ' ' + gettextCatalog.getString("Is there anything we could do better?");
|
||||
break;
|
||||
default:
|
||||
$scope.reaction = gettextCatalog.getString("Feedback!");
|
||||
$scope.comment = gettextCatalog.getString("We're always looking for ways to improve BitPay. How could we improve your experience?");
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.controllers').controller('searchController', function($scope, $rootScope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $ionicNavBarDelegate, $state, $stateParams, $ionicScrollDelegate, bwcError, profileService, lodash, configService, gettext, gettextCatalog, platformInfo, walletService) {
|
||||
angular.module('copayApp.controllers').controller('searchController', function($scope, $rootScope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $state, $stateParams, $ionicScrollDelegate, bwcError, profileService, lodash, configService, gettext, gettextCatalog, platformInfo, walletService) {
|
||||
|
||||
var HISTORY_SHOW_LIMIT = 10;
|
||||
var currentTxHistoryPage = 0;
|
||||
|
|
|
@ -32,15 +32,4 @@ angular.module('copayApp.controllers').controller('tabSettingsController', funct
|
|||
updateConfig();
|
||||
});
|
||||
|
||||
$scope.openRateModal = function() {
|
||||
$scope.isModal = true;
|
||||
$ionicModal.fromTemplateUrl('views/feedback/rateCard.html', {
|
||||
scope: $scope,
|
||||
backdropClickToClose: false,
|
||||
hardwareBackButtonClose: false
|
||||
}).then(function(modal) {
|
||||
$scope.rateModal = modal;
|
||||
$scope.rateModal.show();
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.controllers').controller('txDetailsController', function($log, $ionicHistory, $scope, walletService, lodash, gettextCatalog, profileService, configService, externalLinkService, popupService, ongoingProcess) {
|
||||
angular.module('copayApp.controllers').controller('txDetailsController', function($log, $ionicHistory, $scope, $timeout, walletService, lodash, gettextCatalog, profileService, configService, externalLinkService, popupService, ongoingProcess) {
|
||||
|
||||
$scope.$on("$ionicView.beforeEnter", function(event, data) {
|
||||
$scope.title = gettextCatalog.getString('Transaction');
|
||||
|
@ -29,6 +29,9 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio
|
|||
|
||||
updateMemo();
|
||||
initActionList();
|
||||
$timeout(function() {
|
||||
$scope.$apply();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.controllers').controller('walletDetailsController', function($scope, $rootScope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $state, $stateParams, $ionicHistory, profileService, lodash, configService, gettextCatalog, platformInfo, walletService, txpModalService, externalLinkService, popupService, addressbookService) {
|
||||
angular.module('copayApp.controllers').controller('walletDetailsController', function($scope, $rootScope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $state, $stateParams, $ionicHistory, profileService, lodash, configService, gettextCatalog, platformInfo, walletService, txpModalService, externalLinkService, popupService, addressbookService, storageService, $ionicScrollDelegate, $window) {
|
||||
|
||||
var HISTORY_SHOW_LIMIT = 10;
|
||||
var currentTxHistoryPage = 0;
|
||||
|
@ -10,6 +10,9 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
|
|||
$scope.openTxpModal = txpModalService.open;
|
||||
$scope.isCordova = platformInfo.isCordova;
|
||||
$scope.isAndroid = platformInfo.isAndroid;
|
||||
$scope.isIOS = platformInfo.isIOS;
|
||||
|
||||
$scope.amountIsCollapsible = !$scope.isAndroid;
|
||||
|
||||
$scope.openExternalLink = function(url, target) {
|
||||
externalLinkService.open(url, target);
|
||||
|
@ -158,6 +161,52 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
|
|||
}
|
||||
};
|
||||
|
||||
$scope.getDate = function(txCreated) {
|
||||
var date = new Date(txCreated * 1000);
|
||||
return date;
|
||||
};
|
||||
|
||||
$scope.isFirstInGroup = function(index) {
|
||||
if (index === 0) {
|
||||
return true;
|
||||
}
|
||||
var curTx = $scope.txHistory[index];
|
||||
var prevTx = $scope.txHistory[index - 1];
|
||||
return !createdDuringSameMonth(curTx, prevTx);
|
||||
};
|
||||
|
||||
$scope.isLastInGroup = function(index) {
|
||||
if (index === $scope.txHistory.length - 1) {
|
||||
return true;
|
||||
}
|
||||
return $scope.isFirstInGroup(index + 1);
|
||||
};
|
||||
|
||||
function createdDuringSameMonth(tx1, tx2) {
|
||||
var date1 = new Date(tx1.time * 1000);
|
||||
var date2 = new Date(tx2.time * 1000);
|
||||
return getMonthYear(date1) === getMonthYear(date2);
|
||||
}
|
||||
|
||||
$scope.createdWithinPastDay = function(time) {
|
||||
var now = new Date();
|
||||
var date = new Date(time * 1000);
|
||||
return (now.getTime() - date.getTime()) < (1000 * 60 * 60 * 24);
|
||||
};
|
||||
|
||||
$scope.isDateInCurrentMonth = function(date) {
|
||||
var now = new Date();
|
||||
return getMonthYear(now) === getMonthYear(date);
|
||||
};
|
||||
|
||||
function getMonthYear(date) {
|
||||
return date.getMonth() + date.getFullYear();
|
||||
}
|
||||
|
||||
$scope.isUnconfirmed = function(tx) {
|
||||
return !tx.confirmations || tx.confirmations === 0;
|
||||
};
|
||||
|
||||
$scope.showMore = function() {
|
||||
$timeout(function() {
|
||||
currentTxHistoryPage++;
|
||||
|
@ -184,9 +233,72 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
|
|||
});
|
||||
};
|
||||
|
||||
$scope.$on("$ionicView.beforeEnter", function(event, data) {
|
||||
var prevPos;
|
||||
var screenInactive = true;
|
||||
|
||||
$scope.wallet = profileService.getWallet(data.stateParams.walletId);
|
||||
function getScrollPosition() {
|
||||
var scrollPosition = $ionicScrollDelegate.getScrollPosition();
|
||||
if (!scrollPosition || screenInactive) {
|
||||
$window.requestAnimationFrame(function() {
|
||||
getScrollPosition();
|
||||
});
|
||||
return;
|
||||
}
|
||||
var pos = scrollPosition.top;
|
||||
if (pos === prevPos) {
|
||||
$window.requestAnimationFrame(function() {
|
||||
getScrollPosition();
|
||||
});
|
||||
return;
|
||||
}
|
||||
prevPos = pos;
|
||||
var amountHeight = 180 - pos;
|
||||
if (amountHeight < 80) {
|
||||
amountHeight = 80;
|
||||
}
|
||||
var contentMargin = amountHeight;
|
||||
if (contentMargin > 180) {
|
||||
contentMargin = 180;
|
||||
}
|
||||
|
||||
var amountScale = (amountHeight / 180);
|
||||
if (amountScale < 0.5) {
|
||||
amountScale = 0.5;
|
||||
}
|
||||
if (amountScale > 1.1) {
|
||||
amountScale = 1.1;
|
||||
}
|
||||
|
||||
var s = amountScale;
|
||||
|
||||
$scope.altAmountOpacity = (amountHeight - 100) / 80;
|
||||
$window.requestAnimationFrame(function() {
|
||||
$scope.amountHeight = amountHeight + 'px';
|
||||
$scope.contentMargin = contentMargin + 'px';
|
||||
$scope.amountScale = 'scale3d(' + s + ',' + s + ',' + s + ')';
|
||||
$scope.$digest();
|
||||
getScrollPosition();
|
||||
});
|
||||
}
|
||||
|
||||
var scrollWatcherInitialized;
|
||||
|
||||
$scope.$on("$ionicView.enter", function(event, data) {
|
||||
$timeout(function() {
|
||||
screenInactive = false;
|
||||
}, 200);
|
||||
if (scrollWatcherInitialized || !$scope.amountIsCollapsible) {
|
||||
return;
|
||||
}
|
||||
scrollWatcherInitialized = true;
|
||||
$timeout(function() {
|
||||
getScrollPosition();
|
||||
}, 100);
|
||||
});
|
||||
|
||||
$scope.$on("$ionicView.beforeEnter", function(event, data) {
|
||||
$scope.walletId = data.stateParams.walletId;
|
||||
$scope.wallet = profileService.getWallet($scope.walletId);
|
||||
$scope.requiresMultipleSignatures = $scope.wallet.credentials.m > 1;
|
||||
|
||||
addressbookService.list(function(err, ab) {
|
||||
|
@ -209,6 +321,7 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
|
|||
});
|
||||
|
||||
$scope.$on("$ionicView.leave", function(event, data) {
|
||||
screenInactive = true;
|
||||
lodash.each(listeners, function(x) {
|
||||
x();
|
||||
});
|
||||
|
|
|
@ -16,6 +16,6 @@ angular.module('copayApp.directives')
|
|||
scope.emailHash = md5.createHash(scope.email.toLowerCase() || '');
|
||||
}
|
||||
},
|
||||
template: '<img class="gravatar" alt="{{ name }}" height="{{ height }}" width="{{ width }}" src="https://secure.gravatar.com/avatar/{{ emailHash }}.jpg?s={{ width }}&d=mm">'
|
||||
}
|
||||
template: '<img class="gravatar" alt="{{ name }}" height="{{ height }}" width="{{ width }}" src="https://secure.gravatar.com/avatar/{{ emailHash }}.jpg?s={{ width }}&d=identicon">'
|
||||
};
|
||||
});
|
||||
|
|
|
@ -151,7 +151,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
|||
*/
|
||||
|
||||
.state('tabs.wallet', {
|
||||
url: '/wallet/{walletId}/{fromOnboarding}',
|
||||
url: '/wallet/:walletId/:fromOnboarding',
|
||||
views: {
|
||||
'tab-home@tabs': {
|
||||
controller: 'walletDetailsController',
|
||||
|
@ -186,6 +186,23 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
|||
}
|
||||
}
|
||||
})
|
||||
.state('tabs.wallet.backupWarning', {
|
||||
url: '/backupWarning/:from/:walletId',
|
||||
views: {
|
||||
'tab-home@tabs': {
|
||||
templateUrl: 'views/backupWarning.html'
|
||||
}
|
||||
}
|
||||
})
|
||||
.state('tabs.wallet.backup', {
|
||||
url: '/backup/:walletId',
|
||||
views: {
|
||||
'tab-home@tabs': {
|
||||
templateUrl: 'views/backup.html',
|
||||
controller: 'backupController'
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
/*
|
||||
*
|
||||
|
@ -601,7 +618,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
|||
|
||||
/*
|
||||
*
|
||||
* Back flow from receive
|
||||
* Init backup flow
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -726,43 +743,52 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
|||
*
|
||||
*/
|
||||
|
||||
.state('feedback', {
|
||||
.state('tabs.feedback', {
|
||||
url: '/feedback',
|
||||
abstract: true,
|
||||
template: '<ion-nav-view name="feedback"></ion-nav-view>'
|
||||
})
|
||||
.state('feedback.send', {
|
||||
url: '/send/:score',
|
||||
views: {
|
||||
'feedback': {
|
||||
controller: 'sendController',
|
||||
templateUrl: 'views/feedback/send.html'
|
||||
'tab-settings@tabs': {
|
||||
templateUrl: 'views/feedback/send.html',
|
||||
controller: 'sendController'
|
||||
}
|
||||
}
|
||||
})
|
||||
.state('feedback.complete', {
|
||||
.state('tabs.rate', {
|
||||
url: '/rate',
|
||||
abstract: true
|
||||
})
|
||||
.state('tabs.rate.send', {
|
||||
url: '/send/:score',
|
||||
views: {
|
||||
'tab-home@tabs': {
|
||||
templateUrl: 'views/feedback/send.html',
|
||||
controller: 'sendController'
|
||||
}
|
||||
}
|
||||
})
|
||||
.state('tabs.rate.complete', {
|
||||
url: '/complete/:score/:skipped',
|
||||
views: {
|
||||
'feedback': {
|
||||
'tab-home@tabs': {
|
||||
controller: 'completeController',
|
||||
templateUrl: 'views/feedback/complete.html'
|
||||
}
|
||||
}
|
||||
})
|
||||
.state('feedback.rateApp', {
|
||||
.state('tabs.rate.rateApp', {
|
||||
url: '/rateApp/:score',
|
||||
views: {
|
||||
'feedback': {
|
||||
'tab-home@tabs': {
|
||||
controller: 'rateAppController',
|
||||
templateUrl: 'views/feedback/rateApp.html'
|
||||
}
|
||||
}
|
||||
})
|
||||
/*
|
||||
*
|
||||
* Buy or Sell Bitcoin
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Buy or Sell Bitcoin
|
||||
*
|
||||
*/
|
||||
|
||||
.state('tabs.buyandsell', {
|
||||
url: '/buyandsell',
|
||||
|
|
|
@ -20,7 +20,7 @@ angular.module('copayApp.services').factory('configService', function(storageSer
|
|||
},
|
||||
|
||||
rateApp: {
|
||||
ios: 'https://itunes.apple.com/app/bitpay-secure-bitcoin-wallet/id1149581638',
|
||||
ios: 'http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=1149581638&pageNumber=0&sortOrdering=2&type=Purple+Software&mt=8',
|
||||
android: 'https://play.google.com/store/apps/details?id=com.bitpay.wallet',
|
||||
wp: ''
|
||||
},
|
||||
|
|
|
@ -30,7 +30,7 @@ angular.module('copayApp.services').factory('feeService', function($log, $stateP
|
|||
var feeLevelValue = lodash.find(levels, {
|
||||
level: feeLevel
|
||||
});
|
||||
if (!feeLevelValue || !feeLevelValue.feePerKB)
|
||||
if (!feeLevelValue || feeLevelValue.feePerKB == null)
|
||||
return cb({
|
||||
message: 'Could not get dynamic fee for level: ' + feeLevel
|
||||
});
|
||||
|
|
|
@ -51,12 +51,12 @@ angular.module('copayApp.services').service('popupService', function($log, $ioni
|
|||
|
||||
var _cordovaConfirm = function(title, message, okText, cancelText, cb) {
|
||||
var onConfirm = function(buttonIndex) {
|
||||
if (buttonIndex == 1) return cb(true);
|
||||
if (buttonIndex == 2) return cb(true);
|
||||
else return cb(false);
|
||||
}
|
||||
okText = okText || gettextCatalog.getString('OK');
|
||||
cancelText = cancelText || gettextCatalog.getString('Cancel');
|
||||
navigator.notification.confirm(message, onConfirm, title, [okText, cancelText]);
|
||||
navigator.notification.confirm(message, onConfirm, title, [cancelText, okText]);
|
||||
};
|
||||
|
||||
var _cordovaPrompt = function(title, message, opts, cb) {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#bitpayCard {
|
||||
background: white;
|
||||
.bar-header {
|
||||
border: 0;
|
||||
background: #1e3186;
|
||||
|
@ -9,15 +10,35 @@
|
|||
background-color: transparent;
|
||||
}
|
||||
}
|
||||
.amount-wrapper {
|
||||
position: relative;
|
||||
overflow: visible;
|
||||
|
||||
.amount-bg {
|
||||
content: '';
|
||||
top: -1000px;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
height: 1000px;
|
||||
width: 100%;
|
||||
background-color: #1e3186;
|
||||
}
|
||||
}
|
||||
.amount {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
padding: 2rem 1rem 1.5rem 1rem;
|
||||
height: 140px;
|
||||
height: 160px;
|
||||
border-color: #172565;
|
||||
background-color: #1e3186;
|
||||
background-image: linear-gradient(0deg, #172565, #172565 0%, transparent 0%);
|
||||
color: #fff;
|
||||
|
||||
&__balance {
|
||||
margin-bottom: 25px;
|
||||
font-weight: 600;
|
||||
font-size: 34px;
|
||||
}
|
||||
}
|
||||
.wallet-details-wallet-info {
|
||||
bottom: 5px;
|
||||
|
@ -37,4 +58,26 @@
|
|||
.item-select select {
|
||||
color: #667;
|
||||
}
|
||||
|
||||
.get-started {
|
||||
|
||||
margin-top: 20px;
|
||||
|
||||
&__arrow {
|
||||
font-size: 56px;
|
||||
opacity: .2;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 28px;
|
||||
color: #4A4A4A;
|
||||
}
|
||||
|
||||
&__text {
|
||||
font-weight: 300;
|
||||
color: #8e8e8e;
|
||||
max-width: 300px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
#view-confirm {
|
||||
|
||||
.tx-details-content > .scroll {
|
||||
padding-bottom: .25rem;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,6 +19,8 @@
|
|||
}
|
||||
.subtitle {
|
||||
padding: 10px 30px 20px 40px;
|
||||
text-align: center;
|
||||
color: $mid-gray;
|
||||
}
|
||||
.icon-svg > img {
|
||||
height: 16rem;
|
||||
|
@ -40,6 +42,7 @@
|
|||
bottom: 0;
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
padding: 20px;
|
||||
background-color: $subtle-gray;
|
||||
.row {
|
||||
margin: 20px 0px 20px;
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
#rate-app {
|
||||
background-color: #ffffff;
|
||||
.skip {
|
||||
margin: 10px;
|
||||
margin-top: 15px;
|
||||
color: #667;
|
||||
}
|
||||
.skip-rating {
|
||||
margin-right: 15px;
|
||||
}
|
||||
.icon-svg > img {
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
|
@ -13,20 +16,18 @@
|
|||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
color: $dark-gray;
|
||||
margin: 40px 50px 10px;
|
||||
margin: 80px 50px 10px;
|
||||
text-align: center;
|
||||
}
|
||||
.subtitle {
|
||||
padding: 10px 30px 20px 40px;
|
||||
color: #667;
|
||||
}
|
||||
.buttons {
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
background-color: $subtle-gray;
|
||||
.button {
|
||||
margin-top: 40px;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
padding: 50px 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,14 +1,18 @@
|
|||
#rate-card {
|
||||
.item-heading {
|
||||
font-weight: 700;
|
||||
}
|
||||
.row {
|
||||
border: none;
|
||||
}
|
||||
.row.row-margin{
|
||||
margin: 20px 0px 20px 0px;
|
||||
}
|
||||
.item-icon-right {
|
||||
margin: 0;
|
||||
}
|
||||
.feedback-flow-button {
|
||||
padding: 20px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.icon-svg > img {
|
||||
height: 1.8rem;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,27 +4,34 @@
|
|||
border: none;
|
||||
}
|
||||
.skip {
|
||||
margin: 20px 20px 10px;
|
||||
color: #667;
|
||||
text-decoration: none;
|
||||
color: rgba(255, 255, 255, 0.3);
|
||||
}
|
||||
.feedback-heading {
|
||||
padding-top: 20px
|
||||
}
|
||||
.title {
|
||||
padding: 20px;
|
||||
padding-left: 10px;
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
color: $dark-gray;
|
||||
}
|
||||
.rating {
|
||||
text-align: right;
|
||||
padding-right: 15px;
|
||||
}
|
||||
.comment {
|
||||
padding: 20px;
|
||||
padding: 0 20px 20px;
|
||||
font-size: 1rem;
|
||||
line-height: 1.5em;
|
||||
font-weight: 300;
|
||||
color: $dark-gray;
|
||||
}
|
||||
textarea {
|
||||
padding: 20px;
|
||||
.user-feedback {
|
||||
border-top: 1px solid $subtle-gray;
|
||||
padding: 20px;
|
||||
width: 100%;
|
||||
}
|
||||
.send-feedback-star {
|
||||
height: 1rem;
|
||||
margin-left: 5px;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
|
||||
img {
|
||||
margin-right: 1rem;
|
||||
height: 35px;
|
||||
width: 35px;
|
||||
}
|
||||
|
||||
span {
|
||||
|
|
|
@ -18,16 +18,18 @@
|
|||
}
|
||||
}
|
||||
.item{
|
||||
padding: calc(100vh - 99vh) calc(100vw - 93vw) calc(100vh - 97vh) calc(100vw - 95vw);
|
||||
i{left:auto;}
|
||||
padding: 3vh 3vw 3vh 3vw;
|
||||
span{
|
||||
clear:both;
|
||||
width: 100%;
|
||||
display: inline-block;
|
||||
&.wallet-name{
|
||||
margin-top:10px;
|
||||
margin-bottom:5px;
|
||||
font-size:13px;
|
||||
font-size:16px;
|
||||
width: 70%;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
font-weight: 600;
|
||||
}
|
||||
&.wallet-number{
|
||||
visibility: hidden;
|
||||
|
|
|
@ -52,6 +52,15 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
.wallet-details__item.item {
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
|
||||
.wallet-details__tx-icon {
|
||||
background: #fff;
|
||||
border-radius: 50px;
|
||||
}
|
||||
}
|
||||
.next-step.item {
|
||||
padding-top: 27px;
|
||||
padding-bottom: 27px;
|
||||
|
|
|
@ -13,14 +13,17 @@
|
|||
.scroll{height:100%;}
|
||||
#address {
|
||||
background: #fff;
|
||||
height: calc(100vh - 34vh);
|
||||
height: 66vh;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
flex-flow: column;
|
||||
@media(max-height: 600px){
|
||||
height: calc(100vh - 36vh);
|
||||
height: 68vh;
|
||||
}
|
||||
@media(max-height: 600px) and (-webkit-device-pixel-ratio: 2){
|
||||
height: 64vh;
|
||||
}
|
||||
&-info{
|
||||
height: 100%;
|
||||
|
@ -64,15 +67,27 @@
|
|||
.item {
|
||||
border: none;
|
||||
font-size: .8rem;
|
||||
z-index: 0;
|
||||
i {
|
||||
font-size: 1.3rem;
|
||||
}
|
||||
}
|
||||
#qr-options{
|
||||
.item{
|
||||
font-size:.7rem;
|
||||
@media(min-width:350px){
|
||||
font-size:.9rem;
|
||||
}
|
||||
@media(min-width:450px){
|
||||
font-size:1rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
.bit-address {
|
||||
font-size: .8rem;
|
||||
// left:10%;
|
||||
position: absolute;
|
||||
transition: all .4s ease;
|
||||
transition: all .15s ease;
|
||||
width:100%;
|
||||
height: 100%;
|
||||
z-index: 0;
|
||||
|
@ -100,16 +115,24 @@
|
|||
padding-bottom: 5px;
|
||||
display: inline-block;
|
||||
font-size: .7rem;
|
||||
@media(min-width:350px){
|
||||
font-size:.9rem;
|
||||
}
|
||||
@media(min-width:450px){
|
||||
font-size:1rem;
|
||||
}
|
||||
color:$light-gray;
|
||||
}
|
||||
}
|
||||
.qr {
|
||||
padding: calc(100vh - 85vh) 0 calc(100vh - 96vh);
|
||||
padding: 15vh 0 4vh;
|
||||
align-self: center;
|
||||
margin-top: auto;
|
||||
height: 220px;
|
||||
position: relative;
|
||||
justify-content: center;
|
||||
flex: 1;
|
||||
z-index: 1;
|
||||
div{
|
||||
transition: all .4s ease;
|
||||
&.current, &.prev, &.next{
|
||||
|
@ -131,7 +154,7 @@
|
|||
}
|
||||
}
|
||||
@media(max-height: 700px){
|
||||
padding: calc(100vh - 90vh) 0 calc(100vh - 96vh);
|
||||
padding: 10vh 0 4vh;
|
||||
}
|
||||
div{
|
||||
display: flex;
|
||||
|
@ -235,7 +258,8 @@
|
|||
}
|
||||
.wallets{
|
||||
position: relative;
|
||||
height: calc(100vh - 83vh);
|
||||
height: calc(27vh - 62px);
|
||||
z-index: 5;
|
||||
.slides {
|
||||
.swiper-container{
|
||||
position: absolute;
|
||||
|
@ -244,15 +268,29 @@
|
|||
-webkit-transform: translate(-50%, -50%);
|
||||
transform: translate(-50%, -50%);
|
||||
max-width: 450px;
|
||||
.swiper-wrapper{
|
||||
height: auto;
|
||||
top: 10%;
|
||||
position:relative;
|
||||
@media(max-height: 600px){padding-top:.2rem}
|
||||
@media(min-height: 900px){top:30%;}
|
||||
}
|
||||
.swiper-slide{
|
||||
text-align: center;
|
||||
.card{
|
||||
margin-top:2vh;
|
||||
display: inline-block;
|
||||
width:80%;
|
||||
@media(min-height: 1000px) and (max-width: 699px){
|
||||
.item{
|
||||
padding: 2vh 3vw 2vh 3vw;
|
||||
}
|
||||
}
|
||||
}
|
||||
@media(max-width: 500px){
|
||||
&-next{left:-25%;}
|
||||
&-prev{left:25%;}
|
||||
}
|
||||
&-next{left:-25%;}
|
||||
&-prev{left:25%;}
|
||||
}
|
||||
@media (max-height: 600px){
|
||||
&{
|
||||
|
@ -267,11 +305,17 @@
|
|||
.wallets{display: none;}
|
||||
#address{
|
||||
float:left;
|
||||
height:90vh;
|
||||
width:65%;
|
||||
height:100%;
|
||||
width:calc(100% - 410px);
|
||||
@media(max-width: 1000px){
|
||||
width:65%;
|
||||
}
|
||||
&-info{
|
||||
height: 100%;
|
||||
}
|
||||
#qr-options{
|
||||
.item{font-size:1rem;}
|
||||
}
|
||||
.qr{
|
||||
height: 70%;
|
||||
div{
|
||||
|
@ -292,7 +336,14 @@
|
|||
.backup, #bit-address{left:0;}
|
||||
#bit-address{
|
||||
height: 10%;
|
||||
padding: calc(100vh - 99vh);
|
||||
padding: 1vh;
|
||||
.bit-address{
|
||||
.item{
|
||||
top: 40%;
|
||||
transform: translateY(-40%);
|
||||
font-size:1rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#wallets{
|
||||
|
@ -302,18 +353,29 @@
|
|||
display: flex;
|
||||
flex-direction: column;
|
||||
overflow: visible;
|
||||
max-width: 410px;
|
||||
@media(max-height: 600px){
|
||||
padding-top:.55rem;
|
||||
}
|
||||
@media(max-width: 1000px){
|
||||
max-width: none;
|
||||
}
|
||||
#sidebar-wallet{display: block;}
|
||||
.list{height: 100%;overflow: visible;}
|
||||
#wallet-list{
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
overflow-y: scroll;
|
||||
width: 110%;
|
||||
overflow-y: auto;
|
||||
height: 100%;
|
||||
left: -6%;
|
||||
}
|
||||
.wallet{
|
||||
position: relative;
|
||||
&.current{
|
||||
position: relative;
|
||||
.card{
|
||||
opacity: 1;
|
||||
transform: scale(1);
|
||||
}
|
||||
&:before {
|
||||
right: 93%;
|
||||
top: 50%;
|
||||
|
@ -331,24 +393,30 @@
|
|||
}
|
||||
.card {
|
||||
max-width: 350px;
|
||||
box-shadow:$subtle-box-shadow;
|
||||
box-shadow: 0 1px 36px rgba(0, 0, 0, 0.07);
|
||||
padding:0;
|
||||
border-radius: 6px;
|
||||
padding:2px;
|
||||
width: 80%;
|
||||
position: relative;
|
||||
margin: 1.5rem auto 0;
|
||||
position: relative;
|
||||
opacity: .5;
|
||||
transform:scale(.85);
|
||||
transition:transform .2s ease;
|
||||
.item{
|
||||
padding: 6% 10% 6% 8%;
|
||||
i{left:auto;}
|
||||
span{
|
||||
clear:both;
|
||||
width: 100%;
|
||||
display: inline-block;
|
||||
&.wallet-name{
|
||||
margin-top:10px;
|
||||
margin-bottom:5px;
|
||||
font-size:13px;
|
||||
font-size:16px;
|
||||
width: 70%;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
font-weight: 600;
|
||||
}
|
||||
&.wallet-number{
|
||||
visibility: hidden;
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
font-weight: bold;
|
||||
}
|
||||
&--received {
|
||||
color: #30af6c;
|
||||
color: #09C286;
|
||||
}
|
||||
&--sent {
|
||||
color: $dark-gray;
|
||||
|
@ -14,18 +14,106 @@
|
|||
}
|
||||
&__tx-time {
|
||||
color: $light-gray;
|
||||
font-size: 12.5px;
|
||||
}
|
||||
&__tx-title {
|
||||
padding-top: 10px;
|
||||
flex-grow: 1;
|
||||
color: $dark-gray;
|
||||
overflow: hidden;
|
||||
}
|
||||
&__tx-icon {
|
||||
float: left;
|
||||
margin-right: 10px;
|
||||
margin-right: 25px;
|
||||
}
|
||||
&__tx-message {
|
||||
margin-right: 1rem;
|
||||
}
|
||||
|
||||
&__list {
|
||||
|
||||
}
|
||||
|
||||
.item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
background: #fff;
|
||||
padding-left: 1rem;
|
||||
}
|
||||
|
||||
&__item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
background: #fff;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
padding-left: 1rem;
|
||||
|
||||
&.proposal {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
&__marker {
|
||||
position: absolute;
|
||||
height: 100%;
|
||||
width: 3px;
|
||||
background: #F5A623;
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&__tx-content {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-grow: 1;
|
||||
padding: 1rem 0;
|
||||
padding-right: 1rem;
|
||||
border-bottom: 1px solid rgb(245, 245, 245);
|
||||
overflow: hidden;
|
||||
|
||||
&.no-border {
|
||||
border: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&__tx-amount {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
&__group-label {
|
||||
font-size: 14px;
|
||||
font-weight: 300;
|
||||
color: #727272;
|
||||
padding: 2px 1rem;
|
||||
background: #f8f8f9;
|
||||
}
|
||||
}
|
||||
|
||||
#walletDetails {
|
||||
background: #F8F8F9;
|
||||
|
||||
.scroll-refresher {
|
||||
z-index: 1;
|
||||
margin-top: 3.5rem;
|
||||
}
|
||||
|
||||
.ionic-refresher-content {
|
||||
color: white !important;
|
||||
|
||||
.spinner svg {
|
||||
stroke: white;
|
||||
fill: white;
|
||||
}
|
||||
}
|
||||
|
||||
.bp-content {
|
||||
position: relative;
|
||||
height: 100%;
|
||||
|
||||
&.status-bar {
|
||||
margin-top: 20px;
|
||||
}
|
||||
}
|
||||
.bar-header {
|
||||
border: 0;
|
||||
background: none;
|
||||
|
@ -39,13 +127,66 @@
|
|||
.nav-bar-block, .bar {
|
||||
background-color: inherit !important;
|
||||
}
|
||||
ion-content {
|
||||
|
||||
&.collapsible {
|
||||
margin-top: 180px;
|
||||
}
|
||||
|
||||
padding-top: 0;
|
||||
top: 0;
|
||||
.scroll {
|
||||
background: rgb(248, 248, 249);
|
||||
min-height: 300px;
|
||||
}
|
||||
}
|
||||
.amount-wrapper {
|
||||
position: relative;
|
||||
overflow: visible;
|
||||
|
||||
.amount-bg {
|
||||
content: '';
|
||||
top: 0;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 500px;
|
||||
transform: translateY(-499px);
|
||||
|
||||
&.collapsible {
|
||||
top: initial;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 200px;
|
||||
transform: translateY(100px);
|
||||
}
|
||||
}
|
||||
}
|
||||
.amount {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
padding: 2rem 1rem 1.5rem 1rem;
|
||||
color: #fff;
|
||||
height: 140px;
|
||||
margin-bottom: 10px;
|
||||
height: 180px;
|
||||
padding-top: 40px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
&.collapsible {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
&__balance {
|
||||
transform: scale3d(1, 1, 1);
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
&__updating {
|
||||
z-index: 999;
|
||||
margin-top: -2.1rem;
|
||||
}
|
||||
|
||||
&-alternative {
|
||||
line-height: 36px;
|
||||
|
@ -77,3 +218,18 @@
|
|||
font-size: 20px;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.wallet-not-backed-up-warning {
|
||||
background: orange;
|
||||
text-align: center;
|
||||
color: white;
|
||||
font-size: 14px;
|
||||
display: block;
|
||||
text-decoration: none;
|
||||
z-index: 9999;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
a.item {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 17.8 17.8" style="enable-background:new 0 0 17.8 17.8;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#F2F2F2;}
|
||||
.st0{fill:#DADADA;}
|
||||
</style>
|
||||
<path class="st0" d="M17.7,6c-0.1-0.2-0.2-0.3-0.4-0.3h-5.5L9.3,0.3C9.2,0.1,9.1,0,8.9,0C8.7,0,8.6,0.1,8.5,0.3L5.9,5.8H0.4
|
||||
C0.3,5.8,0.1,5.9,0,6C0,6.2,0,6.4,0.1,6.5l4,4.2l-1.6,6.5c0,0.2,0,0.4,0.2,0.5c0.1,0.1,0.3,0.1,0.5,0l5.7-3.3l5.7,3.3
|
||||
|
|
Before Width: | Height: | Size: 654 B After Width: | Height: | Size: 654 B |
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="33px" height="33px" viewBox="0 0 33 33" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 40.1 (33804) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>Group 2</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Icons/Transaction/Processing" transform="translate(-8.000000, -8.000000)">
|
||||
<g id="Icons/Send">
|
||||
<g id="Group-2" transform="translate(8.000000, 8.000000)">
|
||||
<path d="M16.5,33 C25.6126984,33 33,25.6126984 33,16.5 C33,7.38730163 25.6126984,0 16.5,0 C7.38730163,0 0,7.38730163 0,16.5 C0,25.6126984 7.38730163,33 16.5,33 Z" id="Oval-204" fill="#F2F2F2" opacity="0.8"></path>
|
||||
<g id="Group" transform="translate(8.000000, 7.500000)" stroke="#BDBDBD">
|
||||
<path d="M0,9 C0,4.05 3.80952381,0 8.46560847,0 C11.7671958,0 14.6455026,1.98 16,4.95" id="Shape"></path>
|
||||
<path d="M17,9 C17,13.95 13.1904762,18 8.53439153,18 C5.23280423,18 2.35449735,16.02 1,13.05" id="Shape"></path>
|
||||
<polyline id="Shape" points="17 0 16.2941176 5 11 4.3220339"></polyline>
|
||||
<polyline id="Shape" points="0 18 0.705882353 13 6 13.6779661"></polyline>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.5 KiB |
|
@ -0,0 +1,23 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="33px" height="33px" viewBox="0 0 33 33" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 40.1 (33804) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>Group</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Icons/Transaction/Pending" transform="translate(-8.000000, -8.000000)">
|
||||
<g id="Icons/Send">
|
||||
<g id="icons/received">
|
||||
<g id="users-24px-outline-2_a-check" transform="translate(8.000000, 8.000000)">
|
||||
<g id="Group">
|
||||
<path d="M16.5,33 C25.6126984,33 33,25.6126984 33,16.5 C33,7.38730163 25.6126984,0 16.5,0 C7.38730163,0 0,7.38730163 0,16.5 C0,25.6126984 7.38730163,33 16.5,33 Z" id="Oval-204" fill="#FFF6EF"></path>
|
||||
<path d="M15.7275949,17.3034598 C13.3028473,17.3034598 11.1520001,17.8512604 9.73870884,18.3277955 C8.69548354,18.680689 8,19.6638107 8,20.7654223 L8,24.172433 L14.8689732,24.172433" id="Shape" stroke="#F6A623"></path>
|
||||
<path d="M15.7275949,17.3034598 L15.7275949,17.3034598 C13.3569405,17.3034598 11.4344866,14.5223843 11.4344866,12.1517299 L11.4344866,11.2931083 C11.4344866,8.92245388 13.3569405,7 15.7275949,7 L15.7275949,7 C18.0982492,7 20.0207031,8.92245388 20.0207031,11.2931083 L20.0207031,12.1517299 C20.0207031,14.5223843 18.0982492,17.3034598 15.7275949,17.3034598 L15.7275949,17.3034598 Z" id="Shape" stroke="#F6A623"></path>
|
||||
<polyline id="Shape" stroke="#F6A623" points="19.1620815 23.3138114 20.8793248 25.0310547 25.172433 20.7379464"></polyline>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
|
@ -0,0 +1,21 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="35px" height="35px" viewBox="0 0 35 35" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 40.1 (33804) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>Group 2</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Icons/Transaction/Send" transform="translate(-6.000000, -6.000000)">
|
||||
<g id="Group-2" transform="translate(24.500000, 24.500000) rotate(90.000000) translate(-24.500000, -24.500000) translate(7.000000, 7.000000)">
|
||||
<g id="Icons/Send">
|
||||
<g id="icons/received">
|
||||
<g id="Received" transform="translate(17.244258, 17.883990) scale(-1, 1) translate(-17.244258, -17.883990) translate(0.244258, 0.883990)">
|
||||
<path d="M17.3272285,33.991292 C26.4399269,33.991292 33.8272285,26.6039904 33.8272285,17.491292 C33.8272285,8.37859367 26.4399269,0.991292046 17.3272285,0.991292046 C8.21453012,0.991292046 0.82722849,8.37859367 0.82722849,17.491292 C0.82722849,26.6039904 8.21453012,33.991292 17.3272285,33.991292 Z" id="Oval-204" stroke="#BDBDBD" opacity="0.8"></path>
|
||||
<path d="M11.0503675,17.6759465 L24.0056239,17.6759465 M15.816934,23.6130491 L10,17.7604241 L15.614688,12" id="Line" stroke="#BEBEBE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" transform="translate(17.002812, 17.806525) scale(1, -1) rotate(-90.000000) translate(-17.002812, -17.806525) "></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.7 KiB |
|
@ -0,0 +1,15 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 35 35" style="enable-background:new 0 0 35 35;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#0EC286;}
|
||||
</style>
|
||||
<g>
|
||||
<path class="st0" d="M17.5,34.5c-9.4,0-17-7.6-17-17s7.6-17,17-17s17,7.6,17,17S26.9,34.5,17.5,34.5z M17.5,1.5
|
||||
c-8.8,0-16,7.2-16,16s7.2,16,16,16s16-7.2,16-16S26.3,1.5,17.5,1.5z"/>
|
||||
</g>
|
||||
<path class="st0" d="M23.8,18.2c-0.3-0.3-0.8-0.3-1.1,0l-4.7,4.6V10.5c0-0.4-0.3-0.8-0.8-0.8s-0.8,0.3-0.8,0.8v12.1l-4.4-4.3
|
||||
c-0.3-0.3-0.8-0.3-1.1,0c-0.3,0.3-0.3,0.8,0,1.1l5.8,5.6c0.1,0.1,0.3,0.2,0.5,0.2c0.2,0,0.4-0.1,0.5-0.2l5.9-5.8
|
||||
C24.1,18.9,24.1,18.5,23.8,18.2z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 851 B |
|
@ -0,0 +1,21 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="35px" height="35px" viewBox="0 0 35 35" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 40.1 (33804) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>Group 2</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Icons/Transaction/Send" transform="translate(-6.000000, -8.000000)">
|
||||
<g id="Group-2" transform="translate(7.000000, 7.000000)">
|
||||
<g id="Icons/Send">
|
||||
<g id="icons/received">
|
||||
<g id="Received" transform="translate(17.244258, 17.883990) scale(-1, 1) translate(-17.244258, -17.883990) translate(0.244258, 0.883990)">
|
||||
<path d="M17.3272285,33.991292 C26.4399269,33.991292 33.8272285,26.6039904 33.8272285,17.491292 C33.8272285,8.37859367 26.4399269,0.991292046 17.3272285,0.991292046 C8.21453012,0.991292046 0.82722849,8.37859367 0.82722849,17.491292 C0.82722849,26.6039904 8.21453012,33.991292 17.3272285,33.991292 Z" id="Oval-204" stroke="#BDBDBD" opacity="0.8"></path>
|
||||
<path d="M11.0503675,17.6759465 L24.0056239,17.6759465 M15.816934,23.6130491 L10,17.7604241 L15.614688,12" id="Line" stroke="#BEBEBE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" transform="translate(17.002812, 17.806525) scale(1, -1) rotate(-90.000000) translate(-17.002812, -17.806525) "></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
|
@ -16,10 +16,11 @@
|
|||
Sandbox version. Only for testing purpose
|
||||
</div>
|
||||
|
||||
<div class="oh pr" ng-show="!error">
|
||||
<div class="amount-wrapper" ng-show="!error">
|
||||
<div class="amount-bg"></div>
|
||||
<div class="amount">
|
||||
<div ng-if="bitpayCard.bitpayCardCurrentBalance" ng-click="bitpayCard.update()">
|
||||
<div class="size-36 m20b">${{bitpayCard.bitpayCardCurrentBalance}}</div>
|
||||
<div class="amount__balance">${{bitpayCard.bitpayCardCurrentBalance}}</div>
|
||||
<a class="button button-primary button-small m5t size-14"
|
||||
style="padding: 0.5em 1em;"
|
||||
ui-sref="tabs.bitpayCard.amount({'cardId': cardId, 'toName': 'BitPay Card'})">
|
||||
|
@ -41,11 +42,13 @@
|
|||
</div>
|
||||
|
||||
<div
|
||||
class="m10t text-center padding ng-hide"
|
||||
class="text-center padding get-started"
|
||||
ng-show="bitpayCard.getStarted">
|
||||
<i class="icon ion-ios-arrow-thin-up size-24"></i>
|
||||
<i class="icon ion-ios-arrow-thin-up get-started__arrow"></i>
|
||||
<h1>Get started</h1>
|
||||
<h4>Your BitPay Card is ready. Add funds to your card to start using your card at stores and ATMs worldwide.</h4>
|
||||
<div class="get-started__text">
|
||||
Your BitPay Card is ready. Add funds to your card to start using your card at stores and ATMs worldwide.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="list" ng-show="!bitpayCard.getStarted">
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
<div class="list">
|
||||
<div class="item head">
|
||||
<div class="sending-label">
|
||||
<img src="img/sending-icon.svg">
|
||||
<img src="img/icon-tx-sent-outline.svg">
|
||||
<span translate>Sending</span>
|
||||
</div>
|
||||
<div class="amount-label">
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
<ion-view id="complete">
|
||||
<ion-view id="complete" hide-tabs>
|
||||
<ion-content scroll="false">
|
||||
<div class="item item-icon-right item-heading">
|
||||
<a ui-sref="tabs.home"><i class="icon ion-ios-close-empty close-home-tip"></i></a>
|
||||
<div class="padding oh">
|
||||
<a class="right size-36" ng-click="close()"><i class="icon ion-ios-close-empty close-home-tip"></i></a>
|
||||
</div>
|
||||
<div ng-show="skipped && isCordova">
|
||||
<div ng-show="score > 3">
|
||||
<div class="title" translate>Invite friends to BitPay Wallet!</div>
|
||||
<div class="title" translate>Invite friends to BitPay!</div>
|
||||
<div class="text-center">
|
||||
<i class="icon addressbook-icon-svg">
|
||||
<img src="img/address-book-add.svg"/>
|
||||
|
@ -53,45 +53,41 @@
|
|||
</div>
|
||||
<div class="share-buttons" ng-if="isCordova && score > 3">
|
||||
<div class="ng-hide" ng-show="socialsharing" ng-if="score >= 4">
|
||||
<div class="row">
|
||||
<div class="ng-hide" ng-show="facebook" ng-click="shareFacebook()">
|
||||
<i class="icon socialsharing-icon">
|
||||
<img src="img/social-icons/ico-social-facebook.svg"/>
|
||||
</i>
|
||||
<span>Facebook</span>
|
||||
</div>
|
||||
<div class="ng-hide" ng-show="twitter" ng-click="shareTwitter()">
|
||||
<i class="icon socialsharing-icon">
|
||||
<img src="img/social-icons/ico-social-twitter.svg"/>
|
||||
</i>
|
||||
<span>Twitter</span>
|
||||
</div>
|
||||
<div class="ng-hide" ng-show="googleplus" ng-click="shareGooglePlus()">
|
||||
<i class="icon socialsharing-icon">
|
||||
<img src="img/social-icons/ico-social-googleplus.svg"/>
|
||||
</i>
|
||||
<span>Google+</span>
|
||||
</div>
|
||||
<div class="left text-center m10r ng-hide" ng-show="facebook" ng-click="shareFacebook()">
|
||||
<i class="icon socialsharing-icon">
|
||||
<img src="img/social-icons/ico-social-facebook.svg"/>
|
||||
</i>
|
||||
<div>Facebook</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="ng-hide" ng-show="email" ng-click="shareEmail()">
|
||||
<i class="icon socialsharing-icon">
|
||||
<img src="img/social-icons/ico-social-email.svg"/>
|
||||
</i>
|
||||
<span>Email</span>
|
||||
</div>
|
||||
<div class="ng-hide" ng-show="whatsapp" ng-click="shareWhatsapp()">
|
||||
<i class="icon socialsharing-icon">
|
||||
<img src="img/social-icons/ico-social-whatsapp.svg"/>
|
||||
</i>
|
||||
<span>Whatsapp</span>
|
||||
</div>
|
||||
<div ng-click="shareMessage()">
|
||||
<i class="icon socialsharing-icon">
|
||||
<img src="img/social-icons/ico-social-message.svg"/>
|
||||
</i>
|
||||
<span>Message</span>
|
||||
</div>
|
||||
<div class="left text-center m10r ng-hide" ng-show="twitter" ng-click="shareTwitter()">
|
||||
<i class="icon socialsharing-icon">
|
||||
<img src="img/social-icons/ico-social-twitter.svg"/>
|
||||
</i>
|
||||
<div>Twitter</div>
|
||||
</div>
|
||||
<div class="left text-center m10r ng-hide" ng-show="googleplus" ng-click="shareGooglePlus()">
|
||||
<i class="icon socialsharing-icon">
|
||||
<img src="img/social-icons/ico-social-googleplus.svg"/>
|
||||
</i>
|
||||
<div>Google+</div>
|
||||
</div>
|
||||
<div class="left text-center m10r ng-hide" ng-show="email" ng-click="shareEmail()">
|
||||
<i class="icon socialsharing-icon">
|
||||
<img src="img/social-icons/ico-social-email.svg"/>
|
||||
</i>
|
||||
<div>Email</div>
|
||||
</div>
|
||||
<div class="left text-center m10r ng-hide" ng-show="whatsapp" ng-click="shareWhatsapp()">
|
||||
<i class="icon socialsharing-icon">
|
||||
<img src="img/social-icons/ico-social-whatsapp.svg"/>
|
||||
</i>
|
||||
<div>Whatsapp</div>
|
||||
</div>
|
||||
<div class="left text-center m10r" ng-click="shareMessage()">
|
||||
<i class="icon socialsharing-icon">
|
||||
<img src="img/social-icons/ico-social-message.svg"/>
|
||||
</i>
|
||||
<div>Message</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<ion-view id="rate-app">
|
||||
<ion-view id="rate-app" hide-tabs>
|
||||
<ion-content scroll="false">
|
||||
<a class="right skip" ng-click="skip()">Skip</a>
|
||||
<a class="right skip skip-rating" ng-click="skip()" translate>Not now</a>
|
||||
<div class="title">
|
||||
<span translate>Thank you!</span>
|
||||
<div>
|
||||
|
@ -10,10 +10,10 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="subtitle text-center">
|
||||
<span translate>5-star ratings help us get BitPay Wallet into more hands, and more users means more resoucers can be committed to the app!</span>
|
||||
<span translate>5-star ratings help us get BitPay into more hands, and more users means more resources can be committed to the app!</span>
|
||||
</div>
|
||||
<div class="subtitle text-center">
|
||||
<span class="text-bold" translate>Would you be willing to rate BitPay Wallet in the app store?</span>
|
||||
<span class="text-bold" translate>Would you be willing to rate BitPay in the app store?</span>
|
||||
</div>
|
||||
<div class="buttons">
|
||||
<button type="submit" class="button button-standard button-primary" ng-click="goAppStore()">
|
||||
|
|
|
@ -1,35 +1,35 @@
|
|||
<div id="rate-card" ng-class="{'popup-modal': isModal}" ng-controller="rateCardController">
|
||||
<div class="card" id="rate-card" ng-controller="rateCardController">
|
||||
<div class="item item-icon-right item-heading">
|
||||
<span translate>How do you like BitPay Wallet?</span>
|
||||
<span translate>How do you like BitPay?</span>
|
||||
<a ng-click="hideCard()" ><i class="icon ion-ios-close-empty close-home-tip"></i></a>
|
||||
</div>
|
||||
<div class="row item item-sub" ng-class="{'row-margin': isModal}">
|
||||
<div class="col col-20">
|
||||
<i class="icon icon-svg" ng-click="setScore(1)">
|
||||
<div class="col col-20" ng-click="setScore(1)">
|
||||
<i class="icon icon-svg">
|
||||
<img ng-if="1 <= score" src="img/ico-star-filled.svg"/>
|
||||
<img ng-if="1 > score" src="img/ico-star.svg"/>
|
||||
</i>
|
||||
</div>
|
||||
<div class="col col-20">
|
||||
<i class="icon icon-svg" ng-click="setScore(2)">
|
||||
<div class="col col-20" ng-click="setScore(2)">
|
||||
<i class="icon icon-svg">
|
||||
<img ng-if="2 <= score" src="img/ico-star-filled.svg"/>
|
||||
<img ng-if="2 > score" src="img/ico-star.svg"/>
|
||||
</i>
|
||||
</div>
|
||||
<div class="col col-20">
|
||||
<i class="icon icon-svg" ng-click="setScore(3)">
|
||||
<div class="col col-20" ng-click="setScore(3)">
|
||||
<i class="icon icon-svg">
|
||||
<img ng-if="3 <= score" src="img/ico-star-filled.svg"/>
|
||||
<img ng-if="3 > score" src="img/ico-star.svg"/>
|
||||
</i>
|
||||
</div>
|
||||
<div class="col col-20">
|
||||
<i class="icon icon-svg" ng-click="setScore(4)">
|
||||
<div class="col col-20" ng-click="setScore(4)">
|
||||
<i class="icon icon-svg">
|
||||
<img ng-if="4 <= score" src="img/ico-star-filled.svg"/>
|
||||
<img ng-if="4 > score" src="img/ico-star.svg"/>
|
||||
</i>
|
||||
</div>
|
||||
<div class="col col-20">
|
||||
<i class="icon icon-svg" ng-click="setScore(5)">
|
||||
<div class="col col-20" ng-click="setScore(5)">
|
||||
<i class="icon icon-svg">
|
||||
<img ng-if="5 == score" src="img/ico-star-filled.svg"/>
|
||||
<img ng-if="5 > score" src="img/ico-star.svg"/>
|
||||
</i>
|
||||
|
|
|
@ -1,51 +1,39 @@
|
|||
<ion-view id="send-feedback">
|
||||
<a class="right skip" ng-click="sendFeedback(null,true)" href translate>Skip</a>
|
||||
<ion-view id="send-feedback" hide-tabs>
|
||||
<ion-nav-bar class="bar-royal">
|
||||
<ion-nav-back-button>
|
||||
</ion-nav-back-button>
|
||||
<ion-nav-buttons side="secondary">
|
||||
<button ng-show="score" class="button no-border" ng-click="sendFeedback(null, true)" translate>
|
||||
Skip
|
||||
</button>
|
||||
</ion-nav-buttons>
|
||||
</ion-nav-bar>
|
||||
<ion-content class="has-header" scroll="false">
|
||||
<div class="title">
|
||||
<span>{{reaction}}</span>
|
||||
</div>
|
||||
<div class="row item item-sub">
|
||||
<div class="col col-10">
|
||||
<i class="icon icon-svg" ng-click="setScore(1)">
|
||||
<img ng-if="1 <= score" src="img/ico-star-filled.svg"/>
|
||||
<img ng-if="1 > score" src="img/ico-star.svg"/>
|
||||
</i>
|
||||
<div class="row item item-sub feedback-heading">
|
||||
<div class="col col-50">
|
||||
<div class="title">
|
||||
<span>{{reaction}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col col-10">
|
||||
<i class="icon icon-svg" ng-click="setScore(2)">
|
||||
<img ng-if="2 <= score" src="img/ico-star-filled.svg"/>
|
||||
<img ng-if="2 > score" src="img/ico-star.svg"/>
|
||||
</i>
|
||||
</div>
|
||||
<div class="col col-10">
|
||||
<i class="icon icon-svg" ng-click="setScore(3)">
|
||||
<img ng-if="3 <= score" src="img/ico-star-filled.svg"/>
|
||||
<img ng-if="3 > score" src="img/ico-star.svg"/>
|
||||
</i>
|
||||
</div>
|
||||
<div class="col col-10">
|
||||
<i class="icon icon-svg" ng-click="setScore(4)">
|
||||
<img ng-if="4 <= score" src="img/ico-star-filled.svg"/>
|
||||
<img ng-if="4 > score" src="img/ico-star.svg"/>
|
||||
</i>
|
||||
</div>
|
||||
<div class="col col-10">
|
||||
<i class="icon icon-svg" ng-click="setScore(5)">
|
||||
<img ng-if="5 == score" src="img/ico-star-filled.svg"/>
|
||||
<img ng-if="5 > score" src="img/ico-star.svg"/>
|
||||
</i>
|
||||
<div class="col col-50 rating" ng-if="score">
|
||||
<img class="send-feedback-star" ng-if="1 <= score" src="img/ico-star-filled.svg"/>
|
||||
<img class="send-feedback-star" ng-if="1 > score" src="img/ico-star.svg"/>
|
||||
<img class="send-feedback-star" ng-if="2 <= score" src="img/ico-star-filled.svg"/>
|
||||
<img class="send-feedback-star" ng-if="2 > score" src="img/ico-star.svg"/>
|
||||
<img class="send-feedback-star" ng-if="3 <= score" src="img/ico-star-filled.svg"/>
|
||||
<img class="send-feedback-star" ng-if="3 > score" src="img/ico-star.svg"/>
|
||||
<img class="send-feedback-star" ng-if="4 <= score" src="img/ico-star-filled.svg"/>
|
||||
<img class="send-feedback-star" ng-if="4 > score" src="img/ico-star.svg"/>
|
||||
<img class="send-feedback-star" ng-if="5 == score" src="img/ico-star-filled.svg"/>
|
||||
<img class="send-feedback-star" ng-if="5 > score" src="img/ico-star.svg"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="comment">
|
||||
<span translate>{{comment}}</span>
|
||||
</div>
|
||||
<div>
|
||||
<textarea ng-model="feedback" placeholder="Is there anything we could do to improve your experience?" row="40"></textarea>
|
||||
</div>
|
||||
<div class="padding">
|
||||
<button ng-disabled="!feedback" type="submit" class="button button-full button-primary" ng-click="sendFeedback(feedback, false)" translate>
|
||||
Send
|
||||
</button>
|
||||
</div>
|
||||
<textarea class="user-feedback" ng-model="feedback.value" rows="5" placeholder="Your ideas, feedback, or comments" autofocus></textarea>
|
||||
<button ng-disabled="!feedback.value" type="submit" class="button button-standard button-primary" ng-click="sendFeedback(feedback.value, false)" translate>
|
||||
Send
|
||||
</button>
|
||||
</ion-content>
|
||||
</ion-view>
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
</div>
|
||||
<div class="popup-modal-content popup-modal-content-success">
|
||||
<div class="popup-modal-heading" translate>Your bitcoin wallet is backed up!</div>
|
||||
<div class="popup-modal-message" translate>Be sure to store your recovery phrase in a secure place. If this app is deleted, your money cannot be recoved without it.</div>
|
||||
<div class="popup-modal-message" translate>Be sure to store your recovery phrase in a secure place. If this app is deleted, your money cannot be recovered without it.</div>
|
||||
<button class="button button-clear" ng-click="closeBackupResultModal()" translate>Got it</button>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,27 +1,39 @@
|
|||
<div class="wallet-details__item__marker"></div>
|
||||
<img class="wallet-details__tx-icon" src="img/icon-proposal-pending.svg" width="40">
|
||||
|
||||
<div class="wallet-activity" ng-class="{'wallet-activity-not-pending':!tx.pendingForUs}">
|
||||
<div class="wallet-activity-amount">
|
||||
{{tx.amountStr}}
|
||||
<div class="wallet-details__tx-content" ng-class="{'no-border': $last}">
|
||||
|
||||
<div class="wallet-details__tx-title">
|
||||
<span ng-show="!tx.merchant">
|
||||
<span ng-show="addressbook[tx.toAddress] && !tx.message">
|
||||
{{addressbook[tx.toAddress].name || addressbook[tx.toAddress]}}
|
||||
</span>
|
||||
<span class="ellipsis" ng-show="!addressbook[tx.toAddress] && tx.message">
|
||||
{{tx.message}}
|
||||
</span>
|
||||
<span ng-show="!addressbook[tx.toAddress] && !tx.message" translate>
|
||||
Sending
|
||||
</span>
|
||||
</span>
|
||||
<span ng-show="tx.merchant">
|
||||
<span ng-show="tx.merchant.pr.ca"><i class="fi-lock"></i> {{tx.merchant.domain}}</span>
|
||||
<span ng-show="!tx.merchant.pr.ca"><i class="fi-unlock"></i> {{tx.merchant.domain}}</span>
|
||||
</span>
|
||||
</div>
|
||||
<span ng-show="!tx.merchant">
|
||||
<span ng-show="addressbook[tx.toAddress] && !tx.message">
|
||||
{{addressbook[tx.toAddress].name || addressbook[tx.toAddress]}}
|
||||
</span>
|
||||
<span class="ellipsis" ng-show="!addressbook[tx.toAddress] && tx.message">
|
||||
{{tx.message}}
|
||||
</span>
|
||||
<span ng-show="!addressbook[tx.toAddress] && !tx.message" translate>
|
||||
Sending
|
||||
</span>
|
||||
</span>
|
||||
<span ng-show="tx.merchant">
|
||||
<span ng-show="tx.merchant.pr.ca"><i class="fi-lock"></i> {{tx.merchant.domain}}</span>
|
||||
<span ng-show="!tx.merchant.pr.ca"><i class="fi-unlock"></i> {{tx.merchant.domain}}</span>
|
||||
</span>
|
||||
|
||||
<p class="wallet-activity-note">
|
||||
<i class="icon ion-record wallet-activity-note-child" ng-style="{'color':tx.wallet.color}"></i>
|
||||
<span class="wallet-activity-note-child">{{tx.wallet.name}}</span>
|
||||
<time class="wallet-activity-note-child">{{tx.createdOn * 1000 | amTimeAgo}}</time>
|
||||
</p>
|
||||
<span class="item-note text-right wallet-details__tx-amount">
|
||||
<span class="wallet-details__tx-amount wallet-details__tx-amount--sent">
|
||||
<span ng-if="tx.action == 'sent'">–</span>
|
||||
<span class="size-12" ng-if="tx.action == 'invalid'" translate>
|
||||
(possible double spend)
|
||||
</span>
|
||||
<span ng-if="tx.action != 'invalid'">
|
||||
– {{tx.amountStr}}
|
||||
</span>
|
||||
</span>
|
||||
<div>
|
||||
<time class="wallet-details__tx-time" ng-if="tx.createdOn && createdWithinPastDay(tx.createdOn)">{{tx.createdOn * 1000 | amTimeAgo}}</time>
|
||||
<time class="wallet-details__tx-time" ng-if="tx.createdOn && !createdWithinPastDay(tx.createdOn)">{{tx.createdOn * 1000 | date:'MMMM d, y'}}</time>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
|
|
|
@ -40,9 +40,9 @@
|
|||
</p>
|
||||
</span>
|
||||
|
||||
<img class="left m10r" src="img/icon-receive-history.svg" alt="sync" width="40" ng-if="btx.action == 'received'">
|
||||
<img class="left m10r" src="img/icon-sent-history.svg" alt="sync" width="40" ng-if="btx.action == 'sent'">
|
||||
<img class="left m10r" src="img/icon-moved.svg" alt="sync" width="40" ng-if="btx.action == 'moved'">
|
||||
<img class="left m10r" src="img/icon-tx-received-outline.svg" alt="sync" width="40" ng-if="btx.action == 'received'">
|
||||
<img class="left m10r" src="img/icon-tx-sent-outline.svg" alt="sync" width="40" ng-if="btx.action == 'sent'">
|
||||
<img class="left m10r" src="img/icon-tx-moved-outline.svg" alt="sync" width="40" ng-if="btx.action == 'moved'">
|
||||
|
||||
<h2>
|
||||
<div class="padding" ng-if="btx.action == 'received'">
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
<div class="list">
|
||||
<div class="item head">
|
||||
<div class="sending-label">
|
||||
<img src="img/sending-icon.svg">
|
||||
<img src="img/icon-tx-sent-outline.svg">
|
||||
<span translate>Sending</span>
|
||||
</div>
|
||||
<div class="amount-label">
|
||||
|
|
|
@ -16,10 +16,8 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="list card" ng-show="txps[0] && !fetchingProposals">
|
||||
<a ng-repeat="tx in txps" class="item" ng-click="openTxpModal(tx)">
|
||||
<span ng-include="'views/includes/txp.html'"></span>
|
||||
</a>
|
||||
<div class="list card" ng-show="txps[0] && !fetchingProposals" style="padding: 0;">
|
||||
<a ng-repeat="tx in txps" ng-click="openTxpModal(tx)" class="wallet-details__item item item-sub" ng-include="'views/includes/txp.html'"></a>
|
||||
</div>
|
||||
|
||||
<div class="list card" ng-show="!txps[0] && !fetchingProposals">
|
||||
|
|
|
@ -13,9 +13,7 @@
|
|||
<div class="release ng-hide" ng-show="newRelease" ng-click="openExternalLink('https://github.com/bitpay/copay/releases/latest', true, 'Update Available', 'An update to this app is available. For your security, please update to the latest version.', 'View Update', 'Go Back')">
|
||||
<span translate>An update to this app is available</span><span><i class="icon bp-arrow-right"></i></span>
|
||||
</div>
|
||||
<div class="list card ng-hide" ng-show="showRateCard.value">
|
||||
<span ng-include="'views/feedback/rateCard.html'"></span>
|
||||
</div>
|
||||
<div class="ng-hide" ng-show="showRateCard.value" ng-include="'views/feedback/rateCard.html'"></div>
|
||||
<div class="list card homeTip" ng-if="homeTip">
|
||||
<div class="item item-icon-right item-heading">
|
||||
<a ng-click="hideHomeTip()"><i class="icon ion-ios-close-empty close-home-tip"></i></a>
|
||||
|
@ -40,9 +38,9 @@
|
|||
<span class="badge badge-assertive m5t m10r" ng-show="txpsN>3"> {{txpsN}}</span>
|
||||
</a>
|
||||
|
||||
<a ng-repeat="tx in txps" class="item item-sub" ng-click="openTxpModal(tx)">
|
||||
<span ng-include="'views/includes/txp.html'"></span>
|
||||
</a>
|
||||
<div ng-repeat="tx in txps" ng-click="openTxpModal(tx)">
|
||||
<a class="wallet-details__item item item-sub" ng-include="'views/includes/txp.html'"></a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="list card" ng-if="notifications[0] && recentTransactionsEnabled">
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
<img src="img/icon-link.svg" class="bg just-a-hint"/>
|
||||
</i>
|
||||
</a>
|
||||
<a class="item item-icon-left item-icon-right" ng-click="openRateModal()">
|
||||
<a class="item item-icon-left item-icon-right" ui-sref="tabs.feedback">
|
||||
<i class="icon big-icon-svg">
|
||||
<img src="img/icon-send-feedback.svg" class="bg"/>
|
||||
</i>
|
||||
|
|
|
@ -7,13 +7,20 @@
|
|||
</ion-nav-back-button>
|
||||
</ion-nav-bar>
|
||||
|
||||
<ion-content>
|
||||
<ion-content class="tx-details-content">
|
||||
<div class="list">
|
||||
<div class="item head">
|
||||
<div class="sending-label">
|
||||
<img src="img/icon-check-circled.svg">
|
||||
<div class="sending-label" ng-if="btx.confirmations > 0">
|
||||
<img src="img/icon-tx-sent-outline.svg" ng-if="btx.action === 'sent'">
|
||||
<img src="img/icon-tx-received-outline.svg" ng-if="btx.action === 'received'">
|
||||
<img src="img/icon-tx-moved-outline.svg" ng-if="btx.action === 'moved'">
|
||||
<span translate>{{btx.action | translate}}</span>
|
||||
</div>
|
||||
<div class="sending-label" ng-if="btx.confirmations === 0">
|
||||
<img src="img/icon-confirming.svg">
|
||||
<span ng-if="btx.action == 'sent' || btx.action == 'moved'">Sending</span>
|
||||
<span ng-if="btx.action == 'received'">Receiving</span>
|
||||
</div>
|
||||
<div class="amount-label">
|
||||
<div class="amount">{{displayAmount}} <span class="unit">{{displayUnit}}</span></div>
|
||||
<div class="alternative" ng-click="getFiatRate(); showRate = !showRate">
|
||||
|
@ -53,11 +60,11 @@
|
|||
{{btx.creatorName}} <time>{{ (btx.ts || btx.createdOn ) * 1000 | amDateFormat:'MM/DD/YYYY hh:mm a'}}</time>
|
||||
</span>
|
||||
</div>
|
||||
<a class="item single-line item-icon-right" ng-click="showCommentPopup()">
|
||||
<a class="item item-icon-right" ng-class="{'single-line': !btx.note.body && !btx.message}" ng-click="showCommentPopup()">
|
||||
<span class="label" translate>Memo</span>
|
||||
<span class="item-note m10l">
|
||||
<div class="item-note" style="display: block; float: none; margin-bottom: .25rem;">
|
||||
{{btx.note.body || btx.message}}
|
||||
</span>
|
||||
</div>
|
||||
<i class="icon bp-arrow-right"></i>
|
||||
</a>
|
||||
<div class="item single-line">
|
||||
|
@ -69,7 +76,7 @@
|
|||
<div class="item single-line">
|
||||
<span class="label" translate>Confirmations</span>
|
||||
<span class="item-note">
|
||||
<span class="assertive" ng-show="!btx.confirmations || btx.confirmations == 0" translate>
|
||||
<span ng-show="!btx.confirmations || btx.confirmations == 0" translate>
|
||||
Unconfirmed
|
||||
</span>
|
||||
<span ng-show="btx.confirmations>0 && !btx.safeConfirmed">
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
<ion-view id="walletDetails">
|
||||
|
||||
<ion-nav-bar ng-style="{'background-color': wallet.color}">
|
||||
<ion-nav-title>{{wallet.name}}</ion-nav-title>
|
||||
<ion-nav-back-button>
|
||||
|
@ -10,15 +11,94 @@
|
|||
</ion-nav-buttons>
|
||||
</ion-nav-bar>
|
||||
|
||||
<ion-content has-bouncing="false">
|
||||
<div class="bp-content" ng-class="{'status-bar': isCordova && isIOS}">
|
||||
|
||||
<div class="amount-wrapper" ng-show="wallet && wallet.isComplete() && amountIsCollapsible" ng-style="{'background-color':wallet.color}">
|
||||
<div
|
||||
class="amount-bg"
|
||||
ng-style="{'background-color':wallet.color}"
|
||||
ng-class="{collapsible: amountIsCollapsible}"
|
||||
></div>
|
||||
<div
|
||||
ng-style="{'background-color':wallet.color, 'height': amountHeight}"
|
||||
class="amount"
|
||||
ng-class="{collapsible: amountIsCollapsible}"
|
||||
>
|
||||
<div ng-if="!notAuthorized && !updatingStatus">
|
||||
|
||||
<div ng-show="updateStatusError">
|
||||
<a class="button button-outline button-light button-small" ng-click='update()' translate>Tap to retry</a>
|
||||
</div>
|
||||
|
||||
<div ng-show="walletNotRegistered">
|
||||
<span class="size-12 db m10b" translate>This wallet is not registered at the given Bitcore Wallet Service (BWS). You can recreate it from the local information.</span>
|
||||
<a class="button button-outline button-light button-small" ng-click='recreate()' translate>Recreate</a>
|
||||
</div>
|
||||
|
||||
<div ng-show="wallet.walletScanStatus == 'error'" ng-click='retryScan()'>
|
||||
<span translate>Scan status finished with error</span>
|
||||
<br><span translate>Tap to retry</span>
|
||||
</div>
|
||||
|
||||
<div
|
||||
ng-click='updateAll(true)'
|
||||
ng-show="!updateStatusError && wallet.walletScanStatus != 'error' && !wallet.balanceHidden"
|
||||
on-hold="hideToggle()"
|
||||
ng-style="{'transform': amountScale}"
|
||||
class="amount__balance"
|
||||
>
|
||||
<strong ng-if="!status.pendingAmount" class="size-36">{{status.totalBalanceStr}}</strong>
|
||||
<div
|
||||
ng-if="!status.pendingAmount"
|
||||
class="size-14 amount-alternative"
|
||||
ng-if="status.totalBalanceAlternative"
|
||||
ng-style="{opacity: altAmountOpacity}"
|
||||
>
|
||||
{{status.totalBalanceAlternative}} {{status.alternativeIsoCode}}
|
||||
</div>
|
||||
<div class="size-20" ng-if="status.pendingAmount">
|
||||
<div style="margin-bottom:.5rem"><span translate>Available</span>: {{status.totalBalanceStr}}</div>
|
||||
<div><span translate>Confirming</span>: {{status.pendingAmountStr}}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div ng-show="!updateStatusError && wallet.walletScanStatus != 'error' && wallet.balanceHidden" on-hold="hideToggle()">
|
||||
<strong class="size-24" translate>[Balance Hidden]</strong>
|
||||
<div class="size-14" translate>
|
||||
Tap and hold to show
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div ng-if="updatingStatus" class="amount__updating">
|
||||
<div class="size-36">
|
||||
<strong>...</strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="wallet-details-wallet-info" ng-style="{opacity: altAmountOpacity}">
|
||||
<span ng-include="'views/includes/walletInfo.html'"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ion-content ng-style="{'margin-top': contentMargin}" ng-class="{collapsible: amountIsCollapsible}">
|
||||
<ion-refresher
|
||||
ng-if="isAndroid"
|
||||
pulling-icon="ion-ios-refresh"
|
||||
spinner="ios-small"
|
||||
on-refresh="onRefresh()">
|
||||
</ion-refresher>
|
||||
<div class="oh pr" ng-show="wallet && wallet.isComplete()">
|
||||
<div ng-style="{'background-color':wallet.color}" class="amount">
|
||||
|
||||
<div class="amount-wrapper" ng-if="wallet && wallet.isComplete() && !amountIsCollapsible">
|
||||
<div
|
||||
class="amount-bg"
|
||||
ng-style="{'background-color':wallet.color}"
|
||||
></div>
|
||||
<div
|
||||
ng-style="{'background-color':wallet.color}"
|
||||
class="amount"
|
||||
ng-class="{'collapsible': amountIsCollapsible}"
|
||||
>
|
||||
<div ng-if="!updatingStatus">
|
||||
|
||||
<div ng-show="updateStatusError">
|
||||
|
@ -59,7 +139,11 @@
|
|||
</div>
|
||||
</div> <!-- oh -->
|
||||
|
||||
<div class="p60b" ng-show="wallet && wallet.isComplete() && !walletNotRegistered">
|
||||
<a class="wallet-not-backed-up-warning" ng-if="wallet.needsBackup" ui-sref="tabs.wallet.backupWarning({from: 'tabs.wallet'})">
|
||||
Wallet not backed up
|
||||
</a>
|
||||
|
||||
<div class="p60b" ng-if="wallet && wallet.isComplete() && !walletNotRegistered" style="padding-top: 1rem;">
|
||||
<div class="oh pr m20t" ng-show="wallet.incorrectDerivation">
|
||||
<div class="text-center text-warning">
|
||||
<i class="fi-alert"></i>
|
||||
|
@ -69,14 +153,18 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="list" ng-if="txps[0]">
|
||||
<div class="item item-heading" translate>
|
||||
<!-- <div class="item item-heading" translate>
|
||||
<span ng-show="requiresMultipleSignatures" translate>Payment Proposals</span>
|
||||
<span ng-show="!requiresMultipleSignatures" translate>Unsent transactions</span>
|
||||
</div> -->
|
||||
<div class="wallet-details__group-label" style="padding-bottom: 8px;">
|
||||
<span ng-show="requiresMultipleSignatures" translate>Proposals</span>
|
||||
<span ng-show="!requiresMultipleSignatures" translate>Unsent transactions</span>
|
||||
</div>
|
||||
<div ng-repeat="tx in txps" class="item item-icon-left" ng-click="openTxpModal(tx)">
|
||||
<span ng-include="'views/includes/txp.html'"></span>
|
||||
<div ng-repeat="tx in txps" ng-click="openTxpModal(tx)">
|
||||
<a class="wallet-details__item proposal item" ng-include="'views/includes/txp.html'"></a>
|
||||
</div>
|
||||
<div class="item item-footer description" ng-show="status.lockedBalanceSat">
|
||||
<div class="item item-footer description" ng-show="status.lockedBalanceSat" style="background: white;">
|
||||
<span translate>Total Locked Balance</span>:
|
||||
<b>{{status.lockedBalanceStr}} </b>
|
||||
<span> {{status.lockedBalanceAlternative}} {{status.alternativeIsoCode}} </span>
|
||||
|
@ -102,51 +190,74 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="list" ng-show="txHistory[0]">
|
||||
<div class="item" ng-repeat="btx in txHistory track by $index" ng-click="openTxModal(btx)">
|
||||
<span class="item-note text-right">
|
||||
<span class="wallet-details__tx-amount" ng-class="{'wallet-details__tx-amount--recent': btx.recent, 'wallet-details__tx-amount--received': btx.action == 'received', 'wallet-details__tx-amount--sent': btx.action == 'sent'}">
|
||||
<span ng-if="btx.action == 'sent'">–</span>
|
||||
<span class="size-12" ng-if="btx.action == 'invalid'" translate>
|
||||
(possible double spend)
|
||||
</span>
|
||||
<span ng-if="btx.action != 'invalid'">
|
||||
{{btx.amountStr}}
|
||||
</span>
|
||||
<div class="wallet-details__list" ng-show="txHistory[0]">
|
||||
<div ng-repeat="btx in txHistory track by $index" ng-click="openTxModal(btx)">
|
||||
<div class="wallet-details__group-label" ng-if="isFirstInGroup($index)">
|
||||
<span ng-if="isDateInCurrentMonth(getDate(btx.time))">
|
||||
Recent
|
||||
</span>
|
||||
<span ng-if="!isDateInCurrentMonth(getDate(btx.time))">
|
||||
{{getDate(btx.time) | date:'MMMM'}}
|
||||
</span>
|
||||
<p>
|
||||
<time class="wallet-details__tx-time" ng-if="btx.time">{{btx.time * 1000 | amTimeAgo}}</time>
|
||||
<span translate class="text-warning"
|
||||
ng-show="!btx.time && (!btx.confirmations || btx.confirmations == 0)">
|
||||
Unconfirmed
|
||||
</span>
|
||||
</p>
|
||||
</span>
|
||||
<img class="wallet-details__tx-icon" src="img/icon-tx-received.svg" width="40" ng-if="btx.action == 'received'">
|
||||
<img class="wallet-details__tx-icon" src="img/icon-tx-sent.svg" width="40" ng-if="btx.action == 'sent'">
|
||||
<img class="wallet-details__tx-icon" src="img/icon-tx-moved.svg" width="40" ng-if="btx.action == 'moved'">
|
||||
|
||||
<div class="wallet-details__tx-title">
|
||||
<div ng-show="btx.action == 'received'" class="ellipsis">
|
||||
<div ng-if="btx.note.body">{{btx.note.body}}</div>
|
||||
<div ng-if="!btx.note.body" translate> Received</div>
|
||||
</div>
|
||||
|
||||
<div ng-show="btx.action == 'sent'" class="ellipsis">
|
||||
<div ng-if="btx.message">{{btx.message}}</div>
|
||||
<div ng-if="!btx.message && btx.note.body">{{btx.note.body}}</div>
|
||||
<div ng-if="!btx.message && !btx.note.body && addressbook[btx.addressTo]">
|
||||
{{addressbook[btx.addressTo].name || addressbook[btx.addressTo]}}
|
||||
</div>
|
||||
<div ng-if="!btx.message && !btx.note.body && !addressbook[btx.addressTo]" translate>Sent</div>
|
||||
</div>
|
||||
|
||||
<div ng-show="btx.action == 'moved'" class="ellipsis">
|
||||
<div ng-if="btx.note.body">{{btx.note.body}}</div>
|
||||
<div ng-if="!btx.note.body" translate>Moved</div>
|
||||
</div>
|
||||
<span class="label tu warning radius" ng-if="btx.action == 'invalid'" translate>Invalid</span>
|
||||
</div>
|
||||
|
||||
<a class="wallet-details__item item">
|
||||
<img class="wallet-details__tx-icon" src="img/icon-confirming.svg" width="40" ng-if="isUnconfirmed(btx)">
|
||||
<span ng-if="!isUnconfirmed(btx)">
|
||||
<img class="wallet-details__tx-icon" src="img/icon-tx-received-outline.svg" width="40" ng-if="btx.action == 'received'">
|
||||
<img class="wallet-details__tx-icon" src="img/icon-tx-sent-outline.svg" width="40" ng-if="btx.action == 'sent'">
|
||||
<img class="wallet-details__tx-icon" src="img/icon-tx-moved-outline.svg" width="40" ng-if="btx.action == 'moved'">
|
||||
</span>
|
||||
|
||||
<div class="wallet-details__tx-content" ng-class="{'no-border': isLastInGroup($index)}">
|
||||
|
||||
<div class="wallet-details__tx-title" ng-if="!isUnconfirmed(btx)">
|
||||
<div ng-show="btx.action == 'received'" class="ellipsis">
|
||||
<div ng-if="btx.note.body" class="wallet-details__tx-message ellipsis">{{btx.note.body}}</div>
|
||||
<div ng-if="!btx.note.body" class="wallet-details__tx-message ellipsis" translate> Received</div>
|
||||
</div>
|
||||
|
||||
<div ng-show="btx.action == 'sent'" class="ellipsis">
|
||||
<div ng-if="btx.message" class="wallet-details__tx-message ellipsis">{{btx.message}}</div>
|
||||
<div ng-if="!btx.message && btx.note.body" class="wallet-details__tx-message ellipsis">{{btx.note.body}}</div>
|
||||
<div ng-if="!btx.message && !btx.note.body && addressbook[btx.addressTo]" class="wallet-details__tx-message ellipsis">
|
||||
{{addressbook[btx.addressTo].name || addressbook[btx.addressTo]}}
|
||||
</div>
|
||||
<div ng-if="!btx.message && !btx.note.body && !addressbook[btx.addressTo]" translate>Sent</div>
|
||||
</div>
|
||||
|
||||
<div ng-show="btx.action == 'moved'" class="ellipsis">
|
||||
<div ng-if="btx.note.body" class="wallet-details__tx-message ellipsis">{{btx.note.body}}</div>
|
||||
<div ng-if="!btx.note.body" class="wallet-details__tx-message ellipsis" translate>Moved</div>
|
||||
</div>
|
||||
<span class="label tu warning radius" ng-if="btx.action == 'invalid'" translate>Invalid</span>
|
||||
</div>
|
||||
|
||||
<div class="wallet-details__tx-title" ng-if="isUnconfirmed(btx)">
|
||||
<div class="ellipsis" style="color: #B4B4B4;">
|
||||
<span ng-if="btx.action == 'sent' || btx.action == 'moved'">Sending</span>
|
||||
<span ng-if="btx.action == 'received'">Receiving</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<span class="item-note text-right wallet-details__tx-amount">
|
||||
<span class="wallet-details__tx-amount" ng-class="{'wallet-details__tx-amount--recent': btx.recent, 'wallet-details__tx-amount--received': btx.action == 'received', 'wallet-details__tx-amount--sent': btx.action == 'sent'}">
|
||||
<span ng-if="btx.action == 'sent'">–</span>
|
||||
<span class="size-12" ng-if="btx.action == 'invalid'" translate>
|
||||
(possible double spend)
|
||||
</span>
|
||||
<span ng-if="btx.action != 'invalid'">
|
||||
{{btx.amountStr}}
|
||||
</span>
|
||||
</span>
|
||||
<div>
|
||||
<time class="wallet-details__tx-time" ng-if="btx.time && createdWithinPastDay(btx.time)">{{btx.time * 1000 | amTimeAgo}}</time>
|
||||
<time class="wallet-details__tx-time" ng-if="btx.time && !createdWithinPastDay(btx.time)">{{btx.time * 1000 | date:'MMMM d, y'}}</time>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<ion-infinite-scroll
|
||||
|
@ -156,4 +267,5 @@
|
|||
</ion-infinite-scroll>
|
||||
</div>
|
||||
</ion-content>
|
||||
</div>
|
||||
</ion-view>
|
||||
|
|