Merge branch 'ref/design' of https://github.com/bitpay/bitpay-wallet into feature/home_views_polish

# Conflicts:
#	public/views/tab-home.html
This commit is contained in:
Jamal Jackson 2016-09-21 13:18:06 -04:00
commit fda7e641a1
60 changed files with 288 additions and 166 deletions

View file

@ -1,9 +1,8 @@
'use strict';
angular.module('copayApp.controllers').controller('activityController',
function($rootScope, $timeout, $scope, $state, lodash, profileService, walletService, configService, txFormatService, $ionicModal, $log, platformInfo) {
var self = this;
function($timeout, $scope, $log, $ionicModal, lodash, txpModalService, profileService, walletService, ongoingProcess, popupService, gettextCatalog) {
$scope.openTxpModal = txpModalService.open;
$scope.init = function() {
$scope.fetchingNotifications = true;
@ -14,9 +13,57 @@ angular.module('copayApp.controllers').controller('activityController',
}
$scope.fetchingNotifications = false;
$scope.notifications = n;
$timeout(function() {
$scope.$apply();
}, 1);
profileService.getTxps({}, function(err, txps, n) {
if (err) $log.error(err);
$scope.txps = txps;
$timeout(function() {
$scope.$apply();
});
});
});
}
};
$scope.openNotificationModal = function(n) {
if (n.txid) {
openTxModal(n);
} else {
var txp = lodash.find($scope.txps, {
id: n.txpId
});
if (txp) txpModalService.open(txp);
else {
$log.warn('No txp found');
return popupService.showAlert(null, gettextCatalog.getString('Transaction not found'));
}
}
};
var openTxModal = function(n) {
var wallet = profileService.getWallet(n.walletId);
ongoingProcess.set('loadingTxInfo', true);
walletService.getTx(wallet, n.txid, function(err, tx) {
ongoingProcess.set('loadingTxInfo', false);
if (err) {
$log.error(err);
return popupService.showAlert(gettextCatalog.getString('Error'), err);
}
if (!tx) {
$log.warn('No tx found');
return popupService.showAlert(null, gettextCatalog.getString('Transaction not found'));
}
$scope.wallet = wallet;
$scope.btx = lodash.cloneDeep(tx);
$ionicModal.fromTemplateUrl('views/modals/tx-details.html', {
scope: $scope
}).then(function(modal) {
$scope.txDetailsModal = modal;
$scope.txDetailsModal.show();
});
});
};
});

View file

@ -28,9 +28,9 @@ angular.module('copayApp.controllers').controller('buyAmazonController',
};
this.confirm = function() {
var title = gettextCatalog.getString('Confirm Amazon.com Gift Card purchase for ${{amount}} USD', {amount: $scope.fiat});
var message = gettextCatalog.getString('Amazon.com Gift Card purchase for ${{amount}} USD', {amount: $scope.fiat});
var ok = gettextCatalog.getString('Buy');
popupService.showConfirm(title, null, ok, null, function(res) {
popupService.showConfirm(null, message, ok, null, function(res) {
if (res) self.createTx();
});
};

View file

@ -1,20 +1,18 @@
'use strict';
angular.module('copayApp.controllers').controller('txDetailsController', function($log, $timeout, $scope, $filter, $stateParams, lodash, gettextCatalog, profileService, configService, txFormatService, externalLinkService, popupService) {
var self = $scope.self;
var wallet = profileService.getWallet($stateParams.walletId);
angular.module('copayApp.controllers').controller('txDetailsController', function($log, $timeout, $scope, $filter, $stateParams, ongoingProcess, walletService, lodash, gettextCatalog, profileService, configService, txFormatService, externalLinkService, popupService) {
var config = configService.getSync();
var configWallet = config.wallet;
var walletSettings = configWallet.settings;
var wallet;
$scope.title = gettextCatalog.getString('Transaction');
$scope.init = function() {
wallet = $scope.wallet;
$scope.alternativeIsoCode = walletSettings.alternativeIsoCode;
$scope.color = wallet.color;
$scope.copayerId = wallet.credentials.copayerId;
$scope.isShared = wallet.credentials.n > 1;
$scope.btx.amountStr = txFormatService.formatAmount($scope.btx.amount, true) + ' ' + walletSettings.unitName;
$scope.btx.feeStr = txFormatService.formatAmount($scope.btx.fees, true) + ' ' + walletSettings.unitName;
$scope.btx.feeLevel = walletSettings.feeLevel;
if ($scope.btx.action != 'invalid') {
@ -22,7 +20,30 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio
if ($scope.btx.action == 'received') $scope.title = gettextCatalog.getString('Received Funds');
if ($scope.btx.action == 'moved') $scope.title = gettextCatalog.getString('Moved Funds');
}
updateMemo();
initActionList();
getAlternativeAmount();
$timeout(function() {
$scope.$apply();
});
};
function updateMemo() {
wallet.getTxNote({
txid: $scope.btx.txid
}, function(err, note) {
if (err || !note) {
$log.debug(gettextCatalog.getString('Could not fetch transaction note'));
return;
}
$scope.note = note;
$timeout(function() {
$scope.$apply();
});
});
};
function initActionList() {
@ -60,12 +81,12 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio
};
$scope.showCommentPopup = function() {
popupService.showPrompt(gettextCatalog.getString('Memo'), ' ', {}, function(res) {
popupService.showPrompt(gettextCatalog.getString('Memo'), ' ', {}, function(text) {
$log.debug('Saving memo');
var args = {
txid: $scope.btx.txid,
body: res
body: text
};
wallet.editTxNote(args, function(err) {
@ -77,7 +98,7 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio
$scope.btx.note = null;
if (args.body) {
$scope.btx.note = {};
$scope.btx.note.body = res;
$scope.btx.note.body = text;
$scope.btx.note.editedByName = wallet.credentials.copayerName;
$scope.btx.note.editedOn = Math.floor(Date.now() / 1000);
}
@ -85,12 +106,12 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio
$timeout(function() {
$scope.$apply();
}, 200);
});
});
});
};
$scope.getAlternativeAmount = function() {
var getAlternativeAmount = function() {
var satToBtc = 1 / 100000000;
wallet.getFiatRate({
@ -123,5 +144,4 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio
$scope.cancel = function() {
$scope.txDetailsModal.hide();
};
});

View file

@ -1,7 +1,7 @@
'use strict';
angular.module('copayApp.controllers').controller('tabHomeController',
function($rootScope, $timeout, $scope, $state, $stateParams, $ionicScrollDelegate, lodash, profileService, walletService, configService, $log, platformInfo, storageService, txpModalService, $window) {
function($rootScope, $timeout, $scope, $state, $stateParams, $ionicModal, $ionicScrollDelegate, gettextCatalog, lodash, popupService, ongoingProcess, profileService, walletService, configService, $log, platformInfo, storageService, txpModalService, $window) {
$scope.externalServices = {};
$scope.bitpayCardEnabled = true; // TODO
$scope.openTxpModal = txpModalService.open;
@ -16,6 +16,49 @@ angular.module('copayApp.controllers').controller('tabHomeController',
$scope.coinbaseEnabled = config.coinbase.enabled && !isWindowsPhoneApp;
});
$scope.openNotificationModal = function(n) {
if (n.txid) {
openTxModal(n);
} else {
var txp = lodash.find($scope.txps, {
id: n.txpId
});
if (txp) txpModalService.open(txp);
else {
$log.warn('No txp found');
return popupService.showAlert(null, gettextCatalog.getString('Transaction not found'));
}
}
};
var openTxModal = function(n) {
var wallet = profileService.getWallet(n.walletId);
ongoingProcess.set('loadingTxInfo', true);
walletService.getTx(wallet, n.txid, function(err, tx) {
ongoingProcess.set('loadingTxInfo', false);
if (err) {
$log.error(err);
return popupService.showAlert(gettextCatalog.getString('Error'), err);
}
if (!tx) {
$log.warn('No tx found');
return popupService.showAlert(null, gettextCatalog.getString('Transaction not found'));
}
$scope.wallet = wallet;
$scope.btx = lodash.cloneDeep(tx);
$ionicModal.fromTemplateUrl('views/modals/tx-details.html', {
scope: $scope
}).then(function(modal) {
$scope.txDetailsModal = modal;
$scope.txDetailsModal.show();
});
});
};
$scope.openWallet = function(wallet) {
if (!wallet.isComplete()) {
return $state.go('tabs.copayers', {
@ -112,7 +155,9 @@ angular.module('copayApp.controllers').controller('tabHomeController',
$scope.hideHomeTip = function() {
$scope.homeTip = null;
$state.transitionTo($state.current, null, {
reload: false, inherit: false, notify: false
reload: false,
inherit: false,
notify: false
});
};

View file

@ -152,18 +152,13 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
$scope.close = function() {
$scope.searchModal.hide();
}
};
$scope.openTxModal = function(btx) {
var self = this;
$scope.btx = lodash.cloneDeep(btx);
$scope.self = self;
$scope.walletId = wallet.id;
$ionicModal.fromTemplateUrl('views/modals/tx-details.html', {
scope: $scope,
hideDelay: 500
scope: $scope
}).then(function(modal) {
$scope.txDetailsModal = modal;
$scope.txDetailsModal.show();

View file

@ -30,7 +30,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
$ionicConfigProvider.navBar.positionSecondaryButtons('right');
// NAV BACK-BUTTON TEXT/ICON
$ionicConfigProvider.backButton.icon('ion-arrow-left-c').text('');
$ionicConfigProvider.backButton.icon('icon ion-ios-arrow-thin-left').text('');
$ionicConfigProvider.backButton.previousTitleText(false);
$logProvider.debugEnabled(true);
@ -106,7 +106,11 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
.state('starting', {
url: '/starting',
templateUrl: 'views/starting.html'
template: '<ion-view id="starting"><ion-content>{{starting}}</ion-content></ion-view>',
controller: function($scope, $log, gettextCatalog) {
$log.info('Starting...');
$scope.starting = gettextCatalog.getString('Starting...');
}
})
/*

View file

@ -1,7 +1,7 @@
'use strict';
angular.module('copayApp.services')
.factory('logHeader', function($log, platformInfo) {
$log.info('Starting Copay v' + window.version + ' #' + window.commitHash);
.factory('logHeader', function($window, $log, platformInfo) {
$log.info($window.appConfig.nameCase + ' v' + window.version + ' #' + window.commitHash);
$log.info('Client: '+ JSON.stringify(platformInfo) );
return {};
});

View file

@ -32,6 +32,7 @@ angular.module('copayApp.services').factory('ongoingProcess', function($log, $ti
'sweepingWallet': gettext('Sweeping Wallet...'),
'validatingWallet': gettext('Validating wallet integrity...'),
'validatingWords': gettext('Validating recovery phrase...'),
'loadingTxInfo': gettext('Loading transaction info...'),
};
root.clear = function() {

View file

@ -1,6 +1,6 @@
'use strict';
angular.module('copayApp.services').service('popupService', function($log, $ionicPopup, platformInfo) {
angular.module('copayApp.services').service('popupService', function($log, $ionicPopup, platformInfo, gettextCatalog) {
var isCordova = platformInfo.isCordova;
@ -10,7 +10,7 @@ angular.module('copayApp.services').service('popupService', function($log, $ioni
if (!cb) cb = function() {};
$ionicPopup.alert({
title: title,
template: message,
subTitle: message,
okType: 'button-clear button-positive'
}).then(cb);
};
@ -18,7 +18,7 @@ angular.module('copayApp.services').service('popupService', function($log, $ioni
var _ionicConfirm = function(title, message, okText, cancelText, cb) {
$ionicPopup.confirm({
title: title,
template: message,
subTitle: message,
cancelText: cancelText,
cancelType: 'button-clear button-positive',
okText: okText,
@ -53,6 +53,8 @@ angular.module('copayApp.services').service('popupService', function($log, $ioni
if (buttonIndex == 1) 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]);
};
@ -67,8 +69,8 @@ angular.module('copayApp.services').service('popupService', function($log, $ioni
/**
* Show a simple alert popup
*
* @param {String} Title
* @param {String} Message (optional)
* @param {String} Title (optional)
* @param {String} Message
* @param {Callback} Function (optional)
*/
@ -85,10 +87,10 @@ angular.module('copayApp.services').service('popupService', function($log, $ioni
/**
* Show a simple confirm popup
*
* @param {String} Title
* @param {String} Title (optional)
* @param {String} Message
* @param {String} okText
* @param {String} cancelText
* @param {String} okText (optional)
* @param {String} cancelText (optional)
* @param {Callback} Function
* @returns {Callback} OK: true, Cancel: false
*/
@ -105,7 +107,7 @@ angular.module('copayApp.services').service('popupService', function($log, $ioni
/**
* Show a simple prompt popup
*
* @param {String} Title
* @param {String} Title (optional)
* @param {String} Message
* @param {Object} Object{ inputType, inputPlaceholder, defaultText } (optional)
* @param {Callback} Function

View file

@ -822,11 +822,11 @@ angular.module('copayApp.services')
x.action = function() {
// TODO?
$state.go('tabs.details', {
walletId: x.walletId,
txpId: x.txpId,
txid: x.txid,
});
// $state.go('tabs.details', {
// walletId: x.walletId,
// txpId: x.txpId,
// txid: x.txid,
// });
};
});

View file

@ -502,6 +502,32 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
});
};
root.getTx = function(wallet, txid, cb) {
var tx;
if (wallet.completeHistory && wallet.completeHistory.isValid) {
tx = lodash.find(wallet.completeHistory, {
txid: txid
});
finish();
} else {
root.getTxHistory(wallet, {}, function(err, txHistory) {
if (err) return cb(err);
tx = lodash.find(txHistory, {
txid: txid
});
finish();
});
}
function finish() {
if (tx) return cb(null, tx);
else return cb();
};
};
root.getTxHistory = function(wallet, opts, cb) {
opts = opts || {};

View file

@ -5,6 +5,9 @@ $royal: #1e3186;
$soft-blue: rgb(100,124,232);
$base-background-color: #f5f5f5;
/* Ionic Workaround */
ion-nav-bar.hide { display: block !important; }
@import "../../bower_components/ionic/scss/ionic";

View file

@ -955,6 +955,30 @@ input[type=number] {
}
}
/* Starting */
#starting {
background: rgba(30, 49, 134, 1);
background: -moz-linear-gradient(top, rgba(30, 49, 134, 1) 0%, rgba(17, 27, 73, 1) 100%);
background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(30, 49, 134, 1)), color-stop(100%, rgba(17, 27, 73, 1)));
background: -webkit-linear-gradient(top, rgba(30, 49, 134, 1) 0%, rgba(17, 27, 73, 1) 100%);
background: -o-linear-gradient(top, rgba(30, 49, 134, 1) 0%, rgba(17, 27, 73, 1) 100%);
background: -ms-linear-gradient(top, rgba(30, 49, 134, 1) 0%, rgba(17, 27, 73, 1) 100%);
background: linear-gradient(to bottom, rgba(30, 49, 134, 1) 0%, rgba(17, 27, 73, 1) 100%);
color: #fff;
height: 100%;
.scroll-content {
display: table !important;
width: 100% !important;
height: 100% !important;
}
.scroll {
display: table-cell;
vertical-align: middle;
text-align: center;
}
}
@import "ionic";
@import "common";
@import "forms";