This commit is contained in:
Matias Alejo Garcia 2015-01-04 12:29:20 -03:00
commit b37306c872
32 changed files with 520 additions and 200 deletions

View File

@ -25,19 +25,11 @@ module.exports = function(grunt) {
}
}
},
shell: {
exec: {
prod: {
options: {
stdout: false,
stderr: false
},
command: 'node ./util/build.js'
command: 'ls'
},
dev: {
options: {
stdout: true,
stderr: true
},
command: 'node ./util/build.js -d'
}
},
@ -242,25 +234,25 @@ module.exports = function(grunt) {
grunt.registerTask('default', [
'shell:dev', 'nggettext_compile', 'concat', 'cssmin:desktop', 'cssmin:vendors'
'exec:dev', 'nggettext_compile', 'concat', 'cssmin:desktop', 'cssmin:vendors'
]);
grunt.registerTask('mobile', [
'shell:dev', 'nggettext_compile', 'concat', 'cssmin:mobile', 'cssmin:vendors'
'exec:dev', 'nggettext_compile', 'concat', 'cssmin:mobile', 'cssmin:vendors'
]);
grunt.registerTask('dist', [
'shell:prod', 'nggettext_compile', 'concat', 'cssmin:desktop', 'cssmin:vendors', 'uglify', 'copy:dist'
'exec:prod', 'nggettext_compile', 'concat', 'cssmin:desktop', 'cssmin:vendors', 'uglify', 'copy:dist'
]);
grunt.registerTask('dist-dbg', [
'shell:prod', 'nggettext_compile', 'concat', 'cssmin:desktop', 'cssmin:vendors', 'copy:dist'
'exec:prod', 'nggettext_compile', 'concat', 'cssmin:desktop', 'cssmin:vendors', 'copy:dist'
]);
grunt.registerTask('dist-mobile', [
'shell:prod', 'nggettext_compile', 'concat', 'cssmin:mobile', 'cssmin:vendors', 'uglify', 'copy:dist'
'exec:prod', 'nggettext_compile', 'concat', 'cssmin:mobile', 'cssmin:vendors', 'uglify', 'copy:dist'
]);
grunt.registerTask('dist-mobile-dbg', [
'shell:dev', 'nggettext_compile', 'concat', 'cssmin:mobile', 'cssmin:vendors', 'copy:dist'
'exec:dev', 'nggettext_compile', 'concat', 'cssmin:mobile', 'cssmin:vendors', 'copy:dist'
]);
grunt.registerTask('prod', [
'shell:prod', 'nggettext_compile', 'concat', 'cssmin:desktop', 'cssmin:vendors', 'uglify'
'exec:prod', 'nggettext_compile', 'concat', 'cssmin:desktop', 'cssmin:vendors', 'uglify'
]);
grunt.registerTask('translate', ['nggettext_extract']);
grunt.registerTask('docs', ['jsdoc']);

View File

@ -1,29 +1,31 @@
VERSION=`cut -d '"' -f2 $BUILDDIR/../version.js`
sign:
gpg -u 1112CFA1 --output browser-extensions/chrome/copay-chrome-extension.zip.sig --detach-sig browser-extensions/chrome/copay-chrome-extension.zip
verify:
gpg --verify browser-extensions/chrome/copay-chrome-extension.zip.sig browser-extensions/chrome/copay-chrome-extension.zip
ios:
cordova/build.sh
cd cordova/project && cordova build ios
open cordova/project/platforms/ios/Copay.xcodeproj
ios-debug:
cordova/build.sh --dbgjs
cd cordova/project && cordova build ios
open cordova/project/platforms/ios/Copay.xcodeproj
android:
cordova/build.sh --android --dbgjs
cd cordova/project && cordova run android
android-prod:
cordova/build.sh --release
cd cordova/project && cordova build android --release
chrome:
grunt prod
browser-extensions/chrome/build.sh
cordova-base:
grunt dist-mobile
ios: cordova-base
make -C cordova ios
open cordova/project/platforms/ios/Copay
android: cordova-base
make -C cordova run-android
release-android: cordova-base
make -C cordova release-android
wp8:
cordova/build.sh WP8
cordova/wp/fix-svg.sh
echo -e "\a"

50
cordova/Makefile Normal file
View File

@ -0,0 +1,50 @@
.PHONY: plugins android wp8 ios clean
all:
# grunt dist-mobile-dbg
plugins:
make -C project plugins
project:
cordova create project com.bitpay.copay Copay
cp config.xml project/config.xml
cp ProjectMakefile project/Makefile
cp -af ../dist/web/** project/www
sed "s/<\!-- PLACEHOLDER: CORDOVA SRIPT -->/<script type='text\/javascript' charset='utf-8' src='cordova.js'><\/script>/g" ../index.html > project/www/index.html
android: project plugins
mkdir -p project/platforms/android/res/xml/
cp android/AndroidManifest.xml project/platforms/android/AndroidManifest.xml
cp android/project.properties project/platforms/android/project.properties
cp -R android/res/* project/platforms/android/res
make -C project android
wp8: project plugins
make -C project wp8
cp -R project/www/* project/platforms/wp8/www
cp -R wp/res/* project/platforms/wp/res
ios: project plugins
make -C project ios
cp ios/Copay-Info.plist project/platforms/ios/Copay-Info.plist
mkdir -p project/platforms/ios/Copay/Resources/icons
mkdir -p project/platforms/ios/Copay/Resources/splash
cp -R ios/icons/* project/platforms/ios/Copay/Resources/icons
cp -R ios/splash/* project/platforms/ios/Copay/Resources/splash
open-ios: ios
open project/platforms/ios/Copay.xcodeproj
run-android: android
make -C project run-android
release-android: android
make -C project release-android
clean:
rm -rf project

31
cordova/ProjectMakefile Normal file
View File

@ -0,0 +1,31 @@
.PHONY: android plugins wp8 ios
plugins:
@echo "Intalling cordova plugins"
cordova plugin add https://github.com/Initsogar/cordova-webintent.git
cordova plugin add https://github.com/wildabeast/BarcodeScanner.git
cordova plugin add org.apache.cordova.splashscreen
cordova plugin add org.apache.cordova.statusbar
cordova plugin add https://github.com/EddyVerbruggen/LaunchMyApp-PhoneGap-Plugin.git --variable URL_SCHEME=bitcoin
cordova plugin add org.apache.cordova.inappbrowser
android:
cordova platforms add android
wp8:
cordova platforms add wp8
ios:
cordova platforms add ios
build-ios:
cordova build ios
run-android:
cordova run android
release-android:
cordova build android --release

View File

@ -1,14 +1,9 @@
#! /bin/bash
#
# Usage:
# sh ./build.sh --android --reload
OpenColor="\033["
Red="1;31m"
Yellow="1;33m"
Green="1;32m"
CloseColor="\033[0m"
#
#
# Check function OK
checkOK() {
if [ $? != 0 ]; then
@ -22,22 +17,22 @@ BUILDDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
PROJECT="$BUILDDIR/project"
VERSION=`cut -d '"' -f2 $BUILDDIR/../version.js`
SKIPIOS=false
CURRENT_OS=$1
if [ -z "CURRENT_OS" ]
then
echo "Build.sh WP8|ANDROID|IPHONE"
fi
CLEAR=false
DBGJS=false
# Check Args
if [[ $1 = "--android" || $2 = "--android" || $3 = "--android" ]]
then
SKIPIOS=true
fi
if [[ $1 = "--clear" || $2 = "--clear" || $3 = "--clear" ]]
if [[ $2 = "--clear" || $3 = "--clear" ]]
then
CLEAR=true
fi
if [[ $1 = "--dbgjs" || $2 = "--dbgjs" || $3 = "--dbgjs" ]]
if [[ $2 = "--dbgjs" || $3 = "--dbgjs" ]]
then
DBGJS=true
fi
@ -45,7 +40,7 @@ fi
echo "${OpenColor}${Green}* Checking dependencies...${CloseColor}"
command -v cordova >/dev/null 2>&1 || { echo >&2 "Cordova is not present, please install it: sudo npm -g cordova."; exit 1; }
command -v xcodebuild >/dev/null 2>&1 || { echo >&2 "XCode is not present, install it or use [--android]."; exit 1; }
#command -v xcodebuild >/dev/null 2>&1 || { echo >&2 "XCode is not present, install it or use [--android]."; exit 1; }
# Create project dir
if $CLEAR
@ -55,6 +50,10 @@ then
fi
fi
echo "Build directory is $BUILDDIR"
echo "Project directory is $PROJECT"
if [ ! -d $PROJECT ]; then
cd $BUILDDIR
echo "${OpenColor}${Green}* Creating project... ${CloseColor}"
@ -62,21 +61,30 @@ if [ ! -d $PROJECT ]; then
checkOK
cd $PROJECT
echo "${OpenColor}${Green}* Adding Android platform... ${CloseColor}"
cordova platforms add android
checkOK
if [[ !$SKIPIOS ]]; then
if [ $CURRENT_OS == "ANDROID" ]; then
echo "${OpenColor}${Green}* Adding Android platform... ${CloseColor}"
cordova platforms add android
checkOK
fi
if [ $CURRENT_OS == "IPHONE" ]; then
echo "${OpenColor}${Green}* Adding IOS platform... ${CloseColor}"
cordova platforms add ios
checkOK
fi
if [ $CURRENT_OS == "WP8" ]; then
echo "${OpenColor}${Green}* Adding WP8 platform... ${CloseColor}"
cordova platforms add wp8
checkOK
fi
echo "${OpenColor}${Green}* Installing plugins... ${CloseColor}"
cordova plugin add https://github.com/Initsogar/cordova-webintent.git
checkOK
cordova plugin add https://github.com/wildabeast/BarcodeScanner.git
checkOK
@ -116,22 +124,32 @@ sed "s/<\!-- PLACEHOLDER: CORDOVA SRIPT -->/<script type='text\/javascript' char
checkOK
cd $BUILDDIR
cp config.xml $PROJECT/config.xml
checkOK
mkdir -p $PROJECT/platforms/android/res/xml/
checkOK
cp android/AndroidManifest.xml $PROJECT/platforms/android/AndroidManifest.xml
checkOK
cp android/project.properties $PROJECT/platforms/android/project.properties
checkOK
cp config.xml $PROJECT/config.xml
checkOK
cp -R android/res/* $PROJECT/platforms/android/res
checkOK
if [ $CURRENT_OS == "ANDROID" ]; then
echo "Android project!!!"
if [[ !$SKIPIOS ]]; then
mkdir -p $PROJECT/platforms/android/res/xml/
checkOK
cp android/AndroidManifest.xml $PROJECT/platforms/android/AndroidManifest.xml
checkOK
cp android/project.properties $PROJECT/platforms/android/project.properties
checkOK
cp -R android/res/* $PROJECT/platforms/android/res
checkOK
fi
if [ $CURRENT_OS == "IPHONE" ]; then
echo "Iphone project!!!"
cp ios/Copay-Info.plist $PROJECT/platforms/ios/Copay-Info.plist
checkOK
@ -148,3 +166,16 @@ if [[ !$SKIPIOS ]]; then
checkOK
fi
if [ $CURRENT_OS == "WP8" ]; then
echo "Wp8 project!!!"
cp -R $PROJECT/www/* $PROJECT/platforms/wp8/www
checkOK
mkdir -p $PROJECT/platforms/res/wp
cp -v wp/res/* $PROJECT/platforms/wp8/Assets
cp -v wp/res/SplashScreenImage.jpg $PROJECT/platforms/wp8/
checkOK
fi

View File

@ -21,6 +21,7 @@
<preference name="StatusBarBackgroundColor" value="#3C4E60" />
<preference name="StatusBarStyle" value="lightcontent" />
<preference name="BackupWebStorage" value="none"/>
<preference name="windows-target-version" value="8.1"/>
<feature name="App">
<param name="android-package" value="com.bitpay.copay" />
</feature>

View File

@ -9,11 +9,10 @@
## Build the project
$ sh cordova/build.sh [--android]
$ cd cordova/project
$ cordova run android
$ cordova emulate ios
$ make [clean] open-ios
OR $ make [clean] android-run
OR $ make [clean] wp8
See Makefile for more targets
## Build for release
$ cordova build android --release

45
cordova/wp/MainPage.xaml Normal file
View File

@ -0,0 +1,45 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<phone:PhoneApplicationPage
x:Class="com.bitpay.copay.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
Background="Black"
SupportedOrientations="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible="True" d:DesignHeight="768" d:DesignWidth="480"
xmlns:my="clr-namespace:WPCordovaClassLib">
<Grid x:Name="LayoutRoot" Background="Transparent" HorizontalAlignment="Stretch">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<my:CordovaView HorizontalAlignment="Stretch"
Margin="0,0,0,0"
x:Name="CordovaView"
VerticalAlignment="Stretch" />
</Grid>
</phone:PhoneApplicationPage>

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest" xmlns:m2="http://schemas.microsoft.com/appx/2013/manifest" xmlns:m3="http://schemas.microsoft.com/appx/2014/manifest" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest">
<Identity Name="18C7659D.Copay" Publisher="CN=F89609D1-EB3E-45FD-A58A-C2E3895FCE7B" Version="0.9.2.2" />
<mp:PhoneIdentity PhoneProductId="5381aa50-9069-11e4-84cc-293caf9cbdc8" PhonePublisherId="F89609D1-EB3E-45FD-A58A-C2E3895FCE7B" />
<Properties>
<DisplayName>Copay</DisplayName>
<PublisherDisplayName>BitPay Inc.</PublisherDisplayName>
<Logo>Assets\StoreLogo.png</Logo>
</Properties>
<Prerequisites>
<OSMinVersion>6.3.1</OSMinVersion>
<OSMaxVersionTested>6.3.1</OSMaxVersionTested>
</Prerequisites>
<Resources>
<Resource Language="x-generate" />
</Resources>
<Applications>
<Application Id="x5381aa50y9069y11e4y84ccy293caf9cbdc8x" Executable="AGHost.exe" EntryPoint="MainPage.xaml">
<m3:VisualElements DisplayName="Copay" Square150x150Logo="Assets\SquareTile150x150.png" Square44x44Logo="Assets\Logo.png" Description="Copay" ForegroundText="light" BackgroundColor="#464646">
<m3:DefaultTile Square71x71Logo="Assets\SquareTile71x71.png">
</m3:DefaultTile>
<m3:SplashScreen Image="SplashScreenImage.jpg" />
</m3:VisualElements>
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="AgHost.BackgroundTask">
<BackgroundTasks>
<Task Type="systemEvent" />
</BackgroundTasks>
</Extension>
</Extensions>
</Application>
</Applications>
<Extensions>
<Extension Category="windows.activatableClass.inProcessServer">
<InProcessServer>
<Path>AgHostSvcs.dll</Path>
<ActivatableClass ActivatableClassId="AgHost.BackgroundTask" ThreadingModel="both" />
</InProcessServer>
</Extension>
</Extensions>
</Package>

12
cordova/wp/fix-svg.sh Normal file
View File

@ -0,0 +1,12 @@
#/bin/bash
PROJECT=./cordova/project/platforms
for i in $PROJECT/wp8/www/img/*.svg
do
cat $i |grep -v ?xml > $i
done
for i in $PROJECT/wp8/www/font/*.svg
do
cat $i |grep -v ?xml > $i
done

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

BIN
cordova/wp/wxga.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

BIN
cordova/wp/wxga2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
cordova/wp/wxga3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

View File

@ -1,10 +1,10 @@
@font-face {
font-family: 'icomoon';
src:url("../font/icomoon.eot?-5b2xva");
src:url("../font/icomoon.eot?#iefix-5b2xva") format('embedded-opentype'),
url("../font/icomoon.woff?-5b2xva") format('woff'),
url("../font/icomoon.ttf?-5b2xva") format('truetype'),
url("../font/icomoon.svg?-5b2xva#icomoon") format('svg');
src:url("../font/icomoon.eot");
src:url("../font/icomoon.eot?#iefix") format('embedded-opentype'),
url("../font/icomoon.woff") format('woff'),
url("../font/icomoon.ttf") format('truetype'),
url("../font/icomoon.svg#icomoon") format('svg');
font-weight: normal;
font-style: normal;
}

View File

@ -19,7 +19,7 @@
}
.button-close {
margin-top:65px;
margin-top:10px;
background: #213140;
padding: 1.2rem;
font-size: 14px;
@ -91,7 +91,6 @@
.scroll-section {
position: absolute;
top: 45px;
bottom: 65px;
overflow-y: auto;
}

View File

@ -1,5 +1,5 @@
<!doctype html>
<html lang="en" ng-csp>
<!doctype html>
<html lang="en" ng-app="copayApp" ng-csp>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
@ -77,20 +77,20 @@
<span translate> <strong class="size-16">Network Error</strong>.<br> Attempting to reconnect..</span>
</span>
<div ng-controller="SidebarController" ng-show="$root.iden && !$root.hideNavigation">
<div ng-controller="SidebarController" ng-show="$root.iden && !$root.hideNavigation && !$root.wpInputFocused">
<nav class="tab-bar">
<section class="left-small">
<a class="left-off-canvas-toggle menu-icon" ><span></span></a>
</section>
<section class="right-small" ng-show="$root.iden && $root.wallet.isComplete()">
<a class="p10" ng-click="$root.go('more')"><i class="fi-widget size-24"></i></a>
</section>
<section class="right-small" ng-show="$root.iden && $root.wallet.isComplete() && !$root.hideWalletNavigation">
<a class="p10" ng-click="$root.go('more')"><i class="fi-widget size-24"></i></a>
</section>
<section class="middle tab-bar-section">
<h1 class="title ellipsis" ng-show="$root.iden && $root.wallet">
{{$root.wallet.getName()}}
</h1>
<h1 class="title ellipsis" ng-show="$root.iden && $root.wallet && !$root.hideWalletNavigation">
{{$root.wallet.getName()}}
</h1>
</section>
</nav>
@ -98,13 +98,12 @@
<div ng-include="'views/includes/sidebar-mobile.html'"></div>
</nav>
<div
ng-if="$root.iden"
<div ng-if="$root.iden"
ng-include="'views/includes/sidebar.html'"
role='navigation'
class="sidebar"></div>
<div class="bottom-bar" ng-if="$root.wallet &&
$root.wallet.isComplete() && !$root.wallet.isLocked">
$root.wallet.isComplete() && !$root.wallet.isLocked && !$root.hideWalletNavigation">
<div ng-include="'views/includes/bottombar-mobile.html'"></div>
</div>
</div>
@ -116,10 +115,10 @@
class="head show-for-large-up"
ng-include="'views/includes/head.html'"
ng-if="$root.iden"
ng-class="{'dni':$root.hideNavigation}"
ng-class="{'dni':$root.hideNavigation || $root.wpInputFocused}"
></div>
<section ng-class="{'main':$root.iden && !$root.starting && !$root.hideNavigation}" ng-view></section>
<section ng-class="{'main':$root.iden && !$root.starting && !$root.hideNavigation && !$root.wpInputFocused}" ng-view></section>
<a class="exit-off-canvas"></a>

View File

@ -1,15 +1,17 @@
'use strict';
angular.module('copayApp.controllers').controller('CreateController',
function($scope, $rootScope, $location, $timeout, identityService, backupService, notification, defaults) {
function($scope, $rootScope, $location, $timeout, identityService, backupService, notification, defaults, isMobile, isCordova) {
$rootScope.fromSetup = true;
$scope.loading = false;
$scope.walletPassword = $rootScope.walletPassword;
$scope.isMobile = !!window.cordova;
$scope.isMobile = isMobile.any();
$scope.hideAdv = true;
$scope.networkName = config.networkName;
$rootScope.title = 'Create new wallet';
$rootScope.hideWalletNavigation = true;
$scope.isWindowsPhoneApp = isMobile.Windows() && isCordova;
// ng-repeat defined number of times instead of repeating over array?
$scope.getNumber = function(num) {
@ -39,6 +41,7 @@ angular.module('copayApp.controllers').controller('CreateController',
return $scope.networkUrl != defaults.network.livenet.url && $scope.networkUrl != defaults.network.testnet.url;
};
$scope.create = function(form) {
if (form && form.$invalid) {
$scope.error = 'Please enter the required fields';
@ -68,4 +71,8 @@ angular.module('copayApp.controllers').controller('CreateController',
},1);
});
};
$scope.$on("$destroy", function () {
$rootScope.hideWalletNavigation = false;
});
});

View File

@ -1,6 +1,6 @@
'use strict';
angular.module('copayApp.controllers').controller('CreateProfileController', function($scope, $rootScope, $location, $timeout, $window, notification, pluginManager, identityService, pinService, isMobile, configService, go) {
angular.module('copayApp.controllers').controller('CreateProfileController', function($scope, $rootScope, $location, $timeout, $window, notification, pluginManager, identityService, pinService, isMobile, isCordova, configService, go) {
var _credentials, _firstpin;
@ -10,15 +10,25 @@ angular.module('copayApp.controllers').controller('CreateProfileController', fun
go.walletHome();
$scope.isMobile = isMobile.any();
$scope.isWindowsPhoneApp = isMobile.Windows() && isCordova;
$scope.hideForWP = 0;
$scope.createStep = 'storage';
$scope.useLocalstorage = false;
$scope.minPasswordStrength = _.isUndefined(config.minPasswordStrength) ?
4 : config.minPasswordStrength;
pinService.makePinInput($scope, 'newpin', function(newValue) {
_firstpin = newValue;
$scope.hideForWP = 0;
$scope.askForPin = 2;
$timeout(function() {
$scope.$digest();
}, 1);
});
pinService.makePinInput($scope, 'repeatpin', function(newValue) {
@ -27,6 +37,9 @@ angular.module('copayApp.controllers').controller('CreateProfileController', fun
$scope.createPin(newValue);
} else {
$scope.askForPin = 1;
$scope.hideForWP = 0;
$scope.passwordStrength = null;
_firstpin = null;
$scope.setPinForm.newpin.$setViewValue('');
@ -36,10 +49,20 @@ angular.module('copayApp.controllers').controller('CreateProfileController', fun
$scope.setPinForm.$setPristine();
$scope.error = 'Entered PINs were not equal. Try again';
$timeout(function() {
$scope.$digest();
}, 1);
}
});
};
$scope.formFocus = function() {
if (!$scope.isWindowsPhoneApp) return
$scope.hideForWP = true;
$timeout(function() {
$scope.$digest();
}, 1);
};
$scope.createPin = function(pin) {
preconditions.checkArgument(pin);
@ -66,6 +89,7 @@ angular.module('copayApp.controllers').controller('CreateProfileController', fun
$scope.setStep = function(step) {
$scope.error = null;
$scope.createStep = step;
$scope.hideForWP = false;
$timeout(function() {
$scope.$digest();
}, 1);
@ -73,6 +97,7 @@ angular.module('copayApp.controllers').controller('CreateProfileController', fun
$scope.selectStorage = function(storage) {
$scope.useLocalstorage = storage == 'local';
$scope.hideForWP = false;
$timeout(function() {
$scope.$digest();
}, 1);
@ -88,6 +113,7 @@ angular.module('copayApp.controllers').controller('CreateProfileController', fun
preconditions.checkState($scope.userOrEmail);
$scope.error = null;
$scope.hideForWP = false;
$scope.createStep = 'pass';
$timeout(function() {
$scope.$digest();
@ -142,6 +168,8 @@ angular.module('copayApp.controllers').controller('CreateProfileController', fun
password: password,
};
$scope.askForPin = 1;
$scope.hideForWP = 0;
$rootScope.hideNavigation = true;
$timeout(function() {
$rootScope.$digest();

View File

@ -1,10 +1,12 @@
'use strict';
angular.module('copayApp.controllers').controller('HomeController', function($scope, $rootScope, $timeout, $window, go, notification, identityService, Compatibility, pinService, applicationService, isMobile) {
angular.module('copayApp.controllers').controller('HomeController', function($scope, $rootScope, $timeout, $window, go, notification, identityService, Compatibility, pinService, applicationService, isMobile, isCordova) {
var _credentials, _firstpin;
$scope.init = function() {
$scope.isMobile = isMobile.any();
$scope.isWindowsPhoneApp = isMobile.Windows() && isCordova;
$scope.hideForWP = 0;
$scope.attempt = 0;
// This is only for backwards compat, insight api should link to #!/confirmed directly
@ -30,6 +32,16 @@ angular.module('copayApp.controllers').controller('HomeController', function($sc
$scope.usingLocalStorage = config.plugins.EncryptedLocalStorage;
};
$scope.formFocus = function() {
if ($scope.isWindowsPhoneApp) {
$scope.hideForWP = true;
$timeout(function() {
$scope.$digest();
}, 1);
}
};
pinService.makePinInput($scope, 'pin', function(newValue) {
$scope.openWithPin(newValue);
});

View File

@ -9,6 +9,8 @@ angular.module('copayApp.controllers').controller('ImportController',
$scope.isSafari = isMobile.Safari();
$scope.isCordova = isCordova;
$scope.importOpts = {};
$rootScope.hideWalletNavigation = true;
window.ignoreMobilePause = true;
$scope.$on('$destroy', function() {
@ -96,4 +98,10 @@ angular.module('copayApp.controllers').controller('ImportController',
});
}
};
$scope.$on("$destroy", function () {
$rootScope.hideWalletNavigation = false;
});
});

View File

@ -6,6 +6,8 @@ angular.module('copayApp.controllers').controller('JoinController',
$scope.loading = false;
$scope.isMobile = isMobile.any();
$rootScope.title = 'Join shared wallet';
$rootScope.hideWalletNavigation = true;
// QR code Scanner
var cameraInput;
@ -150,4 +152,9 @@ angular.module('copayApp.controllers').controller('JoinController',
$timeout(function () { $scope.$digest(); }, 1);
});
}
$scope.$on("$destroy", function () {
$rootScope.hideWalletNavigation = false;
});
});

View File

@ -3,7 +3,7 @@ var bitcore = require('bitcore');
var preconditions = require('preconditions').singleton();
angular.module('copayApp.controllers').controller('SendController',
function($scope, $rootScope, $window, $timeout, $modal, $filter, notification, isMobile, rateService, txStatus) {
function($scope, $rootScope, $window, $timeout, $modal, $filter, notification, isMobile, rateService, txStatus, isCordova) {
var satToUnit;
@ -13,9 +13,13 @@ angular.module('copayApp.controllers').controller('SendController',
preconditions.checkState(w.settings.unitToSatoshi);
$scope.isMobile = isMobile.any();
$scope.isWindowsPhoneApp = isMobile.Windows() && isCordova;
$rootScope.wpInputFocused = false;
$scope.isShared = w.isShared();
$scope.requiresMultipleSignatures = w.requiresMultipleSignatures();
$rootScope.title =$scope.requiresMultipleSignatures ? 'Send Proposal' : 'Send';
$rootScope.title = $scope.requiresMultipleSignatures ? 'Send Proposal' : 'Send';
$scope.loading = false;
$scope.error = $scope.success = null;
@ -44,7 +48,30 @@ angular.module('copayApp.controllers').controller('SendController',
$scope.isRateAvailable = true;
$scope.$digest();
});
}
};
$scope.formFocus = function(what) {
if (!$scope.isWindowsPhoneApp) return
if (!what) {
$rootScope.wpInputFocused = false;
$scope.hideAddress = false;
$scope.hideAmount = false;
} else {
$rootScope.wpInputFocused = true;
if (what == 'amount') {
$scope.hideAddress = true;
} else if (what == 'msg') {
$scope.hideAddress = true;
$scope.hideAmount = true;
}
}
$timeout(function() {
$rootScope.$digest();
}, 1);
};
$scope.setInputs = function() {
var w = $rootScope.wallet;
@ -148,25 +175,35 @@ angular.module('copayApp.controllers').controller('SendController',
}
$scope.loading = true;
var comment = form.comment.$modelValue;
var merchantData = $scope._merchantData;
var address, amount;
if (!merchantData) {
address = form.address.$modelValue;
amount = parseInt((form.amount.$modelValue * unitToSat).toFixed(0));
}
$scope.creatingTX = true;
if ($scope.isWindowsPhoneApp)
$rootScope.wpInputFocused = true;
w.spend({
merchantData: merchantData,
toAddress: address,
amountSat: amount,
comment: comment,
}, function(err, txid, status) {
$scope.loading = false;
if (err)
return $scope.setError(err);
txStatus.notify(status);
$scope.resetForm();
$timeout(function () {
var comment = form.comment.$modelValue;
var merchantData = $scope._merchantData;
var address, amount;
if (!merchantData) {
address = form.address.$modelValue;
amount = parseInt((form.amount.$modelValue * unitToSat).toFixed(0));
}
w.spend({
merchantData: merchantData,
toAddress: address,
amountSat: amount,
comment: comment,
}, function (err, txid, status) {
$scope.loading = false;
$scope.creatingTX = false;
if ($scope.isWindowsPhoneApp)
$rootScope.wpInputFocused = false;
if (err)
return $scope.setError(err);
txStatus.notify(status);
$scope.resetForm();
});
});
};
@ -291,7 +328,7 @@ angular.module('copayApp.controllers').controller('SendController',
window.ignoreMobilePause = true;
cordova.plugins.barcodeScanner.scan(
function onSuccess(result) {
$timeout(function(){
$timeout(function() {
window.ignoreMobilePause = false;
}, 100);
if (result.cancelled) return;
@ -305,7 +342,7 @@ angular.module('copayApp.controllers').controller('SendController',
}, 1000);
},
function onError(error) {
$timeout(function(){
$timeout(function() {
window.ignoreMobilePause = false;
}, 100);
alert('Scanning error');

View File

@ -1,9 +1,11 @@
'use strict';
angular.element(document).ready(function() {
var startAngular = function() {
angular.bootstrap(document, ['copayApp']);
};
// this is now in HTML tab, witch is compatible with Windows Phone
// var startAngular = function() {
// angular.bootstrap(document, ['copayApp']);
// };
/* Cordova specific Init */
if (window.cordova !== undefined) {
@ -28,10 +30,10 @@ angular.element(document).ready(function() {
window.plugins.webintent.onNewIntent(handleBitcoinURI);
window.handleOpenURL = handleBitcoinURI;
startAngular();
// startAngular();
}, false);
} else {
startAngular();
// startAngular();
}
});

View File

@ -22,13 +22,14 @@
},
"dependencies": {
"browser-request": "git://github.com/matiu/browser-request.git#67200dd4ec133457fb7dc69f005540f92b543f0a",
"cordova": "^4.1.2",
"inherits": "^2.0.1",
"lodash": "^2.4.1",
"moment": "2.6.0",
"optimist": "^0.6.1",
"preconditions": "^1.0.7",
"querystring": "^0.2.0",
"request": "^2.40.0",
"moment": "2.6.0"
"request": "^2.40.0"
},
"scripts": {
"start": "node server.js",
@ -66,7 +67,7 @@
"grunt-markdown": "^0.5.0",
"grunt-mocha-test": "^0.8.2",
"grunt-release": "^0.7.0",
"grunt-shell": "^0.6.4",
"grunt-exec": "*",
"istanbul": "^0.2.10",
"karma": "^0.12.9",
"karma-chai": "^0.1.0",

View File

@ -3,11 +3,6 @@
<div ng-include="'views/includes/loading.html'" ng-init="title = 'Creating wallet'"></div>
</div>
<div class="setup" ng-show="!loading && !$root.starting">
<div class="row hide-for-large-up">
<div class="medium-12 small-12 columns">
<h1>{{$root.title}}</h1>
</div>
</div>
<form name="setupForm" ng-submit="create(setupForm)" novalidate>
<div class="row">
<div class="large-12 columns">
@ -24,7 +19,7 @@
<div class="panel">
<label><span translate>Wallet name</span>
<div class="input">
<input type="text" placeholder="{{'Family vacation funds'|translate}}" class="form-control" ng-model="walletName" ng-required="true">
<input type="text" placeholder="{{'Family vacation funds'|translate}}" class="form-control" ng-model="walletName" ng-required="true">
</div>
</label>
<div class="row">

View File

@ -4,34 +4,34 @@
</div>
<div class="large-4 large-centered medium-7 medium-centered columns m20b" ng-show="!$root.starting && !askForPin">
<div class="logo-setup hide-for-small-only">
<div class="logo-setup hide-for-small-only" ng-hide="hideForWP">
<img src="img/logo-negative-beta.svg" alt="Copay" width="100">
</div>
<div>
<div class="clipo" ng-show="createStep == 'storage' ">
<div class="clipo" ng-show="createStep == 'storage' && !hideForWP ">
<img src="img/clipo-signup1.png" alt="clipo" width="311">
</div>
<div ng-show="createStep == 'email'">
<div class="clipo" ng-if="useLocalstorage">
<div class="clipo" ng-if="useLocalstorage && !hideForWP" >
<img src="img/clipo-signup2-1.png" alt="clipo" width="373">
</div>
<div class="clipo" ng-if="!useLocalstorage">
<div class="clipo" ng-if="!useLocalstorage && !hideForWP">
<img src="img/clipo-signup2.png" alt="clipo" width="373">
</div>
<h2 ng-if="!useLocalstorage"> Creating in the cloud </h2>
<h2 ng-if="useLocalstorage"> Creating on this device </h2>
<h2 ng-if="!useLocalstorage" ng-hide="hideForWP"> Creating in the cloud </h2>
<h2 ng-if="useLocalstorage" ng-hide="hideForWP"> Creating on this device </h2>
</div>
<div ng-show="createStep == 'pass'">
<div class="clipo">
<div class="clipo" ng-hide="hideForWP">
<img src="img/clipo-signup3.png" alt="clipo" width="380">
</div>
<h2 ng-if="useLocalstorage"> Creating on this device </h2>
<h2 ng-if="!useLocalstorage"> Creating in the cloud </h2>
<div class="text-gray text-center m20b">{{userOrEmail}}</div>
<h2 ng-if="useLocalstorage" ng-hide="hideForWP"> Creating on this device </h2>
<h2 ng-if="!useLocalstorage" ng-hide="hideForWP"> Creating in the cloud </h2>
<div class="text-gray text-center m20b" ng-hide="hideForWP">{{userOrEmail}}</div>
</div>
<div class="box-notification" ng-show="error && !passwordStrength">
@ -113,7 +113,7 @@
<form ng-show="createStep == 'email'" name="emailForm" ng-submit="setEmailOrUsername(emailForm)" novalidate>
<div class="input" ng-if="useEmail">
<input type="email" ng-model="email" class="form-control fi-email" name="email" placeholder="Email" required auto-focus="!isMobile">
<input type="email" ng-model="email" class="form-control fi-email" name="email" placeholder="Email" required auto-focus="!isMobile" ng-focus="formFocus()">
<i class="icon-email"></i>
<div class="icon-input" ng-if="useEmail">
<span translate class="has-error size-12" ng-show="emailForm.email.$invalid &&
@ -128,7 +128,7 @@
</div>
<div class="input" ng-if="!useEmail">
<input type="text" ng-model="username" class="form-control fi-user" name="username" placeholder="Username" required auto-focus>
<input type="text" ng-model="username" class="form-control fi-user" name="username" placeholder="Username" required auto-focus="!isMobile" ng-focus="formFocus()">
<i class="icon-person"></i>
</div>
@ -149,10 +149,13 @@
<form ng-show="createStep == 'pass'" name="passForm" ng-submit="createProfile(passForm)" novalidate>
<div class="box-notification" ng-show="passwordStrength">
<div class="box-icon" style="background-color:{{passwordStrength.color}}">
<i class="fi-x size-24" ng-if="passwordStrength.strength< minPasswordStrength"></i>
<i class="fi-check size-24" ng-if="passwordStrength.strength >= minPasswordStrength"></i>
</div>
<!-- if you change this, check it on WP...-->
<div class="box-icon" ng-if="passwordStrength.strength< minPasswordStrength" style="background-color:#dd514c">
<i class="fi-x size-24"></i>
</div>
<div class="box-icon" ng-if="passwordStrength.strength >= minPasswordStrength" style="background-color:#16A085">
<i class="fi-check size-24"></i>
</div>
<span class="size-14" >
Password Strength: {{passwordStrength.message}}
</span>
@ -160,13 +163,13 @@
<div class="input">
<input id="password" type="password" ng-model="$parent.password" class="form-control" name="password" placeholder="{{'Choose a password'|translate}}" check-strength="passwordStrength" >
<input id="password" type="password" ng-model="$parent.password" class="form-control" name="password" placeholder="{{'Choose a password'|translate}}" check-strength="passwordStrength" ng-focus="formFocus()" >
<i class="icon-locked"></i>
</div>
<div class="input">
<input type="password" ng-model="repeatpassword" class="input form-control" name="repeatpassword" placeholder="{{'Repeat password'|translate}}" match="password" required>
<input type="password" ng-model="repeatpassword" class="input form-control" name="repeatpassword" placeholder="{{'Repeat password'|translate}}" match="password" required ng-focus="formFocus()">
<i class="icon-locked"></i>
<div class="icon-input">
<span translate class="has-error size-12" ng-show="passForm.repeatpassword.$dirty &&
@ -198,7 +201,7 @@
</div>
<div class="large-4 large-centered medium-6 medium-centered columns m20b" ng-show="!$root.starting && askForPin">
<div class="clipo">
<div class="clipo" ng-hide="hideForWP">
<img src="img/clipo-pin.png" alt="clipo" width="380">
</div>
@ -212,31 +215,29 @@
</div>
<form name="setPinForm" novalidate>
<div class="input" ng-show="askForPin == 1">
<input id="newpin" type="tel" ng-model="newpin" class="form-control" ng-maxlength="4" ng-minlength="4" maxlength="4" ng-pattern="/^[0-9]{1,4}$/" placeholder="PIN" name="newpin" required show-focus="askForPin == 1">
<i class="icon-locked"></i>
<div class="input" ng-if="askForPin == 1">
<input id="newpin" type="tel" ng-model="newpin" class="form-control" ng-maxlength="4" ng-minlength="4" maxlength="4" ng-pattern="/^[0-9]{1,4}$/" placeholder="PIN" name="newpin" required show-focus="askForPin == 1 && !isWindowsPhoneApp" ng-focus="formFocus()">
<i class="icon-locked" ng-hide="isWindowsPhoneApp"></i>
</div>
<div class="input" ng-show="askForPin == 2">
<input id="repeatpin" type="tel" ng-model="repeatpin" class="form-control" ng-maxlength="4" ng-minlength="4" maxlength="4" ng-pattern="/^[0-9]{1,4}$/" placeholder="Confirm your PIN" name="repeatpin" required show-focus="askForPin == 2">
<i class="icon-locked"></i>
<div class="input" ng-if="askForPin == 2">
<input id="repeatpin" type="tel" ng-model="repeatpin" class="form-control" ng-maxlength="4" ng-minlength="4" maxlength="4" ng-pattern="/^[0-9]{1,4}$/" placeholder="Confirm your PIN" name="repeatpin" required show-focus="askForPin == 2 && !isWindowsPhoneApp" ng-focus="formFocus()">
<i class="icon-locked" ng-hide="isWindowsPhoneApp"></i>
</div>
<div class="box-setup-footer row collapse">
<div class="large-6 medium-6 small-6 columns">
<a class="button secondary radius m0" ng-click="createDefaultWallet()">
<span translate>Skip</span>
</a>
<div class="box-setup-footer row collapse">
<div class="large-6 medium-6 small-6 columns">
<a class="button secondary radius m0" ng-click="createDefaultWallet()">
<span translate>Skip</span>
</a>
</div>
<div class="large-6 medium-6 small-6 columns text-right">
<button translate ng-click="createPin(setPinForm.repeatpin.$modelValue)" class="button primary radius expand m0"
ng-disabled="setPinForm.$invalid || error">
OK
</button>
</div>
</div>
<div class="large-6 medium-6 small-6 columns text-right">
<button translate ng-click="createPin(setPinForm.repeatpin.$modelValue)" class="button primary radius expand m0"
ng-disabled="setPinForm.$invalid || error">
OK
</button>
</div>
</div>
</form>
</form>
</div>
</div>

View File

@ -5,7 +5,7 @@
</div>
<div class="large-4 large-centered medium-6 medium-centered columns" ng-show="!$root.starting">
<div class="logo-setup" ng-show="!$root.iden">
<div class="logo-setup" ng-show="!$root.iden && !hideForWP">
<img src="img/logo-negative-beta.svg" alt="Cop ay" width="100">
<div ng-include="'views/includes/version.html'"></div>
</div>
@ -38,11 +38,11 @@
<form name="setPinForm" ng-model="setPinForm" novalidate>
<div class="input" ng-show="askForPin == 1">
<input id="newpin" type="tel" ng-model="newpin" class="form-control" ng-maxlength="4" ng-minlength="4" maxlength="4" ng-pattern="/^[0-9]{1,4}$/" placeholder="PIN" name="newpin" required show-focus="askForPin == 1">
<input id="newpin" type="tel" ng-model="newpin" class="form-control" ng-maxlength="4" ng-minlength="4" maxlength="4" ng-pattern="/^[0-9]{1,4}$/" placeholder="PIN" name="newpin" required show-focus="askForPin == 1 && !isWindowsPhoneApp" ng-focus="formFocus()">
<i class="icon-locked"></i>
</div>
<div class="input" ng-show="askForPin == 2">
<input id="repeatpin" type="tel" ng-model="repeatpin" class="form-control" ng-maxlength="4" ng-minlength="4" maxlength="4" ng-pattern="/^[0-9]{1,4}$/" placeholder="Confirm your PIN" name="repeatpin" required show-focus="askForPin == 2">
<input id="repeatpin" type="tel" ng-model="repeatpin" class="form-control" ng-maxlength="4" ng-minlength="4" maxlength="4" ng-pattern="/^[0-9]{1,4}$/" placeholder="Confirm your PIN" name="repeatpin" required show-focus="askForPin == 2 && !isWindowsPhoneApp" ng-focus="formFocus()">
<i class="icon-locked"></i>
</div>
@ -65,7 +65,7 @@
</div>
<div ng-if='$root.hasPin && !$root.iden'>
<div class="clipo">
<div class="clipo" ng-hide="hideForWP">
<img src="img/clipo-pin-enter.png" alt="clipo" width="300">
</div>
<form name="pinForm" novalidate>
@ -79,7 +79,7 @@
</div>
<div class="input">
<input id="pin" type="tel" ng-model="pin" class="form-control" ng-maxlength="4" ng-minlength="4" maxlength="4" ng-pattern="/^[0-9]{1,4}$/" placeholder="Pin number" name="pin" required>
<input id="pin" type="tel" ng-model="pin" class="form-control" ng-maxlength="4" ng-minlength="4" maxlength="4" ng-pattern="/^[0-9]{1,4}$/" placeholder="Pin number" name="pin" required ng-focus="formFocus()">
<i class="icon-locked"></i>
</div>
@ -101,7 +101,7 @@
</div>
<div ng-if='!$root.hasPin && !askForPin && !$root.iden'>
<div class="clipo">
<div class="clipo" ng-hide="hideForWP">
<img src="img/clipo-signin.png" alt="clipo" width="310">
</div>
<div class="p10 m20b size-14 bg-success text-white" ng-show="anyWallet && !confirmedEmail && !error">
@ -131,24 +131,28 @@
</div>
<div class="input" ng-if="!usingLocalStorage">
<input type="email" ng-model="email" class="form-control" name="email" placeholder="Email" required show-focus="!isMobile">
<input type="email" ng-model="email" class="form-control" name="email" placeholder="Email" required show-focus="!isMobile" ng-focus="formFocus()">
<i class="icon-email"></i>
</div>
<div class="input" ng-if="usingLocalStorage">
<input type="text" ng-model="email" class="form-control" name="email" placeholder="Username" required show-focus="!isMobile">
<input type="text" ng-model="email" class="form-control" name="email" placeholder="Username" 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" required>
<input type="password" ng-model="password" class="form-control" name="password" placeholder="Password" required ng-focus="formFocus()">
<i class="icon-locked"></i>
</div>
<button translate type="submit" class="button primary radius expand m0" ng-disabled="loginForm.$invalid">
Sign in
{{hideAll}}
</button>
</form>
aasdas
<div ng-if="usingLocalStorage" class="text-gray size-12 m10v">
* Using this device storage. Change to cloud storage on 'settings'.
</div>

View File

@ -1,6 +1,6 @@
<div class="send" ng-controller="SendController" ng-init="init()">
<div class="row hide-for-large-up" >
<div class="row hide-for-large-up" ng-hide="$root.wpInputFocused" >
<div class="large-10 medium-10 small-9 columns">
<h1>{{$root.title}}</h1>
</div>
@ -28,12 +28,28 @@
</div>
</div>
</div>
<div class="row" ng-show="creatingTX">
<div class="large-12 columns">
<div class="panel">
<div class="box-notification">
<div class="box-icon secondary">
<i class="fi-bitcoin-circle icon-rotate spinner size-24"></i>
</div>
<span class="text-secondary size-14">
Creating Transaction...
</span>
</div>
</div>
</div>
</div>
<div class="row" ng-show="!fetchingURL">
<div class="row" ng-show="!fetchingURL && !creatingTX">
<div class="large-8 large-centered columns">
<form name="sendForm" ng-submit="submitForm(sendForm)" novalidate>
<div class="panel">
<div class="box-notification" ng-show="error">
<div class="box-notification" ng-show="error && !hideForWP ">
<div class="box-icon error">
<i class="fi-x size-24"></i>
</div>
@ -52,10 +68,10 @@
<a class="close-notification text-success" ng-click="success=null">&#215;</a>
</div>
<div ng-if="!_merchantData">
<div ng-if="!_merchantData" ng-hide="hideAddress">
<div class="row collapse">
<label for="address" class="left">
<label for="address" class="left" >
<span translate>To</span>
</label>
@ -73,13 +89,13 @@
</div>
<div class="input">
<input type="text" id="address" name="address" ng-disabled="loading || lockAddress" placeholder="{{'Bitcoin address'|translate}}" ng-model="_address" valid-address required>
<input type="text" id="address" name="address" ng-disabled="loading || lockAddress" placeholder="{{'Bitcoin address'|translate}}" ng-model="_address" valid-address required ng-focus="formFocus('address')" ng-blur="formFocus(false)">
<a class="postfix" ng-click="openAddressBook()"><i class="fi-address-book size-24"></i></a>
</div>
<div id="scanner" class="row" ng-if="showScanner" ng-include="'views/includes/scanner.html'">
</div>
</div>
<div ng-show="_merchantData">
<div ng-show="_merchantData && !hideAddress">
<div class="row collapse" ng-click="openPPModal(_merchantData)">
<label for="domain">
@ -93,7 +109,7 @@
</div>
</div>
<div class="row" ng-init="showAlternative = false">
<div class="row" ng-init="showAlternative = false" ng-hide="hideAmount">
<div class="large-12 medium-12 columns">
<div class="m5b right" ng-hide="sendForm.amount.$pristine">
<span translate class="has-error right size-12" ng-show="sendForm.amount.$invalid">
@ -110,7 +126,7 @@
</label>
<div class="input">
<input type="number" id="amount" ng-disabled="loading || lockAmount" name="amount" placeholder="{{'Amount'|translate}}" ng-minlength="0.00000001" ng-maxlength="10000000000" ng-model="_amount" valid-amount required autocomplete="off">
<input type="number" id="amount" ng-disabled="loading || lockAmount" name="amount" placeholder="{{'Amount'|translate}}" ng-minlength="0.00000001" ng-maxlength="10000000000" ng-model="_amount" valid-amount required autocomplete="off" ng-focus="formFocus('amount')" ng-blur="formFocus(false)">
<a class="postfix" ng-click="showAlternative = true">{{$root.wallet.settings.unitName}}</a>
</div>
</div>
@ -118,7 +134,7 @@
<label for="alternative"><span translate>Amount in</span> {{ alternativeName }}
</label>
<div class="input">
<input type="number" id="alternative" ng-disabled="loading || !isRateAvailable || lockAmount" name="alternative" placeholder="{{'Amount'|translate}}" ng-model="_alternative" requiredautocomplete="off">
<input type="number" id="alternative" ng-disabled="loading || !isRateAvailable || lockAmount" name="alternative" placeholder="{{'Amount'|translate}}" ng-model="_alternative" requiredautocomplete="off" ng-focus="formFocus('amount')" ng-blur="formFocus(false)">
<a class="postfix" ng-click="showAlternative = false"> {{ alternativeName }}</a>
</div>
</div>
@ -131,8 +147,8 @@
<small translate class="has-error" ng-show="sendForm.comment.$invalid && !sendForm.comment.$pristine">too long!</small>
</label>
<div class="input">
<textarea id="comment" ng-disabled="loading" name="comment" ng-if="isShared" placeholder="Leave a private message to your copayers" ng-maxlength="100" ng-model="_comment"></textarea>
<textarea id="comment" ng-disabled="loading" name="comment" ng-if="!isShared" placeholder="Add a private comment to identify the transaction" ng-maxlength="100" ng-model="_comment"></textarea>
<textarea id="comment" ng-disabled="loading" name="comment" ng-if="isShared" placeholder="Leave a private message to your copayers" ng-maxlength="100" ng-model="_comment" ng-focus="formFocus('msg')" ng-blur="formFocus(false)"></textarea>
<textarea id="comment" ng-disabled="loading" name="comment" ng-if="!isShared" placeholder="Add a private comment to identify the transaction" ng-maxlength="100" ng-model="_comment" ng-focus="formFocus('msg')" ng-blur="formFocus(false)"></textarea>
</div>
</div>
</div>