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

This commit is contained in:
Jamal Jackson 2016-09-08 10:33:21 -04:00
commit 57c1942740
33 changed files with 566 additions and 591 deletions

View file

@ -13,14 +13,14 @@
], ],
"main": "public/index.html", "main": "public/index.html",
"window": { "window": {
"title": "Copay - A multisignature bitcoin wallet", "title": "*NAMECASE* - *DESCRIPTION*",
"icon": "./public/img/icons/icon-256.png", "icon": "./public/img/icons/icon-256.png",
"toolbar": false, "toolbar": false,
"show": true, "show": true,
"visible": true, "visible": true,
"resizable": true, "resizable": true,
"frame": true, "frame": true,
"width": 800, "width": 400,
"height": 600, "height": 600,
"position": "center", "position": "center",
"fullscreen": false "fullscreen": false
@ -85,7 +85,7 @@
"xcode": "^0.8.2" "xcode": "^0.8.2"
}, },
"scripts": { "scripts": {
"preinstall": "bower install && cd app-template && node apply.js", "preinstall": "bower install && npm i fs-extra && cd app-template && node apply.js",
"postinstall": "npm run build", "postinstall": "npm run build",
"build": "grunt", "build": "grunt",
"start": "node app.js", "start": "node app.js",

View file

@ -5,7 +5,7 @@
"manifest_version": 2, "manifest_version": 2,
"name": "BitPay", "name": "BitPay",
"description": "The BitPay Bitcoin Wallet", "description": "The BitPay Bitcoin Wallet",
"version": "0.8.0", "version": "0.10.0",
"permissions": [ "permissions": [
"storage", "storage",
"unlimitedStorage", "unlimitedStorage",

View file

@ -6,7 +6,7 @@
"name": "bitpay", "name": "bitpay",
"description": "The BitPay Bitcoin Wallet", "description": "The BitPay Bitcoin Wallet",
"author": "BitPay", "author": "BitPay",
"version": "0.8.0", "version": "0.10.0",
"keywords": [ "keywords": [
"wallet", "wallet",
"copay", "copay",
@ -16,14 +16,14 @@
], ],
"main": "public/index.html", "main": "public/index.html",
"window": { "window": {
"title": "Copay - A multisignature bitcoin wallet", "title": "BitPay - The BitPay Bitcoin Wallet",
"icon": "./public/img/icons/icon-256.png", "icon": "./public/img/icons/icon-256.png",
"toolbar": false, "toolbar": false,
"show": true, "show": true,
"visible": true, "visible": true,
"resizable": true, "resizable": true,
"frame": true, "frame": true,
"width": 800, "width": 400,
"height": 600, "height": 600,
"position": "center", "position": "center",
"fullscreen": false "fullscreen": false
@ -88,7 +88,7 @@
"xcode": "^0.8.2" "xcode": "^0.8.2"
}, },
"scripts": { "scripts": {
"preinstall": "bower install && cd app-template && ./apply.js", "preinstall": "bower install && npm i fs-extra && cd app-template && node apply.js",
"postinstall": "npm run build", "postinstall": "npm run build",
"build": "grunt", "build": "grunt",
"start": "node app.js", "start": "node app.js",

View file

@ -1,13 +1,13 @@
<ion-view> <ion-view>
<ion-nav-bar class="bar-royal"> <ion-nav-bar class="bar-royal">
<ion-nav-buttons side="primary"> <ion-nav-buttons side="primary">
<button class="button back-button" ui-sref="tabs.home"> <button class="button button-clear" ui-sref="tabs.home">
<i class="icon ion-ios-arrow-thin-left"></i> Close
</button> </button>
</ion-nav-buttons> </ion-nav-buttons>
<ion-nav-title>BitPay Card</ion-nav-title> <ion-nav-title>BitPay Card</ion-nav-title>
<ion-nav-buttons side="secondary"> <ion-nav-buttons side="secondary">
<button class="button no-border" ui-sref="bitpayCard.preferences"> <button class="button button-clear" ui-sref="bitpayCard.preferences">
<i class="icon ion-gear-b"></i> <i class="icon ion-gear-b"></i>
</button> </button>
</ion-nav-buttons> </ion-nav-buttons>
@ -93,8 +93,8 @@
</div> </div>
<div ng-show="bitpayCard.bitpayCardAuthenticated && !bitpayCard.visaCardActivated && !addFunds"> <div ng-show="bitpayCard.bitpayCardAuthenticated && !bitpayCard.visaCardActivated && !addFunds">
<div class="oh pr"> <div id="bitpayCard" class="oh pr">
<div class="amount" ng-style="{'background-color': '#293C92'}"> <div class="amount">
<div ng-show="!loadingHistory && bitpayCard.bitpayCardCurrentBalance" ng-click="bitpayCard.update()"> <div ng-show="!loadingHistory && bitpayCard.bitpayCardCurrentBalance" ng-click="bitpayCard.update()">
<strong class="size-36">${{bitpayCard.bitpayCardCurrentBalance}}</strong> <strong class="size-36">${{bitpayCard.bitpayCardCurrentBalance}}</strong>
<div class="size-12">Available balance</div> <div class="size-12">Available balance</div>
@ -110,7 +110,7 @@
</div> </div>
</div> </div>
<select ng-model="dateRange" ng-change="bitpayCard.update(dateRange)"> <select class="m10" ng-model="dateRange" ng-change="bitpayCard.update(dateRange)">
<option value="last30Days">Recent Activity</option> <option value="last30Days">Recent Activity</option>
<option value="lastMonth">Last Month</option> <option value="lastMonth">Last Month</option>
<option value="all">All Activity</option> <option value="all">All Activity</option>
@ -127,40 +127,41 @@
<i class="icon ion-android-sync"></i> <i class="icon ion-android-sync"></i>
</div> </div>
<div <div class="card list" ng-show="!loadingHistory">
ng-show="!loadingHistory"
ng-repeat="tx in bitpayCard.bitpayCardTransactionHistory | orderBy: ['pending','-timestamp']"
class="row"
ng-init="bitpayCard.getMerchantInfo(tx)">
<div class="col" ng-init="icon = bitpayCard.getIconName(tx)">
<img class="m5t" ng-src="img/mcc-icons/{{icon}}.svg" width="22">
</div>
<div class="col">
<div class="size-12 text-bold">
{{tx.merchant.name}}
</div>
<div class="size-12">
{{tx.merchant.city}}, {{tx.merchant.state}}
</div>
</div>
<div <div
ng-init="desc = bitpayCard.processDescription(tx)" ng-repeat="tx in bitpayCard.bitpayCardTransactionHistory | orderBy: ['pending','-timestamp']"
class="col"> class="item row"
{{desc}} ng-init="bitpayCard.getMerchantInfo(tx)">
</div> <div class="col" ng-init="icon = bitpayCard.getIconName(tx)">
<div class="col"> <img class="m5t" ng-src="img/mcc-icons/{{icon}}.svg" width="22">
<img ng-show="!tx.pending" ng-src="img/check.svg" width="14"> </div>
<img ng-show="tx.pending" ng-src="img/sync.svg" width="14">
</div> <div class="col">
<div class="col text-right size-12 text-gray"> <div class="size-12 text-bold">
<div class="size-14" {{tx.merchant.name}}
ng-class="{ </div>
'text-success': tx.amount.indexOf('-') == -1 && !tx.pending, <div class="size-12">
'text-gray': tx.amount.indexOf('-') == -1 && tx.pending}"> {{tx.merchant.city}}, {{tx.merchant.state}}
{{tx.amount | currency:'$':2 }} </div>
</div>
<div
ng-init="desc = bitpayCard.processDescription(tx)"
class="col">
{{desc}}
</div>
<div class="col">
<img ng-show="!tx.pending" ng-src="img/check.svg" width="14">
<img ng-show="tx.pending" ng-src="img/sync.svg" width="14">
</div>
<div class="col text-right size-12 text-gray">
<div class="size-14"
ng-class="{
'text-success': tx.amount.indexOf('-') == -1 && !tx.pending,
'text-gray': tx.amount.indexOf('-') == -1 && tx.pending}">
{{tx.amount | currency:'$':2 }}
</div>
<time>{{tx.timestamp | amTimeAgo}}</time>
</div> </div>
<time>{{tx.timestamp | amTimeAgo}}</time>
</div> </div>
</div> </div>
</div> </div>
@ -171,7 +172,7 @@
ng-submit="bitpayCard.sendFunds()" ng-submit="bitpayCard.sendFunds()"
novalidate> novalidate>
<div class="list"> <div class="card list">
<label class="item item-input item-stacked-label"> <label class="item item-input item-stacked-label">
<span class="input-label">Amount</span> <span class="input-label">Amount</span>
<input <input
@ -198,14 +199,14 @@
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<button class="button button-block button-stable" <button class="button button-block button-light"
type="button" type="button"
ng-click="addFunds = false"> ng-click="addFunds = false; fiat = null">
Cancel Cancel
</button> </button>
</div> </div>
<div class="col"> <div class="col">
<button class="button button-block" <button class="button button-block button-positive"
ng-disabled="!fiat" ng-disabled="!fiat"
type="submit"> type="submit">
Send Send

View file

@ -11,7 +11,7 @@
<h1 class="text-center" translate>Share this invitation with your copayers</h1> <h1 class="text-center" translate>Share this invitation with your copayers</h1>
<div ng-click="copySecret()" ng-class="{'enable_text_select': !isCordova}"> <div ng-click="copySecret()" ng-class="{'enable_text_select': !isCordova}">
<div class="text-center"> <div class="text-center" copy-to-clipboard="secret">
<qrcode size="220" error-correction-level="L" data="{{secret}}"></qrcode> <qrcode size="220" error-correction-level="L" data="{{secret}}"></qrcode>
<div ng-show="!secret" style="position:relative; top:-226px; height:0px"> <div ng-show="!secret" style="position:relative; top:-226px; height:0px">
<div style="height:220px; width:220px; margin:auto; background: white"> <div style="height:220px; width:220px; margin:auto; background: white">

View file

@ -1,13 +1,22 @@
<ion-view > <ion-view>
<ion-tabs class="tabs-striped tabs-color-positive tabs-color-active-positive tabs-top"> <ion-nav-bar class="bar-royal">
<ion-nav-title>{{'Export wallet' | translate}}</ion-nav-title>
<ion-nav-back-button>
<i class="icon ion-ios-arrow-thin-left"></i>
</ion-nav-back-button>
</ion-nav-bar>
<ion-tab title="File/Text" ui-sref="tabs.preferences.export.file"> <ion-content ng-controller="exportController" ng-init="file = true; init();">
<ion-nav-view name="tab-export-file"></ion-nav-view> <div class="row text-center">
</ion-tab> <div class="col" ng-click="file = true" ng-style="file && {'border-bottom': '2px solid'}">
<span class="" translate>File/Text</span>
</div>
<div class="col" ng-click="file = false" ng-style="!file && {'border-bottom': '2px solid'}">
<span class="" translate>QR Code</span>
</div>
</div>
<ion-tab title="QR Code" ui-sref="tabs.preferences.export.qrCode"> <div ng-include="'views/tab-export-file.html'" ng-if="file"></div>
<ion-nav-view name="tab-export-qrCode"></ion-nav-view> <div ng-include="'views/tab-export-qrCode.html'" ng-if="!file"></div>
</ion-tab> </ion-content>
</ion-tabs>
</ion-view> </ion-view>

View file

@ -1,11 +1,11 @@
<ion-modal-view> <ion-modal-view>
<ion-header-bar align-title="center" class="tab-bar" ng-style="{'background-color':color}"> <ion-header-bar align-title="center" class="bar-royal" ng-style="{'background-color':color}">
<div class="left-small"> <button class="button button-clear" ng-click="close()">
<a ng-click="close()" class="p10"> Close
<span class="text-close" translate>Close</span> </button>
</a> <div class="title" translate>
Search Transactions
</div> </div>
<h1 class="title ellipsis" translate>Search Transactions</h1>
</ion-header-bar> </ion-header-bar>
<ion-content ng-controller="searchController" ng-init="search = ''"> <ion-content ng-controller="searchController" ng-init="search = ''">
@ -18,14 +18,33 @@
</div> </div>
<div class="list"> <div class="list">
<div class="row item" ng-repeat="btx in txHistorySearchResults track by btx.txid" ng-click="openTxModal(btx)"> <div class="item" ng-repeat="btx in txHistorySearchResults track by btx.txid" ng-click="openTxModal(btx)">
<div class="col col-10">
<img src="img/icon-receive-history.svg" alt="sync" width="40" ng-if="btx.action == 'received'">
<img src="img/icon-sent-history.svg" alt="sync" width="40" ng-if="btx.action == 'sent'">
<img src="img/icon-moved.svg" alt="sync" width="40" ng-if="btx.action == 'moved'">
</div>
<div class="col col-50"> <span class="item-note text-right">
<span class="size-16" ng-class="{'text-bold': btx.recent}">
<span ng-if="btx.action == 'received'">+</span>
<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>
<p>
<time ng-if="btx.time">{{btx.time * 1000 | amTimeAgo}}</time>
<span translate class="text-warning"
ng-show="!btx.time && (!btx.confirmations || btx.confirmations == 0)" translate>
Unconfirmed
</span>
</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'">
<h2>
<div class="padding" ng-if="btx.action == 'received'"> <div class="padding" ng-if="btx.action == 'received'">
<span class="ellipsis"> <span class="ellipsis">
<h2 ng-if="btx.note.body">{{btx.note.body}}</h2> <h2 ng-if="btx.note.body">{{btx.note.body}}</h2>
@ -49,31 +68,8 @@
</span> </span>
</div> </div>
<span class="label tu warning radius" ng-if="btx.action == 'invalid'" translate>Invalid</span> <span class="label tu warning radius" ng-if="btx.action == 'invalid'" translate>Invalid</span>
</div> </h2>
<div class="col col-30 padding">
<span class="size-16" ng-class="{'text-bold': btx.recent}">
<span ng-if="btx.action == 'received'">+</span>
<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>
<p>
<time ng-if="btx.time">{{btx.time * 1000 | amTimeAgo}}</time>
<span translate class="text-warning"
ng-show="!btx.time && (!btx.confirmations || btx.confirmations == 0)" translate>
Unconfirmed
</span>
</p>
</div>
<div class="col col-10 text-center">
<i class="icon ion-chevron-right"></i>
</div>
</div> </div>
<div class="text-gray text-center size-12 p10t" ng-if="txHistoryShowMore"> <div class="text-gray text-center size-12 p10t" ng-if="txHistoryShowMore">
<span class="size-12" translate>{{filteredTxHistory.length - txHistorySearchResults.length}} more</span> <span class="size-12" translate>{{filteredTxHistory.length - txHistorySearchResults.length}} more</span>

View file

@ -1,163 +1,159 @@
<ion-modal-view ng-controller="txDetailsController"> <ion-modal-view ng-controller="txDetailsController">
<ion-header-bar align-title="center" class="tab-bar" ng-style="{'background-color':color}"> <ion-header-bar align-title="center" class="bar-royal" ng-style="{'background-color':color}">
<div class="left-small"> <button class="button button-clear" ng-click="cancel()">
<a ng-click="cancel()" class="p10"> Close
<span class="text-close" translate>Close</span> </button>
</a> <div class="title" translate>
Transaction
</div> </div>
<h1 class="title ellipsis" translate>Transaction</h1>
</ion-header-bar> </ion-header-bar>
<ion-content ng-style="{'background-color': '#F6F7F9'}"> <ion-content>
<div class="modal-content"> <div class="header-modal text-center" ng-init="getAlternativeAmount(btx)">
<div class="header-modal text-center" ng-init="getAlternativeAmount(btx)"> <div ng-show="btx.action != 'invalid'">
<div ng-show="btx.action != 'invalid'"> <div ng-show="btx.action == 'received'">
<div ng-show="btx.action == 'received'"> <img src="img/icon-receive-history.svg" alt="sync" width="50">
<img src="img/icon-receive-history.svg" alt="sync" width="50"> <p class="m0 text-gray size-14" translate>Received</p>
<p class="m0 text-gray size-14" translate>Received</p>
</div>
<div ng-show="btx.action == 'sent'">
<img src="img/icon-sent-history.svg" alt="sync" width="50">
<p class="m0 text-gray size-14" translate>Sent</p>
</div>
<div ng-show="btx.action == 'moved'">
<img src="img/icon-moved.svg" alt="sync" width="50">
<p class="m0 text-gray size-14" translate>Moved</p>
</div>
<div class="size-36" copy-to-clipboard="btx.amountStr">
<span class="enable_text_select">{{btx.amountStr}}</span>
</div>
<div class="alternative-amount" ng-click="showRate=!showRate" ng-init="showRate = false">
<span class="label gray radius" ng-show="!showRate && alternativeAmountStr">
{{alternativeAmountStr}}
</span>
<span class="size-12" ng-show="showRate && alternativeAmountStr">
{{rateStr}} ({{rateDate | amDateFormat:'MM/DD/YYYY HH:mm a'}})
</span>
</div>
</div> </div>
<div ng-show="btx.action == 'invalid'"> <div ng-show="btx.action == 'sent'">
- <img src="img/icon-sent-history.svg" alt="sync" width="50">
<p class="m0 text-gray size-14" translate>Sent</p>
</div>
<div ng-show="btx.action == 'moved'">
<img src="img/icon-moved.svg" alt="sync" width="50">
<p class="m0 text-gray size-14" translate>Moved</p>
</div>
<div class="size-36" copy-to-clipboard="btx.amountStr">
<span class="enable_text_select">{{btx.amountStr}}</span>
</div>
<div class="alternative-amount" ng-click="showRate=!showRate" ng-init="showRate = false">
<span class="label gray radius" ng-show="!showRate && alternativeAmountStr">
{{alternativeAmountStr}}
</span>
<span class="size-12" ng-show="showRate && alternativeAmountStr">
{{rateStr}} ({{rateDate | amDateFormat:'MM/DD/YYYY HH:mm a'}})
</span>
</div> </div>
</div> </div>
<div ng-show="btx.action == 'invalid'">
-
</div>
</div>
<h4 class="title m0" translate>Details</h4> <ul class="list">
<div class="item item-divider" translate>Details</div>
<ul class="no-bullet size-14 m0"> <li ng-if="!btx.hasMultiplesOutputs && btx.addressTo && btx.addressTo != 'N/A'" class="item"
<li ng-if="!btx.hasMultiplesOutputs && btx.addressTo && btx.addressTo != 'N/A'" class="line-b p10 oh" copy-to-clipboard="btx.addressTo">
copy-to-clipboard="btx.addressTo"> <span class="text-gray" translate>To</span>
<span class="text-gray" translate>To</span> <span class="right">
<span class="right"> <span ng-if="btx.merchant">
<span ng-if="btx.merchant"> <span ng-show="btx.merchant.pr.ca"><i class="fi-lock color-greeni"></i> {{btx.merchant.domain}}</span>
<span ng-show="btx.merchant.pr.ca"><i class="fi-lock color-greeni"></i> {{btx.merchant.domain}}</span> <span ng-show="!btx.merchant.pr.ca"><i class="fi-unlock color-yellowi"></i> {{btx.merchant.domain}}</span>
<span ng-show="!btx.merchant.pr.ca"><i class="fi-unlock color-yellowi"></i> {{btx.merchant.domain}}</span>
</span>
<span ng-if="!btx.merchant">
<span ng-show="btx.labelTo">{{btx.labelTo}}</span>
<contact ng-show="!btx.labelTo" class="enable_text_select" address="{{btx.addressTo}}"></contact>
</span>
</span> </span>
</li> <span ng-if="!btx.merchant">
<span ng-show="btx.labelTo">{{btx.labelTo}}</span>
<li ng-show="btx.hasMultiplesOutputs" class="line-b p10 oh" <contact ng-show="!btx.labelTo" class="enable_text_select" address="{{btx.addressTo}}"></contact>
ng-click="showMultiplesOutputs = !showMultiplesOutputs">
<span class="text-gray" translate>Recipients</span>
<span class="right">{{btx.recipientCount}}
<i ng-show="showMultiplesOutputs" class="icon-arrow-up3 size-24"></i>
<i ng-show="!showMultiplesOutputs" class="icon-arrow-down3 size-24"></i>
</span> </span>
</li> </span>
</li>
<div class="line-b" ng-show="btx.hasMultiplesOutputs && showMultiplesOutputs" <li ng-show="btx.hasMultiplesOutputs" class="item"
ng-repeat="output in btx.outputs" ng-click="showMultiplesOutputs = !showMultiplesOutputs">
ng-include="'views/includes/output.html'"> <span class="text-gray" translate>Recipients</span>
</div> <span class="right">{{btx.recipientCount}}
<i ng-show="showMultiplesOutputs" class="icon-arrow-up3 size-24"></i>
<i ng-show="!showMultiplesOutputs" class="icon-arrow-down3 size-24"></i>
</span>
</li>
<li ng-if="btx.action == 'invalid'" class="line-b p10 oh"> <div class="item" ng-show="btx.hasMultiplesOutputs && showMultiplesOutputs"
<span class="right" translate> ng-repeat="output in btx.outputs"
This transaction has become invalid; possibly due to a double spend attempt. ng-include="'views/includes/output.html'">
</span>
</li>
<li ng-if="btx.time" class="line-b p10 oh">
<span class="text-gray" translate>Date</span>
<span class="right enable_text_select">
<time>{{ btx.time * 1000 | amDateFormat:'MM/DD/YYYY HH:mm a'}}</time>
<time>({{ btx.time * 1000 | amTimeAgo}})</time>
</span>
</li>
<li class="line-b p10" ng-show="btx.action != 'received'"
copy-to-clipboard="btx.feeStr">
<span class="text-gray" translate>Fee</span>
<span class="right enable_text_select">{{btx.feeStr}}</span>
</li>
<li class="line-b p10 oh" ng-if="btx.message && btx.action != 'received'"
copy-to-clipboard="btx.message">
<span class="text-gray" translate>Description</span>
<span class="right enable_text_select">{{btx.message}}</span>
</li>
<li ng-if="btx.merchant" class="line-b p10 oh"
copy-to-clipboard="btx.merchant.pr.pd.memo">
<span class="text-gray" translate>Merchant message</span>
<span class="right enable_text_select">
{{btx.merchant.pr.pd.memo}}
</span>
</li>
<li ng-if="btx.time" class="line-b p10 oh">
<span class="text-gray" translate>Confirmations</span>
<span class="right" >
<span class="text-warning" ng-show="!btx.confirmations || btx.confirmations == 0" translate>
Unconfirmed
</span>
<span class="label gray radius" ng-show="btx.confirmations>0 && !btx.safeConfirmed">
{{btx.confirmations}}
</span>
<span class="label gray radius" ng-show="btx.safeConfirmed">
{{btx.safeConfirmed}}
</span>
</span>
</li>
<li class="p10 oh" ng-show="btx.note && btx.note.body">
<span class="text-gray" translate>Comment</span>
<span class="right enable_text_select">{{btx.note.body}}</span><br>
<span class="right text-italic text-gray size-12">
<span translate>Edited by</span> <span>{{btx.note.editedByName}}</span>,
<time>{{btx.note.editedOn * 1000 | amTimeAgo}}</time></span>
</span>
</li>
</ul>
<div ng-if="btx.actions[0] && isShared">
<h4 class="title m0" translate>Participants</h4>
<ul class="no-bullet size-14 m0">
<li class="line-b p10 text-gray" ng-repeat="c in btx.actions">
<i class="icon-contact size-24"></i>
<span class="right">
<i ng-if="c.type == 'reject'" class="fi-x icon-sign x db"></i>
<i ng-if="c.type == 'accept'" class="fi-check icon-sign check db"></i>
</span>
{{c.copayerName}} <span ng-if="c.copayerId == copayerId">({{'Me'|translate}})</span>
</li>
</ul>
</div> </div>
<div ng-show="btx.txid" class="tx-details-blockchain"> <li ng-if="btx.action == 'invalid'" class="item">
<div class="text-center m20t"> <span class="right" translate>
<button class="button button-positive" ng-click="openExternalLink('https://' + This transaction has become invalid; possibly due to a double spend attempt.
(getShortNetworkName() == 'test' ? 'test-' : '') + 'insight.bitpay.com/tx/' + btx.txid)"> </span>
<span class="text-gray" translate>See it on the blockchain</span> </li>
</button>
<button class="button button-positive" ng-click="showCommentPopup()"> <li ng-if="btx.time" class="item">
<span class="text-gray" translate ng-show="!btx.note">Add comment</i></span> <span class="text-gray" translate>Date</span>
<span class="text-gray" translate ng-show="btx.note">Edit comment</span> <span class="right enable_text_select">
</button> <time>{{ btx.time * 1000 | amDateFormat:'MM/DD/YYYY HH:mm a'}}</time>
</div> <time>({{ btx.time * 1000 | amTimeAgo}})</time>
</span>
</li>
<li class="item" ng-show="btx.action != 'received'"
copy-to-clipboard="btx.feeStr">
<span class="text-gray" translate>Fee</span>
<span class="right enable_text_select">{{btx.feeStr}}</span>
</li>
<li class="item" ng-if="btx.message && btx.action != 'received'"
copy-to-clipboard="btx.message">
<span class="text-gray" translate>Description</span>
<span class="right enable_text_select">{{btx.message}}</span>
</li>
<li ng-if="btx.merchant" class="item"
copy-to-clipboard="btx.merchant.pr.pd.memo">
<span class="text-gray" translate>Merchant message</span>
<span class="right enable_text_select">
{{btx.merchant.pr.pd.memo}}
</span>
</li>
<li ng-if="btx.time" class="item">
<span class="text-gray" translate>Confirmations</span>
<span class="right" >
<span class="text-warning" ng-show="!btx.confirmations || btx.confirmations == 0" translate>
Unconfirmed
</span>
<span class="label gray radius" ng-show="btx.confirmations>0 && !btx.safeConfirmed">
{{btx.confirmations}}
</span>
<span class="label gray radius" ng-show="btx.safeConfirmed">
{{btx.safeConfirmed}}
</span>
</span>
</li>
<li class="item" ng-show="btx.note && btx.note.body">
<span class="text-gray" translate>Comment</span>
<span class="right enable_text_select">{{btx.note.body}}</span><br>
<span class="right text-italic text-gray size-12">
<span translate>Edited by</span> <span>{{btx.note.editedByName}}</span>,
<time>{{btx.note.editedOn * 1000 | amTimeAgo}}</time></span>
</span>
</li>
</ul>
<div class="list" ng-if="btx.actions[0] && isShared">
<div class="item item-divider" translate>Participants</div>
<div class="item" ng-repeat="c in btx.actions">
<span class="item-note">
<i ng-if="c.type == 'reject'" class="fi-x icon-sign x db"></i>
<i ng-if="c.type == 'accept'" class="fi-check icon-sign check db"></i>
</span>
{{c.copayerName}} <span ng-if="c.copayerId == copayerId">({{'Me'|translate}})</span>
</div>
</div>
<div ng-show="btx.txid" class="row">
<div class="col">
<button class="button button-block button-positive" ng-click="openExternalLink('https://' +
(getShortNetworkName() == 'test' ? 'test-' : '') + 'insight.bitpay.com/tx/' + btx.txid)">
<span class="text-gray" translate>See it on the blockchain</span>
</button>
</div>
<div class="col">
<button class="button button-block button-positive" ng-click="showCommentPopup()">
<span class="text-gray" translate ng-show="!btx.note">Add comment</i></span>
<span class="text-gray" translate ng-show="btx.note">Edit comment</span>
</button>
</div> </div>
</div> </div>
</ion-content> </ion-content>

View file

@ -8,7 +8,7 @@
<span translate>Sent</span> <span translate>Sent</span>
</div> </div>
<div class="text-center m20t"> <div class="text-center m20t">
<a class="button" ng-click="cancel()" translate>OKAY</a> <a class="button button-positive" ng-click="cancel()" translate>OKAY</a>
</div> </div>
</div> </div>
@ -19,7 +19,7 @@
<span translate>Payment Proposal Created</span> <span translate>Payment Proposal Created</span>
</div> </div>
<div class="text-center"> <div class="text-center">
<a class="button" ng-click="cancel()" translate>OKAY</a> <a class="button button-positive" ng-click="cancel()" translate>OKAY</a>
</div> </div>
</div> </div>
@ -31,7 +31,7 @@
<span translate>Payment Accepted</span> <span translate>Payment Accepted</span>
</div> </div>
<div class="text-center"> <div class="text-center">
<a class="button" ng-click="cancel()" translate>OKAY</a> <a class="button button-positive" ng-click="cancel()" translate>OKAY</a>
</div> </div>
</div> </div>
@ -41,7 +41,7 @@
<span translate>Payment Rejected</span> <span translate>Payment Rejected</span>
</div> </div>
<div class="text-center"> <div class="text-center">
<a class="button" ng-click="cancel()" translate>OKAY</a> <a class="button button-positive" ng-click="cancel()" translate>OKAY</a>
</div> </div>
</div> </div>
</ion-modal-view> </ion-modal-view>

View file

@ -1,118 +1,102 @@
<ion-modal-view ng-controller="txpDetailsController"> <ion-modal-view ng-controller="txpDetailsController">
<ion-header-bar align-title="center" class="tab-bar"> <ion-header-bar align-title="center" class="bar-royal" ng-style="{'background-color':color}">
<div class="left-small"> <button class="button button-clear" ng-click="close()">
<a ng-click="close()" class="p10"> Close
<span class="text-close" translate>Close</span> </button>
</a> <div class="title" translate>
Payment Proposal
</div> </div>
<h1 class="title ellipsis" translate>Payment Proposal</h1>
</ion-header-bar> </ion-header-bar>
<ion-content ng-style="{'background-color': '#F6F7F9'}" ng-init="updateCopayerList()"> <ion-content ng-init="updateCopayerList()">
<div class="list card">
<ul>
<li class="item" >
<div class="payment-proposal-head" ng-style="{'background-color':color}"> <div class="payment-proposal-head" ng-style="{'background-color':color}">
<div class="size-36">{{tx.amountStr}}</div> <div class="size-36">{{tx.amountStr}}</div>
<div class="size-14 text-light" ng-show="tx.alternativeAmountStr">{{tx.alternativeAmountStr}}</div> <div class="size-14 text-light" ng-show="tx.alternativeAmountStr">{{tx.alternativeAmountStr}}</div>
<i class="db fi-arrow-down size-24 m10v"></i> <i class="icon ion-ios-arrow-thin-down"></i>
<span class="payment-proposal-to" copy-to-clipboard="tx.toAddress"> <span class="payment-proposal-to" copy-to-clipboard="tx.toAddress">
<i class="fi-bitcoin left"></i>
<contact ng-if="!tx.hasMultiplesOutputs" class="dib enable_text_select ellipsis m5t m5b size-14" address="{{tx.toAddress}}"></contact> <contact ng-if="!tx.hasMultiplesOutputs" class="dib enable_text_select ellipsis m5t m5b size-14" address="{{tx.toAddress}}"></contact>
<span ng-if="tx.hasMultiplesOutputs" translate>Multiple recipients</span> <span ng-if="tx.hasMultiplesOutputs" translate>Multiple recipients</span>
</span> </span>
</div> </div>
</li>
<li class="item">
<div class="row" ng-if="tx.removed"> <div class="row" ng-if="tx.removed">
<div class="column m20t text-center text-warning size-12" translate> <div class="column m20t text-center text-warning size-12" translate>
The payment was removed by creator The payment was removed by creator
</div>
</div> </div>
</li> </div>
<li class="item">
<div class="button-bar" ng-if="tx.pendingForUs"> <div class="button-bar" ng-if="tx.pendingForUs">
<button class="button button-assertive button-block" ng-click="reject()" ng-disabled="loading" ng-show="isShared"> <button class="button button-assertive button-block" ng-click="reject()" ng-disabled="loading" ng-show="isShared">
<i class="fi-x"></i> <i class="fi-x"></i>
<span translate>Reject</span> <span translate>Reject</span>
</button> </button>
<button class="button button-balanced button-block" ng-click="sign()" ng-style="{'background-color':color}" ng-disabled="loading || paymentExpired" ng-show="canSign"> <button class="button button-balanced button-block" ng-click="sign()" ng-style="{'background-color':color}" ng-disabled="loading || paymentExpired" ng-show="canSign">
<i class="fi-check"></i> <i class="fi-check"></i>
<span translate>Accept</span> <span translate>Accept</span>
</button>
</div>
<div ng-show="tx.status != 'pending'">
<div ng-show="tx.status=='accepted' && !tx.isGlidera">
<div class="m10b" translate>Payment accepted, but not yet broadcasted</div>
<button class="button button-balanced button-block" ng-style="{'background-color':color}" ng-click="broadcast(tx)" ng-disabled="loading">
<i class="fi-upload-cloud"></i>
<span translate>Broadcast Payment</span>
</button> </button>
</div> </div>
<div ng-show="tx.status=='accepted' && tx.isGlidera" >
</li> <div class="m10h" translate>Payment accepted. It will be broadcasted by Glidera. In case there is a problem, it can be deleted 6 hours after it was created.</div>
<li class="item">
<div ng-show="tx.status != 'pending'">
<div ng-show="tx.status=='accepted' && !tx.isGlidera">
<div class="m10b" translate>Payment accepted, but not yet broadcasted</div>
<button class="button button-balanced button-block" ng-style="{'background-color':color}" ng-click="broadcast(tx)" ng-disabled="loading">
<i class="fi-upload-cloud"></i>
<span translate>Broadcast Payment</span>
</button>
</div>
<div ng-show="tx.status=='accepted' && tx.isGlidera" >
<div class="m10h" translate>Payment accepted. It will be broadcasted by Glidera. In case there is a problem, it can be deleted 6 hours after it was created.</div>
</div>
<div class="balanced" ng-show="tx.status == 'broadcasted'" translate>Payment Sent</div>
<div class="assertive" ng-show="tx.status=='rejected'" translate>Payment Rejected</div>
</div> </div>
</li> <div class="balanced" ng-show="tx.status == 'broadcasted'" translate>Payment Sent</div>
<li class="item"> <div class="assertive" ng-show="tx.status=='rejected'" translate>Payment Rejected</div>
<h4 class="title m0" translate>Details</h4> </div>
<ul class="no-bullet size-14 m0"> <ul class="list">
<li class="line-b p10 oh" ng-show="tx.message"> <div class="item item-divider" translate>Details</div>
<li class="item" ng-show="tx.message">
<span class="text-gray" translate>Description</span> <span class="text-gray" translate>Description</span>
<span class="right">{{tx.message}}</span> <span class="right">{{tx.message}}</span>
</li> </li>
<li ng-show="tx.hasMultiplesOutputs" class="line-b p10 oh" ng-click="showMultiplesOutputs = !showMultiplesOutputs"> <li ng-show="tx.hasMultiplesOutputs" class="item" ng-click="showMultiplesOutputs = !showMultiplesOutputs">
<span class="text-gray" translate>Recipients</span> <span class="text-gray" translate>Recipients</span>
<span class="right">{{tx.recipientCount}} <span class="right">{{tx.recipientCount}}
<i ng-show="showMultiplesOutputs" class="icon-arrow-up3 size-24"></i> <i ng-show="showMultiplesOutputs" class="icon ion-ios-arrow-up"></i>
<i ng-show="!showMultiplesOutputs" class="icon-arrow-down3 size-24"></i> <i ng-show="!showMultiplesOutputs" class="icon ion-ios-arrow-up"></i>
</span> </span>
</li> </li>
<div class="line-b" ng-show="tx.hasMultiplesOutputs && showMultiplesOutputs" <div class="item" ng-show="tx.hasMultiplesOutputs && showMultiplesOutputs"
ng-repeat="output in tx.outputs" ng-include="'views/includes/output.html'"> ng-repeat="output in tx.outputs" ng-include="'views/includes/output.html'">
</div> </div>
<li class="line-b p10"> <li class="item">
<span class="text-gray" translate>Fee</span> <span class="text-gray" translate>Fee</span>
<span class="right">{{tx.feeStr}}</span> <span class="right">{{tx.feeStr}}</span>
</li> </li>
<li class="line-b p10"> <li class="item">
<span class="text-gray" translate>Time</span> <span class="text-gray" translate>Time</span>
<span class="right"> <span class="right">
<time>{{ (tx.ts || tx.createdOn ) * 1000 | amTimeAgo}}</time> <time>{{ (tx.ts || tx.createdOn ) * 1000 | amTimeAgo}}</time>
</span> </span>
</li> </li>
<li class="line-b p10 oh"> <li class="item">
<span class="text-gray" translate>Created by</span> <span class="text-gray" translate>Created by</span>
<span class="right">{{tx.creatorName}}</span> <span class="right">{{tx.creatorName}}</span>
</li> </li>
</ul>
<div class="p10 text-center size-12" ng-show="!currentSpendUnconfirmed && tx.hasUnconfirmedInputs"> <div class="item" ng-show="!currentSpendUnconfirmed && tx.hasUnconfirmedInputs">
<span class="text-warning" translate>Warning: this transaction has unconfirmed inputs</span> <span class="text-warning" translate>Warning: this transaction has unconfirmed inputs</span>
</div> </div>
</li>
<li class="item">
<div ng-if="tx.paypro"> <div ng-if="tx.paypro">
<h4 class="title m0" translate>Payment details</h4> <div class="item item-divider" translate>Payment details</div>
<ul class="no-bullet size-14 m0"> <li class="item">
<li class="line-b p10">
<span class="text-gray" translate>To</span> <span class="text-gray" translate>To</span>
<span class="right"> <span class="right">
<span> <span>
@ -122,56 +106,48 @@
<contact address="{{tx.toAddress}}" ng-hide="tx.merchant"></contact> <contact address="{{tx.toAddress}}" ng-hide="tx.merchant"></contact>
</span> </span>
</li> </li>
<li class="line-b p10" ng-if="paymentExpired"> <li class="item" ng-if="paymentExpired">
<span class="text-gray" translate>Expired</span> <span class="text-gray" translate>Expired</span>
<span class="right text-alert"> <span class="right text-alert">
<time>{{tx.paypro.expires * 1000 | amTimeAgo }}</time> <time>{{tx.paypro.expires * 1000 | amTimeAgo }}</time>
</span> </span>
</li> </li>
<li class="line-b p10" ng-if="!paymentExpired"> <li class="item" ng-if="!paymentExpired">
<span class="text-gray" translate>Expires</span> <span class="text-gray" translate>Expires</span>
<span class="right"> <span class="right">
<time>{{expires}}</time> <time>{{expires}}</time>
</span> </span>
</li> </li>
<li class="line-b p10"> <li class="item">
<span class="text-gray" translate>Merchant Message</span> <span class="text-gray" translate>Merchant Message</span>
<span class="db">{{tx.paypro.pr.pd.memo}}</span> <span class="db">{{tx.paypro.pr.pd.memo}}</span>
</li> </li>
</ul> </div>
</div>
</li> <div ng-if="tx.actions[0] && !txRejected && !txBroadcasted">
<li class="item" ng-if="tx.actions[0] && !txRejected && !txBroadcasted"> <div class="item item-divider">
<h4 class="title m0"> <div class="right size-12 text-gray m10r">
<div class="right size-12 text-gray m10r"> {{tx.requiredSignatures}}/{{tx.walletN}}
{{tx.requiredSignatures}}/{{tx.walletN}} </div>
<span translate>Participants</span>
</div> </div>
<span translate>Participants</span> <li class="item" ng-repeat="ac in tx.actions">
</h4> <span class="item-note">
<ul class="no-bullet size-14 m0"> <i ng-if="ac.type == 'reject'" class="icon ion-ios-close-empty"></i>
<li class="line-b p10 text-gray" ng-repeat="ac in tx.actions"> <i ng-if="ac.type == 'accept'" class="icon ion-ios-checkmark-empty"></i>
<i class="icon-contact size-24"></i>
<span class="right">
<i ng-if="ac.type == 'reject'" class="fi-x icon-sign x db"></i>
<i ng-if="ac.type == 'accept'" class="fi-check icon-sign check db"></i>
</span> </span>
{{ac.copayerName}} <span ng-if="ac.copayerId == copayerId">({{'Me'|translate}})</span> {{ac.copayerName}} <span ng-if="ac.copayerId == copayerId">({{'Me'|translate}})</span>
</li> </li>
</ul>
</div>
</li>
<li class="item" ng-if="tx.canBeRemoved || (tx.status == 'accepted' && !tx.broadcastedOn)">
<div class="text-gray size-12 m20b" ng-show="!tx.isGlidera && isShared" translate>
* A payment proposal can be deleted if 1) you are the creator, and no other copayer has signed, or 2) 24 hours have passed since the proposal was created.
</div> </div>
<button class="button button-assertive button-block" ng-click="remove()" ng-disabled="loading"> </ul>
<i class="fi-trash size-14 m5r"></i> <div class="m20t" ng-if="tx.canBeRemoved || (tx.status == 'accepted' && !tx.broadcastedOn)">
<span translate>Delete Payment Proposal</span> <div class="size-12 padding" ng-show="!tx.isGlidera && isShared" translate>
</button> * A payment proposal can be deleted if 1) you are the creator, and no other copayer has signed, or 2) 24 hours have passed since the proposal was created.
</li> </div>
</ul> <button class="button button-assertive button-block" ng-click="remove()" ng-disabled="loading">
<i class="fi-trash size-14 m5r"></i>
<span translate>Delete Payment Proposal</span>
</button>
</div> </div>
</ion-content> </ion-content>
</ion-modal-view> </ion-modal-view>

View file

@ -16,11 +16,9 @@
<input type="email" id="email" name="email" ng-model="email" required></input> <input type="email" id="email" name="email" ng-model="email" required></input>
</label> </label>
</form> </form>
<div class="text-center"> <button class="button button-block button-positive button-clear" ng-click="onboardingMailSkip()">
<button class="button button-back no-border" ng-click="onboardingMailSkip()"> {{'Skip' | translate}}
{{'Skip' | translate}} </button>
</button>
</div>
</div> </div>
<div class="overlay"></div> <div class="overlay"></div>
</ion-content> </ion-content>

View file

@ -17,7 +17,7 @@
<span translate>Sweep paper wallet</span> <span translate>Sweep paper wallet</span>
<i class="icon nav-item-arrow-right"></i> <i class="icon nav-item-arrow-right"></i>
</a> </a>
<a class="item item-icon-right" ui-sref="tabs.preferences.export.file"> <a class="item item-icon-right" ui-sref="tabs.preferences.export">
<span translate>Export Wallet</span> <span translate>Export Wallet</span>
<i class="icon nav-item-arrow-right"></i> <i class="icon nav-item-arrow-right"></i>
</a> </a>

View file

@ -8,9 +8,9 @@
<ion-nav-title>Preferences</ion-nav-title> <ion-nav-title>Preferences</ion-nav-title>
</ion-nav-bar> </ion-nav-bar>
<ion-content ng-controller="preferencesBitpayCardController as bitpay"> <ion-content ng-controller="preferencesBitpayCardController">
<ul class="list"> <ul class="list">
<li class="item assertive" ng-click="bitpay.logout()"> <li class="item assertive" ng-click="logout()">
Log out Log out
</li> </li>
</ul> </ul>

View file

@ -1,104 +1,93 @@
<ion-view> <div ng-show="!backupWalletPlainText">
<ion-nav-bar class="bar-royal"> <div class="size-14" ng-show="error">
<ion-nav-title>{{'Export Wallet' | translate}}</ion-nav-title> <i class="ion-alert-circled"></i>
<ion-nav-buttons side="primary"> <span translate>Failed to export</span>
<button class="button back-button" ui-sref="tabs.preferences.preferencesAdvanced"> </div>
<i class="icon ion-ios-arrow-thin-left"></i>
</button>
</ion-nav-buttons>
</ion-nav-bar>
<ion-content ng-controller="exportController" ng-init="init()" cache-view="true"> <form name="exportForm" novalidate>
<div class="card">
<label class="item item-input item-stacked-label">
<span class="input-label" transalate>Set up a password</span>
<input type="password" placeholder="{{'Your password'|translate}}" ng-model="formData.password">
</label>
<div ng-show="!backupWalletPlainText"> <label class="item item-input item-stacked-label">
<div class="size-14" ng-show="error"> <span class="input-label" transalate>Repeat the password</span>
<i class="ion-alert-circled"></i> <input type="password" placeholder="{{'Repeat password'|translate}}" ng-model="formData.repeatpassword">
<span translate>Failed to export</span> </label>
</div>
<form name="exportForm" novalidate>
<label class="item item-input item-stacked-label">
<span class="input-label" transalate>Set up a password</span>
<input type="password" placeholder="{{'Your password'|translate}}" name="password" ng-model="password">
</label>
<label class="item item-input item-stacked-label">
<span class="input-label" transalate>Repeat the password</span>
<input type="password" class="form-control" placeholder="{{'Repeat password'|translate}}" name="password" ng-model="repeatpassword">
</label>
</form>
<ion-toggle ng-show="canSign" ng-model="showAdvanced" toggle-class="toggle-balanced">
<span translate ng-show="!showAdvanced">Show advanced options</span>
<span translate ng-show="showAdvanced">Hide advanced options</span>
</ion-toggle>
<ion-toggle ng-model="noSignEnabled" ng-show="showAdvanced" toggle-class="toggle-balanced" class="r0" ng-change="noSignEnabledChange()">
<span class="toggle-label" translate>Do not include private key</span>
</ion-toggle>
<div class="box-notification" ng-show="!canSign">
<span class="size-14">
<i class="ion-alert-circled"></i>
<span translate>
WARNING: The private key of this wallet is not available. The export allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so <b>funds will not be accessible from the export</b>.
</span>
</span>
</div>
<div class="box-notification" ng-show="noSignEnabled">
<span class="size-14">
<i class="ion-alert-circled"></i>
<span translate>
WARNING: Not including the private key allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so <b>funds will not be accessible from the export</b>.
</span>
</span>
</div>
<button
ng-click="downloadWalletBackup()"
class="button button-block button-positive"
ng-disabled="(!password || password != repeatpassword)"
ng-style="{'background-color':wallet.color}"
ng-show="!isSafari && !isCordova">
<i class="fi-download"></i>
<span translate>Download</span>
</button>
<button
ng-click="viewWalletBackup()"
class="button button-block button-positive"
ng-disabled="(!password || password != repeatpassword)"
ng-style="{'background-color':wallet.color}"
ng-show="isSafari && !isCordova">
<i class="fi-eye"></i>
<span translate>View</span>
</button>
<div ng-show="isCordova">
<h4 translate>Export options</h4>
<button class="button button-block button-positive"
ng-disabled="(!password || password != repeatpassword)"
ng-style="{'background-color':wallet.color}"
ng-click="copyWalletBackup()">
<i class="fi-clipboard-pencil"></i>
<span translate>Copy to clipboard</span></button>
<button class="button button-block button-positive" ng-disabled="(!password || password != repeatpassword)"
ng-style="{'background-color':wallet.color}"
ng-click="sendWalletBackup()"><i class="fi-mail"></i>
<span translate>Send by email</span></button>
</div>
</div> </div>
</form>
<div class="row" ng-show="backupWalletPlainText"> <ion-toggle ng-show="canSign" ng-model="formData.showAdvanced" toggle-class="toggle-balanced">
<div class="large-12 columns"> <span translate ng-show="!formData.showAdvanced">Show advanced options</span>
<h3 translate>Wallet Export</h3> <span translate ng-show="formData.showAdvanced">Hide advanced options</span>
<div class="input"> </ion-toggle>
<textarea rows="12">{{backupWalletPlainText}}</textarea>
</div> <div class="card" ng-show="formData.showAdvanced">
<div class="size-12 text-gray text-right"> <ion-checkbox ng-model="formData.noSignEnabled" class="checkbox-balanced" ng-change="noSignEnabledChange()">
<i class="icon-compose"></i> <span class="toggle-label" translate>Do not include private key</span>
<span translate>Copy this text as it is to a safe place (notepad or email)</span> </ion-checkbox>
</div> </div>
</div>
</div> <div class="box-notification error" ng-show="!canSign">
</ion-content> <span class="size-14">
</ion-view> <i class="ion-alert-circled"></i>
<span translate>
WARNING: The private key of this wallet is not available. The export allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so <b>funds will not be accessible from the export</b>.
</span>
</span>
</div>
<div class="box-notification error" ng-show="formData.noSignEnabled">
<span class="size-14">
<i class="ion-alert-circled"></i>
<span translate>
WARNING: Not including the private key allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so <b>funds will not be accessible from the export</b>.
</span>
</span>
</div>
<button
ng-click="downloadWalletBackup()"
class="button button-block button-positive"
ng-disabled="(!formData.password || formData.password != formData.repeatpassword)"
ng-style="{'background-color':wallet.color}"
ng-show="!isSafari && !isCordova">
<i class="fi-download"></i>
<span translate>Download</span>
</button>
<button
ng-click="viewWalletBackup()"
class="button button-block button-positive"
ng-disabled="(!formData.password || formData.password != formData.repeatpassword)"
ng-style="{'background-color':wallet.color}"
ng-show="isSafari && !isCordova">
<i class="fi-eye"></i>
<span translate>View</span>
</button>
<div ng-show="isCordova">
<h4 translate>Export options</h4>
<button class="button button-block button-positive"
ng-disabled="(!formData.password || formData.password != formData.repeatpassword)"
ng-style="{'background-color':wallet.color}"
ng-click="copyWalletBackup()">
<i class="fi-clipboard-pencil"></i>
<span translate>Copy to clipboard</span></button>
<button class="button button-block button-positive" ng-disabled="(!formData.password || formData.password != formData.repeatpassword)"
ng-style="{'background-color':wallet.color}"
ng-click="sendWalletBackup()"><i class="fi-mail"></i>
<span translate>Send by email</span></button>
</div>
</div>
<div ng-show="backupWalletPlainText" class="text-center card">
<label class="item item-input item-stacked-label">
<textarea rows="12">{{backupWalletPlainText}}</textarea>
</label>
<div class="item text-gray item-icon-left">
<i class="icon ion-compose"></i>
<p translate>Copy this text as it is to a safe place (notepad or email)</p>
</div>
</div>

View file

@ -1,25 +1,10 @@
<ion-view> <div class="m20t text-gray" ng-show="formData.supported">
<ion-nav-bar class="bar-royal"> <div class="text-center m20b">
<ion-nav-title>{{'Export Wallet' | translate}}</ion-nav-title> <qrcode size="220" version="8" error-correction-level="M" data="{{formData.exportWalletInfo}}"></qrcode>
<ion-nav-buttons side="primary"> </div>
<button class="button back-button" ui-sref="tabs.preferences.preferencesAdvanced"> <div class="text-center size-12 m10" translate>From the destination device, go to Add wallet &gt; Import wallet and scan this QR code</div>
<i class="icon ion-ios-arrow-thin-left"></i> </div>
</button>
</ion-nav-buttons>
</ion-nav-bar>
<ion-content ng-controller="exportController" ng-init="init()"> <div class="m20t text-gray" ng-show="!formData.supported">
<div class="text-center size-12 m10" translate>Exporting via QR not supported for this wallet</div>
<div class="m20t text-gray" ng-show="supported"> </div>
<div class="text-center m20b">
<qrcode size="220" version="8" error-correction-level="M" data="{{exportWalletInfo}}"></qrcode>
</div>
<div class="text-center size-12 m10" translate>From the destination device, go to Add wallet &gt; Import wallet and scan this QR code</div>
</div>
<div class="m20t text-gray" ng-show="!supported">
<div class="text-center size-12 m10" translate>Exporting via QR not supported for this wallet</div>
</div>
</ion-content>
</ion-view>

View file

@ -19,7 +19,7 @@
</a> </a>
</div> </div>
<div class="list card"> <div class="list card" ng-if="notifications[0]">
<a class="item item-icon-right item-heading" ui-sref="tabs.activity" translate> <a class="item item-icon-right item-heading" ui-sref="tabs.activity" translate>
Recent Activity Recent Activity
<i class="icon nav-item-arrow-right"></i> <i class="icon nav-item-arrow-right"></i>
@ -28,7 +28,7 @@
<ion-spinner icon="lines"></ion-spinner> <ion-spinner icon="lines"></ion-spinner>
<div translate>Updating activity. Please stand by</div> <div translate>Updating activity. Please stand by</div>
</span> </span>
<a ng-if="notifications[0]" class="item" ng-repeat="x in notifications" ng-click="x.action()"> <a class="item" ng-repeat="x in notifications" ng-click="x.action()">
<span ng-include="'views/includes/walletActivity.html'"></span> <span ng-include="'views/includes/walletActivity.html'"></span>
</a> </a>
</div> </div>

View file

@ -6,10 +6,9 @@
<ion-content ng-controller="tabSettingsController" ng-init="init()"> <ion-content ng-controller="tabSettingsController" ng-init="init()">
<div class="list"> <div class="list">
<div class="item item-divider"></div> <div class="item item-divider"></div>
<a class="item item-icon-left item-icon-right" ng-click="openAddressbookModal()"> <a class="item item-icon-left" ng-click="openAddressbookModal()">
<i class="icon ion-ios-book-outline"></i> <i class="icon ion-ios-book-outline"></i>
<span translate>Address Book</span> <span translate>Address Book</span>
<i class="icon nav-item-arrow-right"></i>
</a> </a>
<div class="item item-divider" translate>Preferences</div> <div class="item item-divider" translate>Preferences</div>

View file

@ -84,29 +84,23 @@
</div> </div>
<div ng-if="txps[0]"> <div class="card list" ng-if="txps[0]">
<h4 ng-show="requiresMultipleSignatures" class="title m0" translate>Payment Proposals</h4> <div class="item item-heading" translate>
<h4 ng-show="!requiresMultipleSignatures" class="title m0" translate>Unsent transactions</h4> <span ng-show="requiresMultipleSignatures" translate>Payment Proposals</span>
<div class="list card"> <span ng-show="!requiresMultipleSignatures" translate>Unsent transactions</span>
<ul> </div>
<li ng-repeat="tx in txps" class="item item-icon-left" ng-click="openTxpModal(tx)"> <div ng-repeat="tx in txps" class="item item-icon-left" ng-click="openTxpModal(tx)">
<span ng-include="'views/includes/txp.html'"></span> <span ng-include="'views/includes/txp.html'"></span>
</li> </div>
</ul> <div class="item item-footer" ng-show="status.lockedBalanceSat">
<span translate>Total Locked Balance</span>:
<div ng-show="lockedBalanceSat"> <b>{{status.lockedBalanceStr}} </b>
<span translate>Total Locked Balance</span>: <span> {{status.lockedBalanceAlternative}} {{status.alternativeIsoCode}} </span>
<b>{{lockedBalanceStr}} </b>
<span> {{lockedBalanceAlternative}} {{alternativeIsoCode}} </span>
</div>
</div> </div>
</div> </div>
<!-- Transactions --> <!-- Transactions -->
<h4 class="title" ng-show="!notAuthorized">
<span translate>Activity</span>
</h4>
<div class="oh pr m20t text-gray size-12 text-center" <div class="oh pr m20t text-gray size-12 text-center"
ng-show="!txHistory[0] && !updatingTxHistory && !txHistoryError && !updateStatusError && !notAuthorized" ng-show="!txHistory[0] && !updatingTxHistory && !txHistoryError && !updateStatusError && !notAuthorized"
@ -139,41 +133,9 @@
</div> </div>
</div> </div>
<div class="list"> <div class="card list" ng-show="txHistory[0]">
<div class="row item" ng-repeat="btx in txHistory track by btx.txid" ng-click="openTxModal(btx)"> <div class="item" ng-repeat="btx in txHistory track by btx.txid" ng-click="openTxModal(btx)">
<div class="col col-10"> <span class="item-note text-right">
<img src="img/icon-receive-history.svg" alt="sync" width="40" ng-if="btx.action == 'received'">
<img src="img/icon-sent-history.svg" alt="sync" width="40" ng-if="btx.action == 'sent'">
<img src="img/icon-moved.svg" alt="sync" width="40" ng-if="btx.action == 'moved'">
</div>
<div class="col col-50">
<div class="padding" ng-if="btx.action == 'received'">
<span class="ellipsis">
<h2 ng-if="btx.note.body">{{btx.note.body}}</h2>
<h2 ng-if="!btx.note.body" translate> Received</h2>
</span>
</div>
<div class="padding" ng-if="btx.action == 'sent'">
<span class="ellipsis">
<h2 ng-if="btx.message">{{btx.message}}</h2>
<h2 ng-if="!btx.message && btx.note.body">{{btx.note.body}}</h2>
<h2 ng-if="!btx.message && !btx.note.body && wallet.addressbook[btx.addressTo]">{{wallet.addressbook[btx.addressTo]}}</h2>
<h2 ng-if="!btx.message && !btx.note.body && !wallet.addressbook[btx.addressTo]" translate> Sent</h2>
</span>
</div>
<div class="padding" ng-if="btx.action == 'moved'">
<span class="ellipsis">
<h2 ng-if="btx.note.body">{{btx.note.body}}</h2>
<h2 ng-if="!btx.note.body" translate>Moved</h2>
</span>
</div>
<span class="label tu warning radius" ng-if="btx.action == 'invalid'" translate>Invalid</span>
</div>
<div class="col col-30 padding">
<span class="size-16" ng-class="{'text-bold': btx.recent}"> <span class="size-16" ng-class="{'text-bold': btx.recent}">
<span ng-if="btx.action == 'received'">+</span> <span ng-if="btx.action == 'received'">+</span>
<span ng-if="btx.action == 'sent'">-</span> <span ng-if="btx.action == 'sent'">-</span>
@ -191,11 +153,37 @@
Unconfirmed Unconfirmed
</span> </span>
</p> </p>
</div> </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'">
<h2 class="p10t">
<div ng-if="btx.action == 'received'">
<span class="ellipsis">
<h2 ng-if="btx.note.body">{{btx.note.body}}</h2>
<h2 ng-if="!btx.note.body" translate> Received</h2>
</span>
</div>
<div ng-if="btx.action == 'sent'">
<span class="ellipsis">
<h2 ng-if="btx.message">{{btx.message}}</h2>
<h2 ng-if="!btx.message && btx.note.body">{{btx.note.body}}</h2>
<h2 ng-if="!btx.message && !btx.note.body && wallet.addressbook[btx.addressTo]">{{wallet.addressbook[btx.addressTo]}}</h2>
<h2 ng-if="!btx.message && !btx.note.body && !wallet.addressbook[btx.addressTo]" translate> Sent</h2>
</span>
</div>
<div ng-if="btx.action == 'moved'">
<span class="ellipsis">
<h2 ng-if="btx.note.body">{{btx.note.body}}</h2>
<h2 ng-if="!btx.note.body" translate>Moved</h2>
</span>
</div>
<span class="label tu warning radius" ng-if="btx.action == 'invalid'" translate>Invalid</span>
</h2>
<div class="col col-10 text-center">
<i class="icon ion-chevron-right"></i>
</div>
</div> </div>
<ion-infinite-scroll <ion-infinite-scroll

View file

@ -1,6 +1,6 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('bitpayCardController', function($scope, $timeout, $log, lodash, bitpayCardService, configService, profileService, walletService, ongoingProcess, pbkdf2Service, moment, popupService) { angular.module('copayApp.controllers').controller('bitpayCardController', function($scope, $timeout, $log, lodash, bitpayCardService, configService, profileService, walletService, ongoingProcess, pbkdf2Service, moment, popupService, gettextCatalog, bwcError) {
var self = this; var self = this;
var wallet; var wallet;
@ -168,6 +168,7 @@ angular.module('copayApp.controllers').controller('bitpayCardController', functi
}; };
walletService.createTx(wallet, txp, function(err, createdTxp) { walletService.createTx(wallet, txp, function(err, createdTxp) {
ongoingProcess.set('Processing Transaction...', false);
if (err) { if (err) {
popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err)); popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err));
return; return;

View file

@ -17,6 +17,11 @@ angular.module('copayApp.controllers').controller('confirmController', function(
$scope.showDescriptionPopup = function() { $scope.showDescriptionPopup = function() {
$scope.data = {
comment: null
};
var commentPopup = $ionicPopup.show({ var commentPopup = $ionicPopup.show({
templateUrl: "views/includes/note.html", templateUrl: "views/includes/note.html",
title: gettextCatalog.getString('Set description'), title: gettextCatalog.getString('Set description'),
@ -25,9 +30,9 @@ angular.module('copayApp.controllers').controller('confirmController', function(
$scope.commentPopupClose = function() { $scope.commentPopupClose = function() {
commentPopup.close(); commentPopup.close();
}; };
$scope.commentPopupSave = function(description) { $scope.commentPopupSave = function() {
$log.debug('Saving description: ' + description); $log.debug('Saving description: ' + $scope.data.comment);
$scope.description = description; $scope.description = $scope.data.comment;
commentPopup.close(); commentPopup.close();
}; };
}; };

View file

@ -1,20 +1,15 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('exportController', angular.module('copayApp.controllers').controller('exportController',
function($rootScope, $scope, $timeout, $log, $ionicHistory, lodash, backupService, walletService, storageService, profileService, platformInfo, gettext, gettextCatalog, $state, $stateParams, popupService) { function($scope, $timeout, $log, $ionicHistory, backupService, walletService, storageService, profileService, platformInfo, gettextCatalog, $state, $stateParams, popupService) {
var prevState;
var isWP = platformInfo.isWP;
var isAndroid = platformInfo.isAndroid;
var wallet = profileService.getWallet($stateParams.walletId); var wallet = profileService.getWallet($stateParams.walletId);
$scope.isEncrypted = wallet.isPrivKeyEncrypted();
$scope.isCordova = platformInfo.isCordova;
$scope.isSafari = platformInfo.isSafari;
$scope.init = function() { $scope.init = function() {
$scope.supported = true; $scope.formData = {};
$scope.exportQR = false; $scope.isEncrypted = wallet.isPrivKeyEncrypted();
$scope.noSignEnabled = false; $scope.isCordova = platformInfo.isCordova;
$scope.isSafari = platformInfo.isSafari;
$scope.formData.noSignEnabled = false;
$scope.showAdvanced = false; $scope.showAdvanced = false;
$scope.wallet = wallet; $scope.wallet = wallet;
$scope.canSign = wallet.canSign(); $scope.canSign = wallet.canSign();
@ -22,13 +17,15 @@ angular.module('copayApp.controllers').controller('exportController',
walletService.getEncodedWalletInfo(wallet, function(err, code) { walletService.getEncodedWalletInfo(wallet, function(err, code) {
if (err || !code) { if (err || !code) {
$log.warn(err); $log.warn(err);
return $state.go('wallet.preferencesAdvanced') return $ionicHistory.goBack();
} }
if (!code) if (!code)
$scope.supported = false; $scope.formData.supported = false;
else else {
$scope.exportWalletInfo = code; $scope.formData.supported = true;
$scope.formData.exportWalletInfo = code;
}
$timeout(function() { $timeout(function() {
$scope.$apply(); $scope.$apply();
@ -38,14 +35,25 @@ angular.module('copayApp.controllers').controller('exportController',
/* /*
EXPORT WITHOUT PRIVATE KEY - PENDING EXPORT WITHOUT PRIVATE KEY - PENDING
*/
$scope.noSignEnabledChange = function() { $scope.noSignEnabledChange = function() {
$scope.exportWalletInfo = encodeWalletInfo(); if (!$scope.formData.supported) return;
$timeout(function() {
$scope.$apply(); walletService.getEncodedWalletInfo(wallet, function(err, code) {
}, 1); if (err) {
$log.error(err);
$scope.formData.supported = false;
$scope.formData.exportWalletInfo = null;
} else {
$scope.formData.supported = true;
$scope.formData.exportWalletInfo = code;
}
$timeout(function() {
$scope.$apply();
}, 1);
});
}; };
*/
$scope.downloadWalletBackup = function() { $scope.downloadWalletBackup = function() {
$scope.getAddressbook(function(err, localAddressBook) { $scope.getAddressbook(function(err, localAddressBook) {
@ -54,11 +62,11 @@ angular.module('copayApp.controllers').controller('exportController',
return; return;
} }
var opts = { var opts = {
noSign: $scope.noSignEnabled, noSign: $scope.formData.noSignEnabled,
addressBook: localAddressBook addressBook: localAddressBook
}; };
backupService.walletDownload($scope.password, opts, function(err) { backupService.walletDownload($scope.formData.password, opts, function(err) {
if (err) { if (err) {
popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Failed to export')); popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Failed to export'));
return; return;
@ -91,11 +99,11 @@ angular.module('copayApp.controllers').controller('exportController',
return cb(null); return cb(null);
} }
var opts = { var opts = {
noSign: $scope.noSignEnabled, noSign: $scope.formData.noSignEnabled,
addressBook: localAddressBook addressBook: localAddressBook
}; };
var ew = backupService.walletExport($scope.password, opts); var ew = backupService.walletExport($scope.formData.password, opts);
if (!ew) { if (!ew) {
popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Failed to export')); popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Failed to export'));
} }
@ -132,7 +140,7 @@ angular.module('copayApp.controllers').controller('exportController',
var ew = backup; var ew = backup;
if (!ew) return; if (!ew) return;
if ($scope.noSignEnabled) if ($scope.formData.noSignEnabled)
name = name + '(No Private Key)'; name = name + '(No Private Key)';
var subject = 'Copay Wallet Backup: ' + name; var subject = 'Copay Wallet Backup: ' + name;

View file

@ -1,6 +1,6 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('termsController', function($scope, $log, $state, uxLanguage, profileService, externalLinkService) { angular.module('copayApp.controllers').controller('termsController', function($scope, $log, $state, $window, uxLanguage, profileService, externalLinkService) {
$scope.lang = uxLanguage.currentLanguage; $scope.lang = uxLanguage.currentLanguage;
$scope.disclaimerUrl = $window.appConfig.disclaimerUrl; $scope.disclaimerUrl = $window.appConfig.disclaimerUrl;

View file

@ -1,15 +1,20 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('preferencesBitpayCardController', angular.module('copayApp.controllers').controller('preferencesBitpayCardController',
function($scope, $ionicModal, bitpayCardService) { function($scope, $state, $timeout, bitpayCardService, popupService) {
this.logout = function() { $scope.logout = function() {
$ionicModal.fromTemplateUrl('views/modals/bitpay-card-confirmation.html', { var title = 'Are you sure you would like to log out of your Bitpay Card account?';
scope: $scope, popupService.showConfirm(title, null, function(res) {
animation: 'slide-in-up' if (res) logout();
}).then(function(modal) { });
$scope.bitpayCardConfirmationModal = modal; };
$scope.bitpayCardConfirmationModal.show();
var logout = function() {
bitpayCardService.logout(function() {
$timeout(function() {
$state.go('bitpayCard.main');
}, 100);
}); });
}; };

View file

@ -144,7 +144,7 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
}; };
$scope.updateTxHistory = function(cb) { $scope.updateTxHistory = function(cb) {
if (!cb) cb = function() {};
if ($scope.updatingTxHistory) return; if ($scope.updatingTxHistory) return;
$scope.updatingTxHistory = true; $scope.updatingTxHistory = true;

View file

@ -434,7 +434,6 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
} }
}) })
.state('tabs.preferences.export', { .state('tabs.preferences.export', {
abstract: true,
url: '/export', url: '/export',
views: { views: {
'preferences': { 'preferences': {
@ -442,24 +441,6 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
} }
} }
}) })
.state('tabs.preferences.export.file', {
url: '/tab-export-file',
needProfile: true,
views: {
'tab-export-file': {
templateUrl: 'views/tab-export-file.html',
},
}
})
.state('tabs.preferences.export.qrCode', {
url: '/tab-export-qrCode',
needProfile: true,
views: {
'tab-export-qrCode': {
templateUrl: 'views/tab-export-qrCode.html',
},
}
})
.state('tabs.preferences.preferencesBwsUrl', { .state('tabs.preferences.preferencesBwsUrl', {
url: '/preferencesBwsUrl', url: '/preferencesBwsUrl',
views: { views: {

View file

@ -30,7 +30,7 @@ angular.module('copayApp.services')
root.updateWalletSettings = function(wallet) { root.updateWalletSettings = function(wallet) {
var defaults = configService.getDefaults(); var defaults = configService.getDefaults();
configService.whenAvailable(function(config){ configService.whenAvailable(function(config) {
wallet.usingCustomBWS = config.bwsFor && config.bwsFor[wallet.id] && (config.bwsFor[wallet.id] != defaults.bws.url); wallet.usingCustomBWS = config.bwsFor && config.bwsFor[wallet.id] && (config.bwsFor[wallet.id] != defaults.bws.url);
wallet.name = (config.aliasFor && config.aliasFor[wallet.id]) || wallet.credentials.walletName; wallet.name = (config.aliasFor && config.aliasFor[wallet.id]) || wallet.credentials.walletName;
wallet.color = (config.colorFor && config.colorFor[wallet.id]) || '#4A90E2'; wallet.color = (config.colorFor && config.colorFor[wallet.id]) || '#4A90E2';
@ -77,7 +77,7 @@ angular.module('copayApp.services')
var opts = opts || {}; var opts = opts || {};
var walletId = wallet.credentials.walletId; var walletId = wallet.credentials.walletId;
if ((root.wallet[walletId] && root.wallet[walletId].started) && !opts.force) { if ((root.wallet[walletId] && root.wallet[walletId].started) && !opts.force) {
return false; return false;
} }
@ -762,7 +762,7 @@ angular.module('copayApp.services')
var TIME_STAMP = 60 * 60 * 24 * 7; var TIME_STAMP = 60 * 60 * 24 * 7;
var MAX = 100; var MAX = 100;
var ignored = { var typeFilter1 = {
'NewBlock': 1, 'NewBlock': 1,
'BalanceUpdated': 1, 'BalanceUpdated': 1,
'NewOutgoingTxByThirdParty': 1, 'NewOutgoingTxByThirdParty': 1,
@ -771,6 +771,12 @@ angular.module('copayApp.services')
'TxProposalFinallyRejected': 1, 'TxProposalFinallyRejected': 1,
}; };
var typeFilter2 = {
'TxProposalAcceptedBy': 1,
'TxProposalRejectedBy': 1,
'NewTxProposal': 1,
}
var w = root.getWallets(); var w = root.getWallets();
if (lodash.isEmpty(w)) return cb(); if (lodash.isEmpty(w)) return cb();
@ -868,9 +874,15 @@ angular.module('copayApp.services')
$log.warn('Error updating notifications:' + err); $log.warn('Error updating notifications:' + err);
} else { } else {
var n = lodash.filter(wallet.cachedActivity.n, function(x) { var n = lodash.filter(wallet.cachedActivity.n, function(x) {
return !ignored[x.type]; return !typeFilter1[x.type];
}); });
if (wallet.n == 1) {
var n = lodash.filter(n, function(x) {
return !typeFilter2[x.type];
});
}
var idToName = {}; var idToName = {};
if (wallet.cachedStatus) { if (wallet.cachedStatus) {
lodash.each(wallet.cachedStatus.wallet.copayers, function(c) { lodash.each(wallet.cachedStatus.wallet.copayers, function(c) {
@ -911,7 +923,7 @@ angular.module('copayApp.services')
txps = txps.concat(x.pendingTxps); txps = txps.concat(x.pendingTxps);
}); });
txps = lodash.sortBy(txps, 'pendingForUs', 'createdOn'); txps = lodash.sortBy(txps, 'pendingForUs', 'createdOn');
txps = lodash.compact(lodash.flatten(txps)).slice(0,MAX); txps = lodash.compact(lodash.flatten(txps)).slice(0, MAX);
var n = txps.length; var n = txps.length;
return cb(null, txps, n); return cb(null, txps, n);
}; };

View file

@ -8,6 +8,10 @@
font-weight: bold; font-weight: bold;
} }
.item.item-footer {
font-weight: lighter;
}
.icon.list-add-button { .icon.list-add-button {
color: #666; color: #666;
font-size: 38px; font-size: 38px;

View file

@ -343,7 +343,7 @@ ul.wallet-selection.wallets {
position: absolute; position: absolute;
top: inherit; top: inherit;
left: 10px; left: 10px;
bottom: 26px; bottom: 15px;
font-size: 20px; font-size: 20px;
color: #fff; color: #fff;
} }
@ -996,5 +996,6 @@ input[type=number] {
@import "views/add"; @import "views/add";
@import "views/tab-home"; @import "views/tab-home";
@import "views/walletDetails"; @import "views/walletDetails";
@import "views/bitpayCard";
@import 'views/onboarding/onboarding'; @import 'views/onboarding/onboarding';
@import "views/includes/walletActivity"; @import "views/includes/walletActivity";

View file

@ -0,0 +1,16 @@
#bitpayCard {
.amount {
width: 100%;
text-align: center;
padding: 2rem 1rem 1.5rem 1rem;
min-height: 115px;
margin-bottom: 25px;
border-color: #172565;
background-color: #1e3186;
background-image: linear-gradient(0deg, #172565, #172565 0%, transparent 0%);
color: #fff;
}
strong {
line-height: 100%;
}
}

View file

@ -14,14 +14,14 @@
opacity: 1; opacity: 1;
background: #fff; background: #fff;
color: rgb(108, 108, 108); color: rgb(108, 108, 108);
height: 13rem; height: 14rem;
animation-name: topBottom; animation-name: topBottom;
animation-iteration-count: 1; animation-iteration-count: 1;
animation-timing-function: ease-in; animation-timing-function: ease-in;
animation-duration: 1s; animation-duration: 1s;
animation-delay: 2s; animation-delay: 2s;
position: absolute; position: absolute;
bottom: -13rem; bottom: -14rem;
animation-fill-mode: forwards; animation-fill-mode: forwards;
z-index: 5; z-index: 5;
margin-top: 0; margin-top: 0;

View file

@ -1,6 +1,7 @@
#walletDetails { #walletDetails {
.bar-header { .bar-header {
border: 0; border: 0;
background: none;
.title, .button { .title, .button {
color: #fff; color: #fff;
} }
@ -12,13 +13,17 @@
.amount { .amount {
width: 100%; width: 100%;
text-align: center; text-align: center;
padding: 2.5rem 1rem 1.5rem 1rem; padding: 2rem 1rem 1.5rem 1rem;
color: #fff; color: #fff;
height: 150px; min-height: 115px;
margin-bottom: 25px; margin-bottom: 10px;
&-alternative { &-alternative {
line-height: 48px; line-height: 36px;
}
strong {
line-height: 100%;
} }
} }
} }

View file

@ -1,6 +1,6 @@
[Desktop Entry] [Desktop Entry]
Type=Application Type=Application
Version=0.8.0 Version=0.10.0
Name=BitPay Name=BitPay
Comment=The BitPay Bitcoin Wallet Comment=The BitPay Bitcoin Wallet
Exec=bitpay Exec=bitpay

View file

@ -2,7 +2,7 @@
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "bitpay" #define MyAppName "bitpay"
#define MyAppVersion "0.8.0" #define MyAppVersion "0.10.0"
#define MyAppPublisher "BitPay" #define MyAppPublisher "BitPay"
#define MyAppURL "https://bitpay.com" #define MyAppURL "https://bitpay.com"
#define MyAppExeName "*NAMECASENOSPACE.exe" #define MyAppExeName "*NAMECASENOSPACE.exe"