refactor wallet settings
This commit is contained in:
parent
fb83bbba34
commit
ac7ce0af23
17 changed files with 635 additions and 692 deletions
|
|
@ -14,15 +14,7 @@
|
|||
<!-- <body ng-cloak class="ng-cloak"> -->
|
||||
<body >
|
||||
|
||||
<ion-nav-bar class="bar-stable">
|
||||
</ion-nav-bar>
|
||||
|
||||
<!-- <div notifications="right top"></div> -->
|
||||
<!-- ng-class="{ 'main': index.hasProfile }" -->
|
||||
<!-- <ion-nav-bar class="bar-positive"> -->
|
||||
<!-- <ion-nav-back-button class="button-icon ion-arrow-left-c"> -->
|
||||
<!-- </ion-nav-back-button> -->
|
||||
<!-- </ion-nav-bar> -->
|
||||
<ion-nav-bar class="bar-stable"></ion-nav-bar>
|
||||
<ion-nav-view name="main"></ion-nav-view>
|
||||
|
||||
<script src="lib/ionic.bundle.min.js"></script>
|
||||
|
|
|
|||
|
|
@ -1,109 +1,96 @@
|
|||
<div class="backup" ng-controller="backupController" ng-init="init(index.prevState)">
|
||||
<nav class="tab-bar">
|
||||
<section class="left-small" ng-show="(step != 1 && step != 4)">
|
||||
<a ng-click="goToStep(1);">
|
||||
<i class="icon-arrow-left3 icon-back"></i>
|
||||
</a>
|
||||
</section>
|
||||
<ion-view ng-controller="backupController" cache-view="false" ng-init="init(index.prevState)">
|
||||
<ion-nav-bar class="bar-stable">
|
||||
<ion-nav-title>Backup Flow</ion-nav-title>
|
||||
<ion-nav-buttons side="primary" ng-show="(step != 1 && step != 4)">
|
||||
<button class="button" ng-click="goToStep(1); goBack()">
|
||||
<i class="ion-arrow-left-c"></i> Back
|
||||
</button>
|
||||
</ion-nav-buttons>
|
||||
</ion-nav-bar>
|
||||
<ion-content class="has-header">
|
||||
<div class="box-notification" ng-show="error">
|
||||
<span class="text-warning">
|
||||
{{error|translate}}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<section class="middle tab-bar-section" ng-style="{'color':index.backgroundColor}">
|
||||
<span>{{walletName}}</span>
|
||||
</section>
|
||||
<!--
|
||||
## STEP 1
|
||||
-->
|
||||
|
||||
<section class="right-small">
|
||||
<a class="p10" ng-click="goBack()">
|
||||
<span class="text-close">
|
||||
<i class="fi-x size-24"></i>
|
||||
</span>
|
||||
</a>
|
||||
</section>
|
||||
</nav>
|
||||
|
||||
<div class="box-notification" ng-show="error">
|
||||
<span class="text-warning">
|
||||
{{error|translate}}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<!--
|
||||
## STEP 1
|
||||
-->
|
||||
|
||||
<div class="content preferences text-center">
|
||||
<div ng-show="step == 1">
|
||||
<div ng-show="mnemonicWords || (!credentialsEncrypted && !deleted)" class="row">
|
||||
<h5 class="text-center" translate>Write your wallet recovery phrase</h5>
|
||||
<div class="size-14 text-gray columns" ng-show="(index.n>1 && index.m != index.n )">
|
||||
<span translate>
|
||||
To restore this {{index.m}}-{{index.n}} <b>shared</b> wallet you will need
|
||||
</span>:
|
||||
<div class="m10t columns size-14 text-gray">
|
||||
<span translate>Your wallet recovery phrase and access to the server that coordinated the initial wallet creation. You still need {{index.m}} keys to spend.</span>
|
||||
<span translate><b>OR</b> the wallet recovery phrase of <b>all</b> copayers in the wallet</span>
|
||||
<span translate><b>OR</b> 1 wallet export file and the remaining quorum of wallet recovery phrases (e.g. in a 3-5 wallet: 1 wallet export file + 2 wallet recovery phrases of any of the other copayers).</span>
|
||||
<div class="content preferences text-center">
|
||||
<div ng-show="step == 1">
|
||||
<div ng-show="mnemonicWords || (!credentialsEncrypted && !deleted)" class="row">
|
||||
<h5 class="text-center" translate>Write your wallet recovery phrase</h5>
|
||||
<div class="size-14 text-gray columns" ng-show="(index.n>1 && index.m != index.n )">
|
||||
<span translate>
|
||||
To restore this {{index.m}}-{{index.n}} <b>shared</b> wallet you will need
|
||||
</span>:
|
||||
<div class="m10t columns size-14 text-gray">
|
||||
<span translate>Your wallet recovery phrase and access to the server that coordinated the initial wallet creation. You still need {{index.m}} keys to spend.</span>
|
||||
<span translate><b>OR</b> the wallet recovery phrase of <b>all</b> copayers in the wallet</span>
|
||||
<span translate><b>OR</b> 1 wallet export file and the remaining quorum of wallet recovery phrases (e.g. in a 3-5 wallet: 1 wallet export file + 2 wallet recovery phrases of any of the other copayers).</span>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
<div class="size-14 text-gray columns" ng-show="(index.n>1 && index.m == index.n )">
|
||||
<span translate>
|
||||
To restore this {{index.m}}-{{index.n}} <b>shared</b> wallet you will need
|
||||
</span>:
|
||||
<div class="m10t columns size-14 text-gray">
|
||||
<span translate>Your wallet recovery phrase and access to the server that coordinated the initial wallet creation. You still need {{index.m}} keys to spend.</span>
|
||||
<span translate><b>OR</b> the wallet recovery phrases of <b>all</b> copayers in the wallet</span>
|
||||
<div class="size-14 text-gray columns" ng-show="(index.n>1 && index.m == index.n )">
|
||||
<span translate>
|
||||
To restore this {{index.m}}-{{index.n}} <b>shared</b> wallet you will need
|
||||
</span>:
|
||||
<div class="m10t columns size-14 text-gray">
|
||||
<span translate>Your wallet recovery phrase and access to the server that coordinated the initial wallet creation. You still need {{index.m}} keys to spend.</span>
|
||||
<span translate><b>OR</b> the wallet recovery phrases of <b>all</b> copayers in the wallet</span>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row m20t" ng-show="deleted">
|
||||
<div class="columns size-14 text-gray text-center" translate>
|
||||
Wallet recovery phrase not available. You can still export it from Advanced > Export.
|
||||
<div class="row m20t" ng-show="deleted">
|
||||
<div class="columns size-14 text-gray text-center" translate>
|
||||
Wallet recovery phrase not available. You can still export it from Advanced > Export.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div ng-show="mnemonicWords || (!credentialsEncrypted && !deleted)">
|
||||
<p class="text-center columns text-gray" ng-show="index.n==1 && step == 1">
|
||||
<span translate>
|
||||
You need the wallet recovery phrase to restore this personal wallet. Write it down and keep them somewhere safe.
|
||||
</span>
|
||||
</p>
|
||||
<div class="row" ng-show="!credentialsEncrypted">
|
||||
<div class="columns">
|
||||
<div class="panel" ng-class="{'enable_text_select': index.network == 'testnet'}">
|
||||
<span ng-repeat="word in mnemonicWords track by $index"><span style="white-space:nowrap">{{word}}</span><span ng-show="useIdeograms"> </span> </span>
|
||||
<div ng-show="mnemonicWords || (!credentialsEncrypted && !deleted)">
|
||||
<p class="text-center columns text-gray" ng-show="index.n==1 && step == 1">
|
||||
<span translate>
|
||||
You need the wallet recovery phrase to restore this personal wallet. Write it down and keep them somewhere safe.
|
||||
</span>
|
||||
</p>
|
||||
<div class="row" ng-show="!credentialsEncrypted">
|
||||
<div class="columns">
|
||||
<div class="panel" ng-class="{'enable_text_select': index.network == 'testnet'}">
|
||||
<span ng-repeat="word in mnemonicWords track by $index"><span style="white-space:nowrap">{{word}}</span><span ng-show="useIdeograms"> </span> </span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="columns extra-padding-bottom" ng-show="!credentialsEncrypted">
|
||||
<div class="line-t p10 size-10 text-gray text-center" ng-show="mnemonicHasPassphrase">
|
||||
<i class="fi-alert"></i>
|
||||
<span translate>
|
||||
This recovery phrase was created with a password. To recover this wallet both the recovery phrase and password are needed.
|
||||
</span>
|
||||
<div class="columns extra-padding-bottom" ng-show="!credentialsEncrypted">
|
||||
<div class="line-t p10 size-10 text-gray text-center" ng-show="mnemonicHasPassphrase">
|
||||
<i class="fi-alert"></i>
|
||||
<span translate>
|
||||
This recovery phrase was created with a password. To recover this wallet both the recovery phrase and password are needed.
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="button-box">
|
||||
<button
|
||||
ng-show="!deleted"
|
||||
ng-disabled="credentialsEncrypted || error"
|
||||
class="button button-block button-stable"
|
||||
ng-click="goToStep(2);"
|
||||
translate>Continue
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="button-box">
|
||||
<button
|
||||
ng-show="!deleted"
|
||||
ng-disabled="credentialsEncrypted || error"
|
||||
class="round expand m0"
|
||||
ng-style="{'background-color':index.backgroundColor}"
|
||||
ng-click="goToStep(2);"
|
||||
translate>Continue
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<!--
|
||||
## STEP 2
|
||||
-->
|
||||
|
||||
<!--
|
||||
## STEP 2
|
||||
-->
|
||||
|
||||
<div ng-show="step == 2">
|
||||
<ion-content class="m20b">
|
||||
<div ng-show="step == 2">
|
||||
<div class="columns text-center extra-padding-bottom">
|
||||
<h5 translate>Confirm your wallet recovery phrase</h5>
|
||||
<p class="text-gray m0" translate>
|
||||
|
|
@ -122,106 +109,97 @@
|
|||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</ion-content>
|
||||
|
||||
<div class="button-box">
|
||||
<button
|
||||
ng-disabled="!selectComplete"
|
||||
class="round expand m0"
|
||||
ng-style="{'background-color':index.backgroundColor}"
|
||||
ng-click="goToStep(3);"
|
||||
translate>Continue
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--
|
||||
## STEP 3
|
||||
-->
|
||||
|
||||
<div ng-show="step == 3">
|
||||
<div class="columns text-center">
|
||||
<h5 translate>Enter your password</h5>
|
||||
<p class="text-gray m0" translate>
|
||||
In order to verify your wallet backup, please type your password:
|
||||
</p>
|
||||
<div class="m20v">
|
||||
<input type="text" id="passphrase" ng-model="passphrase" autocapitalize="off" spellcheck="false" autofocus/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="button-box">
|
||||
<button
|
||||
ng-disabled="!passphrase"
|
||||
ng-style="{'background-color':index.backgroundColor}"
|
||||
class="button round expand m0"
|
||||
ng-click="goToStep(4);"
|
||||
translate>Continue
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--
|
||||
## STEP 4
|
||||
-->
|
||||
|
||||
<div ng-show="step == 4">
|
||||
<div class="row m10t m10b text-center" ng-show="!backupError">
|
||||
<div class="circle-icon">
|
||||
<i class="fi-like size-48"></i>
|
||||
</div>
|
||||
<h5 translate>Congratulations!</h5>
|
||||
<p class="text-gray columns" translate>
|
||||
You backed up your wallet. You can now restore this wallet at any time.
|
||||
</p>
|
||||
|
||||
<div class="columns text-center m20t">
|
||||
<div class="button-box">
|
||||
<button
|
||||
ng-style="{'background-color':index.backgroundColor}"
|
||||
class="button round expand"
|
||||
href ui-sref="walletHome"
|
||||
translate>Finish
|
||||
ng-disabled="!selectComplete"
|
||||
class="button button-block button-stable"
|
||||
ng-click="goToStep(3);"
|
||||
translate>Continue
|
||||
</button>
|
||||
<!-- hide this in multisig just to show less text -->
|
||||
<div class="row m20t" ng-show="index.n==1">
|
||||
<div class="columns size-10 text-gray">
|
||||
<div class="p10t line-t">
|
||||
<span translate>You can safely install your wallet on another device and use it from multiple devices at the same time.</span>
|
||||
<a href="#" ng-click="$root.openExternalLink('https://github.com/bitpay/copay/blob/master/README.md#copay-backups-and-recovery')" translate>
|
||||
Learn more about Copay backups
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--
|
||||
## STEP 3
|
||||
-->
|
||||
|
||||
<div ng-show="step == 3">
|
||||
<h5 translate>Enter your password</h5>
|
||||
<label class="item item-input item-stacked-label">
|
||||
<span class="input-label" transalate>In order to verify your wallet backup, please type your password:</span>
|
||||
<input type="text" id="passphrase" ng-model="passphrase" autocapitalize="off" spellcheck="false" autofocus/>
|
||||
</label>
|
||||
<div class="button-box">
|
||||
<button
|
||||
ng-disabled="!passphrase"
|
||||
class="button button-block button-stable"
|
||||
ng-click="goToStep(4);"
|
||||
translate>Continue
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--
|
||||
## STEP 4
|
||||
-->
|
||||
|
||||
<div ng-show="step == 4">
|
||||
<div class="row m10t m10b text-center" ng-show="!backupError">
|
||||
<div class="circle-icon">
|
||||
<i class="fi-like size-48"></i>
|
||||
</div>
|
||||
<h5 translate>Congratulations!</h5>
|
||||
<p class="text-gray columns" translate>
|
||||
You backed up your wallet. You can now restore this wallet at any time.
|
||||
</p>
|
||||
|
||||
<div class="columns text-center m20t">
|
||||
<button
|
||||
|
||||
class="button round expand"
|
||||
href ui-sref="walletHome"
|
||||
translate>Finish
|
||||
</button>
|
||||
<!-- hide this in multisig just to show less text -->
|
||||
<div class="row m20t" ng-show="index.n==1">
|
||||
<div class="columns size-10 text-gray">
|
||||
<div class="p10t line-t">
|
||||
<span translate>You can safely install your wallet on another device and use it from multiple devices at the same time.</span>
|
||||
<a href="#" ng-click="$root.openExternalLink('https://github.com/bitpay/copay/blob/master/README.md#copay-backups-and-recovery')" translate>
|
||||
Learn more about Copay backups
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row m10t m10b text-center" ng-show="backupError">
|
||||
<div class="circle-icon">
|
||||
<i class="fi-dislike size-48"></i>
|
||||
</div>
|
||||
<h5 translate>Backup failed</h5>
|
||||
<p class="text-gray columns" translate>
|
||||
Failed to verify backup. Please check your information
|
||||
</p>
|
||||
<div class="columns size-10 text-gray extra-padding-bottom" ng-show="index.n==1">
|
||||
<div class="p10t line-t">
|
||||
<span translate>You can safely install your wallet on another device and use it from multiple devices at the same time.</span>
|
||||
<a href="#" ng-click="$root.openExternalLink('https://github.com/bitpay/copay/blob/master/README.md#copay-backups-and-recovery')" translate>
|
||||
Learn more about Copay backups
|
||||
</a>
|
||||
<div class="row m10t m10b text-center" ng-show="backupError">
|
||||
<div class="circle-icon">
|
||||
<i class="fi-dislike size-48"></i>
|
||||
</div>
|
||||
<h5 translate>Backup failed</h5>
|
||||
<p class="text-gray columns" translate>
|
||||
Failed to verify backup. Please check your information
|
||||
</p>
|
||||
<div class="columns size-10 text-gray extra-padding-bottom" ng-show="index.n==1">
|
||||
<div class="p10t line-t">
|
||||
<span translate>You can safely install your wallet on another device and use it from multiple devices at the same time.</span>
|
||||
<a href="#" ng-click="$root.openExternalLink('https://github.com/bitpay/copay/blob/master/README.md#copay-backups-and-recovery')" translate>
|
||||
Learn more about Copay backups
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="button-box">
|
||||
<button
|
||||
|
||||
class="button button-block button-stable"
|
||||
ng-click="goToStep(1);"
|
||||
translate>Try again
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="button-box">
|
||||
<button
|
||||
ng-style="{'background-color':index.backgroundColor}"
|
||||
class="button round expand m0"
|
||||
ng-click="goToStep(1);"
|
||||
translate>Try again
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="extra-margin-bottom"></div>
|
||||
</ion-content>
|
||||
</ion-view>
|
||||
|
|
|
|||
|
|
@ -1,135 +1,139 @@
|
|||
<div
|
||||
class="topbar-container"
|
||||
ng-include="'views/includes/topbar.html'"
|
||||
ng-init="titleSection='Export Wallet'; goBackToState = 'preferencesAdvanced'">
|
||||
</div>
|
||||
|
||||
<div class="content preferences" ng-controller="exportController" ng-init="init(index.prevState)">
|
||||
<div ng-show="!index.canSign"><h4></h4></div>
|
||||
<div ng-show="index.canSign" class="create-tab small-only-text-center">
|
||||
<div class="row">
|
||||
<div class="tab-container small-6 columns"
|
||||
ng-class="{'selected':!exportQR}"
|
||||
ng-style="{'border-color':!exportQR ? index.backgroundColor: 'inherit'}"
|
||||
ng-click="exportQR = false">
|
||||
<a href ng-style="{'color':!exportQR ? index.backgroundColor: 'inherit'}" translate>File/Text</a>
|
||||
</div>
|
||||
<div class="tab-container small-6 columns"
|
||||
ng-class="{'selected':exportQR}"
|
||||
ng-style="{'border-color':exportQR ? index.backgroundColor: 'inherit'}"
|
||||
ng-click="exportQR = true">
|
||||
<a href ng-style="{'color':exportQR ? index.backgroundColor: 'inherit'}" translate>QR Code</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div ng-show="!backupWalletPlainText">
|
||||
<div class="text-warning size-14 m20b" ng-show="error">
|
||||
<i class="fi-alert size-12"></i>
|
||||
<span translate>Failed to export</span>
|
||||
</div>
|
||||
|
||||
<form ng-show="!exportQR">
|
||||
<ion-view ng-controller="exportController" cache-view="false" ng-init="init(index.prevState)">
|
||||
<ion-nav-bar class="bar-stable">
|
||||
<ion-nav-title>Export Wallet</ion-nav-title>
|
||||
<ion-nav-buttons side="primary">
|
||||
<button class="button" href ui-sref="preferencesAdvanced">
|
||||
<i class="ion-arrow-left-c"></i> Back
|
||||
</button>
|
||||
</ion-nav-buttons>
|
||||
</ion-nav-bar>
|
||||
<ion-content class="has-header">
|
||||
<div ng-show="!index.canSign"><h4></h4></div>
|
||||
<div ng-show="index.canSign" class="create-tab small-only-text-center">
|
||||
<div class="row">
|
||||
<div class="tab-container small-6 columns"
|
||||
ng-class="{'selected':!exportQR}"
|
||||
ng-style="{'border-color':!exportQR ? index.backgroundColor: 'inherit'}"
|
||||
ng-click="exportQR = false">
|
||||
<a href ng-style="{'color':!exportQR ? index.backgroundColor: 'inherit'}" translate>File/Text</a>
|
||||
</div>
|
||||
<div class="tab-container small-6 columns"
|
||||
ng-class="{'selected':exportQR}"
|
||||
ng-style="{'border-color':exportQR ? index.backgroundColor: 'inherit'}"
|
||||
ng-click="exportQR = true">
|
||||
<a href ng-style="{'color':exportQR ? index.backgroundColor: 'inherit'}" translate>QR Code</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div ng-show="!backupWalletPlainText">
|
||||
<div class="text-warning size-14 m20b" ng-show="error">
|
||||
<i class="fi-alert size-12"></i>
|
||||
<span translate>Failed to export</span>
|
||||
</div>
|
||||
|
||||
<form ng-show="!exportQR">
|
||||
<div class="row">
|
||||
<div class="columns">
|
||||
<label for="password" translate>Set up a password </label>
|
||||
<div class="input">
|
||||
<input type="password" class="form-control" placeholder="{{'Your password'|translate}}" name="password" ng-model="password">
|
||||
</div>
|
||||
|
||||
<label for="password" translate>Repeat the password</label>
|
||||
<div class="input">
|
||||
<input type="password" class="form-control" placeholder="{{'Repeat password'|translate}}" name="password" ng-model="repeatpassword">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<div class="m20t text-gray" ng-show="exportQR && supported">
|
||||
<div class="text-center m20b">
|
||||
<qrcode size="220" version="8" error-correction-level="M" data="{{exportWalletInfo}}"></qrcode>
|
||||
</div>
|
||||
<div class="text-center size-12 m10" translate>From the destination device, go to Add wallet > Import wallet and scan this QR code</div>
|
||||
</div>
|
||||
|
||||
<div class="m20t text-gray" ng-show="exportQR && !supported">
|
||||
<div class="text-center size-12 m10" translate>Exporting via QR not supported for this wallet</div>
|
||||
</div>
|
||||
|
||||
<div class="row" ng-show="!exportQR && index.canSign">
|
||||
<div class="columns m15t">
|
||||
<a class="button outline light-gray expand tiny p10i" ng-click="showAdvanced = !showAdvanced">
|
||||
<i class="fi-widget m3r"></i>
|
||||
<span translate ng-hide="showAdvanced">Show advanced options</span>
|
||||
<span translate ng-hide="!showAdvanced">Hide advanced options</span>
|
||||
<i ng-if="!showAdvanced" class="icon-arrow-down4"></i>
|
||||
<i ng-if="showAdvanced" class="icon-arrow-up4"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div ng-show="showAdvanced && !exportQR">
|
||||
<ion-toggle ng-model="noSignEnabled" toggle-class="toggle-balanced" class="r0" ng-change="noSignEnabledChange()">
|
||||
<span class="toggle-label" translate>Do not include private key</span>
|
||||
</ion-toggle>
|
||||
</div>
|
||||
|
||||
<div class="box-notification p15l" ng-show="!index.canSign">
|
||||
<span class="text-warning size-14">
|
||||
<i class="fi-alert"></i>
|
||||
<span translate>
|
||||
WARNING: The private key of this wallet is not available. The export allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so <b>funds will not be accessible from the export</b>.
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="box-notification p15l" ng-show="noSignEnabled && !exportQR">
|
||||
<span class="text-warning size-14">
|
||||
<i class="fi-alert"></i>
|
||||
<span translate>
|
||||
WARNING: Not including the private key allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so <b>funds will not be accessible from the export</b>.
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="row" ng-show="!exportQR">
|
||||
<div class="columns">
|
||||
<label for="password" translate>Set up a password </label>
|
||||
<div class="input">
|
||||
<input type="password" class="form-control" placeholder="{{'Your password'|translate}}" name="password" ng-model="password">
|
||||
</div>
|
||||
|
||||
<label for="password" translate>Repeat the password</label>
|
||||
<div class="input">
|
||||
<input type="password" class="form-control" placeholder="{{'Repeat password'|translate}}" name="password" ng-model="repeatpassword">
|
||||
<button class="black round expand m20t" ng-click="downloadWalletBackup()"
|
||||
ng-disabled="(!password || password != repeatpassword)"
|
||||
ng-style="{'background-color':index.backgroundColor}"
|
||||
ng-show="!isSafari && !isCordova"><i class="fi-download"></i>
|
||||
<span translate>Download</span></button>
|
||||
<button class="black round expand m20t" ng-click="viewWalletBackup()"
|
||||
ng-disabled="(!password || password != repeatpassword)"
|
||||
ng-style="{'background-color':index.backgroundColor}"
|
||||
ng-show="isSafari && !isCordova"><i class="fi-eye"></i>
|
||||
<span translate>View</span></button>
|
||||
<div ng-show="isCordova">
|
||||
<h4 translate>Export options</h4>
|
||||
<button class="black round expand" ng-disabled="(!password || password != repeatpassword)"
|
||||
ng-style="{'background-color':index.backgroundColor}"
|
||||
ng-click="copyWalletBackup()"><i class="fi-clipboard-pencil"></i>
|
||||
<span translate>Copy to clipboard</span></button>
|
||||
<button class="black round expand" ng-disabled="(!password || password != repeatpassword)"
|
||||
ng-style="{'background-color':index.backgroundColor}"
|
||||
ng-click="sendWalletBackup()"><i class="fi-mail"></i>
|
||||
<span translate>Send by email</span></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<div class="m20t text-gray" ng-show="exportQR && supported">
|
||||
<div class="text-center m20b">
|
||||
<qrcode size="220" version="8" error-correction-level="M" data="{{exportWalletInfo}}"></qrcode>
|
||||
</div>
|
||||
<div class="text-center size-12 m10" translate>From the destination device, go to Add wallet > Import wallet and scan this QR code</div>
|
||||
</div>
|
||||
|
||||
<div class="m20t text-gray" ng-show="exportQR && !supported">
|
||||
<div class="text-center size-12 m10" translate>Exporting via QR not supported for this wallet</div>
|
||||
</div>
|
||||
|
||||
<div class="row" ng-show="!exportQR && index.canSign">
|
||||
<div class="columns m15t">
|
||||
<a class="button outline light-gray expand tiny p10i" ng-click="showAdvanced = !showAdvanced">
|
||||
<i class="fi-widget m3r"></i>
|
||||
<span translate ng-hide="showAdvanced">Show advanced options</span>
|
||||
<span translate ng-hide="!showAdvanced">Hide advanced options</span>
|
||||
<i ng-if="!showAdvanced" class="icon-arrow-down4"></i>
|
||||
<i ng-if="showAdvanced" class="icon-arrow-up4"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div ng-show="showAdvanced && !exportQR">
|
||||
<ion-toggle ng-model="noSignEnabled" toggle-class="toggle-balanced" class="r0" ng-change="noSignEnabledChange()">
|
||||
<span class="toggle-label" translate>Do not include private key</span>
|
||||
</ion-toggle>
|
||||
</div>
|
||||
|
||||
<div class="box-notification p15l" ng-show="!index.canSign">
|
||||
<span class="text-warning size-14">
|
||||
<i class="fi-alert"></i>
|
||||
<span translate>
|
||||
WARNING: The private key of this wallet is not available. The export allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so <b>funds will not be accessible from the export</b>.
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="box-notification p15l" ng-show="noSignEnabled && !exportQR">
|
||||
<span class="text-warning size-14">
|
||||
<i class="fi-alert"></i>
|
||||
<span translate>
|
||||
WARNING: Not including the private key allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so <b>funds will not be accessible from the export</b>.
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="row" ng-show="!exportQR">
|
||||
<div class="columns">
|
||||
<button class="black round expand m20t" ng-click="downloadWalletBackup()"
|
||||
ng-disabled="(!password || password != repeatpassword)"
|
||||
ng-style="{'background-color':index.backgroundColor}"
|
||||
ng-show="!isSafari && !isCordova"><i class="fi-download"></i>
|
||||
<span translate>Download</span></button>
|
||||
<button class="black round expand m20t" ng-click="viewWalletBackup()"
|
||||
ng-disabled="(!password || password != repeatpassword)"
|
||||
ng-style="{'background-color':index.backgroundColor}"
|
||||
ng-show="isSafari && !isCordova"><i class="fi-eye"></i>
|
||||
<span translate>View</span></button>
|
||||
<div ng-show="isCordova">
|
||||
<h4 translate>Export options</h4>
|
||||
<button class="black round expand" ng-disabled="(!password || password != repeatpassword)"
|
||||
ng-style="{'background-color':index.backgroundColor}"
|
||||
ng-click="copyWalletBackup()"><i class="fi-clipboard-pencil"></i>
|
||||
<span translate>Copy to clipboard</span></button>
|
||||
<button class="black round expand" ng-disabled="(!password || password != repeatpassword)"
|
||||
ng-style="{'background-color':index.backgroundColor}"
|
||||
ng-click="sendWalletBackup()"><i class="fi-mail"></i>
|
||||
<span translate>Send by email</span></button>
|
||||
<div class="row" ng-show="backupWalletPlainText">
|
||||
<div class="large-12 columns">
|
||||
<h3 translate>Wallet Export</h3>
|
||||
<div class="input">
|
||||
<textarea rows="12">{{backupWalletPlainText}}</textarea>
|
||||
</div>
|
||||
<div class="size-12 text-gray text-right">
|
||||
<i class="icon-compose"></i>
|
||||
<span translate>Copy this text as it is to a safe place (notepad or email)</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row" ng-show="backupWalletPlainText">
|
||||
<div class="large-12 columns">
|
||||
<h3 translate>Wallet Export</h3>
|
||||
<div class="input">
|
||||
<textarea rows="12">{{backupWalletPlainText}}</textarea>
|
||||
</div>
|
||||
<div class="size-12 text-gray text-right">
|
||||
<i class="icon-compose"></i>
|
||||
<span translate>Copy this text as it is to a safe place (notepad or email)</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="extra-margin-bottom"></div>
|
||||
</ion-content>
|
||||
</ion-view>
|
||||
|
|
|
|||
|
|
@ -1,91 +1,81 @@
|
|||
|
||||
<div
|
||||
class="topbar-container"
|
||||
ng-include="'views/includes/topbar.html'"
|
||||
ng-init="titleSection=index.setWalletPreferencesTitle(); closeToHome = true">
|
||||
</div>
|
||||
|
||||
|
||||
<div class="content preferences" ng-controller="preferencesController" ng-init="init()">
|
||||
|
||||
<h4></h4>
|
||||
|
||||
<ul class="no-bullet m0" ng-show="!index.noFocusedWallet">
|
||||
|
||||
<li href ui-sref="preferencesAlias">
|
||||
<div class="right text-gray">
|
||||
{{index.alias||index.walletName}}
|
||||
<i class="icon-arrow-right3 size-24 right"></i>
|
||||
<ion-view ng-controller="preferencesController" cache-view="false" ng-init="init()">
|
||||
<ion-nav-bar class="bar-stable">
|
||||
<ion-nav-title>Wallet Settings</ion-nav-title>
|
||||
<ion-nav-buttons side="primary">
|
||||
<button class="button" href ui-sref="walletDetails">
|
||||
<i class="ion-arrow-left-c"></i> Back
|
||||
</button>
|
||||
</ion-nav-buttons>
|
||||
</ion-nav-bar>
|
||||
<ion-content class="has-header">
|
||||
<div class="list">
|
||||
<div class="item item-divider">
|
||||
Preferences
|
||||
</div>
|
||||
<div translate>Alias</div>
|
||||
</li>
|
||||
|
||||
<li href ui-sref="preferencesEmail">
|
||||
<div class="right text-gray">
|
||||
<span ng-if="!index.preferences.email" translate>Disabled</span>
|
||||
<span ng-if="index.preferences.email">{{index.preferences.email}}</span>
|
||||
<i class="icon-arrow-right3 size-24 right"></i>
|
||||
</div>
|
||||
<div translate>Email Notifications</div>
|
||||
</li>
|
||||
|
||||
<li href ui-sref="preferencesColor">
|
||||
<div class="right text-gray">
|
||||
<span ng-style="{'color':index.backgroundColor}">█</span>
|
||||
<i class="icon-arrow-right3 size-24 right"></i>
|
||||
</div>
|
||||
<div translate>Color</div>
|
||||
</li>
|
||||
|
||||
<li ng-show="index.isPrivKeyExternal">
|
||||
<div class="right text-gray m10r">
|
||||
{{externalSource}}
|
||||
</div>
|
||||
<div translate>Hardware wallet</div>
|
||||
</li>
|
||||
|
||||
<li href ui-sref="backup" ng-hide="index.isPrivKeyExternal">
|
||||
<div class="right text-gray">
|
||||
<span class="text-warning" ng-show="index.needsBackup">
|
||||
<i class="fi-alert"></i> <span translate>Not completed</span>
|
||||
<div class="item item-icon-right" href ui-sref="preferencesAlias">
|
||||
<span translate>Wallet Name</span>
|
||||
<span class="item-note">
|
||||
{{index.alias||index.walletName}}
|
||||
</span>
|
||||
<i class="icon-arrow-right3 size-24 text-gray"></i>
|
||||
<i class="icon ion-ios-arrow-right"></i>
|
||||
</div>
|
||||
<div translate>Backup</div>
|
||||
</li>
|
||||
|
||||
<li href ui-sref="preferencesAdvanced">
|
||||
<i class="icon-arrow-right3 size-24 right text-gray"></i>
|
||||
<div translate>Advanced</div>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
<h4 translate ng-show="index.canSign || !deleted">
|
||||
Security preferences
|
||||
</h4>
|
||||
|
||||
<div ng-show="!index.noFocusedWallet && index.canSign">
|
||||
<ion-toggle ng-model="encryptEnabled" toggle-class="toggle-balanced" ng-change="encryptChange()">
|
||||
<span class="toggle-label" translate>Request Spending Password</span>
|
||||
</ion-toggle>
|
||||
|
||||
<ion-toggle ng-model="touchidEnabled" toggle-class="toggle-balanced" ng-change="touchidChange()" ng-show="touchidAvailable">
|
||||
<span class="toggle-label" translate>Scan Fingerprint</span>
|
||||
</ion-toggle>
|
||||
</div>
|
||||
<div ng-show ="!deleted">
|
||||
|
||||
<ul class="no-bullet m0">
|
||||
<li href ui-sref="deleteWords">
|
||||
<i class="icon-arrow-right3 size-24 right text-gray"></i>
|
||||
<div translate>Delete recovery phrase</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
||||
<h4></h4>
|
||||
</div>
|
||||
|
||||
<div class="extra-margin-bottom"></div>
|
||||
<div class="item">
|
||||
<span translate>Devices</span>
|
||||
<span class="item-note">
|
||||
1
|
||||
</span>
|
||||
</div>
|
||||
<div class="item">
|
||||
<span translate>Required number of signatures</span>
|
||||
<span class="item-note">
|
||||
1
|
||||
</span>
|
||||
</div>
|
||||
<div class="item" ng-show="index.isPrivKeyExternal">
|
||||
<span translate>Hardware wallet</span>
|
||||
<span class="item-note">
|
||||
{{externalSource}}
|
||||
</span>
|
||||
</div>
|
||||
<div class="item item-icon-right" href ui-sref="preferencesColor">
|
||||
<span ng-style="{'color':index.backgroundColor}">█</span>
|
||||
<span translate>Wallet Color</span>
|
||||
<span class="item-note">
|
||||
{{index.alias||index.walletName}}
|
||||
</span>
|
||||
<i class="icon ion-ios-arrow-right"></i>
|
||||
</div>
|
||||
<div class="item item-icon-right" href ui-sref="preferencesEmail">
|
||||
<span translate>Email Notifications</span>
|
||||
<span class="item-note">
|
||||
<span ng-if="!index.preferences.email" translate>Disabled</span>
|
||||
<span ng-if="index.preferences.email">{{index.preferences.email}}</span>
|
||||
</span>
|
||||
<i class="icon ion-ios-arrow-right"></i>
|
||||
</div>
|
||||
<div class="item item-divider">
|
||||
Security
|
||||
</div>
|
||||
<div class="item item-icon-right" href ui-sref="backup" ng-hide="index.isPrivKeyExternal">
|
||||
<span translate>Backup</span>
|
||||
<i class="icon ion-ios-arrow-right"></i>
|
||||
</div>
|
||||
<div ng-show="!index.noFocusedWallet && index.canSign">
|
||||
<ion-toggle ng-model="encryptEnabled" toggle-class="toggle-balanced" ng-change="encryptChange()">
|
||||
<span class="toggle-label" translate>Request Spending Password</span>
|
||||
</ion-toggle>
|
||||
</div>
|
||||
<div class="item item-icon-right" href ui-sref="deleteWords" ng-show ="!deleted">
|
||||
<span translate>Delete recovery phrase</span>
|
||||
<i class="icon ion-ios-arrow-right"></i>
|
||||
</div>
|
||||
<div class="item item-divider">
|
||||
Advanced
|
||||
</div>
|
||||
<div class="item item-icon-right" href ui-sref="preferencesAdvanced">
|
||||
<span translate>Advanced</span>
|
||||
<i class="icon ion-ios-arrow-right"></i>
|
||||
</div>
|
||||
</div>
|
||||
</ion-content>
|
||||
</ion-view>
|
||||
|
|
|
|||
|
|
@ -1,47 +1,40 @@
|
|||
<div
|
||||
class="topbar-container"
|
||||
ng-include="'views/includes/topbar.html'"
|
||||
ng-init="titleSection='Advanced'; goBackToState = 'preferences'">
|
||||
</div>
|
||||
|
||||
<div class="content preferences">
|
||||
|
||||
<h4></h4>
|
||||
|
||||
<ul class="no-bullet m0">
|
||||
|
||||
<li href ui-sref="information">
|
||||
<i class="icon-arrow-right3 size-24 right text-gray"></i>
|
||||
<div translate>Wallet Information</div>
|
||||
</li>
|
||||
|
||||
<li ng-show="index.network == 'livenet'" href ui-sref="paperWallet">
|
||||
<i class="icon-arrow-right3 size-24 right text-gray"></i>
|
||||
<div translate>Sweep paper wallet</div>
|
||||
</li>
|
||||
|
||||
<li href ui-sref="export">
|
||||
<i class="icon-arrow-right3 size-24 right text-gray"></i>
|
||||
<div translate>Export Wallet</div>
|
||||
</li>
|
||||
|
||||
<li href ui-sref="preferencesBwsUrl">
|
||||
<i class="icon-arrow-right3 size-24 right text-gray"></i>
|
||||
<div>Wallet Service URL</div>
|
||||
</li>
|
||||
|
||||
<li href ui-sref="preferencesHistory">
|
||||
<i class="icon-arrow-right3 size-24 right text-gray"></i>
|
||||
<div translate>Transaction History</div>
|
||||
</li>
|
||||
|
||||
<li href ui-sref="delete">
|
||||
<i class="icon-arrow-right3 size-24 right text-gray"></i>
|
||||
<div translate>Delete Wallet</div>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<div class="extra-margin-bottom"></div>
|
||||
|
||||
<ion-view cache-view="false">
|
||||
<ion-nav-bar class="bar-stable">
|
||||
<ion-nav-title>Advanced Preferences</ion-nav-title>
|
||||
<ion-nav-buttons side="primary">
|
||||
<button class="button" href ui-sref="preferences">
|
||||
<i class="ion-arrow-left-c"></i> Back
|
||||
</button>
|
||||
</ion-nav-buttons>
|
||||
</ion-nav-bar>
|
||||
<ion-content class="has-header">
|
||||
<div class="list">
|
||||
<div class="item item-divider">
|
||||
</div>
|
||||
<div class="item item-icon-right" href ui-sref="information">
|
||||
<span translate>Wallet Information</span>
|
||||
<i class="icon ion-ios-arrow-right"></i>
|
||||
</div>
|
||||
<div class="item item-icon-right" ng-show="index.network == 'livenet'" href ui-sref="paperWallet">
|
||||
<span translate>Sweep paper wallet</span>
|
||||
<i class="icon ion-ios-arrow-right"></i>
|
||||
</div>
|
||||
<div class="item item-icon-right" href ui-sref="export">
|
||||
<span translate>Export Wallet</span>
|
||||
<i class="icon ion-ios-arrow-right"></i>
|
||||
</div>
|
||||
<div class="item item-icon-right" href ui-sref="preferencesBwsUrl">
|
||||
<span translate>Wallet Service URL</span>
|
||||
<i class="icon ion-ios-arrow-right"></i>
|
||||
</div>
|
||||
<div class="item item-icon-right" href ui-sref="preferencesHistory">
|
||||
<span translate>Transaction History</span>
|
||||
<i class="icon ion-ios-arrow-right"></i>
|
||||
</div>
|
||||
<div class="item item-icon-right" href ui-sref="delete">
|
||||
<span translate>Delete Wallet</span>
|
||||
<i class="icon ion-ios-arrow-right"></i>
|
||||
</div>
|
||||
</div>
|
||||
</ion-content>
|
||||
</ion-view>
|
||||
|
|
|
|||
|
|
@ -1,19 +1,20 @@
|
|||
<div
|
||||
class="topbar-container"
|
||||
ng-include="'views/includes/topbar.html'"
|
||||
ng-init="titleSection='Alias'; goBackToState = 'preferences'">
|
||||
</div>
|
||||
|
||||
<div class="content preferences" ng-controller="preferencesAliasController">
|
||||
|
||||
<h4></h4>
|
||||
<form name="settingsAliasForm" ng-submit="save()" class="columns">
|
||||
<label><span translate>Alias for <i>{{index.walletName}}</i></span></label>
|
||||
<input type="text" id="alias2" type="text" name="alias2" ng-model="alias">
|
||||
<input type="submit" class="button expand black round" value="{{'Save'|translate}}"
|
||||
ng-style="{'background-color':index.backgroundColor}">
|
||||
</form>
|
||||
<div class="text-gray size-12 text-center" translate>Changing wallet alias only affects the local wallet name.
|
||||
</div>
|
||||
</div>
|
||||
<div class="extra-margin-bottom"></div>
|
||||
<ion-view ng-controller="preferencesAliasController" cache-view="false">
|
||||
<ion-nav-bar class="bar-stable">
|
||||
<ion-nav-title>Alias</ion-nav-title>
|
||||
<ion-nav-buttons side="primary">
|
||||
<button class="button" href ui-sref="preferences">
|
||||
<i class="ion-arrow-left-c"></i> Back
|
||||
</button>
|
||||
</ion-nav-buttons>
|
||||
</ion-nav-bar>
|
||||
<ion-content class="has-header">
|
||||
<form name="aliasForm" ng-submit="save(aliasForm)" novalidate>
|
||||
<label class="item item-input item-stacked-label">
|
||||
<span class="input-label" transalate>Alias for {{walletName}}</span>
|
||||
<input type="text" id="alias" name="alias" ng-model="alias" placeholder="John" required></input>
|
||||
</label>
|
||||
<input type="submit" class="button button-block button-stable" value="{{'Save'|translate}}" ng-disabled="aliasForm.$invalid">
|
||||
</form>
|
||||
<div translate>Changing wallet alias only affects the local wallet name.</div>
|
||||
</ion-content>
|
||||
</ion-view>
|
||||
|
|
|
|||
|
|
@ -1,17 +1,19 @@
|
|||
<div
|
||||
class="topbar-container"
|
||||
ng-include="'views/includes/topbar.html'"
|
||||
ng-init="titleSection='Wallet Service URL'; goBackToState = 'preferencesAdvanced';">
|
||||
</div>
|
||||
|
||||
<div class="content preferences" ng-controller="preferencesBwsUrlController">
|
||||
<h4></h4>
|
||||
<form name="settingsBwsUrlForm" ng-submit="save()" class="columns">
|
||||
<label class="left">Wallet Service URL</label>
|
||||
<a class="right size-12" ng-click="resetDefaultUrl()" translate> Set default url</a>
|
||||
<input type="text" id="bwsurl" type="text" name="bwsurl" ng-model="bwsurl">
|
||||
<input type="submit" class="button expand black round" value="{{'Save'|translate}}"
|
||||
ng-style="{'background-color':index.backgroundColor}">
|
||||
</form>
|
||||
</div>
|
||||
<div class="extra-margin-bottom"></div>
|
||||
<ion-view ng-controller="preferencesBwsUrlController" cache-view="false">
|
||||
<ion-nav-bar class="bar-stable">
|
||||
<ion-nav-title>Wallet Service URL</ion-nav-title>
|
||||
<ion-nav-buttons side="primary">
|
||||
<button class="button" href ui-sref="preferencesAdvanced">
|
||||
<i class="ion-arrow-left-c"></i> Back
|
||||
</button>
|
||||
</ion-nav-buttons>
|
||||
</ion-nav-bar>
|
||||
<ion-content class="has-header">
|
||||
<form name="settingsBwsUrlForm" ng-submit="save(settingsBwsUrlForm)" novalidate>
|
||||
<label class="item item-input item-stacked-label">
|
||||
<span class="input-label" transalate>Wallet Service URL</span><a ng-click="resetDefaultUrl()" translate> Set default url</a>
|
||||
<input type="text" id="bwsurl" type="text" name="bwsurl" ng-model="bwsurl">
|
||||
</label>
|
||||
<input type="submit" class="button button-block button-stable" value="{{'Save'|translate}}"></input>
|
||||
</form>
|
||||
</ion-content>
|
||||
</ion-view>
|
||||
|
|
|
|||
|
|
@ -1,11 +1,15 @@
|
|||
<div class="topbar-container" ng-include="'views/includes/topbar.html'"
|
||||
ng-init="titleSection='Color'; goBackToState = 'preferences'">
|
||||
</div>
|
||||
|
||||
<div class="content preferences" ng-controller="preferencesColorController">
|
||||
<h4></h4>
|
||||
|
||||
<ion-radio class="size-12" ng-repeat="c in colorList" ng-value="c" ng-model="currentColor" ng-click="save(c)">
|
||||
<span ng-style="{'color': c}">█</span>
|
||||
</ion-radio>
|
||||
</div>
|
||||
<ion-view ng-controller="preferencesColorController" cache-view="false">
|
||||
<ion-nav-bar class="bar-stable">
|
||||
<ion-nav-title>Color</ion-nav-title>
|
||||
<ion-nav-buttons side="primary">
|
||||
<button class="button" href ui-sref="preferences">
|
||||
<i class="ion-arrow-left-c"></i> Back
|
||||
</button>
|
||||
</ion-nav-buttons>
|
||||
</ion-nav-bar>
|
||||
<ion-content class="has-header">
|
||||
<ion-radio ng-repeat="c in colorList" ng-value="c" ng-model="currentColor" ng-click="save(c)">
|
||||
<span ng-style="{'color': c}">█</span>
|
||||
</ion-radio>
|
||||
</ion-content>
|
||||
</ion-view>
|
||||
|
|
|
|||
|
|
@ -1,21 +1,18 @@
|
|||
<div
|
||||
class="topbar-container"
|
||||
ng-include="'views/includes/topbar.html'"
|
||||
ng-init="titleSection='Delete Wallet'; goBackToState = 'preferencesAdvanced'">
|
||||
</div>
|
||||
|
||||
<div class="content preferences" ng-controller="preferencesDeleteWalletController">
|
||||
<div class="text-center text-gray m20v size-12">
|
||||
<div class="text-warning size-18 m10b" translate>Warning!</div>
|
||||
<div class="m10" translate>Permanently delete this wallet. THIS ACTION CANNOT BE REVERSED</div>
|
||||
</div>
|
||||
|
||||
<ul class="no-bullet m0">
|
||||
<li ng-click="deleteWallet()">
|
||||
<div class="right" ng-style="{'color':index.backgroundColor}" ng-show="!isDeletingWallet">
|
||||
{{index.walletName}} <span ng-show="index.alias">({{index.alias}})</span>
|
||||
</div>
|
||||
<div translate>Delete wallet</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<ion-view ng-controller="preferencesDeleteWalletController" cache-view="false">
|
||||
<ion-nav-bar class="bar-stable">
|
||||
<ion-nav-title>Delete Wallet</ion-nav-title>
|
||||
<ion-nav-buttons side="primary">
|
||||
<button class="button" href ui-sref="preferencesAdvanced">
|
||||
<i class="ion-arrow-left-c"></i> Back
|
||||
</button>
|
||||
</ion-nav-buttons>
|
||||
</ion-nav-bar>
|
||||
<ion-content class="has-header">
|
||||
<div translate>Warning!</div>
|
||||
<div translate>Permanently delete this wallet. THIS ACTION CANNOT BE REVERSED</div>
|
||||
<div class="right" ng-style="{'color':index.backgroundColor}" ng-show="!isDeletingWallet">
|
||||
{{index.walletName}}<span ng-show="index.alias">({{index.alias}})</span>
|
||||
</div>
|
||||
<button class="button button-block button-stable" ng-click="deleteWallet()"translate>Delete wallet</button>
|
||||
</ion-content>
|
||||
</ion-view>
|
||||
|
|
|
|||
|
|
@ -1,35 +1,26 @@
|
|||
<div
|
||||
class="topbar-container"
|
||||
ng-include="'views/includes/topbar.html'"
|
||||
ng-init="titleSection='Delete Recovery Phrase'; goBackToState = 'preferences'">
|
||||
</div>
|
||||
|
||||
|
||||
<div class="content preferences" ng-controller="preferencesDeleteWordsController">
|
||||
|
||||
<div ng-show="!deleted">
|
||||
<div class="text-center text-gray m20t size-12">
|
||||
<div class="box-notification text-warning" ng-show="error" >
|
||||
<ion-view ng-controller="preferencesDeleteWordsController" cache-view="false">
|
||||
<ion-nav-bar class="bar-stable">
|
||||
<ion-nav-title>Delete Recovery Phrase</ion-nav-title>
|
||||
<ion-nav-buttons side="primary">
|
||||
<button class="button" href ui-sref="preferences">
|
||||
<i class="ion-arrow-left-c"></i> Back
|
||||
</button>
|
||||
</ion-nav-buttons>
|
||||
</ion-nav-bar>
|
||||
<ion-content class="has-header">
|
||||
<div ng-show="!deleted">
|
||||
<div ng-show="error">
|
||||
{{error|translate}}
|
||||
</div>
|
||||
<div class="text-warning size-18 m10b" translate>Warning!</div>
|
||||
<div class="m15" ng-show="!index.needsBackup" translate>Once you have copied your wallet recovery phrase down, it is recommended to delete it from this device.</div>
|
||||
<div class="m15" ng-show="index.needsBackup" translate>Need to do backup</div>
|
||||
<div translate>Warning!</div>
|
||||
<div ng-show="!index.needsBackup" translate>Once you have copied your wallet recovery phrase down, it is recommended to delete it from this device.</div>
|
||||
<div ng-show="index.needsBackup" translate>Need to do backup</div>
|
||||
<div ng-show="!index.needsBackup">
|
||||
<button class="button button-block button-stable" ng-click="delete()" translate>Delete Recovery Phrase</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul class="no-bullet m0" ng-show="!index.needsBackup">
|
||||
<li ng-click="delete()">
|
||||
<div class="right" ng-style="{'color':index.backgroundColor}">
|
||||
{{index.walletName}} <span ng-show="index.alias">({{index.alias}})</span>
|
||||
</div>
|
||||
<div translate>Delete Recovery Phrase</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="row m20t" ng-show="deleted">
|
||||
<div class="columns size-14 text-gray text-center" translate>
|
||||
<div ng-show="deleted" translate>
|
||||
Wallet recovery phrase not available. You can still export it from Advanced > Export.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</ion-content>
|
||||
</ion-view>
|
||||
|
|
|
|||
|
|
@ -1,25 +1,21 @@
|
|||
<div
|
||||
class="topbar-container"
|
||||
ng-include="'views/includes/topbar.html'"
|
||||
ng-init="titleSection='Email Notifications'; goBackToState = 'preferences'">
|
||||
</div>
|
||||
|
||||
<div class="content preferences" ng-controller="preferencesEmailController">
|
||||
<h4></h4>
|
||||
|
||||
<form name="emailForm" ng-submit="save(emailForm)" class="columns" novalidate ng-init="email = index.preferences.email">
|
||||
<div class="box-notification" ng-show="error">
|
||||
<span class="text-warning size-14">
|
||||
{{error|translate}}
|
||||
</span>
|
||||
<ion-view ng-controller="preferencesEmailController" cache-view="false">
|
||||
<ion-nav-bar class="bar-stable">
|
||||
<ion-nav-title>Email Notifications</ion-nav-title>
|
||||
<ion-nav-buttons side="primary">
|
||||
<button class="button" href ui-sref="preferences">
|
||||
<i class="ion-arrow-left-c"></i> Back
|
||||
</button>
|
||||
</ion-nav-buttons>
|
||||
</ion-nav-bar>
|
||||
<ion-content class="has-header">
|
||||
<form name="emailForm" ng-submit="save(emailForm)" novalidate>
|
||||
<label class="item item-input item-stacked-label">
|
||||
<span class="input-label" transalate>Email for wallet notifications</span>
|
||||
<input type="email" id="email" name="email" ng-model="email" required></input>
|
||||
</label>
|
||||
<input type="submit" class="button button-block button-stable" value="{{'Save'|translate}}" ng-disabled="emailForm.$invalid">
|
||||
</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>
|
||||
|
||||
<label translate>Email for wallet notifications</label>
|
||||
<input type="email" id="email" name="email" ng-model="email" required>
|
||||
<input type="submit" class="button expand black round" value="{{'Save'|translate}}"
|
||||
ng-style="{'background-color':index.backgroundColor}" ng-disabled="emailForm.$invalid && !index.preferences.email">
|
||||
</form>
|
||||
<div class="text-gray size-12 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>
|
||||
<div class="extra-margin-bottom"></div>
|
||||
</ion-content>
|
||||
</ion-view>
|
||||
|
|
|
|||
|
|
@ -1,24 +1,25 @@
|
|||
<div
|
||||
class="topbar-container"
|
||||
ng-include="'views/includes/topbar.html'"
|
||||
ng-init="titleSection='Transaction History'; goBackToState = 'preferencesAdvanced'">
|
||||
</div>
|
||||
<div class="content preferences" ng-controller="preferencesHistory">
|
||||
<h4></h4>
|
||||
|
||||
<ul class="no-bullet m0" ng-init="index.updatingTxHistory ? null : csvHistory()">
|
||||
<li ng-show="csvReady && !index.isCordova"
|
||||
ng-csv="csvContent" csv-header="csvHeader" filename="Copay-{{index.alias || index.walletName}}.csv">
|
||||
<span ng-style="{'color':index.backgroundColor}" translate>
|
||||
Export to file
|
||||
</span>
|
||||
</li>
|
||||
<li ng-show="!csvReady && !index.isCordova">
|
||||
<span class="right text-gray text-italic" translate>preparing...</span>
|
||||
<ion-view ng-controller="preferencesHistory" cache-view="false" ng-init="index.updatingTxHistory ? null : csvHistory()">
|
||||
<ion-nav-bar class="bar-stable">
|
||||
<ion-nav-title>Transaction History</ion-nav-title>
|
||||
<ion-nav-buttons side="primary">
|
||||
<button class="button" href ui-sref="preferencesAdvanced">
|
||||
<i class="ion-arrow-left-c"></i> Back
|
||||
</button>
|
||||
</ion-nav-buttons>
|
||||
</ion-nav-bar>
|
||||
<ion-content class="has-header">
|
||||
<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">
|
||||
<span translate>Export to file</span>
|
||||
</li>
|
||||
<li ng-click="clearTransactionHistory()" ng-style="{'color':index.backgroundColor}" translate>
|
||||
Clear cache
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item" ng-show="!csvReady && !index.isCordova">
|
||||
<span translate>Export to file</span>
|
||||
<span class="item-note" translate>
|
||||
preparing...
|
||||
</span>
|
||||
</div>
|
||||
<div class="item" ng-click="clearTransactionHistory()">
|
||||
<span translate>Clear cache</span>
|
||||
</div>
|
||||
</ion-content>
|
||||
</ion-view>
|
||||
|
|
|
|||
|
|
@ -1,147 +1,137 @@
|
|||
<div
|
||||
class="topbar-container"
|
||||
ng-include="'views/includes/topbar.html'"
|
||||
ng-init="titleSection='Wallet Information'; goBackToState = 'preferencesAdvanced'">
|
||||
</div>
|
||||
|
||||
<div class="content preferences" ng-controller="preferencesInformation" ng-init="init()">
|
||||
<h4 class="title m0" translate>Wallet Information</h4>
|
||||
|
||||
<ul class="no-bullet m0 size-14">
|
||||
<li class="line-b p20 oh " ng-if="androidTest">
|
||||
<span style="color:red" translate>BETA: Android Key Derivation Test:</span>
|
||||
<span class="right text-gray">
|
||||
<ion-view ng-controller="preferencesInformation" cache-view="false" ng-init="init()">
|
||||
<ion-nav-bar class="bar-stable">
|
||||
<ion-nav-title>Wallet Information</ion-nav-title>
|
||||
<ion-nav-buttons side="primary">
|
||||
<button class="button" href ui-sref="preferencesAdvanced">
|
||||
<i class="ion-arrow-left-c"></i> Back
|
||||
</button>
|
||||
</ion-nav-buttons>
|
||||
</ion-nav-bar>
|
||||
<ion-content class="has-header">
|
||||
<div class="list">
|
||||
<div class="item item-divider">
|
||||
Wallet Information
|
||||
</div>
|
||||
<div class="item">
|
||||
<span translate>BETA: Android Key Derivation Test:</span>
|
||||
<span class="item-note">
|
||||
{{androidTest}}
|
||||
</span>
|
||||
</li>
|
||||
|
||||
<li class="line-b p20 oh" ng-click="saveBlack()">
|
||||
</div>
|
||||
<div class="item" ng-click="saveBlack()">
|
||||
<span translate>Wallet Name (at creation)</span>
|
||||
<span class="right text-gray">
|
||||
<span class="item-note">
|
||||
{{walletName}}
|
||||
</span>
|
||||
</li>
|
||||
|
||||
<li class="line-b p20 oh" ng-click="copyToClipboard(walletId)">
|
||||
</div>
|
||||
<div class="item" ng-click="copyToClipboard(walletId)">
|
||||
<span translate>Wallet Id</span>
|
||||
<span class="right text-gray enable_text_select">
|
||||
<span class="item-note">
|
||||
{{walletId}}
|
||||
</span>
|
||||
</li>
|
||||
|
||||
<li class="line-b p20 oh">
|
||||
</div>
|
||||
<div class="item">
|
||||
<span translate>Wallet Configuration (m-n)</span>
|
||||
<span class="right text-gray">
|
||||
<span class="item-note">
|
||||
{{M}}-{{N}}
|
||||
</span>
|
||||
</li>
|
||||
|
||||
<li class="line-b p20 oh">
|
||||
</div>
|
||||
<div class="item">
|
||||
<span translate>Wallet Network</span>
|
||||
<span class="right text-gray">
|
||||
<span class="item-note">
|
||||
{{network}}
|
||||
</span>
|
||||
</li>
|
||||
|
||||
<li class="line-b p20 oh">
|
||||
</div>
|
||||
<div class="item">
|
||||
<span translate>Address Type</span>
|
||||
<span class="right text-gray">
|
||||
<span class="item-note">
|
||||
{{addressType}}
|
||||
</span>
|
||||
</li>
|
||||
|
||||
<li class="line-b p20 oh">
|
||||
</div>
|
||||
<div class="item">
|
||||
<span translate>Derivation Strategy</span>
|
||||
<span class="right text-gray">
|
||||
<span class="item-note">
|
||||
{{derivationStrategy}}
|
||||
</span>
|
||||
</li>
|
||||
|
||||
<li class="line-b p20 oh" ng-show="index.externalSource">
|
||||
<span>Hardware Wallet</span>
|
||||
<span class="right text-gray capitalize">
|
||||
{{index.externalSource}}
|
||||
</div>
|
||||
<div class="item" ng-show="index.externalSource">
|
||||
<span translate>Hardware Wallet</span>
|
||||
<span class="item-note">
|
||||
{{index.externalSource}}
|
||||
</span>
|
||||
</li>
|
||||
|
||||
<li class="line-b p20 oh" ng-show="!index.externalSource && !index.canSign">
|
||||
</div>
|
||||
<div class="item" ng-show="!index.externalSource && !index.canSign">
|
||||
<span translate></span>
|
||||
<span class="right text-gray capitalize">
|
||||
<span class="item-note">
|
||||
No private key
|
||||
</span>
|
||||
</li>
|
||||
|
||||
<li class="line-b p20 oh" ng-show="index.account">
|
||||
<span translate>Account</span> ({{derivationStrategy}})
|
||||
<span class="right text-gray">
|
||||
</div>
|
||||
<div class="item" ng-show="index.account">
|
||||
<span translate>Account</span>({{derivationStrategy}})
|
||||
<span class="item-note">
|
||||
#{{index.account}}
|
||||
</span>
|
||||
</li>
|
||||
</div>
|
||||
|
||||
<h4 class="title m0" translate>Copayers</h4>
|
||||
<li ng-repeat="copayer in index.copayers">
|
||||
<span class="size-12" ng-show="copayer.id == index.copayerId">
|
||||
<i class="icon-contact size-24 m10r"></i> {{copayer.name}} ({{'Me'|translate}}) <i class="fi-check m5 right"></i>
|
||||
</span>
|
||||
<span class="size-12 text-gray" ng-show="copayer.id != index.copayerId">
|
||||
<i class="icon-contact size-24 m10r"></i> {{copayer.name}}<i class="fi-check m5 right"></i>
|
||||
</span>
|
||||
</li>
|
||||
<div class="item item-divider">
|
||||
Copayers
|
||||
</div>
|
||||
|
||||
<h4 class="title m0" translate>Extended Public Keys</h4>
|
||||
<li ng-repeat="pk in pubKeys" ng-click="copyToClipboard(pk)">
|
||||
<div class="row collapse">
|
||||
<div class="small-4 columns">Copayer {{$index}}</div>
|
||||
<div class="small-8 columns oh text-gray">
|
||||
<div class="ellipsis enable_text_select">{{pk}}</div>
|
||||
<div class="size-12 text-right" ng-if="$index == 0">
|
||||
({{basePath}})
|
||||
</div>
|
||||
</div>
|
||||
<div class="item item-icon-right" ng-repeat="copayer in index.copayers">
|
||||
<span ng-show="copayer.id == index.copayerId" translate>{{copayer.name}} ({{'Me'|translate}})</span>
|
||||
<span ng-style="{'color': 'grey';}" ng-show="copayer.id != index.copayerId" translate>{{copayer.name}}</span>
|
||||
<i class="icon ion-ios-checkmark-outline"></i>
|
||||
</div>
|
||||
|
||||
<div class="item item-divider">
|
||||
Extended Public Keys
|
||||
</div>
|
||||
|
||||
<div class="item" ng-repeat="pk in pubKeys" ng-click="copyToClipboard(pk)">
|
||||
<span translate>Copayer {{$index}}<</span>
|
||||
<i class="icon ion-ios-checkmark-outline"></i>
|
||||
<span class="item-note">
|
||||
<span>Copayer {{$index}}</span>
|
||||
<span>{{pk}}</span>
|
||||
<span ng-if="$index == 0">({{basePath}})</span>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div ng-show="addrs">
|
||||
<div class="item item-divider">
|
||||
Last Wallet Addresses
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div ng-show="addrs">
|
||||
<h4 class="title m0" translate>Last Wallet Addresses</h4>
|
||||
<ul class="no-bullet m0">
|
||||
<li ng-repeat="a in addrs" class="oh" ng-click="copyToClipboard(a.address)">
|
||||
<div class="enable_text_select ellipsis">
|
||||
{{a.address}}
|
||||
</div>
|
||||
<div class="text-gray size-12 right enable_text_select">
|
||||
{{a.path}} · {{a.createdOn *1000 | amDateFormat:'MMMM Do YYYY, h:mm a' }}
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="text-centered text-gray size-12 m10" translate>
|
||||
Only Main (not change) addresses are shown. The addresses on this list were not verified locally at this time.
|
||||
<div class="item" ng-repeat="a in addrs" class="oh" ng-click="copyToClipboard(a.address)">
|
||||
<span>{{a.address}}</span>
|
||||
<span>{{a.path}} · {{a.createdOn *1000 | amDateFormat:'MMMM Do YYYY, h:mm a' }}</span>
|
||||
<i class="icon ion-ios-checkmark-outline"></i>
|
||||
</div>
|
||||
<div translate>
|
||||
Only Main (not change) addresses are shown. The addresses on this list were not verified locally at this time.
|
||||
</div>
|
||||
<ul class="no-bullet m0">
|
||||
<li ng-style="{'color':index.backgroundColor}" href ui-sref="walletHome" ng-click="index.retryScan()" translate>
|
||||
Scan addresses for funds
|
||||
</li>
|
||||
<li ng-style="{'color':index.backgroundColor}" ng-show="index.isCordova" ng-click="sendAddrs()" translate>
|
||||
Send addresses by email
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<ul class="no-bullet m0">
|
||||
<li ng-style="{'color':index.backgroundColor}" href ui-sref="walletHome" ng-click="index.retryScan()" translate>
|
||||
Scan addresses for funds
|
||||
</li>
|
||||
<li ng-style="{'color':index.backgroundColor}" ng-show="index.isCordova" ng-click="sendAddrs()" translate>
|
||||
Send addresses by email
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<ul class="no-bullet m0 size-14" ng-show="index.balanceByAddress">
|
||||
<div ng-if="index.balanceByAddress[0]">
|
||||
<h4 class="title m0" translate>Balance By Address</h4>
|
||||
<li class="line-b p20 oh" ng-repeat="a in index.balanceByAddress" ng-click="copyToClipboard(a.address)">
|
||||
<div class="enable_text_select ellipsis">
|
||||
{{a.address}}
|
||||
</div>
|
||||
<div class="text-gray text-right">
|
||||
<div ng-show="index.balanceByAddress" ng-if="index.balanceByAddress[0]">
|
||||
<div class="item item-divider">
|
||||
Balance By Address
|
||||
</div>
|
||||
<div class="item" ng-repeat="a in index.balanceByAddress" ng-click="copyToClipboard(a.address)">
|
||||
<span>{{a.address}}</span>
|
||||
<span class="item-note">
|
||||
{{(a.amount/1e8).toFixed(8)}} BTC
|
||||
</div>
|
||||
</li>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</ul>
|
||||
|
||||
<h4></h4>
|
||||
<div class="extra-margin-bottom"></div>
|
||||
</div>
|
||||
</div>
|
||||
</ion-content>
|
||||
</ion-view>
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
<ion-view ng-controller="preferencesLanguageController" ng-init="init()" cache-view="false">
|
||||
<ion-nav-bar class="bar-stable">
|
||||
<ion-nav-title>Languages</ion-nav-title>
|
||||
<ion-nav-buttons side="primary">
|
||||
<button class="button" href ui-sref="tabs.settings">
|
||||
<i class="ion-arrow-left-c"></i> Back
|
||||
</button>
|
||||
</ion-nav-buttons>
|
||||
<ion-nav-title>Languages</ion-nav-title>
|
||||
<ion-nav-buttons side="primary">
|
||||
<button class="button" href ui-sref="tabs.settings">
|
||||
<i class="ion-arrow-left-c"></i> Back
|
||||
</button>
|
||||
</ion-nav-buttons>
|
||||
</ion-nav-bar>
|
||||
<ion-content>
|
||||
<ion-radio ng-repeat="lang in availableLanguages" ng-value="lang.isoCode" ng-model="currentLanguage"
|
||||
|
|
|
|||
|
|
@ -5,10 +5,13 @@
|
|||
<ion-nav-title>{{wallet.name}}</ion-nav-title>
|
||||
|
||||
<ion-nav-buttons side="primary">
|
||||
<button class="button" href ui-sref="tabs.home">
|
||||
<button class="button" href ui-sref="tabs.home">
|
||||
<i class="ion-arrow-left-c"></i> Back
|
||||
</button>
|
||||
</ion-nav-buttons>
|
||||
<ion-nav-buttons side="secondary">
|
||||
<button class="button button-icon icon ion-ios-settings" href ui-sref="preferences"></button>
|
||||
</ion-nav-buttons>
|
||||
|
||||
<ion-content delegate-handle="my-handle" overflow-scroll="true">
|
||||
|
||||
|
|
|
|||
|
|
@ -2,12 +2,14 @@
|
|||
|
||||
angular.module('copayApp.controllers').controller('preferencesAliasController',
|
||||
function($scope, $timeout, configService, profileService, go) {
|
||||
|
||||
var fc = profileService.focusedClient;
|
||||
var walletId = fc.credentials.walletId;
|
||||
var config = configService.getSync();
|
||||
|
||||
config.aliasFor = config.aliasFor || {};
|
||||
$scope.alias = config.aliasFor[walletId] || fc.credentials.walletName;
|
||||
$scope.walletName = fc.credentials.walletName;
|
||||
$scope.alias = config.aliasFor[walletId] || $scope.walletName;
|
||||
|
||||
$scope.save = function() {
|
||||
var opts = {
|
||||
|
|
|
|||
|
|
@ -1,19 +1,18 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.controllers').controller('preferencesEmailController', function($rootScope, $scope, go, profileService, walletService) {
|
||||
|
||||
$scope.save = function(form) {
|
||||
$scope.error = null;
|
||||
$scope.saving = true;
|
||||
var fc = profileService.focusedClient;
|
||||
var email = $scope.email || '';
|
||||
|
||||
walletService.updateRemotePreferences(fc, {
|
||||
email: email,
|
||||
}, function(err) {
|
||||
$scope.saving = false;
|
||||
if (!err)
|
||||
$rootScope.$emit('Local/EmailUpdated', email);
|
||||
go.path('preferences');
|
||||
});
|
||||
};
|
||||
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue