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,10 +127,10 @@
<i class="icon ion-android-sync"></i> <i class="icon ion-android-sync"></i>
</div> </div>
<div class="card list" ng-show="!loadingHistory">
<div <div
ng-show="!loadingHistory"
ng-repeat="tx in bitpayCard.bitpayCardTransactionHistory | orderBy: ['pending','-timestamp']" ng-repeat="tx in bitpayCard.bitpayCardTransactionHistory | orderBy: ['pending','-timestamp']"
class="row" class="item row"
ng-init="bitpayCard.getMerchantInfo(tx)"> ng-init="bitpayCard.getMerchantInfo(tx)">
<div class="col" ng-init="icon = bitpayCard.getIconName(tx)"> <div class="col" ng-init="icon = bitpayCard.getIconName(tx)">
<img class="m5t" ng-src="img/mcc-icons/{{icon}}.svg" width="22"> <img class="m5t" ng-src="img/mcc-icons/{{icon}}.svg" width="22">
@ -164,6 +164,7 @@
</div> </div>
</div> </div>
</div> </div>
</div>
<div ng-show="bitpayCard.bitpayCardAuthenticated && !bitpayCard.visaCardActivated && addFunds"> <div ng-show="bitpayCard.bitpayCardAuthenticated && !bitpayCard.visaCardActivated && addFunds">
<form <form
@ -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,15 +1,14 @@
<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'">
@ -42,10 +41,9 @@
</div> </div>
</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">
@ -60,7 +58,7 @@
</span> </span>
</li> </li>
<li ng-show="btx.hasMultiplesOutputs" class="line-b p10 oh" <li ng-show="btx.hasMultiplesOutputs" class="item"
ng-click="showMultiplesOutputs = !showMultiplesOutputs"> ng-click="showMultiplesOutputs = !showMultiplesOutputs">
<span class="text-gray" translate>Recipients</span> <span class="text-gray" translate>Recipients</span>
<span class="right">{{btx.recipientCount}} <span class="right">{{btx.recipientCount}}
@ -69,18 +67,18 @@
</span> </span>
</li> </li>
<div class="line-b" ng-show="btx.hasMultiplesOutputs && showMultiplesOutputs" <div class="item" ng-show="btx.hasMultiplesOutputs && showMultiplesOutputs"
ng-repeat="output in btx.outputs" ng-repeat="output in btx.outputs"
ng-include="'views/includes/output.html'"> ng-include="'views/includes/output.html'">
</div> </div>
<li ng-if="btx.action == 'invalid'" class="line-b p10 oh"> <li ng-if="btx.action == 'invalid'" class="item">
<span class="right" translate> <span class="right" translate>
This transaction has become invalid; possibly due to a double spend attempt. This transaction has become invalid; possibly due to a double spend attempt.
</span> </span>
</li> </li>
<li ng-if="btx.time" class="line-b p10 oh"> <li ng-if="btx.time" class="item">
<span class="text-gray" translate>Date</span> <span class="text-gray" translate>Date</span>
<span class="right enable_text_select"> <span class="right enable_text_select">
<time>{{ btx.time * 1000 | amDateFormat:'MM/DD/YYYY HH:mm a'}}</time> <time>{{ btx.time * 1000 | amDateFormat:'MM/DD/YYYY HH:mm a'}}</time>
@ -88,19 +86,19 @@
</span> </span>
</li> </li>
<li class="line-b p10" ng-show="btx.action != 'received'" <li class="item" ng-show="btx.action != 'received'"
copy-to-clipboard="btx.feeStr"> copy-to-clipboard="btx.feeStr">
<span class="text-gray" translate>Fee</span> <span class="text-gray" translate>Fee</span>
<span class="right enable_text_select">{{btx.feeStr}}</span> <span class="right enable_text_select">{{btx.feeStr}}</span>
</li> </li>
<li class="line-b p10 oh" ng-if="btx.message && btx.action != 'received'" <li class="item" ng-if="btx.message && btx.action != 'received'"
copy-to-clipboard="btx.message"> copy-to-clipboard="btx.message">
<span class="text-gray" translate>Description</span> <span class="text-gray" translate>Description</span>
<span class="right enable_text_select">{{btx.message}}</span> <span class="right enable_text_select">{{btx.message}}</span>
</li> </li>
<li ng-if="btx.merchant" class="line-b p10 oh" <li ng-if="btx.merchant" class="item"
copy-to-clipboard="btx.merchant.pr.pd.memo"> copy-to-clipboard="btx.merchant.pr.pd.memo">
<span class="text-gray" translate>Merchant message</span> <span class="text-gray" translate>Merchant message</span>
<span class="right enable_text_select"> <span class="right enable_text_select">
@ -108,7 +106,7 @@
</span> </span>
</li> </li>
<li ng-if="btx.time" class="line-b p10 oh"> <li ng-if="btx.time" class="item">
<span class="text-gray" translate>Confirmations</span> <span class="text-gray" translate>Confirmations</span>
<span class="right" > <span class="right" >
<span class="text-warning" ng-show="!btx.confirmations || btx.confirmations == 0" translate> <span class="text-warning" ng-show="!btx.confirmations || btx.confirmations == 0" translate>
@ -123,7 +121,7 @@
</span> </span>
</li> </li>
<li class="p10 oh" ng-show="btx.note && btx.note.body"> <li class="item" ng-show="btx.note && btx.note.body">
<span class="text-gray" translate>Comment</span> <span class="text-gray" translate>Comment</span>
<span class="right enable_text_select">{{btx.note.body}}</span><br> <span class="right enable_text_select">{{btx.note.body}}</span><br>
<span class="right text-italic text-gray size-12"> <span class="right text-italic text-gray size-12">
@ -133,32 +131,30 @@
</li> </li>
</ul> </ul>
<div ng-if="btx.actions[0] && isShared"> <div class="list" ng-if="btx.actions[0] && isShared">
<h4 class="title m0" translate>Participants</h4> <div class="item item-divider" translate>Participants</div>
<ul class="no-bullet size-14 m0"> <div class="item" ng-repeat="c in btx.actions">
<li class="line-b p10 text-gray" ng-repeat="c in btx.actions"> <span class="item-note">
<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 == 'reject'" class="fi-x icon-sign x db"></i>
<i ng-if="c.type == 'accept'" class="fi-check icon-sign check db"></i> <i ng-if="c.type == 'accept'" class="fi-check icon-sign check db"></i>
</span> </span>
{{c.copayerName}} <span ng-if="c.copayerId == copayerId">({{'Me'|translate}})</span> {{c.copayerName}} <span ng-if="c.copayerId == copayerId">({{'Me'|translate}})</span>
</li> </div>
</ul>
</div> </div>
<div ng-show="btx.txid" class="tx-details-blockchain"> <div ng-show="btx.txid" class="row">
<div class="text-center m20t"> <div class="col">
<button class="button button-positive" ng-click="openExternalLink('https://' + <button class="button button-block button-positive" ng-click="openExternalLink('https://' +
(getShortNetworkName() == 'test' ? 'test-' : '') + 'insight.bitpay.com/tx/' + btx.txid)"> (getShortNetworkName() == 'test' ? 'test-' : '') + 'insight.bitpay.com/tx/' + btx.txid)">
<span class="text-gray" translate>See it on the blockchain</span> <span class="text-gray" translate>See it on the blockchain</span>
</button> </button>
<button class="button button-positive" ng-click="showCommentPopup()"> </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">Add comment</i></span>
<span class="text-gray" translate ng-show="btx.note">Edit comment</span> <span class="text-gray" translate ng-show="btx.note">Edit comment</span>
</button> </button>
</div> </div>
</div> </div>
</div>
</ion-content> </ion-content>
</ion-modal-view> </ion-modal-view>

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,38 +1,30 @@
<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> </div>
</li>
<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">
@ -45,8 +37,6 @@
</button> </button>
</div> </div>
</li>
<li class="item">
<div ng-show="tx.status != 'pending'"> <div ng-show="tx.status != 'pending'">
<div ng-show="tx.status=='accepted' && !tx.isGlidera"> <div ng-show="tx.status=='accepted' && !tx.isGlidera">
@ -63,56 +53,50 @@
<div class="balanced" ng-show="tx.status == 'broadcasted'" translate>Payment Sent</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 class="assertive" ng-show="tx.status=='rejected'" translate>Payment Rejected</div>
</div> </div>
</li>
<li class="item">
<h4 class="title m0" translate>Details</h4>
<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> </div>
<span translate>Participants</span> <span translate>Participants</span>
</h4> </div>
<ul class="no-bullet size-14 m0"> <li class="item" ng-repeat="ac in tx.actions">
<li class="line-b p10 text-gray" ng-repeat="ac in tx.actions"> <span class="item-note">
<i class="icon-contact size-24"></i> <i ng-if="ac.type == 'reject'" class="icon ion-ios-close-empty"></i>
<span class="right"> <i ng-if="ac.type == 'accept'" class="icon ion-ios-checkmark-empty"></i>
<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> </div>
</ul>
</li> <div class="m20t" ng-if="tx.canBeRemoved || (tx.status == 'accepted' && !tx.broadcastedOn)">
<li class="item" ng-if="tx.canBeRemoved || (tx.status == 'accepted' && !tx.broadcastedOn)"> <div class="size-12 padding" ng-show="!tx.isGlidera && isShared" translate>
<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. * 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"> <button class="button button-assertive button-block" ng-click="remove()" ng-disabled="loading">
<i class="fi-trash size-14 m5r"></i> <i class="fi-trash size-14 m5r"></i>
<span translate>Delete Payment Proposal</span> <span translate>Delete Payment Proposal</span>
</button> </button>
</li>
</ul>
</div> </div>
</ion-content> </ion-content>
</ion-modal-view> </ion-modal-view>

View file

@ -16,12 +16,10 @@
<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>
</ion-view> </ion-view>

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,15 +1,3 @@
<ion-view>
<ion-nav-bar class="bar-royal">
<ion-nav-title>{{'Export Wallet' | translate}}</ion-nav-title>
<ion-nav-buttons side="primary">
<button class="button back-button" ui-sref="tabs.preferences.preferencesAdvanced">
<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">
<div ng-show="!backupWalletPlainText"> <div ng-show="!backupWalletPlainText">
<div class="size-14" ng-show="error"> <div class="size-14" ng-show="error">
<i class="ion-alert-circled"></i> <i class="ion-alert-circled"></i>
@ -17,26 +5,31 @@
</div> </div>
<form name="exportForm" novalidate> <form name="exportForm" novalidate>
<div class="card">
<label class="item item-input item-stacked-label"> <label class="item item-input item-stacked-label">
<span class="input-label" transalate>Set up a password</span> <span class="input-label" transalate>Set up a password</span>
<input type="password" placeholder="{{'Your password'|translate}}" name="password" ng-model="password"> <input type="password" placeholder="{{'Your password'|translate}}" ng-model="formData.password">
</label> </label>
<label class="item item-input item-stacked-label"> <label class="item item-input item-stacked-label">
<span class="input-label" transalate>Repeat the password</span> <span class="input-label" transalate>Repeat the password</span>
<input type="password" class="form-control" placeholder="{{'Repeat password'|translate}}" name="password" ng-model="repeatpassword"> <input type="password" placeholder="{{'Repeat password'|translate}}" ng-model="formData.repeatpassword">
</label> </label>
</div>
</form> </form>
<ion-toggle ng-show="canSign" ng-model="showAdvanced" toggle-class="toggle-balanced"> <ion-toggle ng-show="canSign" ng-model="formData.showAdvanced" toggle-class="toggle-balanced">
<span translate ng-show="!showAdvanced">Show advanced options</span> <span translate ng-show="!formData.showAdvanced">Show advanced options</span>
<span translate ng-show="showAdvanced">Hide advanced options</span> <span translate ng-show="formData.showAdvanced">Hide advanced options</span>
</ion-toggle> </ion-toggle>
<ion-toggle ng-model="noSignEnabled" ng-show="showAdvanced" toggle-class="toggle-balanced" class="r0" ng-change="noSignEnabledChange()"> <div class="card" ng-show="formData.showAdvanced">
<ion-checkbox ng-model="formData.noSignEnabled" class="checkbox-balanced" ng-change="noSignEnabledChange()">
<span class="toggle-label" translate>Do not include private key</span> <span class="toggle-label" translate>Do not include private key</span>
</ion-toggle> </ion-checkbox>
</div>
<div class="box-notification" ng-show="!canSign"> <div class="box-notification error" ng-show="!canSign">
<span class="size-14"> <span class="size-14">
<i class="ion-alert-circled"></i> <i class="ion-alert-circled"></i>
<span translate> <span translate>
@ -45,7 +38,7 @@
</span> </span>
</div> </div>
<div class="box-notification" ng-show="noSignEnabled"> <div class="box-notification error" ng-show="formData.noSignEnabled">
<span class="size-14"> <span class="size-14">
<i class="ion-alert-circled"></i> <i class="ion-alert-circled"></i>
<span translate> <span translate>
@ -57,7 +50,7 @@
<button <button
ng-click="downloadWalletBackup()" ng-click="downloadWalletBackup()"
class="button button-block button-positive" class="button button-block button-positive"
ng-disabled="(!password || password != repeatpassword)" ng-disabled="(!formData.password || formData.password != formData.repeatpassword)"
ng-style="{'background-color':wallet.color}" ng-style="{'background-color':wallet.color}"
ng-show="!isSafari && !isCordova"> ng-show="!isSafari && !isCordova">
<i class="fi-download"></i> <i class="fi-download"></i>
@ -67,38 +60,34 @@
<button <button
ng-click="viewWalletBackup()" ng-click="viewWalletBackup()"
class="button button-block button-positive" class="button button-block button-positive"
ng-disabled="(!password || password != repeatpassword)" ng-disabled="(!formData.password || formData.password != formData.repeatpassword)"
ng-style="{'background-color':wallet.color}" ng-style="{'background-color':wallet.color}"
ng-show="isSafari && !isCordova"> ng-show="isSafari && !isCordova">
<i class="fi-eye"></i> <i class="fi-eye"></i>
<span translate>View</span> <span translate>View</span>
</button> </button>
<div ng-show="isCordova"> <div ng-show="isCordova">
<h4 translate>Export options</h4> <h4 translate>Export options</h4>
<button class="button button-block button-positive" <button class="button button-block button-positive"
ng-disabled="(!password || password != repeatpassword)" ng-disabled="(!formData.password || formData.password != formData.repeatpassword)"
ng-style="{'background-color':wallet.color}" ng-style="{'background-color':wallet.color}"
ng-click="copyWalletBackup()"> ng-click="copyWalletBackup()">
<i class="fi-clipboard-pencil"></i> <i class="fi-clipboard-pencil"></i>
<span translate>Copy to clipboard</span></button> <span translate>Copy to clipboard</span></button>
<button class="button button-block button-positive" ng-disabled="(!password || password != repeatpassword)" <button class="button button-block button-positive" ng-disabled="(!formData.password || formData.password != formData.repeatpassword)"
ng-style="{'background-color':wallet.color}" ng-style="{'background-color':wallet.color}"
ng-click="sendWalletBackup()"><i class="fi-mail"></i> ng-click="sendWalletBackup()"><i class="fi-mail"></i>
<span translate>Send by email</span></button> <span translate>Send by email</span></button>
</div> </div>
</div> </div>
<div class="row" ng-show="backupWalletPlainText"> <div ng-show="backupWalletPlainText" class="text-center card">
<div class="large-12 columns"> <label class="item item-input item-stacked-label">
<h3 translate>Wallet Export</h3>
<div class="input">
<textarea rows="12">{{backupWalletPlainText}}</textarea> <textarea rows="12">{{backupWalletPlainText}}</textarea>
</div> </label>
<div class="size-12 text-gray text-right"> <div class="item text-gray item-icon-left">
<i class="icon-compose"></i> <i class="icon ion-compose"></i>
<span translate>Copy this text as it is to a safe place (notepad or email)</span> <p translate>Copy this text as it is to a safe place (notepad or email)</p>
</div> </div>
</div> </div>
</div>
</ion-content>
</ion-view>

View file

@ -1,25 +1,10 @@
<ion-view> <div class="m20t text-gray" ng-show="formData.supported">
<ion-nav-bar class="bar-royal">
<ion-nav-title>{{'Export Wallet' | translate}}</ion-nav-title>
<ion-nav-buttons side="primary">
<button class="button back-button" ui-sref="tabs.preferences.preferencesAdvanced">
<i class="icon ion-ios-arrow-thin-left"></i>
</button>
</ion-nav-buttons>
</ion-nav-bar>
<ion-content ng-controller="exportController" ng-init="init()">
<div class="m20t text-gray" ng-show="supported">
<div class="text-center m20b"> <div class="text-center m20b">
<qrcode size="220" version="8" error-correction-level="M" data="{{exportWalletInfo}}"></qrcode> <qrcode size="220" version="8" error-correction-level="M" data="{{formData.exportWalletInfo}}"></qrcode>
</div> </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 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>
<div class="m20t text-gray" ng-show="!supported"> <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="text-center size-12 m10" translate>Exporting via QR not supported for this wallet</div>
</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>
<li ng-repeat="tx in txps" class="item item-icon-left" ng-click="openTxpModal(tx)">
<span ng-include="'views/includes/txp.html'"></span>
</li>
</ul>
<div ng-show="lockedBalanceSat">
<span translate>Total Locked Balance</span>:
<b>{{lockedBalanceStr}} </b>
<span> {{lockedBalanceAlternative}} {{alternativeIsoCode}} </span>
</div> </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>
<div class="item item-footer" ng-show="status.lockedBalanceSat">
<span translate>Total Locked Balance</span>:
<b>{{status.lockedBalanceStr}} </b>
<span> {{status.lockedBalanceAlternative}} {{status.alternativeIsoCode}} </span>
</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>
</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>
<div class="col col-10 text-center"> <div ng-if="btx.action == 'sent'">
<i class="icon ion-chevron-right"></i> <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>
<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> </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.init = function() {
$scope.formData = {};
$scope.isEncrypted = wallet.isPrivKeyEncrypted(); $scope.isEncrypted = wallet.isPrivKeyEncrypted();
$scope.isCordova = platformInfo.isCordova; $scope.isCordova = platformInfo.isCordova;
$scope.isSafari = platformInfo.isSafari; $scope.isSafari = platformInfo.isSafari;
$scope.formData.noSignEnabled = false;
$scope.init = function() {
$scope.supported = true;
$scope.exportQR = false;
$scope.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;
walletService.getEncodedWalletInfo(wallet, function(err, code) {
if (err) {
$log.error(err);
$scope.formData.supported = false;
$scope.formData.exportWalletInfo = null;
} else {
$scope.formData.supported = true;
$scope.formData.exportWalletInfo = code;
}
$timeout(function() { $timeout(function() {
$scope.$apply(); $scope.$apply();
}, 1); }, 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

@ -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) {

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"