Merge pull request #60 from cmgustavo/ref/design-17

Ref/design 17
This commit is contained in:
Matias Alejo Garcia 2016-09-05 18:37:03 -03:00 committed by GitHub
commit 774aaec8ca
41 changed files with 314 additions and 299 deletions

View file

@ -5,6 +5,8 @@
"nameCase": "Copay", "nameCase": "Copay",
"nameCaseNoSpace": "Copay", "nameCaseNoSpace": "Copay",
"bundleName": "copay", "bundleName": "copay",
"gitHubRepoName": "copay",
"disclaimerUrl": "https://copay.io/disclaimer",
"url": "https://copay.io", "url": "https://copay.io",
"appDescription": "Copay Bitcoin Wallet", "appDescription": "Copay Bitcoin Wallet",
"winAppName": "CopayWallet", "winAppName": "CopayWallet",

View file

@ -1,13 +1,13 @@
<ion-modal-view ng-controller="addressbookModalController" ng-init="initAddressbook()"> <ion-modal-view ng-controller="addressbookModalController" ng-init="initAddressbook()">
<ion-header-bar align-title="center" class="bar-royal"> <ion-header-bar align-title="center" class="bar-royal">
<button class="button back-button" ng-click="closeAddressbookModal()"> <button class="button button-clear" ng-click="closeAddressbookModal()">
<i class="icon ion-ios-arrow-thin-left"></i> Close
</button> </button>
<div class="h1 title"> <div class="h1 title">
<span ng-show="!addAddressbookEntry" translate>Addressbook</span> <span ng-show="!addAddressbookEntry" translate>Addressbook</span>
<span ng-show="addAddressbookEntry" translate>Add entry</span> <span ng-show="addAddressbookEntry" translate>Add entry</span>
</div> </div>
<button class="button button-clear button-positive" <button class="button button-clear"
ng-click="toggleAddAddressbookEntry()"> ng-click="toggleAddAddressbookEntry()">
<i ng-show="!addAddressbookEntry" class="icon ion-ios-plus-empty"></i> <i ng-show="!addAddressbookEntry" class="icon ion-ios-plus-empty"></i>
<span ng-show="addAddressbookEntry" translate>Cancel</span> <span ng-show="addAddressbookEntry" translate>Cancel</span>

View file

@ -10,7 +10,7 @@
<ion-content ng-controller="termsController" ng-init="accept = false;"> <ion-content ng-controller="termsController" ng-init="accept = false;">
<div ng-include="'views/includes/terms.html'"></div> <div ng-include="'views/includes/terms.html'"></div>
<div class="padding-vertical" ng-show="lang != 'en'"> <div class="padding-vertical" ng-show="lang != 'en'">
<a ng-click="$root.openExternalLink('https://copay.io/disclaimer')" translate>Official English Disclaimer</a> <a ng-click="openExternalLink('https://copay.io/disclaimer')" translate>Official English Disclaimer</a>
</div> </div>
<ion-list class="disclaimer"> <ion-list class="disclaimer">
<ion-checkbox ng-model="accept"><span translate>I have read, understood, and agree with the Terms of Use</span></ion-checkbox> <ion-checkbox ng-model="accept"><span translate>I have read, understood, and agree with the Terms of Use</span></ion-checkbox>

View file

@ -6,33 +6,24 @@
</ion-nav-bar> </ion-nav-bar>
<ion-content ng-controller="preferencesController" ng-init="init()"> <ion-content ng-controller="preferencesController" ng-init="init()">
<div class="list"> <div class="list">
<div class="item item-divider"> <div class="item item-divider"></div>
Preferences
</div>
<div class="item item-icon-right" href ui-sref="tabs.preferences.preferencesAlias"> <div class="item item-icon-right" href ui-sref="tabs.preferences.preferencesAlias">
<span translate>Wallet Name</span> <span translate>Name</span>
<span class="item-note"> <span class="item-note">
{{alias||wallet.walletName}} {{wallet.name}}
</span> </span>
<i class="icon ion-ios-arrow-right"></i> <i class="icon ion-ios-arrow-right"></i>
</div> </div>
<div class="item">
<span translate>Wallet Type</span>
<span class="item-note">
{{wallet.m}}-of-{{wallet.n}}
</span>
</div>
<div class="item" ng-show="wallet.isPrivKeyExternal()"> <div class="item" ng-show="wallet.isPrivKeyExternal()">
<span translate>Hardware wallet</span> <span translate>Hardware Wallet</span>
<span class="item-note"> <span class="item-note">
{{wallet.externalSource}} {{wallet.externalSource}}
</span> </span>
</div> </div>
<div class="item item-icon-right" href ui-sref="tabs.preferences.preferencesColor"> <div class="item item-icon-right" href ui-sref="tabs.preferences.preferencesColor">
<span ng-style="{'color': wallet.color}">&block;</span> <span translate>Color</span>
<span translate>Wallet Color</span> <span class="item-note" ng-style="{'color': wallet.color}">
<span class="item-note"> &block;
{{wallet.alias||wallet.walletName}}
</span> </span>
<i class="icon ion-ios-arrow-right"></i> <i class="icon ion-ios-arrow-right"></i>
</div> </div>
@ -65,9 +56,7 @@
<span translate>Delete recovery phrase</span> <span translate>Delete recovery phrase</span>
<i class="icon ion-ios-arrow-right"></i> <i class="icon ion-ios-arrow-right"></i>
</div> </div>
<div class="item item-divider" translate> <div class="item item-divider"></div>
Advanced
</div>
<div class="item item-icon-right" href ui-sref="tabs.preferences.preferencesAdvanced"> <div class="item item-icon-right" href ui-sref="tabs.preferences.preferencesAdvanced">
<span translate>Advanced</span> <span translate>Advanced</span>
<i class="icon ion-ios-arrow-right"></i> <i class="icon ion-ios-arrow-right"></i>

View file

@ -7,36 +7,41 @@
</ion-nav-buttons> </ion-nav-buttons>
</ion-nav-bar> </ion-nav-bar>
<ion-content ng-controller="preferencesAbout"> <ion-content ng-controller="preferencesAbout">
<div class="item item-divider" translate> <div class="list">
Release information <div class="item item-divider" translate>
</div> Release information
<div class="item item-icon-left"> </div>
<i class="icon ion-ios-film-outline"></i> <div class="item item-icon-left">
<span translate>Version</span> <i class="icon ion-ios-download-outline"></i>
<span class="item-note"> <span translate>Version</span>
v{{version}} <span class="item-note">
</span> v{{version}}
</div> </span>
<div class="item item-icon-left" ng-click="$root.openExternalLink('https://github.com/bitpay/copay/tree/'+commitHash)"> </div>
<i class="icon ion-ios-film-outline"></i> <div class="item item-icon-left" ng-click="openExternalLink('https://github.com/bitpay/'+name+'/tree/'+commitHash)">
<span translate>Commit hash</span> <i class="icon ion-social-github-outline"></i>
<span class="item-note"> <span translate>Commit hash</span>
#{{commitHash}} <span class="item-note">
</span> #{{commitHash}}
</div> </span>
<div class="item item-divider"> </div>
</div> <div class="item item-divider">
<div class="item item-icon-left" href ui-sref="tabs.termsOfUse"> </div>
<i class="icon ion-ios-bell-outline"></i> <div class="item item-icon-left item-icon-right" href ui-sref="tabs.termsOfUse">
<span translate>Terms of Use</span> <i class="icon ion-ios-list-outline"></i>
</div> <span translate>Terms of Use</span>
<div class="item item-icon-left" href ui-sref="tabs.translators"> <i class="icon ion-ios-arrow-right"></i>
<i class="icon ion-ios-bell-outline"></i> </div>
<span translate>Translators</span> <div class="item item-icon-left item-icon-right" href ui-sref="tabs.translators">
</div> <i class="icon ion-ios-people-outline"></i>
<div class="item item-icon-left" href ui-sref="tabs.logs"> <span translate>Translators</span>
<i class="icon ion-ios-bell-outline"></i> <i class="icon ion-ios-arrow-right"></i>
<span translate>Session log</span> </div>
<div class="item item-icon-left item-icon-right" href ui-sref="tabs.logs">
<i class="icon ion-ios-copy-outline"></i>
<span translate>Session log</span>
<i class="icon ion-ios-arrow-right"></i>
</div>
</div> </div>
</ion-content> </ion-content>
</ion-view> </ion-view>

View file

@ -6,12 +6,18 @@
</ion-nav-bar> </ion-nav-bar>
<ion-content ng-controller="preferencesAliasController" > <ion-content ng-controller="preferencesAliasController" >
<form name="aliasForm" ng-submit="save(aliasForm)" novalidate> <form name="aliasForm" ng-submit="save(aliasForm)" novalidate>
<label class="item item-input item-stacked-label"> <div class="card list">
<span class="input-label" transalate>Alias for {{walletName}}</span> <label class="item item-input item-stacked-label">
<input type="text" id="alias" name="alias" ng-model="alias" placeholder="John" required></input> <span class="input-label" transalate>Alias for {{walletName}}</span>
</label> <input type="text" id="alias" name="alias" ng-model="alias" placeholder="John" required>
<input type="submit" class="button button-block button-stable" value="{{'Save'|translate}}" ng-disabled="aliasForm.$invalid"> </label>
</div>
<button type="submit"
class="button button-block button-positive"
ng-disabled="aliasForm.$invalid" translate>
Save
</button>
</form> </form>
<div translate>Changing wallet alias only affects the local wallet name.</div> <div class="text-center" translate>Changing wallet alias only affects the local wallet name.</div>
</ion-content> </ion-content>
</ion-view> </ion-view>

View file

@ -6,17 +6,15 @@
</ion-nav-bar> </ion-nav-bar>
<ion-content ng-controller="preferencesBwsUrlController"> <ion-content ng-controller="preferencesBwsUrlController">
<div class="row no-border"> <div class="card list">
<div class="col col-90"> <label class="item item-input item-stacked-label no-border">
<label class="item item-input item-stacked-label no-border"> <span class="input-label">Wallet Service URL</span>
<span class="input-label" transalate>Wallet Service URL</span> <input type="text" id="bwsurl" type="text" name="bwsurl" ng-model="bwsurl">
<input type="text" id="bwsurl" type="text" name="bwsurl" ng-model="bwsurl"> <a class="postfix" on-tap="resetDefaultUrl()">
</label> <i class="icon ion-ios-reload"></i>
</div> </a>
<div class="col"> </label>
<i class="icon ion-ios-reload" ng-click="resetDefaultUrl()"></i>
</div>
</div> </div>
<button class="button button-block button-balanced" ng-click="save()" translate>Save</button> <button class="button button-block button-positive" ng-click="save()" translate>Save</button>
</ion-content> </ion-content>
</ion-view> </ion-view>

View file

@ -4,12 +4,14 @@
<i class="icon ion-ios-arrow-thin-left"></i> <i class="icon ion-ios-arrow-thin-left"></i>
</ion-nav-back-button> </ion-nav-back-button>
</ion-nav-bar> </ion-nav-bar>
<ion-content class="has-header" ng-controller="preferencesDeleteWalletController" > <ion-content ng-controller="preferencesDeleteWalletController" >
<div translate>Warning!</div> <div class="card">
<div translate>Permanently delete this wallet. THIS ACTION CANNOT BE REVERSED</div> <h1 class="text-center" translate>Warning!</h2>
<div class="right" ng-style="{'color':backgroundColor}" ng-show="!isDeletingWallet"> <div class="assertive padding" translate>Permanently delete this wallet. THIS ACTION CANNOT BE REVERSED</div>
<span ng-show="alias">{{alias}}</span>{{walletName}} <div class="text-center padding">
<span ng-show="alias">{{alias}}</span>{{walletName}}
</div>
</div> </div>
<button class="button button-block button-stable" ng-click="showDeletePopup()"translate>Delete wallet</button> <button class="button button-block button-assertive" ng-click="showDeletePopup()"translate>Delete</button>
</ion-content> </ion-content>
</ion-view> </ion-view>

View file

@ -6,13 +6,19 @@
</ion-nav-bar> </ion-nav-bar>
<ion-content ng-controller="preferencesEmailController" > <ion-content ng-controller="preferencesEmailController" >
<form name="emailForm" ng-submit="save(emailForm)" novalidate> <form name="emailForm" ng-submit="save(emailForm)" novalidate>
<label class="item item-input item-stacked-label"> <div class="card list">
<span class="input-label" transalate>Email for wallet notifications</span> <label class="item item-input item-stacked-label">
<input type="email" id="email" name="email" ng-model="email" required></input> <span class="input-label" transalate>Email for wallet notifications</span>
</label> <input type="email" id="email" name="email" ng-model="email" required></input>
<input type="submit" class="button button-block button-stable" value="{{'Save'|translate}}" ng-disabled="emailForm.$invalid"> </label>
</div>
<button type="submit"
class="button button-block button-positive"
ng-disabled="emailForm.$invalid" translate>
Save
</button>
</form> </form>
<div translate>Setting up email notifications could weaken your privacy, if the wallet service provider is compromised. Information available to an attacker would include your wallet addresses and its balance, but no more. <div class="text-center" translate>Setting up email notifications could weaken your privacy, if the wallet service provider is compromised. Information available to an attacker would include your wallet addresses and its balance, but no more.
</div> </div>
</ion-content> </ion-content>
</ion-view> </ion-view>

View file

@ -6,19 +6,17 @@
</ion-nav-bar> </ion-nav-bar>
<ion-content ng-controller="preferencesFeeController" ng-init="init()"> <ion-content ng-controller="preferencesFeeController" ng-init="init()">
<div ng-show="loading"> <ion-radio ng-repeat="fee in feeLevels.livenet" ng-value="fee.level" ng-model="currentFeeLevel" ng-click="save(fee)">
<ion-spinner class="spinner-dark" icon="lines">Loading...</ion-spinner> {{feeOpts[fee.level]|translate}}
</div>
<ion-radio ng-repeat="fee in feeLevels.livenet" ng-value="fee.level" ng-model="currentFeeLevel" ng-click="save(fee)">{{feeOpts[fee.level]|translate}}
</ion-radio> </ion-radio>
<div ng-repeat="fee in feeLevels.livenet" ng-if="fee.level == currentFeeLevel"> <div class="padding text-center positive" ng-repeat="fee in feeLevels.livenet" ng-if="fee.level == currentFeeLevel">
<div ng-show="fee.nbBlocks"> <div ng-show="fee.nbBlocks">
<span translate>Average confirmation time: {{fee.nbBlocks * 10}} minutes</span>. <span translate>Average confirmation time: {{fee.nbBlocks * 10}} minutes</span>.
</div>
<span translate>Current fee rate for this policy: {{fee.feePerKBUnit}}/kiB</span>
</div>
<div translate>
Bitcoin transactions may include a fee collected by miners on the network. The higher the fee, the greater the incentive a miner has to include that transaction in a block. Current fees are determined based on network load and the selected policy.
</div> </div>
<span translate>Current fee rate for this policy: {{fee.feePerKBUnit}}/kiB</span>
</div>
<div class="padding" translate>
Bitcoin transactions may include a fee collected by miners on the network. The higher the fee, the greater the incentive a miner has to include that transaction in a block. Current fees are determined based on network load and the selected policy.
</div>
</ion-content> </ion-content>
</ion-view> </ion-view>

View file

@ -6,7 +6,7 @@
</ion-nav-bar> </ion-nav-bar>
<ion-content ng-controller="preferencesHistory" ng-init="index.updatingTxHistory ? null : csvHistory()"> <ion-content ng-controller="preferencesHistory" ng-init="index.updatingTxHistory ? null : csvHistory()">
<div class="item item-divider"></div> <div class="item item-divider"></div>
<div class="item" ng-show="csvReady && !index.isCordova" ng-csv="csvContent" csv-header="csvHeader" filename="Copay-{{index.alias || index.walletName}}.csv"> <div class="item" ng-show="csvReady && !index.isCordova" ng-csv="csvContent" csv-header="csvHeader" filename="Copay-{{wallet.name}}.csv">
<span translate>Export to file</span> <span translate>Export to file</span>
</div> </div>
<div class="item" ng-show="!csvReady && !index.isCordova"> <div class="item" ng-show="!csvReady && !index.isCordova">
@ -15,7 +15,7 @@
preparing... preparing...
</span> </span>
</div> </div>
<div class="item" ng-click="clearTransactionHistory()"> <div class="item assertive" ng-click="clearTransactionHistory()">
<span translate>Clear cache</span> <span translate>Clear cache</span>
</div> </div>
</ion-content> </ion-content>

View file

@ -6,9 +6,7 @@
</ion-nav-bar> </ion-nav-bar>
<ion-content ng-controller="preferencesInformation" ng-init="init()"> <ion-content ng-controller="preferencesInformation" ng-init="init()">
<div class="list"> <div class="list">
<div class="item item-divider"> <div class="item item-divider"></div>
Wallet Information
</div>
<div class="item" ng-click="saveBlack()"> <div class="item" ng-click="saveBlack()">
<span translate>Wallet Name (at creation)</span> <span translate>Wallet Name (at creation)</span>
<span class="item-note"> <span class="item-note">
@ -64,23 +62,23 @@
</span> </span>
</div> </div>
<div class="item item-divider"> <div ng-show="wallet.cachedStatus.wallet.copayers[0]" class="item item-divider">
Copayers Copayers
</div> </div>
<div class="item item-icon-right" ng-repeat="copayer in wallet.copayers"> <div class="item item-icon-right" ng-repeat="copayer in wallet.cachedStatus.wallet.copayers">
<span ng-show="copayer.id == wallet.copayerId" translate>{{copayer.name}} ({{'Me'|translate}})</span> {{copayer.name}}
<span ng-style="{'color': 'grey';}" ng-show="copayer.id != wallet.copayerId" translate>{{copayer.name}}</span> <span ng-show="copayer.id == wallet.copayerId">
<i class="icon ion-ios-checkmark-outline"></i> ({{'Me'|translate}})
</span>
</div> </div>
<div class="item item-divider"> <div class="item item-divider" translate>
Extended Public Keys Extended Public Keys
</div> </div>
<div class="item" ng-repeat="pk in pubKeys" copy-to-clipboard="pk"> <div class="item" ng-repeat="pk in pubKeys" copy-to-clipboard="pk">
<span translate>Copayer {{$index}}<</span> <span translate>Copayer {{$index}}</span>
<i class="icon ion-ios-checkmark-outline"></i>
<span class="item-note"> <span class="item-note">
<span>Copayer {{$index}}</span> <span>Copayer {{$index}}</span>
<span>{{pk}}</span> <span>{{pk}}</span>
@ -89,27 +87,27 @@
</div> </div>
<div ng-show="addrs"> <div ng-show="addrs">
<div class="item item-divider"> <div class="item item-divider" translate>
Last Wallet Addresses Last Wallet Addresses
</div> </div>
<div class="item" ng-repeat="a in addrs" class="oh" copy-to-clipboard="a.address"> <div class="item" ng-repeat="a in addrs" class="oh" copy-to-clipboard="a.address">
<span>{{a.address}}</span> <span>{{a.address}}</span>
<span>{{a.path}} &middot; {{a.createdOn *1000 | amDateFormat:'MMMM Do YYYY, h:mm a' }}</span> <span class="item-note">{{a.path}} &middot; {{a.createdOn *1000 | amDateFormat:'MMMM Do YYYY, h:mm a' }}</span>
<i class="icon ion-ios-checkmark-outline"></i>
</div> </div>
<div translate> <div class="padding text-center" translate>
Only Main (not change) addresses are shown. The addresses on this list were not verified locally at this time. Only Main (not change) addresses are shown. The addresses on this list were not verified locally at this time.
</div> </div>
<button class="button button-block button-positive" ng-click="scan()" translate> <button class="button button-block button-positive" ng-click="scan()" translate>
Scan addresses for funds Scan addresses for funds
</button> </button>
<button class="button button-block button-positive" ng-show="isCordova" ng-click="sendAddrs()" translate> <button class="button button-block button-positive" ng-show="isCordova" ng-click="sendAddrs()" translate>
Send addresses by email Send addresses by email
</button> </button>
</div>
<div ng-show="wallet.balanceByAddress" ng-if="wallet.balanceByAddress[0]"> <div ng-show="wallet.balanceByAddress[0]">
<div class="item item-divider"> <div class="item item-divider" translate>
Balance By Address Balance By Address
</div> </div>
<div class="item" ng-repeat="a in wallet.balanceByAddress" copy-to-clipboard="a.address"> <div class="item" ng-repeat="a in wallet.balanceByAddress" copy-to-clipboard="a.address">

View file

@ -8,10 +8,12 @@
<ion-radio ng-repeat="lang in availableLanguages" ng-value="lang.isoCode" ng-model="currentLanguage" <ion-radio ng-repeat="lang in availableLanguages" ng-value="lang.isoCode" ng-model="currentLanguage"
ng-click="save(lang.isoCode)">{{lang.name}} ng-click="save(lang.isoCode)">{{lang.name}}
</ion-radio> </ion-radio>
<span translate>All contributions to Copay's translation are welcome. Sign up at crowdin.com and join the Copay project at</span> <div class="padding">
<a ng-click="$root.openExternalLink('https://crowdin.com/project/copay', '_system')">https://crowdin.com/project/copay</a>. <span translate>All contributions to Copay's translation are welcome. Sign up at crowdin.com and join the Copay project at</span>
<span translate> <a ng-click="openExternalLink('https://crowdin.com/project/copay', '_system')">https://crowdin.com/project/copay</a>.
Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language. <span translate>
</span> Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language.
</span>
</div>
</ion-content> </ion-content>
</ion-view> </ion-view>

View file

@ -4,16 +4,25 @@
<i class="icon ion-ios-arrow-thin-left"></i> <i class="icon ion-ios-arrow-thin-left"></i>
</ion-nav-back-button> </ion-nav-back-button>
</ion-nav-bar> </ion-nav-bar>
<ion-content ng-controller="preferencesLogs" ng-init="init()" > <ion-content ng-controller="preferencesLogs" ng-init="init()">
<button ng-show="isCordova" ng-click="logs.sendLogs()"><i class="fi-mail"></i> <div class="card">
<span translate>Send by email</span> <div class="item item-text-wrap">
<ul>
<li ng-repeat="l in logs">
<span ng-class="{'energized': l.level=='warn', 'dark': l.level=='debug', 'positive': l.level=='info', 'assertive': l.level=='error' }">
{{l.msg}}
</span>
</li>
</ul>
</div>
</div>
<button class="button button-block button-positive" copy-to-clipboard="prepare()">
<i class="icon ion-clipboard"></i>
<span translate>Copy to clipboard</span>
</button>
<button class="button button-block button-positive" ng-show="isCordova" ng-click="sendLogs()">
<i class="icon ion-ios-email-outline"></i>
<span translate>Send by email</span>
</button> </button>
<ul>
<li ng-repeat="l in logs">
<span ng-class="{'text-warning': l.level=='warn', 'text-secondary': l.level=='debug', 'text-primary': l.level=='info', 'text-alert': l.level=='error' }">
{{l.msg}}
</span>
</li>
</ul>
</ion-content> </ion-content>
</ion-view> </ion-view>

View file

@ -6,7 +6,6 @@
<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>
<div class="item item-icon-left" ng-click="openAddressbookModal()"> <div 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>
@ -14,36 +13,40 @@
<div class="item item-divider" translate>Preferences</div> <div class="item item-divider" translate>Preferences</div>
<div class="item item-icon-left" href ui-sref="tabs.language"> <div class="item item-icon-left item-icon-right" ui-sref="tabs.language">
<i class="icon ion-ios-chatbubble-outline"></i> <i class="icon ion-ios-chatbubble-outline"></i>
<span translate>Language</span> <span translate>Language</span>
<span class="item-note"> <span class="item-note">
{{currentLanguageName|translate}} {{currentLanguageName|translate}}
</span> </span>
<i class="icon ion-ios-arrow-right"></i>
</div> </div>
<div class="item item-icon-left" href ui-sref="tabs.unit"> <div class="item item-icon-left item-icon-right" ui-sref="tabs.unit">
<i class="icon ion-ios-calculator-outline"></i> <i class="icon ion-ios-calculator-outline"></i>
<span translate>Unit</span> <span translate>Unit</span>
<span class="item-note"> <span class="item-note">
{{unitName}} {{unitName}}
</span> </span>
<i class="icon ion-ios-arrow-right"></i>
</div> </div>
<div class="item item-icon-left" href ui-sref="tabs.altCurrency"> <div class="item item-icon-left item-icon-right" ui-sref="tabs.altCurrency">
<i class="icon ion-social-usd-outline"></i> <i class="icon ion-social-usd-outline"></i>
<span translate>Alternative Currency</span> <span translate>Alternative Currency</span>
<span class="item-note"> <span class="item-note">
{{selectedAlternative.name}} {{selectedAlternative.name}}
</span> </span>
<i class="icon ion-ios-arrow-right"></i>
</div> </div>
<div class="item item-icon-left" href ui-sref="tabs.fee"> <div class="item item-icon-left item-icon-right" ui-sref="tabs.fee">
<i class="icon ion-ios-film-outline"></i> <i class="icon ion-social-bitcoin-outline"></i>
<span translate>Bitcoin Network Fee Policy</span> <span translate>Bitcoin Network Fee Policy</span>
<span class="item-note"> <span class="item-note">
{{feeOpts[currentFeeLevel]|translate}} {{feeOpts[currentFeeLevel]|translate}}
</span> </span>
<i class="icon ion-ios-arrow-right"></i>
</div> </div>
<div ng-show="usePushNotifications && PNEnabledByUser"> <div ng-show="usePushNotifications && PNEnabledByUser">
@ -80,8 +83,8 @@
<span class="toggle-label" translate>Use Unconfirmed Funds</span> <span class="toggle-label" translate>Use Unconfirmed Funds</span>
</ion-toggle> </ion-toggle>
<div class="item item-divider" translate>Wallets Settings</div> <div class="item item-divider" translate>Wallets Preferences</div>
<div class="item item-icon-left" href <div class="item item-icon-left item-icon-right" href
ui-sref="tabs.preferences.main({'walletId': item.id})" ui-sref="tabs.preferences.main({'walletId': item.id})"
ng-repeat="item in wallets track by $index"> ng-repeat="item in wallets track by $index">
<i class="icon ion-briefcase size-21" ng-style="{'color':item.color}"></i> <i class="icon ion-briefcase size-21" ng-style="{'color':item.color}"></i>
@ -92,14 +95,15 @@
<span class="badge badge-assertive" ng-show="!item.isComplete()" translate> <span class="badge badge-assertive" ng-show="!item.isComplete()" translate>
Incomplete Incomplete
</span> </span>
<i class="icon ion-ios-arrow-right"></i>
</div> </div>
<div class="item item-divider"></div> <div class="item item-divider"></div>
<div class="item item-icon-left" href ui-sref="tabs.about"> <div class="item item-icon-left item-icon-right" href ui-sref="tabs.about">
<i class="icon ion-ios-film-outline"></i> <i class="icon ion-ios-information-outline"></i>
<span translate>About Bitpay Wallet</span> <span translate>About</span> {{appName}}
<i class="icon ion-ios-arrow-right"></i>
</div> </div>
<div class="item item-divider"></div>
</div> </div>
</ion-content> </ion-content>
</ion-view> </ion-view>

View file

@ -5,14 +5,14 @@
</ion-nav-back-button> </ion-nav-back-button>
</ion-nav-bar> </ion-nav-bar>
<ion-content ng-controller="termOfUseController" cache-view="false"> <ion-content class="padding" ng-controller="termOfUseController">
<p> <div class="card">
<div ng-include="'views/includes/terms.html'"></div> <div class="item item-text-wrap" ng-include="'views/includes/terms.html'"></div>
</p> </div>
<div class="row"> <button class="button button-block button-positive"
<p ng-show="lang != 'en'"> ng-show="lang != 'en'"
<a ng-click="$root.openExternalLink('https://copay.io/disclaimer')" translate>Official English Disclaimer</a> ng-click="openExternalLink(disclaimerUrl)" translate>
</p> Official English Disclaimer
</div> </button>
</ion-content> </ion-content>
</ion-view> </ion-view>

View file

@ -5,29 +5,29 @@
<i class="icon ion-ios-arrow-thin-left"></i> <i class="icon ion-ios-arrow-thin-left"></i>
</ion-nav-back-button> </ion-nav-back-button>
</ion-nav-bar> </ion-nav-bar>
<ion-content> <ion-content ng-controller="translatorsController">
<h4 translate>Translation Credits</h4> <div class="list">
<ul> <div class="item item-divider" translate>
<li >kinoshitajona<span translate>Japanese</span></li> Translation Credits
<li >Kirvx<span translate>French</span></li>
<li >saschad<span translate>German</span></li>
<li >cmgustavo83<span translate>Spanish</span></li>
<li >RussianNeuroMancer<span translate>Russian</span></li>
<li >HostFat<span translate>Italian</span></li>
<li >xm2hi<span translate>Chinese</span></li>
<li >Pirx1618<span translate>Polish</span></li>
<li >mareksip<span translate>Czech</span></li>
</ul>
<div class="row">
<div class="columns">
<p>
<span translate>All contributions to Copay's translation are welcome. Sign up at crowdin.com and join the Copay project at</span>
<a ng-click="$root.openExternalLink('https://crowdin.com/project/copay', '_system')">https://crowdin.com/project/copay</a>.
</p>
<spantranslate>
Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language.
</span>
</div>
</div> </div>
<div class="item">kinoshitajona<span class="item-note" translate>Japanese</span></div>
<div class="item">Kirvx<span class="item-note" translate>French</span></div>
<div class="item">saschad<span class="item-note" translate>German</span></div>
<div class="item">cmgustavo83<span class="item-note" translate>Spanish</span></div>
<div class="item">RussianNeuroMancer<span class="item-note" translate>Russian</span></div>
<div class="item">HostFat<span class="item-note" translate>Italian</span></div>
<div class="item">xm2hi<span class="item-note" translate>Chinese</span></div>
<div class="item">Pirx1618<span class="item-note" translate>Polish</span></div>
<div class="item">mareksip<span class="item-note" translate>Czech</span></div>
</div>
<div class="padding">
<p>
<span translate>All contributions to Copay's translation are welcome. Sign up at crowdin.com and join the Copay project at</span>
<a ng-click="openExternalLink('https://crowdin.com/project/copay', '_system')">https://crowdin.com/project/copay</a>.
</p>
<span translate>
Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language.
</span>
</div>
</ion-content> </ion-content>
</ion-view> </ion-view>

View file

@ -94,7 +94,7 @@
</div> </div>
</div> </div>
<div class="release size-12" ng-show="newRelease" ng-click="$root.openExternalLink('https://github.com/bitpay/copay/releases/latest')"> <div class="release size-12" ng-show="newRelease" ng-click="openExternalLink('https://github.com/bitpay/copay/releases/latest')">
<span>{{newRelease}}</span><i class="icon-arrow-right3 right size-18"></i> <span>{{newRelease}}</span><i class="icon-arrow-right3 right size-18"></i>
</div> </div>

View file

@ -1,15 +1,10 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('amazonController', angular.module('copayApp.controllers').controller('amazonController',
function($scope, $timeout, $ionicModal, $log, lodash, bwcError, amazonService, platformInfo, nodeWebkit, popupService) { function($scope, $timeout, $ionicModal, $log, lodash, bwcError, amazonService, platformInfo, externalLinkService, popupService) {
$scope.openExternalLink = function(url, target) { $scope.openExternalLink = function(url, target) {
if (platformInfo.isNW) { externalLinkService.open(url, target);
nodeWebkit.openExternalLink(url);
} else {
target = target || '_blank';
var ref = window.open(url, target, 'location=no');
}
}; };
this.init = function() { this.init = function() {

View file

@ -1,7 +1,7 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('buyAmazonController', angular.module('copayApp.controllers').controller('buyAmazonController',
function($scope, $log, $timeout, $state, lodash, profileService, bwcError, gettextCatalog, configService, walletService, amazonService, ongoingProcess, platformInfo, nodeWebkit, popupService) { function($scope, $log, $timeout, $state, lodash, profileService, bwcError, gettextCatalog, configService, walletService, amazonService, ongoingProcess, platformInfo, externalLinkService, popupService) {
var self = this; var self = this;
var wallet; var wallet;
@ -16,12 +16,7 @@ angular.module('copayApp.controllers').controller('buyAmazonController',
}); });
$scope.openExternalLink = function(url, target) { $scope.openExternalLink = function(url, target) {
if (platformInfo.isNW) { externalLinkService.open(url, target);
nodeWebkit.openExternalLink(url);
} else {
target = target || '_blank';
var ref = window.open(url, target, 'location=no');
}
}; };
this.init = function() { this.init = function() {

View file

@ -1,15 +1,10 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('glideraController', angular.module('copayApp.controllers').controller('glideraController',
function($scope, $timeout, $ionicModal, $log, storageService, glideraService, ongoingProcess, platformInfo, nodeWebkit, popupService, gettextCatalog) { function($scope, $timeout, $ionicModal, $log, storageService, glideraService, ongoingProcess, platformInfo, externalLinkService, popupService, gettextCatalog) {
$scope.openExternalLink = function(url, target) { $scope.openExternalLink = function(url, target) {
if (platformInfo.isNW) { externalLinkService.open(url, target);
nodeWebkit.openExternalLink(url);
} else {
target = target || '_blank';
var ref = window.open(url, target, 'location=no');
}
}; };
$scope.init = function(accessToken) { $scope.init = function(accessToken) {

View file

@ -1,6 +1,6 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('txDetailsController', function($rootScope, $log, $scope, $filter, $stateParams, $ionicPopup, gettextCatalog, profileService, configService, lodash, txFormatService, platformInfo) { angular.module('copayApp.controllers').controller('txDetailsController', function($rootScope, $log, $scope, $filter, $stateParams, $ionicPopup, gettextCatalog, profileService, configService, lodash, txFormatService, platformInfo, externalLinkService) {
var self = $scope.self; var self = $scope.self;
var wallet = profileService.getWallet($stateParams.walletId); var wallet = profileService.getWallet($stateParams.walletId);
@ -81,12 +81,7 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio
}; };
$scope.openExternalLink = function(url, target) { $scope.openExternalLink = function(url, target) {
if (platformInfo.isNW) { externalLinkService.open(url, target);
nodeWebkit.openExternalLink(url);
} else {
target = target || '_blank';
var ref = window.open(url, target, 'location=no');
}
}; };
$scope.getShortNetworkName = function() { $scope.getShortNetworkName = function() {

View file

@ -1,6 +1,6 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('termsController', function($scope, $log, $state, uxLanguage, profileService) { angular.module('copayApp.controllers').controller('termsController', function($scope, $log, $state, uxLanguage, profileService, externalLinkService) {
$scope.lang = uxLanguage.currentLanguage; $scope.lang = uxLanguage.currentLanguage;
$scope.confirm = function() { $scope.confirm = function() {
@ -12,4 +12,8 @@ angular.module('copayApp.controllers').controller('termsController', function($s
}); });
}; };
$scope.openExternalLink = function(url, target) {
externalLinkService.open(url, target);
};
}); });

View file

@ -2,7 +2,7 @@
angular.module('copayApp.controllers').controller('preferencesController', angular.module('copayApp.controllers').controller('preferencesController',
function($scope, $rootScope, $timeout, $log, $stateParams, $ionicHistory, $ionicNavBarDelegate, gettextCatalog, configService, profileService, fingerprintService, walletService) { function($scope, $rootScope, $timeout, $log, $stateParams, $ionicHistory, $ionicNavBarDelegate, gettextCatalog, configService, profileService, fingerprintService, walletService) {
$ionicNavBarDelegate.title(gettextCatalog.getString('Preferences')); $ionicNavBarDelegate.title(gettextCatalog.getString('Wallet Preferences'));
var wallet = profileService.getWallet($stateParams.walletId); var wallet = profileService.getWallet($stateParams.walletId);
var walletId = wallet.credentials.walletId; var walletId = wallet.credentials.walletId;
$scope.wallet = wallet; $scope.wallet = wallet;
@ -14,9 +14,6 @@ angular.module('copayApp.controllers').controller('preferencesController',
return $ionicHistory.goBack(); return $ionicHistory.goBack();
var config = configService.getSync(); var config = configService.getSync();
config.aliasFor = config.aliasFor || {};
$scope.alias = config.aliasFor[walletId] || wallet.credentials.walletName;
$scope.color = config.colorFor[walletId] || '#4A90E2';
$scope.encryptEnabled = walletService.isEncrypted(wallet); $scope.encryptEnabled = walletService.isEncrypted(wallet);
if (wallet.isPrivKeyExternal) if (wallet.isPrivKeyExternal)

View file

@ -1,9 +1,14 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('preferencesAbout', angular.module('copayApp.controllers').controller('preferencesAbout',
function($scope, $window, $ionicNavBarDelegate, gettextCatalog) { function($scope, $window, $ionicNavBarDelegate, gettextCatalog, externalLinkService) {
$ionicNavBarDelegate.title(gettextCatalog.getString('About Copay')); $ionicNavBarDelegate.title(gettextCatalog.getString('About') + ' ' + $window.appConfig.nameCase);
$scope.version = $window.version; $scope.version = $window.version;
$scope.commitHash = $window.commitHash; $scope.commitHash = $window.commitHash;
$scope.name = $window.appConfig.gitHubRepoName;
$scope.openExternalLink = function(url, target) {
externalLinkService.open(url, target);
};
}); });

View file

@ -8,9 +8,8 @@ angular.module('copayApp.controllers').controller('preferencesAliasController',
var walletId = wallet.credentials.walletId; var walletId = wallet.credentials.walletId;
var config = configService.getSync(); var config = configService.getSync();
config.aliasFor = config.aliasFor || {};
$scope.walletName = wallet.credentials.walletName; $scope.walletName = wallet.credentials.walletName;
$scope.alias = config.aliasFor[walletId] || wallet.walletName; $scope.alias = (config.aliasFor && config.aliasFor[walletId]) || wallet.walletName;
$scope.save = function() { $scope.save = function() {
var opts = { var opts = {

View file

@ -1,32 +1,17 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('preferencesDeleteWalletController', angular.module('copayApp.controllers').controller('preferencesDeleteWalletController',
function($scope, $ionicPopup, $stateParams, $ionicNavBarDelegate, $ionicHistory, gettextCatalog, lodash, profileService, $state, ongoingProcess, popupService) { function($scope, $stateParams, $ionicNavBarDelegate, $ionicHistory, gettextCatalog, lodash, profileService, $state, ongoingProcess, popupService) {
$ionicNavBarDelegate.title(gettextCatalog.getString('Delete Wallet')); $ionicNavBarDelegate.title(gettextCatalog.getString('Delete'));
var wallet = profileService.getWallet($stateParams.walletId); var wallet = profileService.getWallet($stateParams.walletId);
$scope.alias = lodash.isEqual(wallet.name, wallet.credentials.walletName) ? null : wallet.name + ' '; $scope.alias = lodash.isEqual(wallet.name, wallet.credentials.walletName) ? null : wallet.name + ' ';
$scope.walletName = '[' + wallet.credentials.walletName + ']'; $scope.walletName = '[' + wallet.credentials.walletName + ']';
$scope.showDeletePopup = function() { $scope.showDeletePopup = function() {
var popup = $ionicPopup.show({ var title = gettextCatalog.getString('Warning!');
template: '<span>' + gettextCatalog.getString('Are you sure you want to delete this wallet?') + '</span>', var message = gettextCatalog.getString('Are you sure you want to delete this wallet?');
title: gettextCatalog.getString('Confirm'), popupService.showConfirm(title, message, function(res) {
buttons: [ if (res) deleteWallet();
{
text: gettextCatalog.getString('Cancel'),
onTap: function(e) {
popup.close();
}
},
{
text: gettextCatalog.getString('Accept'),
type: 'button-positive',
onTap: function(e) {
deleteWallet();
popup.close();
}
}
]
}); });
}; };

View file

@ -1,12 +1,12 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('preferencesFeeController', function($scope, $timeout, $ionicHistory, $ionicNavBarDelegate, gettextCatalog, configService, feeService) { angular.module('copayApp.controllers').controller('preferencesFeeController', function($scope, $timeout, $ionicHistory, $ionicNavBarDelegate, gettextCatalog, configService, feeService, ongoingProcess) {
$ionicNavBarDelegate.title(gettextCatalog.getString('Preferences fee')); $ionicNavBarDelegate.title(gettextCatalog.getString('Bitcoin Network Fee Policy'));
$scope.init = function() { $scope.init = function() {
$scope.loading = true; ongoingProcess.set('gettingFeeLevels', true);
feeService.getFeeLevels(function(levels) { feeService.getFeeLevels(function(levels) {
$scope.loading = false; ongoingProcess.set('gettingFeeLevels', false);
$scope.feeOpts = feeService.feeOpts; $scope.feeOpts = feeService.feeOpts;
$scope.currentFeeLevel = feeService.getCurrentFeeLevel(); $scope.currentFeeLevel = feeService.getCurrentFeeLevel();
$scope.feeLevels = levels; $scope.feeLevels = levels;
@ -29,7 +29,7 @@ angular.module('copayApp.controllers').controller('preferencesFeeController', fu
$ionicHistory.goBack(); $ionicHistory.goBack();
$timeout(function() { $timeout(function() {
$scope.$apply(); $scope.$apply();
}, 10); }, 100);
}); });
}; };
}); });

View file

@ -3,15 +3,14 @@
angular.module('copayApp.controllers').controller('preferencesHistory', angular.module('copayApp.controllers').controller('preferencesHistory',
function($scope, $log, $stateParams, $timeout, $ionicNavBarDelegate, gettextCatalog, storageService, $state, $ionicHistory, profileService, lodash) { function($scope, $log, $stateParams, $timeout, $ionicNavBarDelegate, gettextCatalog, storageService, $state, $ionicHistory, profileService, lodash) {
$ionicNavBarDelegate.title(gettextCatalog.getString('Transaction History')); $ionicNavBarDelegate.title(gettextCatalog.getString('Transaction History'));
var wallet = profileService.getWallet($stateParams.walletId); $scope.wallet = profileService.getWallet($stateParams.walletId);
var c = wallet.credentials;
$scope.csvReady = false; $scope.csvReady = false;
$scope.csvHistory = function(cb) { $scope.csvHistory = function(cb) {
var allTxs = []; var allTxs = [];
function getHistory(cb) { function getHistory(cb) {
storageService.getTxHistory(c.walletId, function(err, txs) { storageService.getTxHistory($scope.wallet.id, function(err, txs) {
if (err) return cb(err); if (err) return cb(err);
var txsFromLocal = []; var txsFromLocal = [];
@ -40,7 +39,7 @@ angular.module('copayApp.controllers').controller('preferencesHistory',
var data = txs; var data = txs;
var satToBtc = 1 / 100000000; var satToBtc = 1 / 100000000;
$scope.csvContent = []; $scope.csvContent = [];
$scope.csvFilename = 'Copay-' + ($scope.alias || $scope.walletName) + '.csv'; $scope.csvFilename = 'Copay-' + $scope.wallet.name + '.csv';
$scope.csvHeader = ['Date', 'Destination', 'Description', 'Amount', 'Currency', 'Txid', 'Creator', 'Copayers', 'Comment']; $scope.csvHeader = ['Date', 'Destination', 'Description', 'Amount', 'Currency', 'Txid', 'Creator', 'Copayers', 'Comment'];
var _amount, _note, _copayers, _creator, _comment; var _amount, _note, _copayers, _creator, _comment;
@ -118,7 +117,7 @@ angular.module('copayApp.controllers').controller('preferencesHistory',
}; };
$scope.clearTransactionHistory = function() { $scope.clearTransactionHistory = function() {
storageService.removeTxHistory(c.walletId, function(err) { storageService.removeTxHistory($scope.wallet.id, function(err) {
if (err) { if (err) {
$log.error(err); $log.error(err);
return; return;

View file

@ -1,9 +1,13 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('preferencesLanguageController', angular.module('copayApp.controllers').controller('preferencesLanguageController',
function($scope, $log, $ionicNavBarDelegate, $ionicHistory, gettextCatalog, configService, profileService, uxLanguage, walletService) { function($scope, $log, $ionicNavBarDelegate, $ionicHistory, gettextCatalog, configService, profileService, uxLanguage, walletService, externalLinkService) {
$ionicNavBarDelegate.title(gettextCatalog.getString('Language')); $ionicNavBarDelegate.title(gettextCatalog.getString('Language'));
$scope.openExternalLink = function(url, target) {
externalLinkService.open(url, target);
};
$scope.init = function() { $scope.init = function() {
$scope.availableLanguages = uxLanguage.getLanguages(); $scope.availableLanguages = uxLanguage.getLanguages();
$scope.currentLanguage = uxLanguage.getCurrentLanguage(); $scope.currentLanguage = uxLanguage.getCurrentLanguage();

View file

@ -8,13 +8,19 @@ angular.module('copayApp.controllers').controller('preferencesLogs',
$scope.logs = historicLog.get(); $scope.logs = historicLog.get();
} }
$scope.sendLogs = function() { $scope.prepare = function() {
var body = 'Copay Session Logs\n Be careful, this could contain sensitive private data\n\n'; var log = 'Copay Session Logs\n Be careful, this could contain sensitive private data\n\n';
body += '\n\n'; log += '\n\n';
body += $scope.logs.map(function(v) { log += $scope.logs.map(function(v) {
return v.msg; return v.msg;
}).join('\n'); }).join('\n');
return log;
};
$scope.sendLogs = function() {
var body = $scope.prepare();
window.plugins.socialsharing.shareViaEmail( window.plugins.socialsharing.shareViaEmail(
body, body,
'Copay Logs', 'Copay Logs',

View file

@ -1,6 +1,6 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('tabSettingsController', function($scope, $rootScope, $log, $ionicModal, lodash, configService, uxLanguage, platformInfo, pushNotificationsService, profileService, feeService) { angular.module('copayApp.controllers').controller('tabSettingsController', function($scope, $rootScope, $log, $ionicModal, $window, lodash, configService, uxLanguage, platformInfo, pushNotificationsService, profileService, feeService) {
$scope.init = function() { $scope.init = function() {
@ -9,6 +9,8 @@ angular.module('copayApp.controllers').controller('tabSettingsController', funct
var isWP = platformInfo.isWP; var isWP = platformInfo.isWP;
var isIOS = platformInfo.isIOS; var isIOS = platformInfo.isIOS;
$scope.appName = $window.appConfig.nameCase;
$scope.unitName = config.wallet.settings.unitName; $scope.unitName = config.wallet.settings.unitName;
$scope.currentLanguageName = uxLanguage.getCurrentLanguageName(); $scope.currentLanguageName = uxLanguage.getCurrentLanguageName();
$scope.selectedAlternative = { $scope.selectedAlternative = {

View file

@ -1,7 +1,12 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('termOfUseController', angular.module('copayApp.controllers').controller('termOfUseController',
function($scope, uxLanguage, $ionicNavBarDelegate, gettextCatalog) { function($scope, $window, uxLanguage, $ionicNavBarDelegate, gettextCatalog, externalLinkService) {
$ionicNavBarDelegate.title(gettextCatalog.getString('About Copay')); $ionicNavBarDelegate.title(gettextCatalog.getString('Terms Of Use'));
$scope.lang = uxLanguage.currentLanguage; $scope.lang = uxLanguage.currentLanguage;
$scope.disclaimerUrl = $window.appConfig.disclaimerUrl;
$scope.openExternalLink = function(url, target) {
externalLinkService.open(url, target);
};
}); });

View file

@ -0,0 +1,8 @@
'use strict';
angular.module('copayApp.controllers').controller('translatorsController',
function($scope, externalLinkService) {
$scope.openExternalLink = function(url, target) {
externalLinkService.open(url, target);
};
});

View file

@ -1,6 +1,6 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('walletDetailsController', function($scope, $rootScope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $ionicNavBarDelegate, $state, $stateParams, bwcError, profileService, lodash, configService, gettext, gettextCatalog, platformInfo, walletService, $ionicPopup, txpModalService) { angular.module('copayApp.controllers').controller('walletDetailsController', function($scope, $rootScope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $ionicNavBarDelegate, $state, $stateParams, bwcError, profileService, lodash, configService, gettext, gettextCatalog, platformInfo, walletService, $ionicPopup, txpModalService, externalLinkService) {
var isCordova = platformInfo.isCordova; var isCordova = platformInfo.isCordova;
var isWP = platformInfo.isWP; var isWP = platformInfo.isWP;
@ -12,6 +12,9 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
var HISTORY_SHOW_LIMIT = 10; var HISTORY_SHOW_LIMIT = 10;
$scope.txps = []; $scope.txps = [];
$scope.openExternalLink = function(url, target) {
externalLinkService.open(url, target);
};
var setPendingTxps = function(txps) { var setPendingTxps = function(txps) {
if (!txps) { if (!txps) {

View file

@ -1,7 +1,7 @@
'use strict'; 'use strict';
angular.module('copayApp.directives') angular.module('copayApp.directives')
.directive('copyToClipboard', function(platformInfo, nodeWebkit, gettextCatalog, ionicToast, clipboard) { .directive('copyToClipboard', function(platformInfo, nodeWebkitService, gettextCatalog, ionicToast, clipboard) {
return { return {
restrict: 'A', restrict: 'A',
scope: { scope: {
@ -22,7 +22,7 @@ angular.module('copayApp.directives')
window.cordova.plugins.clipboard.copy(data); window.cordova.plugins.clipboard.copy(data);
window.plugins.toast.showShortCenter(msg); window.plugins.toast.showShortCenter(msg);
} else if (isNW) { } else if (isNW) {
nodeWebkit.writeToClipboard(data); nodeWebkitService.writeToClipboard(data);
scope.$apply(function() { scope.$apply(function() {
ionicToast.show(msg, 'bottom', false, 1000); ionicToast.show(msg, 'bottom', false, 1000);
}); });

View file

@ -0,0 +1,14 @@
'use strict';
angular.module('copayApp.services').service('externalLinkService', function(platformInfo, nodeWebkitService) {
this.open = function(url, target) {
if (platformInfo.isNW) {
nodeWebkitService.openExternalLink(url);
} else {
target = target || '_blank';
var ref = window.open(url, target, 'location=no');
}
};
});

View file

@ -1,38 +0,0 @@
'use strict';
angular.module('copayApp.services').factory('nodeWebkit', function nodeWebkitFactory() {
var root = {};
var isNodeWebkit = function() {
var isNode = (typeof process !== "undefined" && typeof require !== "undefined");
if(isNode) {
try {
return (typeof require('nw.gui') !== "undefined");
} catch(e) {
return false;
}
}
};
root.readFromClipboard = function() {
if (!isNodeWebkit()) return;
var gui = require('nw.gui');
var clipboard = gui.Clipboard.get();
return clipboard.get();
};
root.writeToClipboard = function(text) {
if (!isNodeWebkit()) return;
var gui = require('nw.gui');
var clipboard = gui.Clipboard.get();
return clipboard.set(text);
};
root.openExternalLink = function(url) {
if (!isNodeWebkit()) return;
var gui = require('nw.gui');
return gui.Shell.openExternal(url);
};
return root;
});

View file

@ -0,0 +1,22 @@
'use strict';
angular.module('copayApp.services').service('nodeWebkitService', function() {
this.readFromClipboard = function() {
var gui = require('nw.gui');
var clipboard = gui.Clipboard.get();
return clipboard.get();
};
this.writeToClipboard = function(text) {
var gui = require('nw.gui');
var clipboard = gui.Clipboard.get();
return clipboard.set(text);
};
this.openExternalLink = function(url) {
var gui = require('nw.gui');
return gui.Shell.openExternal(url);
};
});

View file

@ -31,6 +31,7 @@ angular.module('copayApp.services').factory('ongoingProcess', function($log, $ti
'sweepingWallet': gettext('Sweeping Wallet...'), 'sweepingWallet': gettext('Sweeping Wallet...'),
'deletingWallet': gettext('Deleting Wallet...'), 'deletingWallet': gettext('Deleting Wallet...'),
'extractingWalletInfo': gettext('Extracting Wallet Information...'), 'extractingWalletInfo': gettext('Extracting Wallet Information...'),
'gettingFeeLevels': gettext('Getting fee levels...'),
}; };
root.clear = function() { root.clear = function() {

View file

@ -31,9 +31,9 @@ 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[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[wallet.id] || wallet.credentials.walletName; wallet.name = (config.aliasFor && config.aliasFor[wallet.id]) || wallet.credentials.walletName;
wallet.color = config.colorFor[wallet.id] || '#4A90E2'; wallet.color = (config.colorFor && config.colorFor[wallet.id]) || '#4A90E2';
wallet.email = config.emailFor && config.emailFor[wallet.id]; wallet.email = config.emailFor && config.emailFor[wallet.id];
}); });
} }