Merge pull request #2574 from cmgustavo/bug/removes-orphan-files

Removes unnecessary files. Fixes texts for translation
This commit is contained in:
Matias Alejo Garcia 2015-04-20 19:19:05 -03:00
commit 32d211e5bd
27 changed files with 779 additions and 949 deletions

3
.gitignore vendored
View File

@ -1,6 +1,5 @@
# translation
po/*
!po/*.po
po/*.mo
src/js/translations.js
# version

View File

@ -79,6 +79,7 @@ module.exports = function(grunt) {
angular: {
src: [
'bower_components/fastclick/lib/fastclick.js',
'bower_components/modernizr/modernizr.js',
'bower_components/qrcode-generator/js/qrcode.js',
'bower_components/qrcode-decoder-js/lib/qrcode-decoder.js',
'bower_components/moment/min/moment-with-locales.js',

749
po/template.pot Normal file
View File

@ -0,0 +1,749 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Project-Id-Version: \n"
#: public/views/splash/1.html
msgid "* In case you need to import wallets from previous Copay versions go to <b>Menu</b>"
msgstr ""
#: public/views/modals/txp-details.html
msgid "* Only transactions created by yourself with no peer signatures can be removed"
msgstr ""
#: public/views/backup.html
msgid "* You can safely install your backup on other device and use your wallet from many devices at the same time."
msgstr ""
#: public/views/modals/address-book.html
msgid "Add"
msgstr ""
#: public/views/modals/address-book.html
msgid "Add a new entry"
msgstr ""
#: public/views/modals/address-book.html
msgid "Add entry"
msgstr ""
#: public/views/includes/sidebar.html
msgid "Add wallet"
msgstr ""
#: public/views/paymentUri.html
#: public/views/modals/address-book.html
#: public/views/modals/qr-address.html
msgid "Address"
msgstr ""
#: public/views/modals/address-book.html
msgid "Address Book"
msgstr ""
#: public/views/preferences.html
msgid "Alternative Currency"
msgstr ""
#: public/views/paymentUri.html
#: public/views/send.html
msgid "Amount"
msgstr ""
#: public/views/send.html
msgid "Amount in"
msgstr ""
#: public/views/send.html
msgid "Available Balance"
msgstr ""
#: public/views/create.html
#: public/views/join.html
msgid "BIP32 master extended private key"
msgstr ""
#: public/views/includes/topbar.html
msgid "Back"
msgstr ""
#: public/views/preferences.html
msgid "Backup"
msgstr ""
#: public/views/receive.html
msgid "Backup now"
msgstr ""
#: public/views/backup.html
msgid "Backup options"
msgstr ""
#: public/views/receive.html
msgid "Before receiving funds, it is highly recommended you backup your wallet keys."
msgstr ""
#: public/views/paymentUri.html
msgid "Bitcoin URI is NOT valid!"
msgstr ""
#: public/views/send.html
msgid "Bitcoin address"
msgstr ""
#: public/views/preferences.html
msgid "Bitcore Wallet Service"
msgstr ""
#: public/views/preferencesBwsUrl.html
msgid "Bitcore Wallet Service URL"
msgstr ""
#: public/views/modals/tx-details.html
msgid "Blockchain"
msgstr ""
#: public/views/modals/txp-details.html
msgid "Broadcast Transaction"
msgstr ""
#: public/views/unsupported.html
msgid "Browser unsupported"
msgstr ""
#: public/views/modals/txp-details.html
msgid "But not broadcasted. Try to send manually"
msgstr ""
#: public/views/includes/password.html
msgid "CANCEL"
msgstr ""
#: public/views/copayers.html
#: public/views/send.html
#: public/views/modals/address-book.html
#: public/views/modals/confirmation.html
msgid "Cancel"
msgstr ""
#: public/views/modals/paypro.html
msgid "Certified by:"
msgstr ""
#: public/views/import.html
msgid "Choose backup file from your computer"
msgstr ""
#: public/views/modals/address-book.html
#: public/views/modals/copayers.html
#: public/views/modals/paypro.html
#: public/views/modals/qr-address.html
#: public/views/modals/scanner.html
#: public/views/modals/tx-details.html
#: public/views/modals/txp-details.html
#: public/views/modals/walletSelection.html
msgid "Close"
msgstr ""
#: public/views/preferences.html
msgid "Color"
msgstr ""
#: public/views/modals/tx-details.html
msgid "Confirmations:"
msgstr ""
#: public/views/modals/copayers.html
msgid "Copayers"
msgstr ""
#: public/views/backup.html
msgid "Copy backup in a safe place"
msgstr ""
#: public/views/backup.html
msgid "Copy this text as it is in a safe place (notepad or email)"
msgstr ""
#: public/views/backup.html
#: public/views/modals/qr-address.html
msgid "Copy to clipboard"
msgstr ""
#: public/views/includes/offline.html
msgid "Could not connect to Wallet Service"
msgstr ""
#: public/views/create.html
#: public/views/walletHome.html
msgid "Create"
msgstr ""
#: public/views/add.html
msgid "Create new wallet"
msgstr ""
#: public/views/includes/sidebar.html
msgid "Create, join or import"
msgstr ""
#: public/views/create.html
#: public/views/createProfile.html
msgid "Creating wallet..."
msgstr ""
#: public/views/modals/address-book.html
msgid "Creator"
msgstr ""
#: public/views/modals/address-book.html
msgid "Date"
msgstr ""
#: public/views/modals/tx-details.html
msgid "Date:"
msgstr ""
#: public/views/preferences.html
msgid "Delete"
msgstr ""
#: public/views/backup.html
msgid "Download backup"
msgstr ""
#: public/views/includes/password.html
msgid "ENTER"
msgstr ""
#: public/views/modals/address-book.html
msgid "Empty. Create an alias for your addresses"
msgstr ""
#: public/views/preferences.html
msgid "Encrypt Private Key"
msgstr ""
#: public/views/includes/password.html
msgid "Enter your password"
msgstr ""
#: public/views/modals/address-book.html
msgid "Entry"
msgstr ""
#: public/views/modals/paypro.html
msgid "Expires:"
msgstr ""
#: public/views/create.html
msgid "Family vacation funds"
msgstr ""
#: public/views/send.html
msgid "Fetching Payment Information..."
msgstr ""
#: public/views/receive.html
msgid "Generate new address"
msgstr ""
#: public/views/receive.html
msgid "Generating a new address..."
msgstr ""
#: public/views/history.html
msgid "Getting transactions..."
msgstr ""
#: public/views/preferences.html
msgid "Global settings"
msgstr ""
#: public/views/create.html
#: public/views/join.html
msgid "Hide"
msgstr ""
#: public/views/importLegacy.html
msgid "Import"
msgstr ""
#: public/views/import.html
msgid "Import backup"
msgstr ""
#: public/views/add.html
msgid "Import from Copay Beta 0.9"
msgstr ""
#: public/views/importLegacy.html
msgid "Import from the Cloud?"
msgstr ""
#: public/views/add.html
msgid "Import wallet"
msgstr ""
#: public/views/import.html
msgid "Importing wallet..."
msgstr ""
#: public/views/modals/tx-details.html
#: public/views/modals/txp-details.html
msgid "Information"
msgstr ""
#: public/views/create.html
#: public/views/join.html
msgid "John"
msgstr ""
#: public/views/join.html
msgid "Join"
msgstr ""
#: public/views/add.html
msgid "Join shared wallet"
msgstr ""
#: public/views/join.html
msgid "Joining shared wallet..."
msgstr ""
#: public/views/modals/address-book.html
msgid "Label"
msgstr ""
#: public/views/importLegacy.html
msgid "Learn more about Wallet Migration"
msgstr ""
#: public/views/modals/walletSelection.html
msgid "Loading..."
msgstr ""
#: public/views/paymentUri.html
msgid "Make a payment to"
msgstr ""
#: public/views/create.html
msgid "Master extended private key"
msgstr ""
#: public/views/includes/copayers.html
#: public/views/modals/copayers.html
msgid "Me"
msgstr ""
#: public/views/modals/paypro.html
#: public/views/modals/tx-details.html
msgid "Merchant Message:"
msgstr ""
#: public/views/paymentUri.html
msgid "Message"
msgstr ""
#: public/views/history.html
msgid "More"
msgstr ""
#: public/views/walletHome.html
msgid "Multisignature wallet"
msgstr ""
#: public/views/receive.html
msgid "My Bitcoin address:"
msgstr ""
#: public/views/walletHome.html
msgid "No pending spend proposals at the moment."
msgstr ""
#: public/views/send.html
#: public/views/modals/address-book.html
msgid "Not valid"
msgstr ""
#: public/views/send.html
msgid "Note"
msgstr ""
#: public/views/modals/tx-details.html
msgid "Note:"
msgstr ""
#: public/views/modals/confirmation.html
msgid "OK"
msgstr ""
#: public/views/modals/tx-status.html
msgid "OKAY"
msgstr ""
#: public/views/walletHome.html
msgid "Opening Wallet..."
msgstr ""
#: public/views/import.html
#: public/views/importLegacy.html
msgid "Password"
msgstr ""
#: public/views/includes/password.html
msgid "Password cannot be recovered. Be sure to write it down"
msgstr ""
#: public/views/import.html
msgid "Paste backup plain text code"
msgstr ""
#: public/views/join.html
msgid "Paste wallet secret here"
msgstr ""
#: public/views/modals/tx-status.html
msgid "Payment Sent"
msgstr ""
#: public/views/modals/paypro.html
msgid "Payment protocol request"
msgstr ""
#: public/views/send.html
msgid "Payment to"
msgstr ""
#: public/views/preferencesDeleteWallet.html
msgid "Permanently delete this wallet. WARNING: this action cannot be reversed."
msgstr ""
#: public/views/walletHome.html
msgid "Personal Wallet"
msgstr ""
#: public/views/walletHome.html
msgid "Preferences"
msgstr ""
#: public/views/modals/scanner.html
msgid "QR-Scanner"
msgstr ""
#: public/views/walletHome.html
msgid "Recreate"
msgstr ""
#: public/views/walletHome.html
msgid "Recreating Wallet on BWS..."
msgstr ""
#: public/views/modals/txp-details.html
msgid "Reject"
msgstr ""
#: public/views/modals/txp-details.html
msgid "Remove"
msgstr ""
#: public/views/backup.html
#: public/views/includes/password.html
msgid "Repeat Password"
msgstr ""
#: public/views/backup.html
msgid "Repeat password"
msgstr ""
#: public/views/import.html
#: public/views/join.html
#: public/views/modals/address-book.html
msgid "Required"
msgstr ""
#: public/views/includes/password.html
msgid "SET"
msgstr ""
#: public/views/receive.html
msgid "SKIP BACKUP"
msgstr ""
#: public/views/splash/1.html
msgid "START"
msgstr ""
#: public/views/preferencesBwsUrl.html
msgid "Save"
msgstr ""
#: public/views/walletHome.html
msgid "Scanning Wallet funds..."
msgstr ""
#: public/views/modals/tx-details.html
msgid "See it on the blockchain"
msgstr ""
#: public/views/import.html
msgid "Select a backup file"
msgstr ""
#: public/views/paymentUri.html
msgid "Select a wallet"
msgstr ""
#: public/views/modals/walletSelection.html
msgid "Select a wallet to make the payment"
msgstr ""
#: public/views/create.html
msgid "Select required signatures"
msgstr ""
#: public/views/create.html
msgid "Select total number of copayers"
msgstr ""
#: public/views/send.html
msgid "Send"
msgstr ""
#: public/views/backup.html
msgid "Send by email"
msgstr ""
#: public/views/importLegacy.html
msgid "Server"
msgstr ""
#: public/views/includes/password.html
msgid "Set up a Password"
msgstr ""
#: public/views/backup.html
msgid "Set up a Password for your backup"
msgstr ""
#: public/views/receive.html
msgid "Share address"
msgstr ""
#: public/views/copayers.html
msgid "Share secret"
msgstr ""
#: public/views/copayers.html
msgid "Share this secret with your copayers"
msgstr ""
#: public/views/receive.html
msgid "Share this with anyone to have them send you payments. To protect your privacy, new addresses are generated automatically once you use them."
msgstr ""
#: public/views/create.html
#: public/views/join.html
msgid "Show"
msgstr ""
#: public/views/modals/txp-details.html
msgid "Sign"
msgstr ""
#: public/views/modals/tx-details.html
msgid "Signatures"
msgstr ""
#: public/views/includes/pin.html
msgid "Skip"
msgstr ""
#: public/views/walletHome.html
msgid "Spend proposals"
msgstr ""
#: public/views/backup.html
msgid "This wallet have its private key encrypted. Exporting a backup will keep the private key encrypted on the backup."
msgstr ""
#: public/views/walletHome.html
msgid "This wallet is not registered at the given Bitcore Wallet Service (BWS). You can recreate it from the local information."
msgstr ""
#: public/views/send.html
#: public/views/includes/transaction.html
msgid "To"
msgstr ""
#: public/views/modals/paypro.html
#: public/views/modals/tx-details.html
msgid "To:"
msgstr ""
#: public/views/walletHome.html
msgid "Total Locked Balance"
msgstr ""
#: public/views/modals/tx-details.html
msgid "Transaction"
msgstr ""
#: public/views/modals/txp-details.html
msgid "Transaction accepted..."
msgstr ""
#: public/views/modals/txp-details.html
msgid "Transaction finally rejected"
msgstr ""
#: public/views/modals/txp-details.html
msgid "Transaction proposal"
msgstr ""
#: public/views/modals/txp-details.html
msgid "Transaction sent!"
msgstr ""
#: public/views/includes/offline.html
msgid "Trying to reconnnect..."
msgstr ""
#: public/views/history.html
#: public/views/modals/tx-details.html
msgid "Unconfirmed"
msgstr ""
#: public/views/preferences.html
msgid "Unit"
msgstr ""
#: public/views/walletHome.html
msgid "Unsent transactions"
msgstr ""
#: public/views/modals/paypro.html
msgid "Untrusted"
msgstr ""
#: public/views/walletHome.html
msgid "Updating Balance..."
msgstr ""
#: public/views/walletHome.html
msgid "Updating Pending Transactions..."
msgstr ""
#: public/views/walletHome.html
msgid "Updating Status..."
msgstr ""
#: public/views/create.html
msgid "Use test network"
msgstr ""
#: public/views/backup.html
msgid "View backup"
msgstr ""
#: public/views/modals/address-book.html
msgid "Visible"
msgstr ""
#: public/views/receive.html
msgid "WARNING: Backup needed"
msgstr ""
#: public/views/walletHome.html
msgid "WARNING: Wallet not registered"
msgstr ""
#: public/views/splash/1.html
msgid "WELCOME TO"
msgstr ""
#: public/views/copayers.html
msgid "Waiting for copayers"
msgstr ""
#: public/views/copayers.html
msgid "Waiting..."
msgstr ""
#: public/views/join.html
msgid "Wallet Secret"
msgstr ""
#: public/views/join.html
msgid "Wallet Secret is not valid!"
msgstr ""
#: public/views/copayers.html
msgid "Wallet incomplete and broken"
msgstr ""
#: public/views/create.html
msgid "Wallet name"
msgstr ""
#: public/views/preferencesDeleteWallet.html
msgid "Warning!"
msgstr ""
#: public/views/walletHome.html
msgid "You do not have any wallet"
msgstr ""
#: public/views/backup.html
#: public/views/import.html
msgid "Your backup password"
msgstr ""
#: public/views/create.html
#: public/views/join.html
msgid "Your nickname"
msgstr ""
#: public/views/includes/password.html
msgid "Your password"
msgstr ""
#: public/views/importLegacy.html
msgid "Your profile password"
msgstr ""
#: public/views/create.html
#: public/views/join.html
msgid "advanced options"
msgstr ""
#: public/views/modals/qr-address.html
msgid "change"
msgstr ""
#: public/views/send.html
msgid "in pending transactions"
msgstr ""
#: public/views/copayers.html
#: public/views/create.html
#: public/views/walletHome.html
msgid "of"
msgstr ""
#: public/views/send.html
msgid "optional"
msgstr ""
#: public/views/send.html
msgid "too long!"
msgstr ""
#: public/views/create.html
msgid "wallet"
msgstr ""
#: public/views/preferences.html
msgid "{{index.walletName}} settings"
msgstr ""

View File

@ -1,2 +0,0 @@
<div class="settings" ng-controller="DevLoginController">
</div>

View File

@ -1,62 +0,0 @@
{{'Receive'|translate}}
{{'History'|translate}}
{{'Wrong password'|translate}}
{{'Copied to clipboard'|translate}}
{{'Please enter the required fields'|translate}}
{{'Import a backup'|translate}}
{{'Importing wallet - Reading backup...'|translate}}
{{'Importing wallet - Setting things up...'|translate}}
{{'Importing wallet - We are almost there...'|translate}}
{{'Error updating indexes:'|translate}}
{{'Please, select your backup file'|translate}}
{{'Please enter the required fields'|translate}}
{{'Fatal error connecting to Insight server'|translate}}
{{'The wallet is full'|translate}}
{{'Wallet network configuration missmatch'|translate}}
{{'The secret string you entered is invalid'|translate}}
{{'Transactions Proposals Purged'|translate}}
{{'transaction proposal purged'|translate}}
{{'Updating balance'|translate}}
{{'Scaning for transactions'|translate}}
{{'Using derived addresses from your wallet'|translate}}
{{'Finished'|translate}}
{{'The balance is updated using the derived addresses'|translate}}
{{'Login Required'|translate}}
{{'Please open wallet to complete payment'|translate}}
{{'Send'|translate}}
{{'Unable to send transaction proposal'|translate}}
{{'The transaction proposal has been created'|translate}}
{{'Form Error'|translate}}
{{'Please complete required fields'|translate}}
{{'Success'|translate}}
{{'New entry has been created'|translate}}
{{'There was an error sending the transaction'|translate}}
{{'Transaction rejected'|translate}}
{{'You rejected the transaction successfully'|translate}}
{{'There was an error signing the transaction'|translate}}
{{'Session will be closed'|translate}}
{{'Your session is about to expire due to inactivity in'|translate}}
{{'seconds'|translate}}
{{'Session closed'|translate}}
{{'Session closed because a long time of inactivity'|translate}}
{{'available.'|translate}}
{{'It\'s important that you update your wallet at https://copay.io'|translate}}
{{'Please update your wallet at https://copay.io'|translate}}
{{'Backup created'|translate}}
{{'Encrypted backup file saved'|translate}}
{{'Networking Error'|translate}}
{{'Could not connect to the Insight server. Check your settings and network configuration'|translate}}
{{'Received corrupt message from '|translate}}
{{'Transaction Update'|translate}}
{{'A transaction was signed by'|translate}}
{{'A transaction was rejected by'|translate}}
{{'Transaction Error'|translate}}
{{'Received corrupt transaction from'|translate}}
{{'New Transaction'|translate}}
{{'You have a pending transaction proposal'|translate}}
{{'You have'|translate}}
{{'pending transaction proposals'|translate}}
{{'Funds received!'|translate}}
{{'Transaction broadcasted'|translate}}
{{'Accessing your profile'|translate}}
{{'Signing out'|translate}}

View File

@ -32,7 +32,7 @@
</label>
<label for="username">
<span translate>{{importLegacy.fromCloud ? 'Email': 'Username'}}</span>
{{importLegacy.fromCloud ? 'Email': 'Username'}}
<input type="text" class="form-control" placeholder="{{importLegacy.fromCloud ? 'Email': 'Username'}}"
name="username" ng-model="importLegacy.username" required>
</label>

View File

@ -1,67 +0,0 @@
<div class="import-profile" ng-controller="importProfileController as importProfile">
<div ng-show="$root.starting">
<div ng-include="'views/includes/loading.html'" ng-init="title = importStatus"></div>
</div>
<div class="row" ng-show="!$root.starting">
<div class="large-5 large-centered medium-7 medium-centered columns">
<div class="logo-setup show-for-large-up">
<img src="img/logo-negative-beta.svg" alt="Copay" width="100">
<div ng-include="'views/includes/version.html'"></div>
</div>
<div>
<h2 translate>Import a profile</h2>
<form name="importProfileForm" ng-submit="importProfile.import(importProfileForm)" novalidate>
<div class="box-notification" ng-show="error">
<div class="box-icon error">
<i class="fi-x size-24"></i>
</div>
<span class="text-warning size-14">
{{error|translate}}
</span>
</div>
<div ng-show="!isSafari && !isCordova">
<div class="input">
<input type="file" class="db form-control"
placeholder="{{'Select a backup file'|translate}}" name="backupFile" ng-model="importProfile.backupFile" ng-file-select>
</div>
</div>
<div ng-show="importProfile.isSafari || importProfile.isCordova">
<div class="input">
<textarea
placeholder="{{'Paste backup plain text code'|translate}}"
class="form-control"
name="backupText"
ng-model="importProfile.backupText"
rows="5"></textarea>
<i class="icon-compose"></i>
</div>
</div>
<div class="input">
<input type="password" class="form-control" placeholder="{{'Your profile password'|translate}}"
name="password" ng-model="importProfile.password" required>
<i class="icon-locked"></i>
</div>
<button translate type="submit"
class="button primary radius expand m0"
ng-disabled="importProfileForm.$invalid">
Import backup
</button>
</form>
<div class="box-setup-footer">
<div class="left">
<a class="button outline dark-gray tiny" ng-click="$root.go('signin')">
<i class="icon-arrow-left4 size-10"></i>
<span translate>Back</span>
</a>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -15,7 +15,7 @@
</li>
<h4 class="title m0" translate>&nbsp;</h4>
<h4 class="title m0">&nbsp;</h4>
<li class="line-b p20" ng-click="$root.go('backup')">
<i class="icon-arrow-right3 size-24 right text-gray"></i>
<span translate>Backup</span>

View File

@ -1,124 +0,0 @@
<div class="backup" ng-controller="ProfileController" ng-init="init()">
<div class="row">
<div class="large-12 columns">
<div class="panel">
<div class="row collapse">
<div class="large-2 medium-2 columns text-center">
<a class="photo-container profile"
ng-click="$root.openExternalLink('https://gravatar.com/')"
ng-init="isHover=0"
ng-mouseenter="isHover=1"
ng-mouseleave="isHover=0">
<img ng-show="!isHover" gravatar-src="'{{username}}'" gravatar-size="80">
<img ng-show="isHover" src="img/change-avatar.png" with="80">
</a>
</div>
<div class="large-10 medium-10 columns">
<h2>
<span translate>Profile</span>
<span class="size-12 text-warning" ng-if="$root.iden.backupNeeded">
[ <span translate>Needs Backup</span> ]
</span>
</h2>
<span translate class="text-gray">It's important to backup your profile so that you can recover it in case of disaster. The backup will include all your profile's wallets</span>
</div>
</div>
</div>
</div>
</div>
<div class="row" ng-show="!backupProfilePlainText">
<div class="large-12 columns">
<button class="primary expand" ng-click="downloadProfileBackup()" ng-disabled="loading"
ng-show="!isSafari && !isCordova"><i class="fi-download"></i>
<span translate>Download backup</span></button>
<button class="primary expand" ng-click="viewProfileBackup()" ng-disabled="loading"
ng-show="isSafari && !isCordova"><i class="fi-eye"></i>
<span translate>View backup</span></button>
<div ng-show="isCordova">
<h4 translate>Backup options</h4>
<button class="primary expand"
ng-click="copyProfileBackup()"><i class="fi-clipboard-pencil"></i>
<span translate>Copy to clipboard</span></button>
<button class="primary expand"
ng-click="sendProfileBackup()"><i class="fi-mail"></i>
<span translate>Send by email</span></button>
</div>
</div>
</div>
<div class="row m20b" ng-show="backupProfilePlainText">
<div class="large-12 columns">
<h3 translate>Copy backup in a safe place</h3>
<div class="input">
<textarea class="show-for-large-up" readonly rows="5">{{backupProfilePlainText}}</textarea>
<textarea class="hide-for-large-up" rows="5">{{backupProfilePlainText}}</textarea>
</div>
<div class="size-12 text-gray text-right">
<i class="icon-compose"></i>
<span translate>Copy this text as it is in a safe place (notepad or email)</span>
</div>
</div>
</div>
<div ng-show="$root.quotaPerItem">
<div class="line-dashed-h m20b"></div>
<div class="row size-12 m20b">
<div class="large-12 columns">
<div ng-if="perItem" translate>
Your current server usage quotas are: <b>{{perItem}}kB</b> per wallet and up to <b>{{nrWallets}}</b> wallets.
</div>
<div ng-if="$root.needsEmailConfirmation" class="m10t">
<i class="fi-alert"></i>
<span translate>Confirm your email address to increase storage usage limits.</span>
</div>
</div>
</div>
</div>
<div class="line-dashed-h m20b"></div>
<div class="row oh m20b">
<div class="large-12 columns">
<a class="button outline light-gray tiny" ng-click="hideAdv=!hideAdv">
<i class="fi-widget m3r"></i>
<span translate ng-hide="!hideAdv">Show</span>
<span translate ng-hide="hideAdv">Hide</span>
<span translate>advanced options</span>
<i ng-if="hideAdv" class="icon-arrow-down4"></i>
<i ng-if="!hideAdv" class="icon-arrow-up4"></i>
</a>
</div>
</div>
<div ng-hide="hideAdv" class="row">
<div class="large-12 columns">
<div class="panel">
<h2><i class="fi-minus-circle m10r"></i>
<span translate>Delete Profile</span>
</h2>
<p translate class="text-gray">Permanently delete this profile and all its wallets. WARNING: this action cannot be reversed.</p>
<div ng-show="!confirmDelete">
<a translate class="button warning m0" ng-click="confirmDelete=!confirmDelete">Delete Profile
</a>
</div>
<div class="text-center" ng-show="confirmDelete">
<h2 translate>Are you sure you want to delete this profile?</h2>
<div class="row">
<div class="large-6 medium-6 small-6 columns">
<button class="gray" ng-disabled="loading"
ng-click="confirmDelete=!confirmDelete" translate>Cancel</button>
</div>
<div class="large-6 medium-6 small-6 columns">
<button class="warning" ng-disabled="loading" ng-click="deleteProfile()">
<i class="fi-trash"></i> <span translate>Delete</span>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="extra-margin-bottom"></div>

View File

@ -119,7 +119,7 @@
</div>
<div class="text-gray text-center m10t animated infinite flash" ng-show="send.onGoingProcess" >
<span translate>{{send.onGoingProcess}}...</span>
<span>{{send.onGoingProcess|translate}}...</span>
</div>

View File

@ -1,60 +0,0 @@
<div class="settings row" ng-controller="settingsController as settings" ng-init="settings.init()">
<h1 class="hide-for-small-only">{{$root.title|translate}}</h1>
<div class="large-5 large-centered medium-7 medium-centered columns">
<div class="logo-setup show-for-large-up" id="top">
<img src="img/logo-negative-beta.svg" alt="Copay" width="100">
<div ng-include="'views/includes/version.html'"></div>
</div>
<h2>Settings</h2>
<form name="settingsForm">
<div class="box-notification" ng-show="message">
<div class="box-icon">
<i class="fi-check size-24"></i>
</div>
<span class="text-primary size-14">
{{message|translate}}
</span>
</div>
<fieldset>
<legend translate>Bitcore wallet service</legend>
<div class="row collapse">
<label class="left" for="bws">URL</label>
<div class="has-error right size-12" ng-show="settingsForm.bws.$invalid">
<span class="icon-input"><i class="fi-x"></i></span>
<span translate>Not valid</span>
</div>
</div>
<div class="input">
<input type="text" class="form-control" name="bws" ng-model="settings.bws" valid-url required>
</div>
<small class="text-gray">
<span translate>Bitcore wallet service is open-source software. You can run your own instances, check</span>
<a href
ng-click="$root.openExternalLink('https://github.com/bitpay/bitcore-wallet-service')">Github repository</a>
</small>
</fieldset>
<button translate
type="submit"
class="button primary radius expand m0"
ng-disabled="settingsForm.$invalid || loading" ng-click="settings.save()">
Save
</button>
</form>
<div class="box-setup-footer">
<div class="left">
<a class="button outline dark-gray tiny" ng-click="$root.go('signin')">
<i class="icon-arrow-left4 size-10"></i>
<span translate>Back</span>
</a>
</div>
<div class="right">
<a class="button outline dark-gray tiny" href="" ng-click="settings.reset()">
<i class="fi-page-delete"></i>
<span translate>Reset settings</span>
</a>
</div>
</div>
</div>
</div>

View File

@ -1,132 +0,0 @@
<div class="signin" ng-controller="signinController as signin" ng-init="signin.init()">
<div ng-if="askForPin || ($root.hasPin && !$root.iden)">
<div ng-include="'views/includes/pin-number.html'"></div>
</div>
<div ng-show="$root.starting">
<div ng-include="'views/includes/loading.html'" ng-init="title = 'Accessing your profile'"></div>
</div>
<div class="row" ng-show="signin.showDisclaimer">
<div class="large-8 medium-10 small-12 large-centered medium-centered columns">
<h1 class="text-white text-center" translate>Disclaimer</h1>
<p class="text-white" translate>
The software you are about to use is free, open source, and unsupported beta software. It is important to understand
that beta software refers to software that is undergoing testing and has not officially been released, could have
bugs, and may not act in a reliable fashion. Because the software is currently in beta, it is possible but not certain
that you may lose bitcoin or the value of your bitcoin. It is recommended that you store only nominal amounts of
bitcoins. You acknowledge that your use of this software is at your own discretion and in compliance with all
applicable laws. You are responsible for safekeeping your login IDs, passwords, private key pairs, PINs and any other
codes you use to access the software. IF YOU HAVE NOT SEPARATELY STORED A BACKUP OF ANY WALLET ADDRESSES AND PRIVATE
KEY PAIRS MAINTAINED IN YOUR ACCOUNT, YOU ACKNOWLEDGE AND AGREE THAT ANY BITCOINS YOU HAVE ASSOCIATED WITH SUCH WALLET
ADDRESSES WILL BECOME INACCESSIBLE IF YOU DO NOT HAVE YOUR ACCOUNT PASSWORD AND/OR PIN. All transaction requests are
irreversible. The authors of the software, employees and affiliates of Bitpay, copyright holders, and BitPay, Inc.
cannot retrieve your private keys or passwords if you lose or forget them and cannot guarantee transaction
confirmation as they do not have control over the Bitcoin network. You agree to provide accurate and complete
information in connection with your use of the account. You assume any and all risk associated with the use of the
software. To the fullest extent permitted by law, this software is provided “as is” and no representations or
warranties can be made of any kind, express or implied, including but not limited to the warranties of
merchantability, fitness or a particular purpose and noninfringement. In no event shall the authors of the software,
employees and affiliates of Bitpay, copyright holders, or BitPay, Inc. be held liable for any claim, damages or other
liability, whether in an action of contract, tort, or otherwise, arising from, out of or in connection with the
software or the use or other dealings in the software. We reserve the right to modify this disclaimer from time to
time.
</p>
<button class="success expand" ng-click="signin.agreeDisclaimer()">
{{'I read and agree with these terms'|translate}}
</button>
</div>
</div>
<div class="row">
<div class="large-5 large-centered medium-7 medium-centered columns" ng-show="!$root.starting && !signin.showDisclaimer">
<div class="logo-setup" ng-show="!$root.iden && !signin.hideForWP && !$root.hasPin">
<img src="img/logo-negative-beta.svg" alt="Copay" width="100">
<div ng-include="'views/includes/version.html'"></div>
</div>
<div ng-if='askForPin || ($root.hasPin && !$root.iden)'>
<h2 ng-show="$root.hasPin && !$root.iden" translate>Enter PIN</h2>
<h2 ng-show="signin.askForPin && signin.askForPin !=2" translate>Set up a PIN</h2>
<h2 ng-show="signin.askForPin == 2" translate>Repeat PIN</h2>
<div class="box-notification" ng-show="signin.error">
<div class="box-icon error">
<i class="fi-x size-24"></i>
</div>
<span class="text-warning size-14">
{{signin.error|translate}}
</span>
</div>
<div ng-include="'views/includes/pin.html'"></div>
</div>
<div ng-if='!$root.hasPin && !signin.askForPin && !$root.iden'>
<h2 translate>Signin</h2>
<div class="p10 bg-success m20b text-white" ng-show="signin.pendingPayment">
<div class="left">
<i class="size-36 m10r"></i>
</div>
<div class="size-14" translate>
Please sign in to make the payment
</div>
</div>
<form name="loginForm" ng-submit="signin.openWithCredentials(loginForm)" novalidate>
<div class="box-notification" ng-show="error">
<div class="box-icon error">
<i class="fi-x size-24"></i>
</div>
<span class="text-warning size-14">
{{error|translate}}
</span>
</div>
<div class="input">
<input type="text" ng-model="email" class="form-control" name="email" placeholder="{{'Username'|translate}}"
required show-focus="!isMobile" ng-focus="formFocus()">
<i class="icon-person"></i>
</div>
<div class="input">
<input type="password" ng-model="password" class="form-control" name="password"
placeholder="{{'Password'|translate}}" required ng-focus="formFocus()">
<i class="icon-locked"></i>
</div>
<button type="submit" class="button primary radius expand m0"
ng-disabled="loginForm.$invalid">
{{'Sign in'|translate}}
</button>
</form>
<div class="box-setup-footer">
<div class="right">
<a class="button outline dark-gray tiny" ng-click="$root.go('settings')">
<i class="icon-wrench show-for-large-up size-14"></i>
<span translate>Settings</span>
</a>
</div>
<div class="left m10r">
<a class="button outline dark-gray tiny" ng-click="$root.go('createProfile')">
<i class="icon-person show-for-large-up size-14"></i>
<span translate>Create profile</span>
</a>
</div>
<div class="left">
<a class="button outline dark-gray tiny" ng-click="$root.go('importProfile')">
<i class="icon-upload show-for-large-up size-14"></i>
<span translate>Import</span>
</a>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -1,10 +1,10 @@
<div class="wide-page" ng-controller="unsupportedController">
<div class="row columns p20">
<div class="text-center">
<img src="img/logo-negative-beta.svg" alt="Copay" width="146" height="59">
<img src="img/logo.svg" alt="Copay" width="146" height="59">
<div class="text-white" ng-include="'views/includes/version.html'"></div>
</div>
<h1 translate class="text-center text-white">Browser unsupported</h1>
<h3 class="text-center text-white">
<h1 translate class="text-center">Browser unsupported</h1>
<h3 class="text-center">
Copay does not support your browser.
Please use a current version of Google Chrome, Mozilla Firefox, Internet Explorer, Safari, or Opera.
<br>

View File

@ -50,7 +50,7 @@
<div class="size-12 text-gray">
<span ng-if="index.n > 1" translate>Multisignature wallet </span>
<span ng-if="index.n == 1" translate>Personal Wallet</span>
<span ng-if="index.network != 'livenet'" translate> - Testnet</span>
<span ng-if="index.network != 'livenet'"> - Testnet</span>
</div>
</div>
</div>
@ -64,8 +64,7 @@
</span>
</div>
<div class="text-center text-gray m15r m15l" translate>
This wallet is not registered at the given Bitcore Wallet Service (BWS).
You can recreate it from the local information.
This wallet is not registered at the given Bitcore Wallet Service (BWS). You can recreate it from the local information.
</div>
<div class="text-center m10t ">
<span class="button outline dark-gray tiny"

View File

@ -1,26 +0,0 @@
<div class="wide-page" ng-controller="WarningController"
ng-init="checkLock()">
<div class="text-center">
<img src="img/logo-negative-beta.svg" alt="Copay" width="146" height="59">
<div class="text-white" ng-include="'views/includes/version.html'"></div>
</div>
<h1 translate class="text-center text-warning">Warning!</h1>
<h3 class="text-center text-white">
<span translate>This wallet appears to be currently open.</span>
<br>
<span translate>Opening the wallet in multiple browser tabs could lead to unexpected results</span>
</h3>
<div class="text-center m30v large-12 columns">
<div class="row">
<div class="large-12 columns medium-12 small-12 text-center">
<a href class="button sucess" ng-click="signout()">&laquo; <span translate>Back</span></a>
<br>
<br>
<a translate href ng-click="ignoreLock()">Continue anyways</a>
</div>
</div>
</div>
<div class="text-center text-gray small cb">
</div>
</div>

View File

@ -903,12 +903,6 @@ input.ng-invalid-match, input.ng-invalid-match:focus {
font-size: 14px;
}
.wide-page {
background-color: #2C3E50;
margin: 5% 0;
padding: 50px;
}
.collapse {
margin: auto;
max-width: 100%;

View File

@ -1,6 +0,0 @@
'use strict';
angular.module('copayApp.controllers').controller('EmailConfirmationController', function($scope, $rootScope, $location) {
$rootScope.fromEmailConfirmation = true;
$location.path('/');
});

View File

@ -1,81 +0,0 @@
'use strict';
angular.module('copayApp.controllers').controller('importProfileController',
function($scope, $rootScope, $timeout, notification, isMobile, isCordova, identityService) {
this.importStatus = 'Importing profile - Reading backup...';
this.hideAdv = true;
this.isSafari = isMobile.Safari();
this.isCordova = isCordova;
window.ignoreMobilePause = true;
$scope.$on('$destroy', function() {
$timeout(function(){
window.ignoreMobilePause = false;
}, 100);
});
var reader = new FileReader();
var updateStatus = function(status) {
this.importStatus = status;
}
var _importBackup = function(str) {
var password = this.password;
updateStatus('Importing profile - Setting things up...');
identityService.importProfile(str,password, function(err, iden) {
if (err) {
$rootScope.starting = false;
copay.logger.warn(err);
if ((err.toString() || '').match('BADSTR')) {
this.error = 'Bad password or corrupt profile file';
} else if ((err.toString() || '').match('EEXISTS')) {
this.error = 'Profile already exists';
} else {
this.error = 'Unknown error';
}
$timeout(function() {
$rootScope.$digest();
}, 1);
}
});
};
this.getFile = function() {
// If we use onloadend, we need to check the readyState.
reader.onloadend = function(evt) {
if (evt.target.readyState == FileReader.DONE) { // DONE == 2
var encryptedObj = evt.target.result;
_importBackup(encryptedObj);
}
};
};
this.import = function(form) {
if (form.$invalid) {
this.error = 'Please enter the required fields';
return;
}
var backupFile = this.file;
var backupText = form.backupText.$modelValue;
var password = form.password.$modelValue;
if (!backupFile && !backupText) {
this.error = 'Please, select your backup file';
return;
}
$rootScope.starting = true;
$timeout(function() {
if (backupFile) {
reader.readAsBinaryString(backupFile);
} else {
_importBackup(backupText);
}
}, 100);
};
});

View File

@ -1,68 +0,0 @@
'use strict';
angular.module('copayApp.controllers').controller('ProfileController', function($scope, $rootScope, $location, $modal, $filter, $timeout, backupService, identityService, isMobile, isCordova, notification) {
$scope.username = $rootScope.iden.getName();
$scope.isSafari = isMobile.Safari();
$scope.isCordova = isCordova;
$rootScope.title = 'Profile';
$scope.hideAdv = true;
$scope.downloadProfileBackup = function() {
backupService.profileDownload($rootScope.iden);
};
$scope.viewProfileBackup = function() {
$scope.loading = true;
$timeout(function() {
$scope.backupProfilePlainText = backupService.profileEncrypted($rootScope.iden);
}, 100);
};
$scope.copyProfileBackup = function() {
var ep = backupService.profileEncrypted($rootScope.iden);
window.cordova.plugins.clipboard.copy(ep);
window.plugins.toast.showShortCenter('Copied to clipboard');
};
$scope.sendProfileBackup = function() {
if (isMobile.Android() || isMobile.Windows()) {
window.ignoreMobilePause = true;
}
window.plugins.toast.showShortCenter('Preparing backup...');
var name = $rootScope.iden.fullName;
var ep = backupService.profileEncrypted($rootScope.iden);
var properties = {
subject: 'Copay Profile Backup: ' + name,
body: 'Here is the encrypted backup of the profile ' + name + ': \n\n' + ep + '\n\n To import this backup, copy all text between {...}, including the symbols {}',
isHtml: false
};
window.plugin.email.open(properties);
};
$scope.init = function() {
if ($rootScope.quotaPerItem) {
$scope.perItem = $filter('noFractionNumber')($rootScope.quotaPerItem / 1000, 1);
$scope.nrWallets = parseInt($rootScope.quotaItems) - 1;
}
// no need to add event handlers here. Wallet deletion is handle by callback.
};
$scope.deleteProfile = function() {
$scope.loading = true;
identityService.deleteProfile(function(err, res) {
$scope.loading = false;
if (err) {
log.warn(err);
notification.error('Error', 'Could not delete profile');
$timeout(function() {
$scope.$digest();
});
} else {
$location.path('/');
$timeout(function() {
notification.success('Success', 'Profile successfully deleted');
});
}
});
};
});

View File

@ -1,26 +0,0 @@
'use strict';
angular.module('copayApp.controllers').controller('settingsController', function(configService, applicationService) {
var config;
this.init = function() {
config = configService.get();
this.bws = config.bws.url;
};
this.save = function() {
if (!this.bws) return;
config.bws.url = this.bws;
var res = configService.set(config);
if (res) {
applicationService.restart();
}
};
this.reset = function() {
if (configService.reset()) {
applicationService.restart();
}
};
});

View File

@ -1,5 +0,0 @@
angular.module('copayApp.controllers').controller('signOutController', function(identityService) {
identityService.signout();
});

View File

@ -1,174 +0,0 @@
'use strict';
angular.module('copayApp.controllers').controller('signinController',
function($rootScope, $timeout, $window, go, notification, profileService, pinService, applicationService, isMobile, isCordova, localStorageService) {
var KEY = 'CopayDisclaimer';
var _credentials;
this.init = function() {
this.isMobile = isMobile.any();
this.isWindowsPhoneApp = isMobile.Windows() && isCordova;
this.hideForWP = 0;
this.attempt = 0;
this.digits = [];
this.defined = [];
this.askForPin = 0;
// This is only for backwards compat, insight api should link to #!/confirmed directly
if (getParam('confirmed')) {
var hashIndex = window.location.href.indexOf('/?');
window.location = window.location.href.substr(0, hashIndex) + '#!/confirmed';
return;
}
if ($rootScope.fromEmailConfirmation) {
this.confirmedEmail = true;
$rootScope.fromEmailConfirmation = false;
}
if ($rootScope.wallet) {
go.walletHome();
}
};
this.clear = function() {
pinService.clearPin(this);
};
this.press = function(digit) {
pinService.pressPin(this, digit);
};
this.skip = function() {
pinService.skipPin(this);
};
this.agreeDisclaimer = function() {
if (localStorageService.set(KEY, true)) {
this.showDisclaimer = null;
}
};
this.formFocus = function() {
if (this.isWindowsPhoneApp) {
this.hideForWP = true;
$timeout(function() {
this.$digest();
}, 1);
}
};
this.openWithPin = function(pin) {
if (!pin) {
this.error = 'Please enter the required fields';
return;
}
$rootScope.starting = true;
$timeout(function() {
var credentials = pinService.get(pin, function(err, credentials) {
if (err || !credentials) {
$rootScope.starting = null;
this.error = 'Wrong PIN';
this.clear();
$timeout(function() {
this.error = null;
}, 2000);
return;
}
this.open(credentials.email, credentials.password);
});
}, 100);
};
this.openWallets = function() {
var iden = $rootScope.iden;
$rootScope.hideNavigation = false;
$rootScope.starting = true;
iden.openWallets();
};
this.createPin = function(pin) {
preconditions.checkArgument(pin);
preconditions.checkState($rootScope.iden);
preconditions.checkState(_credentials && _credentials.email);
$rootScope.starting = true;
$timeout(function() {
pinService.save(pin, _credentials.email, _credentials.password, function(err) {
_credentials.password = '';
_credentials = null;
this.askForPin = 0;
$rootScope.hasPin = true;
$rootScope.starting = null;
this.openWallets();
});
}, 100);
};
this.openWithCredentials = function(form) {
if (form && form.$invalid) {
this.error = 'Please enter the required fields';
return;
}
this.open(form.email.$modelValue, form.password.$modelValue);
};
this.pinLogout = function() {
pinService.clear(function() {
copay.logger.debug('PIN erased');
delete $rootScope['hasPin'];
applicationService.restart();
});
};
this.open = function(username, password) {
$rootScope.starting = true;
profileService.open(username, password, function(err) {
if (err) {
$rootScope.starting = false;
$rootScope.hasPin = false;
pinService.clear(function() {});
this.error = 'Unknown error';
return;
}
// mobile
if (this.isMobile && !$rootScope.hasPin) {
_credentials = {
email: email,
password: password,
};
this.askForPin = 1;
$rootScope.starting = false;
$rootScope.hideNavigation = true;
$timeout(function() {
$rootScope.$digest();
}, 1);
}
// no mobile
else {
// this.openWallets();
}
});
};
function getParam(sname) {
var params = location.search.substr(location.search.indexOf("?") + 1);
var sval = "";
params = params.split("&");
// split param and value into individual pieces
for (var i = 0; i < params.length; i++) {
var temp = params[i].split("=");
if ([temp[0]] == sname) {
sval = temp[1];
}
}
return sval;
}
});

View File

@ -1,7 +0,0 @@
'use strict';
angular.module('copayApp.controllers').controller('unsupportedController', function($state) {
if (localStorage && localStorage.length > 0) {
$state.go('signin');
}
});

View File

@ -1,47 +0,0 @@
'use strict';
angular.module('copayApp.controllers').controller('walletForPaymentController', function($rootScope, $scope, $modal, identityService, go) {
// INIT: (not it a function, since there is no associated html)
var ModalInstanceCtrl = function($scope, $modalInstance, identityService) {
$scope.loading = true;
preconditions.checkState($rootScope.iden);
var iden = $rootScope.iden;
iden.on('newWallet', function() {
$scope.setWallets();
});
$scope.setWallets = function() {
$scope.wallets = $rootScope.iden.getWallets();
};
$scope.ok = function(w) {
$modalInstance.close(w);
};
$scope.cancel = function() {
$rootScope.pendingPayment = null;
$modalInstance.close();
};
};
var modalInstance = $modal.open({
templateUrl: 'views/modals/walletSelection.html',
windowClass: 'full',
controller: ModalInstanceCtrl,
});
modalInstance.result.then(function(w) {
if (w) {
identityService.setFocusedWallet(w);
$rootScope.walletForPaymentSet = true;
} else {
$rootScope.pendingPayment = null;
}
go.walletHome();
}, function() {
$rootScope.pendingPayment = null;
go.walletHome();
});
});

View File

@ -1,27 +0,0 @@
'use strict';
angular.module('copayApp.controllers').controller('WarningController', function($scope, $rootScope, $location, identityService) {
$scope.checkLock = function() {
if (!$rootScope.tmp || !$rootScope.tmp.getLock()) {
console.log('[warning.js.7] TODO LOCK'); //TODO
}
};
$scope.signout = function() {
identityService.signout();
};
$scope.ignoreLock = function() {
var w = $rootScope.tmp;
delete $rootScope['tmp'];
if (!w) {
$location.path('/');
} else {
w.ignoreLock = 1;
$scope.loading = true;
//controllerUtils.startNetwork(w, $scope);
// TODO
}
};
});

View File

@ -7,6 +7,11 @@ if (window && window.navigator) {
var isaosp = (rxaosp && rxaosp[1] < 537);
if (!window.cordova && isaosp)
unsupported = true;
if (!Modernizr.localstorage)
unsupported = true;
if (unsupported) {
window.location = '#/unsupported';
}
}
@ -414,18 +419,20 @@ angular
})
.run(function($rootScope, $state, $log, gettextCatalog, uriHandler, isCordova, amMoment, profileService) {
var userLang, androidLang;
// Auto-detect browser language
// Commented for now (default: English)
//var userLang, androidLang;
//
//if (navigator && navigator.userAgent && (androidLang = navigator.userAgent.match(/android.*\W(\w\w)-(\w\w)\W/i))) {
// userLang = androidLang[1];
//} else {
// // works for iOS and Android 4.x
// userLang = navigator.userLanguage || navigator.language;
//}
if (navigator && navigator.userAgent && (androidLang = navigator.userAgent.match(/android.*\W(\w\w)-(\w\w)\W/i))) {
userLang = androidLang[1];
} else {
// works for iOS and Android 4.x
userLang = navigator.userLanguage || navigator.language;
}
userLang = userLang ? (userLang.split('-', 1)[0] || 'en') : 'en';
gettextCatalog.setCurrentLanguage(userLang);
amMoment.changeLocale(userLang);
//userLang = userLang ? (userLang.split('-', 1)[0] || 'en') : 'en';
//gettextCatalog.setCurrentLanguage(userLang);
//amMoment.changeLocale(userLang);
// Register URI handler, not for mobileApp
if (!isCordova) {
@ -463,11 +470,6 @@ angular
$rootScope.$emit('Animation/SwipeLeft');
}
if (unsupported) {
$state.transitionTo('unsupported');
event.preventDefault();
}
if (!profileService.profile && toState.needProfile) {
// Try to open local profile

View File

@ -16,12 +16,12 @@ module.exports = function(config) {
// list of files / patterns to load in the browser
files: [
'bower_components/fastclick/lib/fastclick.js',
'bower_components/modernizr/modernizr.js',
'bower_components/qrcode-generator/js/qrcode.js',
'bower_components/qrcode-decoder-js/lib/qrcode-decoder.js',
'bower_components/moment/min/moment-with-locales.js',
'bower_components/angular/angular.js',
'bower_components/angular-ui-router/release/angular-ui-router.js',
'bower_components/angular-local-storage/dist/angular-local-storage.js',
'bower_components/angular-foundation/mm-foundation.js',
'bower_components/angular-foundation/mm-foundation-tpls.js',
'bower_components/angular-animate/angular-animate.js',