From 3170a1e95d2a538d646cc4918de320d130d6c539 Mon Sep 17 00:00:00 2001 From: uiskander Date: Wed, 24 Jan 2018 15:39:47 +0300 Subject: [PATCH 01/39] client-415-token-help-icon --- src/modules/app/less/app.less | 4 ++++ src/modules/tokens/locales/en.json | 11 +++++++++-- src/modules/tokens/locales/ko.json | 11 +++++++++-- src/modules/tokens/locales/ru.json | 9 ++++++++- src/modules/tokens/templates/tokens.html | 19 ++++++++++++++++--- .../ui/directives/helpIcon/helpIcon.less | 12 +++++++++--- .../addressQrCode/address-qr-code.modal.html | 4 ++-- .../depositAsset/deposit-asset.modal.html | 6 +++--- 8 files changed, 60 insertions(+), 16 deletions(-) diff --git a/src/modules/app/less/app.less b/src/modules/app/less/app.less index 7656068c73..7a3299be62 100644 --- a/src/modules/app/less/app.less +++ b/src/modules/app/less/app.less @@ -87,6 +87,10 @@ md-input-container { width: 100%; } +.relative { + position: relative; +} + w-scroll-box { display: flex; flex-direction: column; diff --git a/src/modules/tokens/locales/en.json b/src/modules/tokens/locales/en.json index 1409aca88c..8c3058584e 100644 --- a/src/modules/tokens/locales/en.json +++ b/src/modules/tokens/locales/en.json @@ -8,8 +8,15 @@ "fee": "Fee 1 WAVES", "create": "Generate", "help": { - "name": "Please use only Latin letters", - "precision": "This field defines the number of decimal signs for your token" + "name": "Please use only Latin letters" + }, + "helpIcon": { + "totalTokens": { + "headline": "This field defines the total tokens supply that your asset will contain.", + "reissuable": "Reissuability allows for additional tokens creation that will be added to the total token supply of asset.", + "notReissuable": "A Non Reissuability asset will be permanently limited to the total token supply defined on this process. " + }, + "demicals": "This field defines the number of decimals that you asset token will be divided in." }, "validators": { "nameLen": "An asset name must be at least 4-16 characters’ long", diff --git a/src/modules/tokens/locales/ko.json b/src/modules/tokens/locales/ko.json index d74d8c2c4c..8b6963b220 100644 --- a/src/modules/tokens/locales/ko.json +++ b/src/modules/tokens/locales/ko.json @@ -8,8 +8,15 @@ "fee": "수수료 1 WAVES", "create": "발행", "help": { - "name": "라틴 문자만 가능합니다.", - "precision": "자산 토큰이 분리될 소수 자릿수를 정하는 항목입니다." + "name": "라틴 문자만 가능합니다." + }, + "helpIcon": { + "totalTokens": { + "headline": "This field defines the total tokens supply that your asset will contain.", + "reissuable": "Reissuability allows for additional tokens creation that will be added to the total token supply of asset.", + "notReissuable": "A Non Reissuability asset will be permanently limited to the total token supply defined on this process. " + }, + "demicals": "자산 토큰이 분리될 소수 자릿수를 정하는 항목입니다." }, "validators": { "nameLen": "자산의 이름은 4-16자 이상이어야 합니다.", diff --git a/src/modules/tokens/locales/ru.json b/src/modules/tokens/locales/ru.json index 809c08fd1f..4161a959b3 100644 --- a/src/modules/tokens/locales/ru.json +++ b/src/modules/tokens/locales/ru.json @@ -9,7 +9,14 @@ "create": "Выпустить", "help": { "name": "Пожалуйста, используйте только латинские буквы", - "precision": "В этом поле укажите, сколько знаков после запятой будет у токена" + }, + "helpIcon": { + "totalTokens": { + "headline": "This field defines the total tokens supply that your asset will contain.", + "reissuable": "Reissuability allows for additional tokens creation that will be added to the total token supply of asset.", + "notReissuable": "A Non Reissuability asset will be permanently limited to the total token supply defined on this process. " + }, + "demicals": "В этом поле укажите, сколько знаков после запятой будет у токена" }, "validators": { "nameLen": "Имя токена должно содержать от 4 до 16 символов", diff --git a/src/modules/tokens/templates/tokens.html b/src/modules/tokens/templates/tokens.html index 7d6f6f7ae3..772d24636e 100644 --- a/src/modules/tokens/templates/tokens.html +++ b/src/modules/tokens/templates/tokens.html @@ -44,7 +44,16 @@
-
+
+ count + +
+ helpIcon.totalTokens.headline +
+
+
+
+
-
+
precision -
+ +
+ helpIcon.demicals +
+
modal.qr.copyAndShare -
modal.qr.warningTitle
-
modal.qr.warningText
+
modal.qr.warningTitle
+
modal.qr.warningText
diff --git a/src/modules/utils/modals/depositAsset/deposit-asset.modal.html b/src/modules/utils/modals/depositAsset/deposit-asset.modal.html index 2a60592a20..0a1d2b3931 100644 --- a/src/modules/utils/modals/depositAsset/deposit-asset.modal.html +++ b/src/modules/utils/modals/depositAsset/deposit-asset.modal.html @@ -13,11 +13,11 @@
-
+
modal.deposit.{{::$ctrl.assetKeyName}}.helpDescrTitle
-
modal.deposit.{{::$ctrl.assetKeyName}}.helpDescrText
-
modal.deposit.pleaseNote
+
modal.deposit.{{::$ctrl.assetKeyName}}.helpDescrText
+
modal.deposit.pleaseNote
From edc8765fa0b0e93631484843d0727686aaae55c9 Mon Sep 17 00:00:00 2001 From: tsigel Date: Wed, 31 Jan 2018 10:57:34 +0300 Subject: [PATCH 02/39] CLIENT-451: change package lock --- package-lock.json | 170 +++++++++--------- .../directives/validators/ValidateService.js | 0 .../utils/directives/validators/Validator.js | 69 ------- 3 files changed, 85 insertions(+), 154 deletions(-) create mode 100644 src/modules/utils/directives/validators/ValidateService.js delete mode 100644 src/modules/utils/directives/validators/Validator.js diff --git a/package-lock.json b/package-lock.json index e9a7fa4b8d..3ecc0d7d05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,7 @@ "@types/babel-core": { "version": "6.25.2", "resolved": "https://registry.npmjs.org/@types/babel-core/-/babel-core-6.25.2.tgz", - "integrity": "sha512-+Ush/fQHUDIithA5yDJWZiL6KdOiVOs5yuj4qcgvQOCnmJec+RgzkLgxnpgmM6Ear9RXa3aCcwjPiUnStPp1zA==", + "integrity": "sha1-UAt/7yg03Oh7MjEaTWehp1etqsc=", "dev": true, "requires": { "@types/babel-generator": "6.25.0", @@ -20,7 +20,7 @@ "@types/babel-generator": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.0.tgz", - "integrity": "sha512-WbrKGSt8SKOxAivCHB1fsIP59EyCCfMHuCYcA6yenjGxnjh0rK3BOSPHR96RdZD6ukgyDwzMF/biQH4llowTDg==", + "integrity": "sha1-glVGmqFHEvDRYIuZaDyr1bQT2Ws=", "dev": true, "requires": { "@types/babel-types": "6.25.1" @@ -29,7 +29,7 @@ "@types/babel-template": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/@types/babel-template/-/babel-template-6.25.0.tgz", - "integrity": "sha512-TtyfVlrprX92xSuKa8D//7vFz5kBJODBw5IQ1hQXehqO+me26vt1fyNxOZyXhUq2a7jRyT72V8p68IyH4NEZNA==", + "integrity": "sha1-JQXXtVuI+CHZgEi0/fB7OyJWPTA=", "dev": true, "requires": { "@types/babel-types": "6.25.1", @@ -39,7 +39,7 @@ "@types/babel-traverse": { "version": "6.25.2", "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.2.tgz", - "integrity": "sha512-SO/YPiHOYApenZJecbw1Psd2lopAQ9Wc9HnFevEvM1mOoNXHglV8mHgVkCQJRIrn6UgWqHE/QfvQ1uG1crNgHA==", + "integrity": "sha1-PPrr4xb+xRWpZK27hBR7PIlxup8=", "dev": true, "requires": { "@types/babel-types": "6.25.1" @@ -48,13 +48,13 @@ "@types/babel-types": { "version": "6.25.1", "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.1.tgz", - "integrity": "sha512-7Z6r20+HE0viAFhsW0d/UrC1K2tTlpXzGpNlYm8MmCv8z5PbAacFIshrM/MjlGRa5SBqxu2socpy8FHntwZKng==", + "integrity": "sha1-zo8SakQD4R4bADOkJPEWOK+seIk=", "dev": true }, "@types/babylon": { "version": "6.16.2", "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz", - "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==", + "integrity": "sha1-BizmO2k9mvHCRvWu35KLycMFicg=", "dev": true, "requires": { "@types/babel-types": "6.25.1" @@ -77,7 +77,7 @@ "@types/connect": { "version": "3.4.31", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.31.tgz", - "integrity": "sha512-OPSxsP6XqA3984KWDUXq/u05Hu8VWa/2rUVlw/aDUOx87BptIep6xb3NdCxCpKLfLdjZcCE5jR+gouTul3gjdA==", + "integrity": "sha1-H5LWsRfswFB2xJ7NAk95duUoutk=", "dev": true, "requires": { "@types/node": "8.0.34" @@ -86,7 +86,7 @@ "@types/express-serve-static-core": { "version": "4.0.53", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.0.53.tgz", - "integrity": "sha512-zaGeOpEYp5G2EhjaUFdVwysDrfEYc6Q6iPhd3Kl4ip30x0tvVv7SuJvY3yzCUSuFlzAG8N5KsyY6BJg93/cn+Q==", + "integrity": "sha1-FyOjXRRH8sVeE8hyHqs0SOQvTYI=", "dev": true, "requires": { "@types/node": "8.0.34" @@ -95,7 +95,7 @@ "@types/fs-extra": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-3.0.3.tgz", - "integrity": "sha512-o2qkg/J2LWK+sr007+KFBBOrxzxpr9kiP0gMFC75gQJXhUn/E3pQA0kSVdxrQ3lf+rOwsRnuH0wnR5MNTotEKg==", + "integrity": "sha1-HWbrZw6/ZX5XwP2gFN80DBnYqgw=", "dev": true, "requires": { "@types/node": "8.0.34" @@ -124,7 +124,7 @@ "@types/gulp": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/gulp/-/gulp-4.0.4.tgz", - "integrity": "sha512-5hGc57snkSvGEkUQ42tcYAQmQrU9E41XQJNglP6FtDg7ou9QGyF1HfPZ5POGnrl7ee7uYq0Om0gh1bAmykxaxA==", + "integrity": "sha1-dT/+Ww3a8MmmAQGzRhQbuA5gLyU=", "dev": true, "requires": { "@types/chokidar": "1.7.1", @@ -181,7 +181,7 @@ "@types/handlebars": { "version": "4.0.36", "resolved": "https://registry.npmjs.org/@types/handlebars/-/handlebars-4.0.36.tgz", - "integrity": "sha512-LjNiTX7TY7wtuC6y3QwC93hKMuqYhgV9A1uXBKNvZtVC8ZvyWAjZkJ5BvT0K7RKqORRYRLMrqCxpw5RgS+MdrQ==", + "integrity": "sha1-/1fHf6GrZxO7RGU03cTZeXB6Onk=", "dev": true }, "@types/html-minifier": { @@ -203,7 +203,7 @@ "@types/jasmine": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.6.0.tgz", - "integrity": "sha512-1ZZdFvYA5zARDXPj5+VF0bwDZWH/o0QQWJVDc5srdC/DngcCZXskR33eR/4PielGvBjLQpQOd6KiQbmtqVkeZA==", + "integrity": "sha1-mXtBondStIUK8mg7xKjYIiwlvQI=", "dev": true }, "@types/jquery": { @@ -227,7 +227,7 @@ "@types/mime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz", - "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==", + "integrity": "sha1-WnMG42fFObn2VDSZ3o3VGfrDeos=", "dev": true }, "@types/minimatch": { @@ -250,7 +250,7 @@ "@types/serve-static": { "version": "1.7.32", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.7.32.tgz", - "integrity": "sha512-WpI0g7M1FiOmJ/a97Qrjafq2I938tjAZ3hZr9O7sXyA6oUhH3bqUNZIt7r1KZg8TQAKxcvxt6JjQ5XuLfIBFvg==", + "integrity": "sha1-D2cy5NqwgTdx3Y/I/hSUDzRyi0w=", "dev": true, "requires": { "@types/express-serve-static-core": "4.0.53", @@ -274,7 +274,7 @@ "@types/uglify-js": { "version": "2.6.29", "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-2.6.29.tgz", - "integrity": "sha512-BdFLCZW0GTl31AbqXSak8ss/MqEZ3DN2MH9rkAyGoTuzK7ifGUlX+u0nfbWeTsa7IPcZhtn8BlpYBXSV+vqGhQ==", + "integrity": "sha1-UhNH9p4gIB0hj1mRrmbhCHivzxo=", "requires": { "@types/source-map": "0.5.2" } @@ -282,7 +282,7 @@ "@types/undertaker": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@types/undertaker/-/undertaker-1.1.2.tgz", - "integrity": "sha512-cfqbNE5SKyXIWKaWdeThRgZewNUX5D1yp4xPnFkuTvr93l6EreBxO9FS3bAluiadarKMBGq6aiFosLZkMsolLw==", + "integrity": "sha1-zw9izcvfYq2fcKTXj4GGmlw0mgk=", "dev": true, "requires": { "@types/undertaker-registry": "1.0.0" @@ -317,7 +317,7 @@ "@uirouter/angularjs": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@uirouter/angularjs/-/angularjs-1.0.8.tgz", - "integrity": "sha512-GNgCyLmtOryzyBO4o8F+e41wkkLzihEN/6hrClQvmA+vf6zX1yvTaC26bFpNg2CJFUNb+DIv8gY5Id3/F0OvZA==", + "integrity": "sha1-CedSiIR1L6QHGrHPdDJfEMbW2Mk=", "requires": { "@uirouter/core": "5.0.10" }, @@ -458,7 +458,7 @@ "ansi-escapes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "integrity": "sha1-7D6LTp+AZPwCw6ybZfHCdb2o75I=", "dev": true }, "ansi-regex": { @@ -469,7 +469,7 @@ "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", "dev": true, "requires": { "color-convert": "1.9.0" @@ -478,7 +478,7 @@ "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", "dev": true, "requires": { "micromatch": "2.3.11", @@ -512,7 +512,7 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", "dev": true }, "array-differ": { @@ -654,7 +654,7 @@ "async": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", + "integrity": "sha1-hDGQ/WtzV6C54clW7d3V7IRitU0=", "dev": true, "requires": { "lodash": "4.17.4" @@ -676,7 +676,7 @@ "autoprefixer": { "version": "7.1.5", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.5.tgz", - "integrity": "sha512-sMN453qIm8Z+tunzYWW+Y490wWkICHhCYm/VohLjjl+N7ARSFuF5au7E6tr7oEbeeXj8mNjpSw2kxjJaO6YCOw==", + "integrity": "sha1-1l0UuDx80d17yAHaoAVXrd9aBrI=", "dev": true, "requires": { "browserslist": "2.5.1", @@ -1502,7 +1502,7 @@ "bignumber.js": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz", - "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==" + "integrity": "sha1-228UBnwUC9RmJIFaeRbJLZtsJLE=" }, "binary-extensions": { "version": "1.10.0", @@ -1525,7 +1525,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", "dev": true }, "body-parser": { @@ -2066,7 +2066,7 @@ "chalk": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "integrity": "sha1-rFvs8U+iG5nGySynp9fP1bF+dD4=", "dev": true, "requires": { "ansi-styles": "3.2.0", @@ -2094,7 +2094,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", "dev": true, "requires": { "inherits": "2.0.3", @@ -2104,7 +2104,7 @@ "circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=", "dev": true }, "clean-css": { @@ -2296,7 +2296,7 @@ "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + "integrity": "sha1-FXFS/R56bI2YpbcVzzdt+SgARWM=" }, "commoner": { "version": "0.10.8", @@ -2444,7 +2444,7 @@ "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", "dev": true }, "convert-source-map": { @@ -2474,7 +2474,7 @@ "cosmiconfig": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "integrity": "sha1-YXPOvVb6wELB9DkO33r2wHx8uJI=", "dev": true, "requires": { "is-directory": "0.3.1", @@ -2546,7 +2546,7 @@ "crypto-browserify": { "version": "3.11.1", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", - "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", + "integrity": "sha1-lIlF78Z1ekANbl5a9HGU0QBkJ58=", "dev": true, "requires": { "browserify-cipher": "1.0.0", @@ -3287,7 +3287,7 @@ "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", "dev": true, "requires": { "ms": "2.0.0" @@ -3412,7 +3412,7 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", "dev": true, "requires": { "md5.js": "1.3.4", @@ -3520,7 +3520,7 @@ "external-editor": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.5.tgz", - "integrity": "sha512-Msjo64WT5W+NhOpQXh0nOHm+n0RfU1QUwDnKYvJ8dEJ8zlwLrqXNTv5mSUTJpepf41PDJGyhueTw2vNZW+Fr/w==", + "integrity": "sha1-UsJJo5gbm6GHx8rPW+tQvx2Rprw=", "dev": true, "requires": { "iconv-lite": "0.4.18", @@ -3531,7 +3531,7 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", "dev": true, "requires": { "os-tmpdir": "1.0.2" @@ -4757,7 +4757,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", "dev": true }, "functional-red-black-tree": { @@ -4952,7 +4952,7 @@ "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", "dev": true }, "globby": { @@ -5435,7 +5435,7 @@ "gulp-copy": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gulp-copy/-/gulp-copy-1.0.1.tgz", - "integrity": "sha512-uhIdHo9SoWkf+pjfjETOMD/6ez10ZItO5/L1bFRfVGH+7lq9zE3TSjkh3WVPuTS9ttPRHA7yW4g1QRE1hPwUOA==", + "integrity": "sha1-93c724Ab5Mj5EjtXW48zun2x+d8=", "dev": true, "requires": { "gulp": "3.9.1", @@ -6141,7 +6141,7 @@ "hash.js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "integrity": "sha1-NA3tvmKQGHFRweodd3o0SJNd+EY=", "dev": true, "requires": { "inherits": "2.0.3", @@ -6205,7 +6205,7 @@ "hosted-git-info": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" + "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=" }, "html-minifier": { "version": "3.5.7", @@ -6230,7 +6230,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" }, "uglify-js": { "version": "3.2.1", @@ -6292,12 +6292,12 @@ "i18next": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/i18next/-/i18next-9.1.0.tgz", - "integrity": "sha512-oarlBl8AX+2xSae45aT57y/i0dlhRP+MAYhuV2AMtih4Cv+ICpAApOILxtxi0BKPL95FMDStIH4F0PX/4CwfCQ==" + "integrity": "sha1-QIAF/iYqmQyNk5RqbeDHe7oRZns=" }, "i18next-xhr-backend": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/i18next-xhr-backend/-/i18next-xhr-backend-1.4.3.tgz", - "integrity": "sha512-l9YfIMl0N17Ka/F1KmzLF97iDC6xl5FtmTG60h/ETAfFwFQnYmmZ6B+oUKdNU4bZzBQR1QYWp58zVvUv95c5LA==" + "integrity": "sha1-1y9wU2o79qOJImHd41K8d9cIiGo=" }, "iconv-lite": { "version": "0.4.18", @@ -6307,7 +6307,7 @@ "identity-img": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/identity-img/-/identity-img-1.0.0.tgz", - "integrity": "sha512-lOl0WslzXMFChhtnE6XeuSg68QjkfL5A1kNgQMlooo5+FDM6qBGiITlg1jMXHnXYoQ+t+4uPpCdjfjpV/wBwOw==" + "integrity": "sha1-vkmdR2GqzWf23qyR26JrqiuXMFk=" }, "ieee754": { "version": "1.1.8", @@ -6318,7 +6318,7 @@ "ignore": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", - "integrity": "sha512-JLH93mL8amZQhh/p6mfQgVBH3M6epNq3DfsXsTSuSrInVjwyYlFE1nv2AgfRCC8PoOhM0jwQ5v8s9LgbK7yGDw==", + "integrity": "sha1-xOcVRV9gc6jX5drnLS/J1xZj26Y=", "dev": true }, "image-size": { @@ -6381,7 +6381,7 @@ "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "integrity": "sha1-ndLyrXZdyrH/BEO0kUQqILoifck=", "dev": true, "requires": { "ansi-escapes": "3.0.0", @@ -6415,7 +6415,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", @@ -6677,7 +6677,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", "dev": true, "requires": { "isobject": "3.0.1" @@ -6918,7 +6918,7 @@ "jschardet": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.1.tgz", - "integrity": "sha512-vE2hT1D0HLZCLLclfBSfkfTTedhVj0fubHpJBHKwwUWX0nSbhPAfk+SG9rTX95BYNmau8rGFfCeaT6T5OW1C2A==", + "integrity": "sha1-xRn2KfhrOlvtuliojTETCe7Al/k=", "dev": true }, "jsesc": { @@ -7037,7 +7037,7 @@ "karma": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", - "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==", + "integrity": "sha1-hcwI6eCiLXzpzKN8ShvoJPaisa4=", "dev": true, "requires": { "bluebird": "3.5.0", @@ -7078,7 +7078,7 @@ "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=", "dev": true }, "tmp": { @@ -7095,7 +7095,7 @@ "karma-chrome-launcher": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", - "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "integrity": "sha1-zxudBxNswY/iOTJ9JGVMPbw2is8=", "dev": true, "requires": { "fs-access": "1.0.1", @@ -7660,7 +7660,7 @@ "lru-cache": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", "dev": true, "requires": { "pseudomap": "1.0.2", @@ -7780,7 +7780,7 @@ "mime": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/mime/-/mime-2.0.3.tgz", - "integrity": "sha512-TrpAd/vX3xaLPDgVRm6JkZwLR0KHfukMdU2wTEbqMDdCnY6Yo3mE+mjs9YE6oMNw2QRfXVeBEYpmpO94BIqiug==", + "integrity": "sha1-Q1MzeFR0fEjqSYMw3ANPn0u7zAs=", "dev": true }, "mime-db": { @@ -7819,7 +7819,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "requires": { "brace-expansion": "1.1.8" } @@ -8033,7 +8033,7 @@ "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", "requires": { "lower-case": "1.1.4" } @@ -8059,7 +8059,7 @@ "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", "requires": { "hosted-git-info": "2.5.0", "is-builtin-module": "1.0.0", @@ -8537,7 +8537,7 @@ "pbkdf2": { "version": "3.0.14", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "integrity": "sha1-o14TxkeZsGzhUyD0WcIw5o5zut4=", "dev": true, "requires": { "create-hash": "1.1.3", @@ -8586,7 +8586,7 @@ "pluralize": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "integrity": "sha1-KYuJ34uTsCIdv0Ia0rGx6iP8Z3c=", "dev": true }, "postcss": { @@ -8677,7 +8677,7 @@ "postcss-reporter": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-5.0.0.tgz", - "integrity": "sha512-rBkDbaHAu5uywbCR2XE8a25tats3xSOsGNx6mppK6Q9kSFGKc/FyAzfci+fWM2l+K402p1D0pNcfDGxeje5IKg==", + "integrity": "sha1-oUF3/RNCgp0pFlPyeG79ZxEDMsM=", "dev": true, "requires": { "chalk": "2.1.0", @@ -8689,7 +8689,7 @@ "log-symbols": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.1.0.tgz", - "integrity": "sha512-zLeLrzMA1A2vRF1e/0Mo+LNINzi6jzBylHj5WqvQ/WK/5WCZt8si9SyN4p9llr/HRYvVR1AoXHRHl4WTHyQAzQ==", + "integrity": "sha1-81+mDieIMrU43E3dy7R4pF0+O+Y=", "dev": true, "requires": { "chalk": "2.1.0" @@ -8747,7 +8747,7 @@ "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", "requires": { "asap": "2.0.6" } @@ -8798,7 +8798,7 @@ "qrcode-reader": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/qrcode-reader/-/qrcode-reader-1.0.3.tgz", - "integrity": "sha512-J1UTJS2vGxJdVPXH1KqFAu/nVMaBJsRLVYus1oDnKKcEVUtktUZDGNwmVTYriEgMz0VCM+uPbBX7136VnuRCEQ==" + "integrity": "sha1-QphaxHUcE04FYTLiUJcNaXldE4w=" }, "qs": { "version": "6.4.0", @@ -8822,7 +8822,7 @@ "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", "dev": true, "requires": { "is-number": "3.0.0", @@ -8863,7 +8863,7 @@ "randombytes": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "integrity": "sha1-3ACaJGuNCaF3tLegrne8Vw9LG3k=", "dev": true, "requires": { "safe-buffer": "5.1.1" @@ -9270,7 +9270,7 @@ "resolve": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "integrity": "sha1-p1vgHFPaJdk0qY69DkxKcxL5KoY=", "dev": true, "requires": { "path-parse": "1.0.5" @@ -9358,24 +9358,24 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=", "dev": true }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", "dev": true }, "semver": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=" }, "send": { "version": "0.16.1", "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", - "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "integrity": "sha1-pw4coh0TgsEdDZ9iMd6ygQgNerM=", "dev": true, "requires": { "debug": "2.6.9", @@ -9405,7 +9405,7 @@ "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=", "dev": true } } @@ -9419,7 +9419,7 @@ "serve-static": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", - "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "integrity": "sha1-TFfVNASnYdjy58HooYpH2/J4pxk=", "dev": true, "requires": { "encodeurl": "1.0.1", @@ -9523,7 +9523,7 @@ "slice-ansi": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "integrity": "sha1-BE8aSdiEL/MHqta1Be0Xi9lQE00=", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0" @@ -9885,7 +9885,7 @@ "stream-http": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "integrity": "sha1-QKBQ7I3DtTsz2ZCUFcAsC/Gr+60=", "dev": true, "requires": { "builtin-status-codes": "3.0.0", @@ -10073,7 +10073,7 @@ "table": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "integrity": "sha1-ozRHN1OR52atNNNIbm4q7chNLjY=", "dev": true, "requires": { "ajv": "5.2.3", @@ -10111,7 +10111,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", @@ -10222,7 +10222,7 @@ "ts-api-validator": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ts-api-validator/-/ts-api-validator-2.0.0.tgz", - "integrity": "sha512-VovTPe5am/TP6doPConDwTWeWcxF9D04OmagSTaKpOTfvHfRe8rxg0zktyhZMAuo2/EUV6HpgAafVVYf6Z1HUQ==", + "integrity": "sha1-Au99P+TGvKQlE9yEJDYUuE8yPU4=", "requires": { "dts-gen": "0.5.6", "dts-generator": "2.1.0", @@ -10232,14 +10232,14 @@ "ts-utils": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/ts-utils/-/ts-utils-4.5.0.tgz", - "integrity": "sha512-nLchzdDOiZ93CxZCsY6Od9q0FwFJivRD0qLSL/au6qjoCE3iBdLr5GnvMENOYdS7Z2ThUBHjq+D1UiMq0aYqng==" + "integrity": "sha1-vjz94AN7KfJR/R/EqiEilNg8dlY=" } } }, "ts-utils": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/ts-utils/-/ts-utils-6.0.0.tgz", - "integrity": "sha512-4LQHT6Nb2Er942WprkOtrAeYpFW6UZZUfq6meq8wA3jNHcht/MJi4YcGfVqXtK6muUHWA5bPE/o33jnzbS7Mgg==" + "integrity": "sha1-b3O1o1oBADD7w4GXTT5w8EcDMkc=" }, "tty-browserify": { "version": "0.0.0", @@ -10292,7 +10292,7 @@ "typescript": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.5.3.tgz", - "integrity": "sha512-ptLSQs2S4QuS6/OD1eAKG+S5G8QQtrU5RT32JULdZQtM1L3WTi34Wsu48Yndzi8xsObRAB9RPt/KhA9wlpEF6w==" + "integrity": "sha1-3z3Nw48764ANS8MiZGsEo/bKfw0=" }, "ua-parser-js": { "version": "0.7.14", @@ -10302,7 +10302,7 @@ "uglify-es": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.1.3.tgz", - "integrity": "sha512-Nuo5gkv/Q6PmLa+Ui2LvK+87YdMAcuXfRIWF0uVfkHVSfpT3Ue0euCSu4t0b8xv4Bt05lmXUT8bLI9OmnyPj8A==", + "integrity": "sha1-oh7rFJyxIKH4MCVjaJ4ZSWVQeAs=", "dev": true, "requires": { "commander": "2.11.0", @@ -10437,7 +10437,7 @@ "uuid": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=", "dev": true, "optional": true }, @@ -10623,7 +10623,7 @@ "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", "dev": true, "requires": { "isexe": "2.0.0" @@ -10651,7 +10651,7 @@ "worker-wrapper": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/worker-wrapper/-/worker-wrapper-1.2.2.tgz", - "integrity": "sha512-rXz1Ct+n1KFq5X24LPwGP/qMYyQiVXaWgaOsuLvoBpQ4H5IrIvSTsR7JCUcLGbDxfRcjh537tDhEw7AwzsIEEA==" + "integrity": "sha1-jYSssjCBFSGaJy94ele0E9g4MEM=" }, "wrap-ansi": { "version": "2.1.0", diff --git a/src/modules/utils/directives/validators/ValidateService.js b/src/modules/utils/directives/validators/ValidateService.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/modules/utils/directives/validators/Validator.js b/src/modules/utils/directives/validators/Validator.js deleted file mode 100644 index b19a4a4ba9..0000000000 --- a/src/modules/utils/directives/validators/Validator.js +++ /dev/null @@ -1,69 +0,0 @@ -(function () { - 'use strict'; - - const factory = function (Base, utils) { - - class Validator extends Base { - - constructor({ $scope, $input, $attrs, $ngModel }) { - super($scope); - - this.$scope = $scope; - this.$input = $input; - this.$attrs = $attrs; - this.$ngModel = $ngModel; - - /** - * @type {Array} - * @private - */ - this._messages = []; - } - - registerValidator(name, handler) { - if (!tsUtils.find(this._messages, { name })) { - this._messages.push({ name, handler }); - } else { - throw new Error('Duplicate validator name!'); - } - } - - onReady() { - return utils.when(); - } - - validate() { - this._messages.forEach((validator) => { - const state = validator.handler(this.$ngModel.$modelValue, this.$ngModel.$viewValue); - this.$ngModel.$setValidity(validator.name, state); - }); - } - - validateByName(name) { - this._messages.forEach((validator) => { - if (validator.name === name) { - this.$ngModel.$setValidity( - validator.name, - validator.handler(this.$ngModel.$modelValue, this.$ngModel.$viewValue) - ); - } - }); - } - - getParser() { - return null; - } - - getFormatter() { - return null; - } - - } - - return Validator; - }; - - factory.$inject = ['Base', 'utils']; - - angular.module('app.utils').factory('Validator', factory); -})(); From 723b95b3be5385ce4783964fbc9f33524264028b Mon Sep 17 00:00:00 2001 From: tsigel Date: Wed, 31 Jan 2018 10:57:42 +0300 Subject: [PATCH 03/39] CLIENT-451: progress --- src/modules/tokens/templates/tokens.html | 13 +- .../ui/directives/password/password.html | 1 - .../utils/directives/validators/CompareTo.js | 44 +++-- .../utils/directives/validators/Validate.js | 185 ++++-------------- .../directives/validators/ValidateService.js | 91 +++++++++ 5 files changed, 169 insertions(+), 165 deletions(-) diff --git a/src/modules/tokens/templates/tokens.html b/src/modules/tokens/templates/tokens.html index 7d6f6f7ae3..c9dffee535 100644 --- a/src/modules/tokens/templates/tokens.html +++ b/src/modules/tokens/templates/tokens.html @@ -50,18 +50,19 @@
- + - +
diff --git a/src/modules/ui/directives/password/password.html b/src/modules/ui/directives/password/password.html index 82d45fb7b1..1ed5b3e43d 100644 --- a/src/modules/ui/directives/password/password.html +++ b/src/modules/ui/directives/password/password.html @@ -32,7 +32,6 @@ diff --git a/src/modules/utils/directives/validators/CompareTo.js b/src/modules/utils/directives/validators/CompareTo.js index d8d0ba14bd..2bda36d532 100644 --- a/src/modules/utils/directives/validators/CompareTo.js +++ b/src/modules/utils/directives/validators/CompareTo.js @@ -1,33 +1,45 @@ (function () { 'use strict'; - const factory = function (Validator) { - - class CompareTo extends Validator { + const directive = function () { + return { + require: 'ngModel', + /** + * @param $scope + * @param {JQuery} $input + * @param $attrs + * @param $ngModel + */ + link: ($scope, $input, { wCompareTo, ngModel }, $ngModel) => { + + /** + * $input can be both and , in the latter case we should ignore validation + */ + if ($input.get(0).tagName !== 'INPUT') { + return null; + } - constructor(data) { - super(data); + const $compare = $input.closest('form').find(`input[name="${wCompareTo}"]`); - const $compare = this.$input.closest('form').find(`input[name="${this.$attrs.wCompareTo}"]`); if (!$compare.length) { throw new Error('Element for compare not found!'); } + const validate = function () { + $ngModel.$setValidity('w-compare-to', $compare.val() === $input.val()); + }; + $compare.on('input', () => { - this.validate(); + validate(); + $scope.$apply(); }); - this.registerValidator('w-compare-to', (value) => { - return value === $compare.val(); - }); + $scope.$watch(ngModel, validate); } - - } - - return CompareTo; + }; }; - factory.$inject = ['Validator', 'utils']; + directive.$inject = []; - angular.module('app.utils').factory('CompareTo', factory); + angular.module('app.utils').directive('wCompareTo', directive); })(); diff --git a/src/modules/utils/directives/validators/Validate.js b/src/modules/utils/directives/validators/Validate.js index 23df0a60a5..6431d2ffcd 100644 --- a/src/modules/utils/directives/validators/Validate.js +++ b/src/modules/utils/directives/validators/Validate.js @@ -1,162 +1,63 @@ (function () { 'use strict'; - /** - * @param {typeof Base} Base - * @param {app.utils} utils - * @param {typeof Asset} Asset - * @param {typeof Num} Num - * @param {typeof CompareTo} CompareTo - * @param {typeof Address} Address - * @return {{require: string, link: (function(*=, *, *, *))}} - */ - const directive = (Base, utils, Asset, Num, CompareTo, Address) => { - - return { - require: 'ngModel', - link: ($scope, $input, $attrs, $ngModel) => { - + const AVAILABLE_VALIDATORS = [ + 'gt', + 'gte', + 'lt', + 'lte', + 'length', + 'precision', + 'byte' + ]; + + function getAttrName(validatorName) { + return `wValidator${validatorName.charAt(0).toUpperCase()}${validatorName.slice(1)}`; + } + + AVAILABLE_VALIDATORS.forEach((name) => { + const attrName = getAttrName(name); + + const directive = function (utils, validateService) { + return { + require: 'ngModel', /** - * $input can be both and , in the latter case we should ignore validation + * @param $scope + * @param {JQuery} $input + * @param $attrs + * @param $ngModel */ - if ($input.get(0).tagName !== 'INPUT') { - return null; - } - - class Validate extends Base { - - constructor() { - super($scope); - /** - * @type {Validator[]} - * @private - */ - this._messages = []; - - this._createValidators(); - this._onReady() - .then(() => { - - const { parsers, formatters } = this._getProcessors(); - - $ngModel.$parsers.unshift((value) => { - this._validate(value); - return parsers.reduce(Validate.valueFormatReducer, value); - }); - - $ngModel.$formatters.unshift((value) => { - return formatters.reduce(Validate.valueFormatReducer, value); - }); - - $scope.$watch($attrs.ngModel, () => { - this._validate(); - }); - - $input.get(0).value = $ngModel.$formatters.reduce((result, formatter) => { - return formatter(result); - }, $ngModel.$viewValue); - - this._validate(); - }); - } - - /** - * @private - */ - _validate() { - this._messages.forEach((validator) => { - validator.validate(); - }); - } + link: ($scope, $input, $attrs, $ngModel) => { /** - * @return {*|Promise} - * @private + * $input can be both and , in the latter case we should ignore validation */ - _onReady() { - return utils.whenAll(this._messages.map((validator) => validator.onReady())); + if ($input.get(0).tagName !== 'INPUT') { + return null; } - /** - * @return {{parsers: Array, formatters: Array}} - * @private - */ - _getProcessors() { - const parsers = []; - const formatters = []; - this._messages.forEach((item) => { - const parser = item.getParser(); - const formatter = item.getFormatter(); - if (parser) { - parsers.push(parser); - } - if (formatter) { - formatters.push(formatter); - } - }); - return { parsers, formatters }; - } + let value = null; + const exp = $attrs[attrName]; - /** - * @private - */ - _createValidators() { - if (!$attrs.wValidate) { - throw new Error('Has no validators list!'); - } - const list = $attrs.wValidate.split(','); - if (!list.length) { - throw new Error('Validators list is empty!'); - } + const validate = function () { + const valid = validateService[name]($ngModel.$modelValue, value); + $ngModel.$setValidity(name, valid); + }; - const hash = Object.create(null); - list.forEach((name) => { - if (hash[name]) { - throw new Error('Duplicate validator!'); - } - this._createValidator(name); - }); - } - - /** - * @param name - * @private - */ - _createValidator(name) { - let Constructor = null; - switch (name) { - case 'asset': - Constructor = Asset; - break; - case 'address': - Constructor = Address; - break; - case 'number': - Constructor = Num; - break; - case 'compare': - Constructor = CompareTo; - break; - default: - throw new Error('Wrong validator name!'); - } - this._messages.push(new Constructor({ $scope, $input, $attrs, $ngModel })); - } - - static valueFormatReducer(result, item) { - return item(result); - } + $scope.$watch(exp, (newValue) => { + value = newValue; + validate(); + }); + $scope.$watch($attrs.ngModel, validate); } - - new Validate(); - } + }; }; - }; - directive.$inject = ['Base', 'utils', 'Asset', 'Num', 'CompareTo', 'Address']; + directive.$inject = ['utils', 'validateService']; - angular.module('app.utils').directive('wValidate', directive); + angular.module('app.utils').directive(attrName, directive); + }); })(); diff --git a/src/modules/utils/directives/validators/ValidateService.js b/src/modules/utils/directives/validators/ValidateService.js index e69de29bb2..c9f1b8340d 100644 --- a/src/modules/utils/directives/validators/ValidateService.js +++ b/src/modules/utils/directives/validators/ValidateService.js @@ -0,0 +1,91 @@ +(function () { + 'use strict'; + + const factory = function () { + + class ValidateService { + + @notNullArgs + @toBigNumberArgs + gt(inputValue, validateValue) { + return inputValue.gt(validateValue); + } + + @notNullArgs + @toBigNumberArgs + gte(inputValue, validateValue) { + return inputValue.gte(validateValue); + } + + @notNullArgs + @toBigNumberArgs + lt(inputValue, validateValue) { + return inputValue.lt(validateValue); + } + + @notNullArgs + @toBigNumberArgs + lte(inputValue, validateValue) { + return inputValue.lte(validateValue); + } + + @notNullArgs + length(inputValue, length) { + return String(inputValue).length <= length; + } + + @notNullArgs + precision(inputValue, precision) { + const [int, dec] = inputValue.split('.'); //TODO add separator + return dec ? dec.length <= precision : true; //TODO remove empty zero + } + + @notNullArgs + byte(inputValue, bytes) { + const blob = new Blob([inputValue], { type: 'text/html' }); + return blob.size <= bytes; + } + + static toBigNumber(item) { + switch (typeof item) { + case 'string': + case 'number': + return new BigNumber(item); + case 'object': + if (item instanceof BigNumber) { + return item; + } else if (item instanceof Waves.Money) { + return item.getTokens(); + } else { + throw new Error('Cant convert data to BigNumber'); + } + } + } + + } + + function notNullArgs(target, key, descriptor) { + const origin = descriptor.value; + descriptor.value = function (...args) { + if (args.some((value) => value == null)) { + return true; + } else { + return origin.call(this, ...args); + } + }; + } + + function toBigNumberArgs(target, key, descriptor) { + const origin = descriptor.value; + descriptor.value = function (...args) { + return origin.call(this, ...args.map(ValidateService.toBigNumber)); + }; + } + + return new ValidateService(); + }; + + factory.$inject = []; + + angular.module('app.utils').factory('validateService', factory); +})(); From 65cdd6a4dfa808b1df87f99df1e0bd5b3f51cb7c Mon Sep 17 00:00:00 2001 From: tsigel Date: Wed, 31 Jan 2018 11:47:08 +0300 Subject: [PATCH 04/39] CLIENT-451: add number input --- src/modules/tokens/templates/tokens.html | 5 +- src/modules/ui/directives/input/Input.js | 44 +++-- .../utils/directives/validators/Num.js | 167 ------------------ 3 files changed, 38 insertions(+), 178 deletions(-) delete mode 100644 src/modules/utils/directives/validators/Num.js diff --git a/src/modules/tokens/templates/tokens.html b/src/modules/tokens/templates/tokens.html index c9dffee535..ba2dac0f4a 100644 --- a/src/modules/tokens/templates/tokens.html +++ b/src/modules/tokens/templates/tokens.html @@ -47,7 +47,9 @@
- cb()); + this._stopScopeHandlers.forEach((cb) => cb()); } /** @@ -77,18 +77,12 @@ _initialize() { this._$input = $element.find('input,textarea'); this._$inputWrap = $element.find('.w-input-wrap'); - const name = this._name = this._getName(); - - this._$input.on('focus', () => { - this._$inputWrap.addClass('focused'); - }); - - this._$input.on('blur', () => { - this._$inputWrap.removeClass('focused'); - }); + const name = this._name = this._getName(); const formName = $element.closest('form').attr('name'); + this._setHandlers(); + if (this._name && formName) { const form = this._$form = this._getForm(formName); @@ -105,6 +99,36 @@ } } + _setHandlers() { + this._$input.on('focus', () => { + this._$inputWrap.addClass('focused'); + }); + + this._$input.on('blur', () => { + this._$inputWrap.removeClass('focused'); + }); + + if ($attrs.wType === 'number') { + + const reg = /[0-9.]/; + this._$input.on('keypress', (event) => { + if (event.keyCode != null) { + const char = String.fromCharCode(event.keyCode); + if (char != null) { + if (reg.test(char)) { + if (char === '.' && this._$input.val().includes('.')) { + // TODO add separator from locale + event.preventDefault(); + } + } else { + event.preventDefault(); + } + } + } + }); + } + } + _getName() { const name = this._$input.attr('name'); diff --git a/src/modules/utils/directives/validators/Num.js b/src/modules/utils/directives/validators/Num.js deleted file mode 100644 index 688ece818a..0000000000 --- a/src/modules/utils/directives/validators/Num.js +++ /dev/null @@ -1,167 +0,0 @@ -(function () { - 'use strict'; - - const factory = function (Validator, utils) { - // TODO rename all validators (add postfix "Validator") - class Num extends Validator { - - constructor(data) { - super(data); - - /** - * @type {RegExp} - */ - const numberReg = /[0-9]/; - /** - * @type {HTMLInputElement} - */ - const input = this.$input.get(0); - - /** - * @param {string} char - * @param {boolean} hasDot - * @return {boolean} - */ - const checkChar = (char, hasDot) => { - if (char === '.') { - return !hasDot; - } else { - return numberReg.test(char); - } - }; - - /** - * @type {boolean} - */ - const isRequired = input.hasAttribute('required'); - /** - * @type {boolean} - */ - const isInteger = input.hasAttribute('integer'); - /** - * @type {boolean} - */ - const hasMax = input.hasAttribute('max'); - /** - * @type {boolean} - */ - const hasMin = input.hasAttribute('min'); - /** - * @type {boolean} - */ - const includeRangeMin = input.hasAttribute('include-range-min'); // TODO refactor to watchers! - /** - * @type {boolean} - */ - const includeRangeMax = input.hasAttribute('include-range-max'); - /** - * @type {boolean} - */ - const hasPrecision = input.hasAttribute('precision'); - - if (isInteger) { - this.registerValidator('integer', (modalValue) => { - return !modalValue || modalValue.round(0).eq(modalValue); - }); - } else if (hasPrecision) { - let precision; - this.registerValidator('precision', (modalValue) => { - return !modalValue || precision == null || modalValue.eq(modalValue.round(precision)); - }); - this.$scope.$watch(this.$attrs.precision, (value) => { - precision = Number(value) || 0; - this.validateByName('precision'); - }); - } - - let min; - if (hasMin) { - if (includeRangeMin) { - this.registerValidator('min', (modalValue) => !min || !modalValue || modalValue.gte(min)); - } else { - this.registerValidator('min', (modalValue) => !min || !modalValue || modalValue.gt(min)); - } - - this.$scope.$watch(this.$attrs.min, (value) => { - min = Num._toBigNumber(value); - this.validateByName('min'); - }); - } - - if (hasMax) { - let max; - if (includeRangeMax) { - this.registerValidator('max', (modalValue) => !max || !modalValue || modalValue.lte(max)); - } else { - this.registerValidator('max', (modalValue) => !max || !modalValue || modalValue.lt(max)); - } - - this.$scope.$watch(this.$attrs.max, (value) => { - max = Num._toBigNumber(value); - this.validateByName('max'); - }); - } - - this.registerValidator('required', (modelValue) => { - return !isRequired || Num._isEmpty(modelValue, includeRangeMin, min); - }); - - this.$input.on('keypress', (event) => { - function getChar(event) { - if (event.which === null) { - if (event.keyCode < 32) return null; - return String.fromCharCode(event.keyCode); - } - - if (event.which !== 0 && event.charCode !== 0) { - if (event.which < 32) { - return null; - } - return String.fromCharCode(event.which); - } - - return null; - } - - const char = getChar(event); - if (event.charCode == null || event.charCode !== 0) { - if (!char || !checkChar(char, this.$input.val().indexOf('.') !== -1)) { - event.preventDefault(); - } - } - }); - - } - - getParser() { - return utils.parseNiceNumber; - } - - static _isEmpty(value, include, min) { - if (include) { - return value instanceof BigNumber ? value.gte(min) : !!value; - } - return value instanceof BigNumber ? value.gt(0) : !!value; - } - - static _toBigNumber(value) { - if (value == null) { - return null; - } else if (!value) { - return new BigNumber(0); - } else if (value instanceof BigNumber) { - return value; - } else { - return new BigNumber(value); - } - } - - } - - return Num; - }; - - factory.$inject = ['Validator', 'utils']; - - angular.module('app.utils').factory('Num', factory); -})(); From f268b6e09ab665f8c3b1e3b65587a935d819df26 Mon Sep 17 00:00:00 2001 From: uiskander Date: Thu, 1 Feb 2018 17:52:56 +0300 Subject: [PATCH 05/39] client-415-token-help-icons: added ru localization for tool-tips --- src/modules/tokens/locales/ru.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/modules/tokens/locales/ru.json b/src/modules/tokens/locales/ru.json index 4161a959b3..09af772119 100644 --- a/src/modules/tokens/locales/ru.json +++ b/src/modules/tokens/locales/ru.json @@ -8,15 +8,15 @@ "fee": "Комиссия 1 WAVES", "create": "Выпустить", "help": { - "name": "Пожалуйста, используйте только латинские буквы", + "name": "Пожалуйста, используйте только латинские буквы" }, "helpIcon": { "totalTokens": { - "headline": "This field defines the total tokens supply that your asset will contain.", - "reissuable": "Reissuability allows for additional tokens creation that will be added to the total token supply of asset.", - "notReissuable": "A Non Reissuability asset will be permanently limited to the total token supply defined on this process. " + "headline": "Количество выпускаемых токенов.", + "reissuable": "Перевыпускаемый тип позволяет при необходимости увеличить количество токенов.", + "notReissuable": "Количество токенов неперевыпускаемого типа не может быть изменено в будущем. " }, - "demicals": "В этом поле укажите, сколько знаков после запятой будет у токена" + "demicals": "Это поле определяет, сколько знаков после запятой будет у создаваемого токена." }, "validators": { "nameLen": "Имя токена должно содержать от 4 до 16 символов", From 08aca2a0c289ef7075b997dc73968d4d69ee3b0b Mon Sep 17 00:00:00 2001 From: tsigel Date: Thu, 1 Feb 2018 19:14:04 +0300 Subject: [PATCH 06/39] CLIENT-451: add validators --- .../directives/createOrder/createOrder.html | 26 +- src/modules/tokens/templates/tokens.html | 14 +- .../directives/balanceInput/balanceInput.html | 11 +- .../inputContainer/InputContainer.js | 30 +- .../utils/directives/validators/Validate.js | 311 +++++++++++++++--- .../directives/validators/ValidateService.js | 10 +- .../utils/modals/sendAsset/send.modal.html | 11 +- 7 files changed, 335 insertions(+), 78 deletions(-) diff --git a/src/modules/dex/directives/createOrder/createOrder.html b/src/modules/dex/directives/createOrder/createOrder.html index 3c94c36c1b..76e2ec8525 100644 --- a/src/modules/dex/directives/createOrder/createOrder.html +++ b/src/modules/dex/directives/createOrder/createOrder.html @@ -64,9 +64,10 @@
@@ -78,17 +79,20 @@ directives.createOrder.errors.required - + + directives.createOrder.errors.required + + directives.createOrder.errors.precision - + directives.createOrder.errors.balance -
+
directives.createOrder.errors.balance @@ -103,8 +107,9 @@
@@ -112,11 +117,14 @@
{{$ctrl.priceDisplayName}}
- + directives.createOrder.errors.precision + + directives.createOrder.errors.required + directives.createOrder.errors.required diff --git a/src/modules/tokens/templates/tokens.html b/src/modules/tokens/templates/tokens.html index ba2dac0f4a..ecd0e5d00c 100644 --- a/src/modules/tokens/templates/tokens.html +++ b/src/modules/tokens/templates/tokens.html @@ -95,18 +95,16 @@ w-type="number" ng-model="$ctrl.precision" required - w-validate="number" - integer - include-range-min - include-range-max - min="0" - max="8" + w-validator-lte="'8'" + w-validator-gte="'0'" + w-validator-integer placeholder="placeholders.precision" w-i18n-attr="placeholder"> - + + validators.minValuePrecision - + validators.maxValuePrecision diff --git a/src/modules/ui/directives/balanceInput/balanceInput.html b/src/modules/ui/directives/balanceInput/balanceInput.html index ab983fbf2b..c69054783e 100644 --- a/src/modules/ui/directives/balanceInput/balanceInput.html +++ b/src/modules/ui/directives/balanceInput/balanceInput.html @@ -1,13 +1,14 @@
balanceInput.max
-
\ No newline at end of file +
diff --git a/src/modules/ui/directives/inputContainer/InputContainer.js b/src/modules/ui/directives/inputContainer/InputContainer.js index d9b5f8f8c6..34320ab6ca 100644 --- a/src/modules/ui/directives/inputContainer/InputContainer.js +++ b/src/modules/ui/directives/inputContainer/InputContainer.js @@ -9,19 +9,28 @@ class InputContainer { + /** + * @type {Array.} + */ + get inputs() { + return $element.find('input') + .toArray(); + } + + /** + * @type {ngModel.NgModelController[]} + */ + get target() { + return this.inputs.map((input) => { + return this.form[input.getAttribute('name')]; + }); + } + constructor() { - /** - * @type {ngModel.NgModelController[]} - */ - this.target = null; /** * @type {ngForm} */ this.form = null; - /** - * @type {Array.} - */ - this.inputs = null; } $postLink() { @@ -32,11 +41,6 @@ throw new Error('Can\'t get form!'); } - this.inputs = $element.find('input') - .toArray(); - this.target = this.inputs.map((input) => { - return this.form[input.getAttribute('name')]; - }); } } diff --git a/src/modules/utils/directives/validators/Validate.js b/src/modules/utils/directives/validators/Validate.js index 6431d2ffcd..65c400e30f 100644 --- a/src/modules/utils/directives/validators/Validate.js +++ b/src/modules/utils/directives/validators/Validate.js @@ -7,57 +7,294 @@ 'lt', 'lte', 'length', + 'integer', 'precision', - 'byte' + 'byte', + 'asset' ]; - function getAttrName(validatorName) { - return `wValidator${validatorName.charAt(0).toUpperCase()}${validatorName.slice(1)}`; - } + /** + * + * @param {app.utils} utils + * @param {ValidateService} validateService + * @param {Waves} waves + */ + const directive = function (utils, validateService, waves) { + return { + require: 'ngModel', + priority: 10000, + compile: function ($input, $attrs) { - AVAILABLE_VALIDATORS.forEach((name) => { - const attrName = getAttrName(name); - - const directive = function (utils, validateService) { - return { - require: 'ngModel', /** - * @param $scope - * @param {JQuery} $input - * @param $attrs - * @param $ngModel + * $input can be both and , in the latter case we should ignore validation */ - link: ($scope, $input, $attrs, $ngModel) => { + if ($input.get(0).tagName !== 'INPUT') { + return null; + } - /** - * $input can be both and , in the latter case we should ignore validation - */ - if ($input.get(0).tagName !== 'INPUT') { - return null; - } + return function ($scope, $input, $compiledAttrs, $ngModel) { - let value = null; - const exp = $attrs[attrName]; + class Validate { - const validate = function () { - const valid = validateService[name]($ngModel.$modelValue, value); - $ngModel.$setValidity(name, valid); - }; + constructor() { + this._validators = Object.create(null); - $scope.$watch(exp, (newValue) => { - value = newValue; - validate(); - }); + this._createValidatorList(); + $scope.$watch($attrs.ngModel, () => this._validate()); + } - $scope.$watch($attrs.ngModel, validate); - } - }; + /** + * @param validators + * @private + */ + _applyValidators(validators) { + validators.forEach(({ name, handler }) => { + const result = handler($ngModel.$modelValue, $ngModel.$viewValue); + + switch (typeof result) { + case 'boolean': + $ngModel.$setValidity(name, result); + break; + case 'object': + if (result && typeof result.then === 'function') { + $ngModel.$setValidity(`pending-${name}`, false); + const onEnd = () => { + $ngModel.$setValidity(`pending-${name}`, true); + }; + result.then(() => { + $ngModel.$setValidity(name, true); + onEnd(); + }, () => { + $ngModel.$setValidity(name, false); + onEnd(); + }); + } else { + throw new Error('Wrong validation result!'); + } + break; + default: + throw new Error('Wrong validation result!'); + } + }); + } + + /** + * @private + */ + _validate() {// TODO async + this._applyValidators(Object.keys(this._validators).map((name) => this._validators[name])); + } + + /** + * @param targetName + * @private + */ + _validateByName(targetName) { + this._applyValidators([this._validators[targetName]].filter(Boolean)); + } + + /** + * @private + */ + _createValidatorList() { + AVAILABLE_VALIDATORS.filter(Validate._hasValidator).forEach((name) => { + this._createValidator(name); + }); + } + + /** + * @param name + * @private + */ + _createValidator(name) { + + if (this._validators[name]) { + throw new Error(`Duplicate validator! ${name}`); + } + + switch (name) { + case 'asset': + this._validators[name] = this._createAssetValidator(name); + break; + default: + this._validators[name] = this._createSimpleValidator(name); + } + + if (this._validators[name].parser) { + $ngModel.$parsers.unshift(this._validators[name].parser); + } + + if (this._validators[name].formatter) { + $ngModel.$formatters.unshift(this._validators[name].formatter); + } + + return this._validators[name]; + } + + /** + * + * @param name + * @return {*} + * @private + */ + _createAssetValidator(name) { + const precisionValidator = this._createValidator('precision'); + let value; + + const validator = { + name: name, + asset: null, + money: null, + value: null, + apply: () => { + precisionValidator.value = validator.asset.precision; + this._validateByName(name); + }, + handler: () => true, + parser: (value) => { + return Validate._toMoney(value, validator.money); + }, + formatter: (value) => { + return Validate._toString(value); + } + }; + + Object.defineProperty(validator, 'value', { + get: () => value, + set: (assetData) => { + + validator.asset = null; + validator.money = null; + + if (!assetData) { + return null; + } + + const id = (typeof assetData === 'string' ? assetData : assetData.id); + value = id; + if (id) { + Waves.Money.fromTokens('0', id).then((money) => { + validator.asset = money.asset; + validator.money = money; + validator.apply(); + $ngModel.$modelValue = validator.parser($ngModel.$viewValue); + }); + } + } + }); + + this._listenValidatorChanges(name, validator); + + return validator; + } + + /** + * @param name + * @private + */ + _createSimpleValidator(name) { + const validator = { + name, + value: null, + handler: function (modelValue) { + return validateService[name](modelValue, validator.value); + } + }; + + this._listenValidatorChanges(name, validator); + + return validator; + } + + /** + * @param name + * @param validator + * @private + */ + _listenValidatorChanges(name, validator) { + const attrValue = $attrs[Validate._getAttrName(name)]; + + if (Validate._hasExp(attrValue)) { + const exp = attrValue.replace(/{{(.*)?}}/g, '$1'); + + if (exp.indexOf('::') !== -1) { + validator.value = $scope.$eval(exp.replace('::', '')); + } else { + $scope.$watch(exp, (value) => { + validator.value = value; + this._validateByName(validator.name); + }); + } + + } else { + validator.value = attrValue; + } + } + + static _toString(value) { + if (value instanceof BigNumber) { + return value.toFixed(); + } else if (value instanceof Waves.Money) { + return value.getTokens().toFixed(); + } else if (!value) { + return ''; + } else { + return String(value); + } + } + + static _toMoney(value, target) { + if (!target) { + return null; + } else { + return target.cloneWithTokens(utils.parseNiceNumber(value)); + } + } + + /** + * @param value + * @return {boolean} + * @private + */ + static _hasExp(value) { + if (!value) { + return false; + } + + const openIndex = value.indexOf('{{'); + const closeIndex = value.indexOf('}}'); + return openIndex !== -1 && closeIndex !== -1 && openIndex < closeIndex; + } + + /** + * @param validatorName + * @return {string} + * @private + */ + static _getAttrName(validatorName) { + return `wValidator${validatorName.charAt(0).toUpperCase()}${validatorName.slice(1)}`; + } + + /** + * @param name + * @return {boolean} + * @private + */ + static _hasValidator(name) { + return Validate._getAttrName(name) in $attrs; + } + + } + + return new Validate(); + }; + } }; + }; - directive.$inject = ['utils', 'validateService']; + directive.$inject = ['utils', 'validateService', 'waves']; - angular.module('app.utils').directive(attrName, directive); - }); + angular.module('app.utils').directive('wValidate', directive); })(); diff --git a/src/modules/utils/directives/validators/ValidateService.js b/src/modules/utils/directives/validators/ValidateService.js index c9f1b8340d..bb5c613067 100644 --- a/src/modules/utils/directives/validators/ValidateService.js +++ b/src/modules/utils/directives/validators/ValidateService.js @@ -35,8 +35,9 @@ } @notNullArgs + @toBigNumberArgs precision(inputValue, precision) { - const [int, dec] = inputValue.split('.'); //TODO add separator + const [int, dec] = inputValue.toFixed().split('.'); //TODO add separator return dec ? dec.length <= precision : true; //TODO remove empty zero } @@ -46,6 +47,11 @@ return blob.size <= bytes; } + @notNullArgs + integer(inputValue) { + return inputValue.round().eq(inputValue); + } + static toBigNumber(item) { switch (typeof item) { case 'string': @@ -67,7 +73,7 @@ function notNullArgs(target, key, descriptor) { const origin = descriptor.value; descriptor.value = function (...args) { - if (args.some((value) => value == null)) { + if (args.some((value) => value == null || value === '')) { return true; } else { return origin.call(this, ...args); diff --git a/src/modules/utils/modals/sendAsset/send.modal.html b/src/modules/utils/modals/sendAsset/send.modal.html index f686556084..f2ce56e2bf 100644 --- a/src/modules/utils/modals/sendAsset/send.modal.html +++ b/src/modules/utils/modals/sendAsset/send.modal.html @@ -42,7 +42,7 @@
- + inputs.errors.required - + + inputs.errors.required + + inputs.errors.invalidAsset - + modal.send.errors.max From 441e7cd559deb6a08f2d34ac6e19aec874186f43 Mon Sep 17 00:00:00 2001 From: tsigel Date: Fri, 2 Feb 2018 12:14:15 +0300 Subject: [PATCH 07/39] CLIENT-451: add validate service --- src/index.html | 2 + .../utils/directives/validators/Address.js | 60 ------ .../utils/directives/validators/CompareTo.js | 45 ----- .../utils/directives/validators/Validate.js | 188 ++++++++++++++++-- .../directives/validators/ValidateService.js | 83 +++++++- .../utils/modals/sendAsset/send.modal.html | 6 +- .../modules/assets/templates/assets.html | 6 +- 7 files changed, 263 insertions(+), 127 deletions(-) delete mode 100644 src/modules/utils/directives/validators/Address.js delete mode 100644 src/modules/utils/directives/validators/CompareTo.js diff --git a/src/index.html b/src/index.html index 9a8f657f5e..1fdce8ee6f 100644 --- a/src/index.html +++ b/src/index.html @@ -256,6 +256,7 @@ modules: [], minAliasLength: 4, maxAliasLength: 30, + maxAddressLength: 45, getLocaleData: function () { return WavesApp.localize[i18next.language]; }, @@ -386,6 +387,7 @@ * @property {Object} localize * @property {number} minAliasLength * @property {number} maxAliasLength + * @property {number} maxAddressLength * @property {object} network * @property {string} network.code * @property {string} network.node diff --git a/src/modules/utils/directives/validators/Address.js b/src/modules/utils/directives/validators/Address.js deleted file mode 100644 index 12dfa96f74..0000000000 --- a/src/modules/utils/directives/validators/Address.js +++ /dev/null @@ -1,60 +0,0 @@ -(function () { - 'use strict'; - - /** - * @param Validator - * @param {Waves} waves - * @param $q - * @param outerBlockchains - * @returns {Address} - */ - const factory = function (Validator, waves, $q, outerBlockchains) { - - class Address extends Validator { - - constructor(data) { - super(data); - - const withGateways = this.$attrs.withGateways === 'true'; - const outerChain = outerBlockchains[this.$attrs.assetId]; - - this.$ngModel.$asyncValidators.inputAddress = function (address) { - if (address.length < WavesApp.minAliasLength) { - return $q.reject(); - } else if (withGateways && outerChain && outerChain.isValidAddress(address)) { - return $q.resolve(); - } else if (address.length <= WavesApp.maxAliasLength) { - if (waves.node.aliases.validate(address)) { - return waves.node.aliases.getAddress(address) - .then( - () => $q.resolve(), - () => $q.reject() - ); - } else { - $q.reject(); - } - } else { - // TODO : replace with address validator from `waves-api` when it's implemented - return Waves.API.Node.v1.addresses.balance(address) - .then((data) => { - if (data && data.balance != null) { - return $q.resolve(); - } else { - return $q.reject(); - } - }, (e) => { - return $q.reject(e.message); - }); - } - }; - } - - } - - return Address; - }; - - factory.$inject = ['Validator', 'waves', '$q', 'outerBlockchains']; - - angular.module('app.utils').factory('Address', factory); -})(); diff --git a/src/modules/utils/directives/validators/CompareTo.js b/src/modules/utils/directives/validators/CompareTo.js deleted file mode 100644 index 2bda36d532..0000000000 --- a/src/modules/utils/directives/validators/CompareTo.js +++ /dev/null @@ -1,45 +0,0 @@ -(function () { - 'use strict'; - - const directive = function () { - return { - require: 'ngModel', - /** - * @param $scope - * @param {JQuery} $input - * @param $attrs - * @param $ngModel - */ - link: ($scope, $input, { wCompareTo, ngModel }, $ngModel) => { - - /** - * $input can be both and , in the latter case we should ignore validation - */ - if ($input.get(0).tagName !== 'INPUT') { - return null; - } - - const $compare = $input.closest('form').find(`input[name="${wCompareTo}"]`); - - if (!$compare.length) { - throw new Error('Element for compare not found!'); - } - - const validate = function () { - $ngModel.$setValidity('w-compare-to', $compare.val() === $input.val()); - }; - - $compare.on('input', () => { - validate(); - $scope.$apply(); - }); - - $scope.$watch(ngModel, validate); - } - }; - }; - - directive.$inject = []; - - angular.module('app.utils').directive('wCompareTo', directive); -})(); diff --git a/src/modules/utils/directives/validators/Validate.js b/src/modules/utils/directives/validators/Validate.js index 65c400e30f..1764f2098f 100644 --- a/src/modules/utils/directives/validators/Validate.js +++ b/src/modules/utils/directives/validators/Validate.js @@ -10,16 +10,22 @@ 'integer', 'precision', 'byte', - 'asset' + 'asset', + 'compare', + 'number', + 'alias', + 'address', + 'wavesAddress', + 'outerBlockchains', + 'anyAddress' ]; /** * * @param {app.utils} utils * @param {ValidateService} validateService - * @param {Waves} waves */ - const directive = function (utils, validateService, waves) { + const directive = function (utils, validateService) { return { require: 'ngModel', priority: 10000, @@ -116,6 +122,27 @@ case 'asset': this._validators[name] = this._createAssetValidator(name); break; + case 'compare': + this._validators[name] = this._createCompareValidator(name); + break; + case 'number': + this._validators[name] = Validate._createBigNumberValidator(name); + break; + case 'alias': + this._validators[name] = Validate._createAliasValidator(name); + break; + case 'address': + this._validators[name] = Validate._createAddressValidator(name); + break; + case 'wavesAddress': + this._validators[name] = Validate._createWavesAddressValidator(name); + break; + case 'outerBlockchains': + this._validators[name] = this._createOuterBlockchainsValidator(name); + break; + case 'anyAddress': + this._validators[name] = this._createAnyAddressValidator(name); + break; default: this._validators[name] = this._createSimpleValidator(name); } @@ -131,6 +158,91 @@ return this._validators[name]; } + _createOuterBlockchainsValidator(name) { + + let value = null; + + const validator = { + name, + value: null, + handler: function (address) { + return validateService.outerBlockchains(address, validator.value); + } + }; + + Object.defineProperty(validator, 'value', { + get: () => value, + set: (data) => { + value = Validate._toAssetId(data); + } + }); + + this._listenValidatorChanges(name, validator); + + return validator; + } + + _createAnyAddressValidator(name) { + + let value = null; + + const validator = { + name, + value: null, + handler: function (address) { + return validateService.anyAddress(address, validator.value); + } + }; + + Object.defineProperty(validator, 'value', { + get: () => value, + set: (data) => { + value = Validate._toAssetId(data); + } + }); + + this._listenValidatorChanges(name, validator); + + return validator; + } + + _createCompareValidator(name) { + + let value = null; + + const validator = { + name, + value: null, + $compare: null, + $compareHandler: () => { + this._validateByName(name); + $scope.$apply(); + }, + handler: (value) => { + return value === validator.$compare.val(); + }, + destroy: function () { + this.$compare.off('input', this.$compareHandler); + } + }; + + Object.defineProperty(validator, 'value', { + get: () => value, + set: (val) => { + if (validator.$compare) { + validator.$compare.off('input', validator.$compareHandler); + } + validator.$compare = $input.closest('form').find(`input[name="${val}"]`); + validator.$compare.on('input', validator.$compareHandler); + value = val; + } + }); + + this._listenValidatorChanges(name, validator); + + return validator; + } + /** * * @param name @@ -139,10 +251,10 @@ */ _createAssetValidator(name) { const precisionValidator = this._createValidator('precision'); - let value; + let value = null; const validator = { - name: name, + name, asset: null, money: null, value: null, @@ -154,9 +266,7 @@ parser: (value) => { return Validate._toMoney(value, validator.money); }, - formatter: (value) => { - return Validate._toString(value); - } + formatter: Validate._toString }; Object.defineProperty(validator, 'value', { @@ -170,10 +280,9 @@ return null; } - const id = (typeof assetData === 'string' ? assetData : assetData.id); - value = id; - if (id) { - Waves.Money.fromTokens('0', id).then((money) => { + value = Validate._toAssetId(assetData); + if (value) { + Waves.Money.fromTokens('0', value).then((money) => { validator.asset = money.asset; validator.money = money; validator.apply(); @@ -231,6 +340,51 @@ } } + static _createAddressValidator(name) { + return { + name, + value: null, + handler: validateService.address + }; + } + + static _createAliasValidator(name) { + return { + name, + value: null, + handler: validateService.alias + }; + } + + static _createWavesAddressValidator(name) { + return { + name, + value: null, + handler: validateService.wavesAddress + }; + } + + static _createBigNumberValidator(name) { + return { + name, + handler: () => true, + parser: Validate._toBigNumber, + formatter: Validate._toString + }; + } + + static _toAssetId(data) { + if (typeof data === 'string') { + return data; + } else if (data instanceof Waves.Money) { + return data.asset.id; + } else if (data instanceof Waves.Asset) { + return data.id; + } else { + return null; + } + } + static _toString(value) { if (value instanceof BigNumber) { return value.toFixed(); @@ -251,6 +405,14 @@ } } + static _toBigNumber(value) { + try { + return new BigNumber(utils.parseNiceNumber(value)); + } catch (e) { + return null; + } + } + /** * @param value * @return {boolean} @@ -292,7 +454,7 @@ }; }; - directive.$inject = ['utils', 'validateService', 'waves']; + directive.$inject = ['utils', 'validateService']; angular.module('app.utils').directive('wValidate', directive); diff --git a/src/modules/utils/directives/validators/ValidateService.js b/src/modules/utils/directives/validators/ValidateService.js index bb5c613067..291272e9a5 100644 --- a/src/modules/utils/directives/validators/ValidateService.js +++ b/src/modules/utils/directives/validators/ValidateService.js @@ -1,7 +1,14 @@ (function () { 'use strict'; - const factory = function () { + /** + * @param {Waves} waves + * @param {$q} $q + * @param {Object.} outerBlockchains + * @param {app.utils} utils + * @return {ValidateService} + */ + const factory = function (waves, $q, outerBlockchains, utils) { class ValidateService { @@ -52,6 +59,78 @@ return inputValue.round().eq(inputValue); } + anyAddress(address, assetId) { + return this.outerBlockchains(address, assetId) ? true : this.wavesAddress(address); + } + + wavesAddress(address) { + return utils.whenAll([ + this.alias(address), + this.address(address) + ]).then(([alias, address]) => { + return (alias || address) ? $q.resolve() : $q.reject(); + }); + } + + outerBlockchains(address, assetId) { + if (!address || !assetId) { + return true; + } + + const outerChain = outerBlockchains[assetId]; + + if (!outerChain) { + return false; + } + + return outerChain.isValidAddress(address); + } + + alias(address) { + if (!address) { + return true; + } + + if (address.length < WavesApp.minAliasLength) { + return false; + } + + if (address.length > WavesApp.maxAliasLength) { + return false; + } + + if (!waves.node.aliases.validate(address)) { + return false; + } else { + return waves.node.aliases.getAddress(address); + } + } + + address(address) { + if (!address) { + return true; + } + + if (address.length <= WavesApp.maxAliasLength) { + return false; + } + + if (address.length >= WavesApp.maxAddressLength) { + return false; + } + + return Waves.API.Node.v1.addresses.balance(address) + .then((data) => { + if (data && data.balance != null) { + return $q.resolve(); + } else { + return $q.reject(); + } + }, (e) => { + return $q.reject(e.message); + }); + } + static toBigNumber(item) { switch (typeof item) { case 'string': @@ -91,7 +170,7 @@ return new ValidateService(); }; - factory.$inject = []; + factory.$inject = ['waves', '$q', 'outerBlockchains', 'utils']; angular.module('app.utils').factory('validateService', factory); })(); diff --git a/src/modules/utils/modals/sendAsset/send.modal.html b/src/modules/utils/modals/sendAsset/send.modal.html index e1e97d33b7..6ce8742450 100644 --- a/src/modules/utils/modals/sendAsset/send.modal.html +++ b/src/modules/utils/modals/sendAsset/send.modal.html @@ -42,14 +42,12 @@
- - - + + + From 70c6093fd65775512be3cbda784011276df87324 Mon Sep 17 00:00:00 2001 From: tsigel Date: Fri, 2 Feb 2018 12:26:50 +0300 Subject: [PATCH 08/39] CLIENT-451: add debounce function --- .../utils/directives/validators/Validate.js | 9 ++++++--- src/modules/utils/services/utils.js | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/modules/utils/directives/validators/Validate.js b/src/modules/utils/directives/validators/Validate.js index 1764f2098f..b0c4096b2c 100644 --- a/src/modules/utils/directives/validators/Validate.js +++ b/src/modules/utils/directives/validators/Validate.js @@ -24,8 +24,9 @@ * * @param {app.utils} utils * @param {ValidateService} validateService + * @param {app.utils.decorators} decorators */ - const directive = function (utils, validateService) { + const directive = function (utils, validateService, decorators) { return { require: 'ngModel', priority: 10000, @@ -87,8 +88,10 @@ /** * @private */ - _validate() {// TODO async + @decorators.async(100) + _validate() { this._applyValidators(Object.keys(this._validators).map((name) => this._validators[name])); + $scope.$apply(); } /** @@ -454,7 +457,7 @@ }; }; - directive.$inject = ['utils', 'validateService']; + directive.$inject = ['utils', 'validateService', 'decorators']; angular.module('app.utils').directive('wValidate', directive); diff --git a/src/modules/utils/services/utils.js b/src/modules/utils/services/utils.js index 66443611ea..41850ed7f2 100644 --- a/src/modules/utils/services/utils.js +++ b/src/modules/utils/services/utils.js @@ -28,6 +28,25 @@ return _addObserverSignals(target, keys, options); }, + /** + * @name app.utils#debounce + * @param {function} handler + * @param {number} [timeout] + * @return {Function} + */ + debounce(handler, timeout) { + let timer = null; + return function (...args) { + if (timer) { + clearTimeout(timer); + } + timer = setTimeout(() => { + timer = null; + handler.call(...args); + }, timeout); + }; + }, + /** * @name app.utils#animate * @param {JQuery} $element From 8e204b4ccb78c3c3b15f774bfd58ee80330e42c1 Mon Sep 17 00:00:00 2001 From: tsigel Date: Fri, 2 Feb 2018 12:28:02 +0300 Subject: [PATCH 09/39] CLIENT-451: change quote for lint --- .../ui/directives/assetLogo/AssetLogo.js | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/modules/ui/directives/assetLogo/AssetLogo.js b/src/modules/ui/directives/assetLogo/AssetLogo.js index e21f7fa401..6a5ad0af9a 100644 --- a/src/modules/ui/directives/assetLogo/AssetLogo.js +++ b/src/modules/ui/directives/assetLogo/AssetLogo.js @@ -15,32 +15,32 @@ }; const COLORS_MAP = { - 'A': '#39a12c', - 'B': '#6a737b', - 'C': '#e49616', - 'D': '#008ca7', - 'E': '#ff5b38', - 'F': '#ff6a00', - 'G': '#c74124', - 'H': '#00a78e', - 'I': '#b01e53', - 'J': '#e0c61b', - 'K': '#5a81ea', - 'L': '#72b7d2', - 'M': '#a5b5c3', - 'N': '#81c926', - 'O': '#86a3bd', - 'P': '#c1d82f', - 'Q': '#5c84a8', - 'R': '#267e1b', - 'S': '#fbb034', - 'T': '#ff846a', - 'U': '#47c1ff', - 'V': '#00a0af', - 'W': '#85d7c6', - 'X': '#8a7967', - 'Y': '#26c1c9', - 'Z': '#72d28b' + A: '#39a12c', + B: '#6a737b', + C: '#e49616', + D: '#008ca7', + E: '#ff5b38', + F: '#ff6a00', + G: '#c74124', + H: '#00a78e', + I: '#b01e53', + J: '#e0c61b', + K: '#5a81ea', + L: '#72b7d2', + M: '#a5b5c3', + N: '#81c926', + O: '#86a3bd', + P: '#c1d82f', + Q: '#5c84a8', + R: '#267e1b', + S: '#fbb034', + T: '#ff846a', + U: '#47c1ff', + V: '#00a0af', + W: '#85d7c6', + X: '#8a7967', + Y: '#26c1c9', + Z: '#72d28b' }; const DEFAULT_COLOR = '#96bca0'; From 2e09aa2377b70b29f890cf153d151e4630b4f2dc Mon Sep 17 00:00:00 2001 From: uiskander Date: Fri, 2 Feb 2018 14:41:49 +0300 Subject: [PATCH 10/39] client-456-export-btn: style of csv download button --- src/modules/ui/directives/button/button.less | 1 + src/modules/wallet/modules/transactions/less/transactions.less | 2 +- .../wallet/modules/transactions/templates/transactions.html | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/modules/ui/directives/button/button.less b/src/modules/ui/directives/button/button.less index caa2c55cae..ce4d81ef66 100644 --- a/src/modules/ui/directives/button/button.less +++ b/src/modules/ui/directives/button/button.less @@ -121,6 +121,7 @@ w-button { background-color: @color-white; border: 1px solid @color-accent-50; color: @color-basic-500; + font-family: @font-roboto-medium; &:hover, &.hover { border-color: @color-basic-500; diff --git a/src/modules/wallet/modules/transactions/less/transactions.less b/src/modules/wallet/modules/transactions/less/transactions.less index ad2e6f031d..061b7f1a2e 100644 --- a/src/modules/wallet/modules/transactions/less/transactions.less +++ b/src/modules/wallet/modules/transactions/less/transactions.less @@ -25,7 +25,7 @@ } button.download { - background: url(/img/icons/download.svg) 20px center no-repeat; + background: url(/img/icons/download.svg) 20px center no-repeat @color-white; padding-left: 40px; } diff --git a/src/modules/wallet/modules/transactions/templates/transactions.html b/src/modules/wallet/modules/transactions/templates/transactions.html index e1213a3059..581bd3c19e 100644 --- a/src/modules/wallet/modules/transactions/templates/transactions.html +++ b/src/modules/wallet/modules/transactions/templates/transactions.html @@ -22,7 +22,7 @@ - + export From 8ba89572b9e59e95fd1074578529bf032297db43 Mon Sep 17 00:00:00 2001 From: tsigel Date: Fri, 2 Feb 2018 18:50:55 +0300 Subject: [PATCH 11/39] CLIENT-451: refactor send --- .../directives/balanceInput/BalanceInput.js | 15 +- .../utils/directives/validators/Validate.js | 26 +- .../directives/validators/ValidateService.js | 5 +- src/modules/utils/modals/ModalManager.js | 1 - .../utils/modals/sendAsset/AssetSendCtrl.js | 329 ++++++++++-------- .../utils/modals/sendAsset/send.modal.html | 36 +- src/modules/utils/services/utils.js | 2 +- 7 files changed, 234 insertions(+), 180 deletions(-) diff --git a/src/modules/ui/directives/balanceInput/BalanceInput.js b/src/modules/ui/directives/balanceInput/BalanceInput.js index 09088dc3e0..dc328a2a1f 100644 --- a/src/modules/ui/directives/balanceInput/BalanceInput.js +++ b/src/modules/ui/directives/balanceInput/BalanceInput.js @@ -20,7 +20,11 @@ */ this.name = null; /** - * @type {BigNumber} + * @type {boolean} + */ + this.focus = false; + /** + * @type {Money} */ this.amount = null; /** @@ -46,6 +50,13 @@ this.observe('assetId', this._onChangeAssetId); this.observe(['fee', 'maxBalance'], this._setMaxBalance); + this.observe('focus', () => { + if (this.focus) { + this.onFocus(); + } else { + this.onBlur(); + } + }); } $postLink() { @@ -117,6 +128,8 @@ name: '@', inputClasses: '@', fillMax: '&', + onFocus: '&', + onBlur: '&', amount: '=', assetId: '<', maxBalance: '<', diff --git a/src/modules/utils/directives/validators/Validate.js b/src/modules/utils/directives/validators/Validate.js index b0c4096b2c..37e7dde8c9 100644 --- a/src/modules/utils/directives/validators/Validate.js +++ b/src/modules/utils/directives/validators/Validate.js @@ -88,7 +88,7 @@ /** * @private */ - @decorators.async(100) + @decorators.async() _validate() { this._applyValidators(Object.keys(this._validators).map((name) => this._validators[name])); $scope.$apply(); @@ -151,11 +151,11 @@ } if (this._validators[name].parser) { - $ngModel.$parsers.unshift(this._validators[name].parser); + $ngModel.$parsers.push(this._validators[name].parser); } if (this._validators[name].formatter) { - $ngModel.$formatters.unshift(this._validators[name].formatter); + $ngModel.$formatters.push(this._validators[name].formatter); } return this._validators[name]; @@ -305,12 +305,24 @@ * @private */ _createSimpleValidator(name) { + + let handler; + switch (name) { + case 'precision': + handler = function (modelValue, viewValue) { + return validateService[name](viewValue, validator.value); + }; + break; + default: + handler = function (modelValue) { + return validateService[name](modelValue, validator.value); + }; + } + const validator = { name, value: null, - handler: function (modelValue) { - return validateService[name](modelValue, validator.value); - } + handler }; this._listenValidatorChanges(name, validator); @@ -392,7 +404,7 @@ if (value instanceof BigNumber) { return value.toFixed(); } else if (value instanceof Waves.Money) { - return value.getTokens().toFixed(); + return value.toFormat(); } else if (!value) { return ''; } else { diff --git a/src/modules/utils/directives/validators/ValidateService.js b/src/modules/utils/directives/validators/ValidateService.js index 291272e9a5..9eba320945 100644 --- a/src/modules/utils/directives/validators/ValidateService.js +++ b/src/modules/utils/directives/validators/ValidateService.js @@ -42,9 +42,8 @@ } @notNullArgs - @toBigNumberArgs precision(inputValue, precision) { - const [int, dec] = inputValue.toFixed().split('.'); //TODO add separator + const [int, dec] = inputValue.split('.'); //TODO add separator return dec ? dec.length <= precision : true; //TODO remove empty zero } @@ -67,7 +66,7 @@ return utils.whenAll([ this.alias(address), this.address(address) - ]).then(([alias, address]) => { + ]).then(([alias = true, address = true]) => { return (alias || address) ? $q.resolve() : $q.reject(); }); } diff --git a/src/modules/utils/modals/ModalManager.js b/src/modules/utils/modals/ModalManager.js index bb5b98b053..ef38c42b74 100644 --- a/src/modules/utils/modals/ModalManager.js +++ b/src/modules/utils/modals/ModalManager.js @@ -104,7 +104,6 @@ mod: 'modal-send', locals: { assetId: asset.id, - baseAssetId: user.getSetting('baseAssetId'), canChooseAsset: !asset.id } }); diff --git a/src/modules/utils/modals/sendAsset/AssetSendCtrl.js b/src/modules/utils/modals/sendAsset/AssetSendCtrl.js index e54707d796..b50d809013 100644 --- a/src/modules/utils/modals/sendAsset/AssetSendCtrl.js +++ b/src/modules/utils/modals/sendAsset/AssetSendCtrl.js @@ -3,83 +3,77 @@ /** * @param $scope - * @param $mdDialog * @param {Waves} waves * @param {Base} Base * @param {app.utils} utils * @param {User} user - * @param {EventManager} eventManager - * @param {NotificationManager} notificationManager * @param {function} createPoll - * @param {@constructor PollComponent} PollComponent - * @param {ModalManager} modalManager * @param outerBlockchains * @param {GatewayService} gatewayService * @return {AssetSendCtrl} */ - const controller = function ($scope, $mdDialog, waves, Base, utils, user, eventManager, notificationManager, - createPoll, modalManager, outerBlockchains, gatewayService) { + const controller = function ($scope, waves, Base, utils, user, createPoll, outerBlockchains, gatewayService) { class AssetSendCtrl extends Base { + /** + * @return {number} + */ + get moneyLength() { + return this.moneyHash && Object.keys(this.moneyHash).length; + } + + /** + * @return {Money} + */ + get balance() { + return this.moneyHash && this.moneyHash[this.assetId]; + } + /** * @param {string} assetId - * @param {string} mirrorId * @param {boolean} canChooseAsset */ - constructor(assetId, mirrorId, canChooseAsset) { + constructor(assetId, canChooseAsset) { super($scope); - this.defaultAssets = WavesApp.defaultAssets; - this.tx = Object.create(null); - /** - * @type {Money} - */ - this.fee = null; /** - * @type {BigNumber} + * @type {ISendTx} */ - this.amount = null; - /** - * @type {BigNumber} - */ - this.amountMirror = null; - /** - * @type {number} - */ - this.step = 0; - /** - * @type {boolean} - */ - this.canChooseAsset = !assetId || canChooseAsset; + this.tx = { + amount: null, + fee: null, + recipient: '', + attachment: '' + }; /** - * @type {string} + * @type {{BTC: string, USD: string, LTC: string, ETH: string, WAVES: string, EUR: string, ZEC: string}} */ - this.mirrorId = mirrorId; + this.defaultAssets = WavesApp.defaultAssets; /** * @type {string} */ - this.assetId = assetId || WavesApp.defaultAssets.WAVES; + this.focus = null; /** * @type {string} */ - this.recipient = ''; + this.mirrorId = null; /** * @type {Money} */ - this.balance = null; + this.mirror = null; /** - * @type {string} + * @type {number} */ - this.attachment = null; + this.step = 0; /** - * @type {Money} + * @type {boolean} */ - this.mirrorBalance = null; + this.canChooseAsset = !assetId || canChooseAsset; /** - * @type {Money[]} + * @type {string} */ - this.moneyList = null; + this.assetId = assetId || WavesApp.defaultAssets.WAVES; /** * @type {boolean} */ @@ -104,93 +98,141 @@ * @type {Array} */ this.feeList = null; + /** + * @type {Object.} + */ + this.moneyHash = null; - this.observe('amount', this._onChangeAmount); - this.observe('amountMirror', this._onChangeAmountMirror); - this.observe('assetId', this._onChangeAssetId); - this.observe('recipient', this._updateGatewayDetails); - this.observe(['gatewayDetails', 'fee', 'amount'], this._currentHasCommission); + this.syncSettings({ + mirrorId: 'baseAssetId' + }); - this._onChangeAssetId({}); + /** + * @type {Poll} + */ + this.poll = createPoll(this, this._getBalanceList, 'moneyHash', 1000, { isBalance: true }); + + utils.whenAll([ + waves.node.assets.fee('transfer'), + this.poll.ready + ]).then(([[fee]]) => { + + this.observe('gatewayDetails', this._currentHasCommission); + this.receive(utils.observe(this.tx, 'fee'), this._currentHasCommission, this); + + this.tx.fee = fee; + this.tx.amount = this.moneyHash[this.assetId].cloneWithTokens('0'); + this.mirror = this.moneyHash[this.mirrorId].cloneWithTokens('0'); - createPoll(this, this._getBalanceList, this._setAssets, 1000, { isBalance: true }); + this.observe(['assetId', 'mirrorId'], () => this.poll.restart()); + this.observe('assetId', this._onChangeAssetId); + this.observe('mirrorId', this._onChangeMirrorId); + this.receive(utils.observe(this.tx, 'recipient'), this._updateGatewayDetails, this); + this.receive(utils.observe(this.tx, 'amount'), this._onChangeAmount, this); + this.observe('mirror', this._onChangeAmountMirror); + + this._updateGatewayDetails(); + }); } fillMax() { - // TODO : consider gateway fee - if (this.assetId === this.fee.asset.id) { - if (this.balance.getTokens().gt(this.fee.getTokens())) { - this.amount = this.balance.getTokens() - .sub(this.fee.getTokens()); - } + let amount = null; + const moneyHash = utils.groupMoney(this.feeList); + if (moneyHash[this.assetId]) { + amount = this.balance.sub(moneyHash[this.assetId]); } else { - this.amount = this.balance.getTokens(); + amount = this.balance; } + waves.utils.getRate(this.assetId, this.mirrorId).then((rate) => { + this.mirror = amount.convertTo(this.mirror.asset, rate); + this.tx.amount = amount; + }); } onReadQrCode(result) { - this.recipient = result; + this.tx.recipient = result; } createTx() { const toGateway = this.outerSendMode && this.gatewayDetails; - return Waves.Money.fromTokens(this.amount, this.assetId) - .then((amount) => waves.node.transactions.createTransaction('transfer', { - amount, - sender: user.address, - fee: this.fee, - recipient: toGateway ? this.gatewayDetails.address : this.recipient, - attachment: toGateway ? this.gatewayDetails.attachment : this.attachment - })).then((tx) => { - this.tx = tx; - this.step++; - }); + return waves.node.transactions.createTransaction('transfer', { + ...this.tx, + sender: user.address, + recipient: toGateway ? this.gatewayDetails.address : this.tx.recipient, + attachment: toGateway ? this.gatewayDetails.attachment : this.tx.attachment + }).then((tx) => { + this.txInfo = tx; + this.step++; + }); } back() { this.step--; } - _getBalanceList() { - return waves.node.assets.userBalances().then((list) => { - return list && list.length ? list : waves.node.assets.balanceList([WavesApp.defaultAssets.WAVES]); - }).then((list) => list.map(({ available }) => available)) - .then((list) => { - if (list.some(({ asset }) => asset.id === this.assetId)) { - return list; - } else { - return Waves.Money.fromTokens('0', this.assetId).then((money) => { - list.push(money); - return list; - }); - } + /** + * @private + */ + _onChangeBaseAssets() { + if (this.assetId === this.mirrorId) { + this.noMirror = true; + } else { + waves.utils.getRate(this.assetId, this.mirrorId).then((rate) => { + this.noMirror = rate.eq(0); }); + } } - _onChangeAssetId({ prev }) { - if (!this.assetId) { + /** + * @return {Promise} + * @private + */ + _getBalanceList() { + return waves.node.assets.userBalances() + .then((list) => list.map(({ available }) => available)) + .then((list) => list.filter((money) => money.getTokens().gt(0))) + .then((list) => utils.toHash(list, 'asset.id')) + .then(AssetSendCtrl._getAddMoneyProcessor(this.assetId)) + .then(AssetSendCtrl._getAddMoneyProcessor(this.mirrorId)); + } + + /** + * @private + */ + _onChangeMirrorId() { + if (!this.mirrorId) { + throw new Error('Has no asset id!'); + } + + this._onChangeBaseAssets(); + + if (!this.moneyHash[this.mirrorId]) { return null; } - if (prev) { - analytics.push('Send', 'Send.ChangeCurrency', this.assetId); + this.mirror = this.moneyHash[this.mirrorId].cloneWithTokens('0'); + this._onChangeAmount(); + } + + /** + * @private + */ + _onChangeAssetId() { + if (!this.assetId) { + throw new Error('Has no asset id!'); } - this.ready = utils.whenAll([ - this._getBalanceList(), - waves.node.assets.info(this.mirrorId), - waves.node.assets.fee('transfer'), - waves.utils.getRateApi(this.assetId, this.mirrorId) - ]).then(([balance, mirrorBalance, [fee], api]) => { - this.noMirror = this.assetId === mirrorBalance.id || api.rate.eq(0); - this.amount = new BigNumber(0); - this.amountMirror = new BigNumber(0); - this.mirrorBalance = mirrorBalance; - this._setAssets(balance); - this.balance = tsUtils.find(this.moneyList, (item) => item.asset.id === this.assetId); - this.fee = fee; - }).then(() => this._updateGatewayDetails()); + this._onChangeBaseAssets(); + + if (!this.moneyHash[this.assetId]) { + return null; + } + + this.tx.amount = this.moneyHash[this.assetId].cloneWithTokens('0'); + this._updateGatewayDetails(); + + analytics.push('Send', 'Send.ChangeCurrency', this.assetId); } _currentHasCommission() { @@ -198,7 +240,7 @@ const check = (feeList) => { const feeHash = utils.groupMoney(feeList); - const balanceHash = utils.toHash(this.moneyList, 'asset.id'); + const balanceHash = this.moneyHash; this.hasComission = Object.keys(feeHash).every((feeAssetId) => { const fee = feeHash[feeAssetId]; return balanceHash[fee.asset.id] && balanceHash[fee.asset.id].gt(fee); @@ -206,32 +248,12 @@ }; if (details) { - Waves.Money.fromTokens(details.gatewayFee, this.assetId).then((fee) => { - check([this.fee, fee]); - this.feeList = [this.fee, fee]; - }); + const gatewayFee = this.balance.cloneWithTokens(details.gatewayFee); + this.feeList = [this.tx.fee, gatewayFee]; + check(this.feeList); } else { - check([this.fee]); - this.feeList = [this.fee]; - } - } - - /** - * @return {Promise} - * @private - */ - _getAsset() { - return waves.node.assets.balance(this.assetId).then(({ available }) => available); - } - - /** - * @param {Money|Money[]} money - * @private - */ - _setAssets(money) { - this.moneyList = utils.toArray(money); - if (!this.assetId && this.moneyList.length) { - this.assetId = this.moneyList[0].asset.id; + this.feeList = [this.tx.fee]; + check(this.feeList); } } @@ -239,12 +261,10 @@ * @private */ _onChangeAmount() { - if (this.amount && this.balance) { - this._getRate().then((api) => { - const mirrorVal = api.exchangeReverse(this.amountMirror).toFixed(this.balance.asset.precision); - if (mirrorVal !== this.amount.toFixed(this.balance.precision)) { - this.amountMirror = api.exchange(this.amount).round(this.mirrorBalance.precision); - } + if (!this.noMirror && this.tx.amount && this.mirror && this.focus === 'amount') { + waves.utils.getRate(this.assetId, this.mirrorId).then((rate) => { + const mirror = this.tx.amount.convertTo(this.mirror.asset, rate); + this.mirror = mirror; }); } } @@ -253,26 +273,25 @@ * @private */ _onChangeAmountMirror() { - if (this.amountMirror && this.mirrorBalance) { - this._getRate().then((api) => { - const amountVal = api.exchange(this.amount).toFixed(this.mirrorBalance.precision); - if (amountVal !== this.amountMirror.toFixed(this.mirrorBalance.precision)) { - this.amount = api.exchangeReverse(this.amountMirror).round(this.balance.precision); - } + if (this.mirror && this.tx.amount && this.focus === 'mirror') { + waves.utils.getRate(this.mirrorId, this.assetId).then((rate) => { + const amount = this.mirror.convertTo(this.tx.amount.asset, rate); + this.tx.amount = amount; }); } } _updateGatewayDetails() { const outerChain = outerBlockchains[this.assetId]; - const isValidWavesAddress = waves.node.isValidAddress(this.recipient); + const isValidWavesAddress = waves.node.isValidAddress(this.tx.recipient); - this.outerSendMode = !isValidWavesAddress && outerChain && outerChain.isValidAddress(this.recipient); + this.outerSendMode = !isValidWavesAddress && outerChain && outerChain.isValidAddress(this.tx.recipient); if (this.outerSendMode) { - gatewayService.getWithdrawDetails(this.balance.asset, this.recipient).then((details) => { - this.assetKeyName = gatewayService.getAssetKeyName(this.balance.asset, 'withdraw'); + gatewayService.getWithdrawDetails(this.balance.asset, this.tx.recipient).then((details) => { + this.assetKeyName = gatewayService.getAssetKeyName(this.tx.amount.asset, 'withdraw'); this.gatewayDetails = details; + $scope.$apply(); // TODO : validate amount field for gateway minimumAmount and maximumAmount }); } else { @@ -281,31 +300,31 @@ } } - /** - * @param {string} [fromRateId] - * @return {Promise} - * @private - */ - _getRate(fromRateId) { - return waves.utils.getRateApi(fromRateId || this.assetId, this.mirrorId); + static _getAddMoneyProcessor(assetId) { + return (hash) => { + if (!hash[assetId]) { + return Waves.Money.fromTokens('0', assetId).then((money) => { + hash[assetId] = money; + return hash; + }); + } else { + return hash; + } + }; } } - return new AssetSendCtrl(this.assetId, this.baseAssetId, this.canChooseAsset); + return new AssetSendCtrl(this.assetId, this.canChooseAsset); }; controller.$inject = [ '$scope', - '$mdDialog', 'waves', 'Base', 'utils', 'user', - 'eventManager', - 'notificationManager', 'createPoll', - 'modalManager', 'outerBlockchains', 'gatewayService' ]; @@ -313,3 +332,11 @@ angular.module('app.utils') .controller('AssetSendCtrl', controller); })(); + +/** + * @typedef {object} ISendTx + * @property {Money} amount + * @property {Money} fee + * @property {string} recipient + * @property {string} attachment + */ diff --git a/src/modules/utils/modals/sendAsset/send.modal.html b/src/modules/utils/modals/sendAsset/send.modal.html index 6ce8742450..1222030154 100644 --- a/src/modules/utils/modals/sendAsset/send.modal.html +++ b/src/modules/utils/modals/sendAsset/send.modal.html @@ -7,7 +7,7 @@
-
@@ -19,9 +19,9 @@
-
@@ -43,7 +43,7 @@
- + modal.send.errors.address @@ -87,16 +87,20 @@ fee="$ctrl.feeList" input-classes="big" min="0" - amount="$ctrl.amount"> + on-focus="$ctrl.focus = 'amount'" + on-blur="$ctrl.focus = ''" + amount="$ctrl.tx.amount">
+ amount="$ctrl.mirror">
@@ -118,7 +122,7 @@
@@ -126,18 +130,18 @@
modal.send.fee  - - {{$ctrl.fee.asset.name}} + + {{$ctrl.tx.fee.asset.displayName}}
+ params="{fee: $ctrl.tx.fee, getawayFee: $ctrl.gatewayDetails.gatewayFee, currency: $ctrl.balance.asset.displayName}"> modal.send.validationError.notEnoughFundsWithdraw modal.send.validationError.notEnoughFunds + params="{fee: $ctrl.tx.fee}">modal.send.validationError.notEnoughFunds
@@ -155,13 +159,13 @@ + tx="$ctrl.txInfo"> + target-recipient="$ctrl.tx.recipient" + tx="$ctrl.txInfo"> diff --git a/src/modules/utils/services/utils.js b/src/modules/utils/services/utils.js index 41850ed7f2..2bd5e3033d 100644 --- a/src/modules/utils/services/utils.js +++ b/src/modules/utils/services/utils.js @@ -507,7 +507,7 @@ function isNotEqualValue(oldValue, newValue) { if (typeof oldValue === typeof newValue) { if (oldValue instanceof Waves.Money && newValue instanceof Waves.Money) { - return oldValue.toTokens() !== newValue.toTokens(); + return oldValue.asset.id !== newValue.asset.id || oldValue.toTokens() !== newValue.toTokens(); } else if (oldValue instanceof BigNumber && newValue instanceof BigNumber) { return !oldValue.eq(newValue); } else if (Array.isArray(oldValue) && Array.isArray(newValue)) { From d72a234914fe4f245d953c2b9283359b566f4cd6 Mon Sep 17 00:00:00 2001 From: tsigel Date: Mon, 5 Feb 2018 11:56:22 +0300 Subject: [PATCH 12/39] CLIENT-451: send refactor --- src/modules/app/directives/i18n/i18n.js | 1 + src/modules/app/initialize/AppConfig.js | 2 +- .../directives/balanceInput/BalanceInput.js | 23 +++-- src/modules/ui/directives/input/Input.js | 20 ----- .../utils/directives/validators/Validate.js | 85 ++++++++++++++++++- src/modules/utils/locales/en.json | 2 +- src/modules/utils/locales/ru.json | 2 +- .../utils/modals/sendAsset/send.modal.html | 4 +- 8 files changed, 101 insertions(+), 38 deletions(-) diff --git a/src/modules/app/directives/i18n/i18n.js b/src/modules/app/directives/i18n/i18n.js index a5095c2f61..4980a5ca3e 100644 --- a/src/modules/app/directives/i18n/i18n.js +++ b/src/modules/app/directives/i18n/i18n.js @@ -71,6 +71,7 @@ } }); } + return literal; } diff --git a/src/modules/app/initialize/AppConfig.js b/src/modules/app/initialize/AppConfig.js index 55500a6c45..6a462d0f22 100644 --- a/src/modules/app/initialize/AppConfig.js +++ b/src/modules/app/initialize/AppConfig.js @@ -56,7 +56,7 @@ case 'money': return value.getTokens().toFixed(); case 'money-currency': - return `${value.getTokens().toFixed()} ${value.asset.displayName}`; + return value && `${value.getTokens().toFixed()} ${value.asset.displayName}` || ''; case 'BigNumber': return value && value.toFixed() || ''; default: diff --git a/src/modules/ui/directives/balanceInput/BalanceInput.js b/src/modules/ui/directives/balanceInput/BalanceInput.js index dc328a2a1f..67aa8cf105 100644 --- a/src/modules/ui/directives/balanceInput/BalanceInput.js +++ b/src/modules/ui/directives/balanceInput/BalanceInput.js @@ -71,14 +71,20 @@ return null; } if (this.maxBalance) { + const feeHash = utils.groupMoney(utils.toArray(this.fee)); + let amount = null; + if (feeHash[this.assetId]) { - this.amount = BigNumber.max( - this.maxBalance.getTokens().sub(feeHash[this.assetId].getTokens()), - new BigNumber(0) - ); + amount = this.maxBalance.sub(feeHash[this.assetId]); + } else { + amount = this.maxBalance; + } + + if (amount.getTokens().lt(0)) { + this.amount = this.maxBalance.cloneWithTokens('0'); } else { - this.amount = this.maxBalance.getTokens(); + this.amount = amount; } } } @@ -108,10 +114,10 @@ if (!this.assetId) { return null; } - waves.node.assets.info(this.assetId).then((info) => { - this.asset = info; + Waves.Money.fromTokens('0', this.assetId).then((money) => { + this.asset = money.asset; if (!this.amount) { - this.amount = new BigNumber(0); + this.amount = money; } }); } @@ -138,7 +144,6 @@ }, scope: false, templateUrl: 'modules/ui/directives/balanceInput/balanceInput.html', - transclude: false, controller }); })(); diff --git a/src/modules/ui/directives/input/Input.js b/src/modules/ui/directives/input/Input.js index 03c7d109e1..37c4bf84ae 100644 --- a/src/modules/ui/directives/input/Input.js +++ b/src/modules/ui/directives/input/Input.js @@ -107,26 +107,6 @@ this._$input.on('blur', () => { this._$inputWrap.removeClass('focused'); }); - - if ($attrs.wType === 'number') { - - const reg = /[0-9.]/; - this._$input.on('keypress', (event) => { - if (event.keyCode != null) { - const char = String.fromCharCode(event.keyCode); - if (char != null) { - if (reg.test(char)) { - if (char === '.' && this._$input.val().includes('.')) { - // TODO add separator from locale - event.preventDefault(); - } - } else { - event.preventDefault(); - } - } - } - }); - } } _getName() { diff --git a/src/modules/utils/directives/validators/Validate.js b/src/modules/utils/directives/validators/Validate.js index 37e7dde8c9..63241a791b 100644 --- a/src/modules/utils/directives/validators/Validate.js +++ b/src/modules/utils/directives/validators/Validate.js @@ -17,7 +17,8 @@ 'address', 'wavesAddress', 'outerBlockchains', - 'anyAddress' + 'anyAddress', + 'pattern' ]; /** @@ -30,6 +31,11 @@ return { require: 'ngModel', priority: 10000, + /** + * @param {JQuery} $input + * @param {object} $attrs + * @return {*} + */ compile: function ($input, $attrs) { /** @@ -45,6 +51,11 @@ constructor() { this._validators = Object.create(null); + /** + * @type {Signal} + * @private + */ + this._validatorsReady = new tsUtils.Signal(); this._createValidatorList(); $scope.$watch($attrs.ngModel, () => this._validate()); @@ -68,7 +79,7 @@ const onEnd = () => { $ngModel.$setValidity(`pending-${name}`, true); }; - result.then(() => { + utils.when(result).then(() => { $ngModel.$setValidity(name, true); onEnd(); }, () => { @@ -109,6 +120,8 @@ AVAILABLE_VALIDATORS.filter(Validate._hasValidator).forEach((name) => { this._createValidator(name); }); + + this._validatorsReady.dispatch(); } /** @@ -146,6 +159,9 @@ case 'anyAddress': this._validators[name] = this._createAnyAddressValidator(name); break; + case 'pattern': + this._validators[name] = this._createPatternValidator(name); + break; default: this._validators[name] = this._createSimpleValidator(name); } @@ -158,6 +174,7 @@ $ngModel.$formatters.push(this._validators[name].formatter); } + return this._validators[name]; } @@ -246,6 +263,46 @@ return validator; } + _createPatternValidator(name) { + + let value; + + const validator = { + name, + value: null, + handler: (modelValue, viewValue) => { + return true; // TODO + } + }; + + Object.defineProperty(validator, 'value', { + get: () => value, + set: (val) => { + value = new RegExp(`[${val}]`); + } + }); + + $input.on('keypress', (event) => { + if (event.keyCode != null) { + const char = String.fromCharCode(event.keyCode); + if (char != null) { + if (validator.value.test(char)) { + if (char === '.' && $input.val().includes('.')) { + // TODO add separator from locale + event.preventDefault(); + } + } else { + event.preventDefault(); + } + } + } + }); + + this._listenValidatorChanges(name, validator); + + return validator; + } + /** * * @param name @@ -254,6 +311,15 @@ */ _createAssetValidator(name) { const precisionValidator = this._createValidator('precision'); + + this._validatorsReady.once(() => { + const patternName = Validate._getAttrName('pattern'); + if (!$attrs[patternName]) { + $attrs[patternName] = '0-9.'; + this._createValidator('pattern'); + } + }); + let value = null; const validator = { @@ -269,7 +335,16 @@ parser: (value) => { return Validate._toMoney(value, validator.money); }, - formatter: Validate._toString + formatter: (value) => { + + const money = Validate._toMoney($input.val(), validator.money); + + if (Validate._isFocused() && (!money || money.eq(value))) { + return $input.val(); + } else { + return Validate._toString(value); + } + } }; Object.defineProperty(validator, 'value', { @@ -355,6 +430,10 @@ } } + static _isFocused() { + return document.activeElement === $input.get(0); + } + static _createAddressValidator(name) { return { name, diff --git a/src/modules/utils/locales/en.json b/src/modules/utils/locales/en.json index 541922dd4d..27b855bab3 100755 --- a/src/modules/utils/locales/en.json +++ b/src/modules/utils/locales/en.json @@ -48,7 +48,7 @@ "description": "Description", "descriptionPlaceholder": "Write an optional message", "placeholderRecipient": "Paste or scan an address", - "fee": "Transaction Fee", + "fee": "Transaction Fee {{fee, money-currency}}", "total": "Total", "errors": { "address": "The address is not valid", diff --git a/src/modules/utils/locales/ru.json b/src/modules/utils/locales/ru.json index 1144b42fa1..e95385b586 100644 --- a/src/modules/utils/locales/ru.json +++ b/src/modules/utils/locales/ru.json @@ -48,7 +48,7 @@ "description": "Описание", "descriptionPlaceholder": "Напишите сообщение (не обязательно)", "placeholderRecipient": "Вставьте или просканируйте адрес", - "fee": "Комиссия", + "fee": "Комиссия {{fee, money-currency}}", "total": "Всего", "errors": { "address": "Неверный адрес", diff --git a/src/modules/utils/modals/sendAsset/send.modal.html b/src/modules/utils/modals/sendAsset/send.modal.html index 1222030154..6116d20e9a 100644 --- a/src/modules/utils/modals/sendAsset/send.modal.html +++ b/src/modules/utils/modals/sendAsset/send.modal.html @@ -129,9 +129,7 @@
- modal.send.fee  - - {{$ctrl.tx.fee.asset.displayName}} + modal.send.fee
From 20cae5d70242fd0f80d8ca8ddfd79769c4adf5e4 Mon Sep 17 00:00:00 2001 From: tsigel Date: Mon, 5 Feb 2018 12:26:37 +0300 Subject: [PATCH 13/39] CLIENT-451: add byte validator for sent attachment --- .../directives/inputContainer/InputContainer.js | 2 +- .../utils/directives/validators/Validate.js | 2 +- .../directives/validators/ValidateService.js | 2 +- src/modules/utils/locales/en.json | 1 + src/modules/utils/locales/ru.json | 7 ++++--- .../utils/modals/sendAsset/send.modal.html | 17 +++++++++++++---- 6 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/modules/ui/directives/inputContainer/InputContainer.js b/src/modules/ui/directives/inputContainer/InputContainer.js index 34320ab6ca..c2248ec401 100644 --- a/src/modules/ui/directives/inputContainer/InputContainer.js +++ b/src/modules/ui/directives/inputContainer/InputContainer.js @@ -13,7 +13,7 @@ * @type {Array.} */ get inputs() { - return $element.find('input') + return $element.find('input,textarea') .toArray(); } diff --git a/src/modules/utils/directives/validators/Validate.js b/src/modules/utils/directives/validators/Validate.js index 63241a791b..c812c36111 100644 --- a/src/modules/utils/directives/validators/Validate.js +++ b/src/modules/utils/directives/validators/Validate.js @@ -41,7 +41,7 @@ /** * $input can be both and , in the latter case we should ignore validation */ - if ($input.get(0).tagName !== 'INPUT') { + if ($input.get(0).tagName !== 'INPUT' && $input.get(0).tagName !== 'TEXTAREA') { return null; } diff --git a/src/modules/utils/directives/validators/ValidateService.js b/src/modules/utils/directives/validators/ValidateService.js index 9eba320945..7ab7e3b886 100644 --- a/src/modules/utils/directives/validators/ValidateService.js +++ b/src/modules/utils/directives/validators/ValidateService.js @@ -50,7 +50,7 @@ @notNullArgs byte(inputValue, bytes) { const blob = new Blob([inputValue], { type: 'text/html' }); - return blob.size <= bytes; + return blob.size <= Number(bytes); } @notNullArgs diff --git a/src/modules/utils/locales/en.json b/src/modules/utils/locales/en.json index 27b855bab3..d6e6526a94 100755 --- a/src/modules/utils/locales/en.json +++ b/src/modules/utils/locales/en.json @@ -49,6 +49,7 @@ "descriptionPlaceholder": "Write an optional message", "placeholderRecipient": "Paste or scan an address", "fee": "Transaction Fee {{fee, money-currency}}", + "attachmentLength": "The description is too long", "total": "Total", "errors": { "address": "The address is not valid", diff --git a/src/modules/utils/locales/ru.json b/src/modules/utils/locales/ru.json index e95385b586..4c21f433d5 100644 --- a/src/modules/utils/locales/ru.json +++ b/src/modules/utils/locales/ru.json @@ -49,6 +49,7 @@ "descriptionPlaceholder": "Напишите сообщение (не обязательно)", "placeholderRecipient": "Вставьте или просканируйте адрес", "fee": "Комиссия {{fee, money-currency}}", + "attachmentLength": "Превышена максимальная длина описания!", "total": "Всего", "errors": { "address": "Неверный адрес", @@ -106,7 +107,7 @@ }, "coinomatETH": { "warningTitle": "Не отправляйте ETH со смарт-контрактов! Не отправляйте ERC20-токены! Только Ethereum.", - "warningText" : "Проверьте, не использует ли ваш кошелёк или биржа смарт-контракты для отправки ETH. Мы не принимаем такие переводы и не можем возместить их. Вы потеряете эти деньги.", + "warningText": "Проверьте, не использует ли ваш кошелёк или биржа смарт-контракты для отправки ETH. Мы не принимаем такие переводы и не можем возместить их. Вы потеряете эти деньги.", "warningMinAmountTitle": "Минимальная сумма депозита 0.001 ETH.", "warningMinAmountText": "Если вы отправите меньше чем 0.001 ETH, вы потеряете деньги.", "helpDescrTitle": "Введите этот адрес в ваш Ethereum клиент или кошелёк.", @@ -114,7 +115,7 @@ }, "coinomatLTC": { "warningTitle": "Отправляйте только LTC на этот адрес", - "warningText" : "Отправка любой другой валюты на этот адрес может повлечь за собой потерю средств.", + "warningText": "Отправка любой другой валюты на этот адрес может повлечь за собой потерю средств.", "warningMinAmountTitle": "Минимальная сумма депозита 0.001 LTC.", "warningMinAmountText": "Если вы отправите меньше чем 0.001 LTC, вы потеряете деньги.", "helpDescrTitle": "Введите этот адрес в ваш Litecoin клиент или кошелёк.", @@ -122,7 +123,7 @@ }, "coinomatZEC": { "warningTitle": "Отправляйте только Zcash на этот адрес", - "warningText" : "Отправка любой другой валюты на этот адрес может повлечь за собой потерю средств.", + "warningText": "Отправка любой другой валюты на этот адрес может повлечь за собой потерю средств.", "warningMinAmountTitle": "Минимальная сумма депозита 0.001 ZEC.", "warningMinAmountText": "Если вы отправите меньше чем 0.001 ZEC, вы потеряете деньги.", "helpDescrTitle": "Введите этот адрес в ваш Zcash клиент или кошелёк.", diff --git a/src/modules/utils/modals/sendAsset/send.modal.html b/src/modules/utils/modals/sendAsset/send.modal.html index 6116d20e9a..08f73e413d 100644 --- a/src/modules/utils/modals/sendAsset/send.modal.html +++ b/src/modules/utils/modals/sendAsset/send.modal.html @@ -121,10 +121,19 @@
- + + + + + modal.send.attachmentLength + +
From 7c52504ff24aea53452ef14d53e51cfd146b2391 Mon Sep 17 00:00:00 2001 From: tsigel Date: Mon, 5 Feb 2018 12:27:38 +0300 Subject: [PATCH 14/39] CLIENT-451: fix send validation form --- src/modules/dex/directives/createOrder/createOrder.html | 2 -- src/modules/tokens/templates/tokens.html | 2 -- src/modules/ui/directives/balanceInput/balanceInput.html | 1 - 3 files changed, 5 deletions(-) diff --git a/src/modules/dex/directives/createOrder/createOrder.html b/src/modules/dex/directives/createOrder/createOrder.html index 76e2ec8525..23eee378a0 100644 --- a/src/modules/dex/directives/createOrder/createOrder.html +++ b/src/modules/dex/directives/createOrder/createOrder.html @@ -64,7 +64,6 @@
Date: Mon, 5 Feb 2018 15:02:00 +0300 Subject: [PATCH 15/39] CLIENT-451: fix send transaction --- .../services/waves/node/content/Aliases.js | 10 ++-- .../app/services/waves/node/content/Assets.js | 11 ++--- .../waves/node/content/Transactions.js | 46 +++++++----------- .../confirmTransaction/ConfirmTransaction.js | 7 +-- .../directives/inputContainer/InputError.js | 8 +++- .../directives/validators/ValidateService.js | 2 +- .../utils/modals/sendAsset/AssetSendCtrl.js | 47 +++++++++++++------ .../utils/modals/sendAsset/send.modal.html | 10 ++-- .../modals/startLeasing/StartLeasingCtrl.js | 16 ++++--- .../modals/startLeasing/startLeasing.html | 4 +- 10 files changed, 88 insertions(+), 73 deletions(-) diff --git a/src/modules/app/services/waves/node/content/Aliases.js b/src/modules/app/services/waves/node/content/Aliases.js index 75b74bc07e..9166e8eb2f 100644 --- a/src/modules/app/services/waves/node/content/Aliases.js +++ b/src/modules/app/services/waves/node/content/Aliases.js @@ -13,6 +13,11 @@ class Aliases extends BaseNodeComponent { + constructor() { + super(); + this.aliases = []; + } + /** * Get address by alias * @param {string} alias @@ -24,11 +29,10 @@ /** * Get alias list by user - * @return {Promise} + * @return {string[]} */ getAliasList() { - return Waves.API.Node.v2.addresses.aliasList(user.address) - .then((list) => list.sort(utils.comparators.asc)); + return this.aliases; } /** diff --git a/src/modules/app/services/waves/node/content/Assets.js b/src/modules/app/services/waves/node/content/Assets.js index c1e71e885a..b68051743a 100644 --- a/src/modules/app/services/waves/node/content/Assets.js +++ b/src/modules/app/services/waves/node/content/Assets.js @@ -113,17 +113,14 @@ * @return {Promise<{id: string}>} */ transfer({ amount, fee, recipient, attachment, keyPair }) { - const address = recipient <= WavesApp.maxAliasLength ? - aliases.getAddress(recipient) : Promise.resolve(recipient); - - return Promise.all([address, this.getFee('transfer', fee)]) - .then(([address, fee]) => { + return this.getFee('transfer', fee) + .then((fee) => { return Waves.API.Node.v1.assets.transfer({ amount: amount.toCoins(), assetId: amount.asset.id, fee: fee.toCoins(), feeAssetId: fee.asset.id, - recipient: address, + recipient, attachment }, keyPair) .then(this._pipeTransaction([amount, fee])); @@ -261,6 +258,8 @@ const wavesTx = eventsMoneyHash[WavesApp.defaultAssets.WAVES] || wavesNodeRegular.cloneWithCoins('0'); const wavesOrder = orderMoneyHash[WavesApp.defaultAssets.WAVES] || wavesNodeRegular.cloneWithCoins('0'); + aliases.aliases = wavesDetails.aliases; + return [{ asset: wavesNodeRegular.asset, regular: Assets._getMoneySub(wavesNodeRegular, wavesTx), diff --git a/src/modules/app/services/waves/node/content/Transactions.js b/src/modules/app/services/waves/node/content/Transactions.js index 53c8ee24fc..447d512225 100644 --- a/src/modules/app/services/waves/node/content/Transactions.js +++ b/src/modules/app/services/waves/node/content/Transactions.js @@ -36,11 +36,8 @@ * @return {Promise} */ get(id) { - return Promise.all([ - aliases.getAliasList(), - Waves.API.Node.v2.transactions.get(id) - ]).then(([aliases, tx]) => { - const pipe = this._pipeTransaction(false, aliases); + return Waves.API.Node.v2.transactions.get(id).then((tx) => { + const pipe = this._pipeTransaction(false); return pipe(tx); }); } @@ -51,11 +48,8 @@ * @return {Promise} */ getUtx(id) { - return Promise.all([ - aliases.getAliasList(), - Waves.API.Node.v2.transactions.utxGet(id) - ]).then(([aliases, tx]) => { - const pipe = this._pipeTransaction(false, aliases); + return Waves.API.Node.v2.transactions.utxGet(id).then((tx) => { + const pipe = this._pipeTransaction(false); return pipe(tx); }); } @@ -75,12 +69,8 @@ * @return {Promise} */ list(limit = 0) { - return Promise.all([ - aliases.getAliasList(), - Waves.API.Node.v2.addresses.transactions(user.address, { limit }) - ]).then(([aliases, txList = []]) => { - return txList.map(this._pipeTransaction(false, aliases)); - }); + return Waves.API.Node.v2.addresses.transactions(user.address, { limit }) + .then((txList = []) => txList.map(this._pipeTransaction(false))); } /** @@ -88,12 +78,8 @@ * @return {Promise} */ listUtx() { - return Promise.all([ - aliases.getAliasList(), - Waves.API.Node.v2.addresses.utxTransactions(user.address) - ]).then(([aliases, list = []]) => { - return list.map(this._pipeTransaction(true, aliases)); - }); + return Waves.API.Node.v2.addresses.utxTransactions(user.address) + .then((list = []) => list.map(this._pipeTransaction(true))); } /** @@ -117,13 +103,11 @@ } createTransaction(transactionType, txData) { - return aliases.getAliasList().then((aliasList) => { - return this._pipeTransaction(false, aliasList)({ - transactionType, - sender: user.address, - timestamp: Date.now(), - ...txData - }); + return this._pipeTransaction(false)({ + transactionType, + sender: user.address, + timestamp: Date.now(), + ...txData }); } @@ -133,7 +117,9 @@ * @return {function(*=)} * @private */ - _pipeTransaction(isUTX, aliasList) { + _pipeTransaction(isUTX) { + const aliasList = aliases.getAliasList(); + return (tx) => { tx.timestamp = new Date(tx.timestamp); tx.isUTX = isUTX; diff --git a/src/modules/ui/directives/confirmTransaction/ConfirmTransaction.js b/src/modules/ui/directives/confirmTransaction/ConfirmTransaction.js index 3f2315bb16..a7449f858a 100644 --- a/src/modules/ui/directives/confirmTransaction/ConfirmTransaction.js +++ b/src/modules/ui/directives/confirmTransaction/ConfirmTransaction.js @@ -8,9 +8,10 @@ * @param {$mdDialog} $mdDialog * @param {ModalManager} modalManager * @param {User} user + * @param {app.utils} utils * @returns {ConfirmTransaction} */ - const controller = function (Base, waves, $attrs, $mdDialog, modalManager, user) { + const controller = function (Base, waves, $attrs, $mdDialog, modalManager, user, utils) { class ConfirmTransaction extends Base { @@ -22,7 +23,7 @@ } confirm() { - this.sendTransaction().then(({ id }) => { + utils.when(this.sendTransaction()).then(({ id }) => { this.tx.id = id; this.step++; }).catch((e) => { @@ -96,7 +97,7 @@ return new ConfirmTransaction(); }; - controller.$inject = ['Base', 'waves', '$attrs', '$mdDialog', 'modalManager', 'user']; + controller.$inject = ['Base', 'waves', '$attrs', '$mdDialog', 'modalManager', 'user', 'utils']; angular.module('app.ui').component('wConfirmTransaction', { bindings: { diff --git a/src/modules/ui/directives/inputContainer/InputError.js b/src/modules/ui/directives/inputContainer/InputError.js index 13503a46a6..bb1e05f94a 100644 --- a/src/modules/ui/directives/inputContainer/InputError.js +++ b/src/modules/ui/directives/inputContainer/InputError.js @@ -48,8 +48,12 @@ _getElements() { const empty = tsUtils.isEmpty(this.name); - return !empty ? [this.inputContainer.form[this.name].$touched] : - this._getTarget(); + if (empty) { + return this._getTarget(); + } else { + const target = this.inputContainer.form[this.name]; + return target ? [target] : []; + } } /** diff --git a/src/modules/utils/directives/validators/ValidateService.js b/src/modules/utils/directives/validators/ValidateService.js index 7ab7e3b886..451d2f8fa7 100644 --- a/src/modules/utils/directives/validators/ValidateService.js +++ b/src/modules/utils/directives/validators/ValidateService.js @@ -166,7 +166,7 @@ }; } - return new ValidateService(); + return utils.bind(new ValidateService()); }; factory.$inject = ['waves', '$q', 'outerBlockchains', 'utils']; diff --git a/src/modules/utils/modals/sendAsset/AssetSendCtrl.js b/src/modules/utils/modals/sendAsset/AssetSendCtrl.js index b50d809013..d8a99033f9 100644 --- a/src/modules/utils/modals/sendAsset/AssetSendCtrl.js +++ b/src/modules/utils/modals/sendAsset/AssetSendCtrl.js @@ -144,7 +144,7 @@ amount = this.balance; } waves.utils.getRate(this.assetId, this.mirrorId).then((rate) => { - this.mirror = amount.convertTo(this.mirror.asset, rate); + this.mirror = amount.convertTo(this.moneyHash[this.mirrorId].asset, rate); this.tx.amount = amount; }); } @@ -156,21 +156,28 @@ createTx() { const toGateway = this.outerSendMode && this.gatewayDetails; - return waves.node.transactions.createTransaction('transfer', { + const tx = waves.node.transactions.createTransaction('transfer', { ...this.tx, sender: user.address, recipient: toGateway ? this.gatewayDetails.address : this.tx.recipient, attachment: toGateway ? this.gatewayDetails.attachment : this.tx.attachment - }).then((tx) => { - this.txInfo = tx; - this.step++; }); + + this.txInfo = tx; + this.step++; } back() { this.step--; } + onBlurMirror() { + if (!this.mirror) { + this._fillMirror(); + } + this.focus = ''; + } + /** * @private */ @@ -261,11 +268,8 @@ * @private */ _onChangeAmount() { - if (!this.noMirror && this.tx.amount && this.mirror && this.focus === 'amount') { - waves.utils.getRate(this.assetId, this.mirrorId).then((rate) => { - const mirror = this.tx.amount.convertTo(this.mirror.asset, rate); - this.mirror = mirror; - }); + if (!this.noMirror && this.tx.amount && this.focus === 'amount') { + this._fillMirror(); } } @@ -273,14 +277,27 @@ * @private */ _onChangeAmountMirror() { - if (this.mirror && this.tx.amount && this.focus === 'mirror') { - waves.utils.getRate(this.mirrorId, this.assetId).then((rate) => { - const amount = this.mirror.convertTo(this.tx.amount.asset, rate); - this.tx.amount = amount; - }); + if (this.mirror && this.focus === 'mirror') { + this._fillAmount(); } } + _fillMirror() { + waves.utils.getRate(this.assetId, this.mirrorId).then((rate) => { + const mirror = this.tx.amount.convertTo(this.moneyHash[this.mirrorId].asset, rate); + this.mirror = mirror; + $scope.$apply(); + }); + } + + _fillAmount() { + waves.utils.getRate(this.mirrorId, this.assetId).then((rate) => { + const amount = this.mirror.convertTo(this.moneyHash[this.assetId].asset, rate); + this.tx.amount = amount; + $scope.$apply(); + }); + } + _updateGatewayDetails() { const outerChain = outerBlockchains[this.assetId]; const isValidWavesAddress = waves.node.isValidAddress(this.tx.recipient); diff --git a/src/modules/utils/modals/sendAsset/send.modal.html b/src/modules/utils/modals/sendAsset/send.modal.html index 08f73e413d..e84a058fea 100644 --- a/src/modules/utils/modals/sendAsset/send.modal.html +++ b/src/modules/utils/modals/sendAsset/send.modal.html @@ -94,7 +94,7 @@
- + inputs.errors.required - + inputs.errors.required - + inputs.errors.invalidAsset - + modal.send.errors.max diff --git a/src/modules/utils/modals/startLeasing/StartLeasingCtrl.js b/src/modules/utils/modals/startLeasing/StartLeasingCtrl.js index 1e28194efb..94b45fb86f 100644 --- a/src/modules/utils/modals/startLeasing/StartLeasingCtrl.js +++ b/src/modules/utils/modals/startLeasing/StartLeasingCtrl.js @@ -23,7 +23,7 @@ this.title = i18n.translate('modal.startLease.title', 'app.utils'); this.assetId = WavesApp.defaultAssets.WAVES; this.recipient = ''; - this.amount = new BigNumber(0); + this.amount = null; waves.node.fee('lease') .then(([money]) => { @@ -36,13 +36,15 @@ }); } + back() { + this.step--; + } + next() { - return Waves.Money.fromTokens(this.amount, this.assetId).then((amount) => { - return waves.node.transactions.createTransaction('lease', { - recipient: this.recipient, - fee: this.fee, - amount - }); + return waves.node.transactions.createTransaction('lease', { + recipient: this.recipient, + fee: this.fee, + amount: this.amount }).then((tx) => { this.tx = tx; this.step++; diff --git a/src/modules/utils/modals/startLeasing/startLeasing.html b/src/modules/utils/modals/startLeasing/startLeasing.html index 6b776e5d91..a7ac4e5404 100644 --- a/src/modules/utils/modals/startLeasing/startLeasing.html +++ b/src/modules/utils/modals/startLeasing/startLeasing.html @@ -19,7 +19,8 @@ @@ -38,6 +39,7 @@ From 9914c8d9fa10f8558feb2f4c48f345fe543b75d9 Mon Sep 17 00:00:00 2001 From: tsigel Date: Mon, 5 Feb 2018 17:02:08 +0300 Subject: [PATCH 16/39] CLIENT-451: fix send modal --- .../directives/inputContainer/InputError.js | 2 +- .../utils/directives/validators/Validate.js | 16 +++++++++++++--- .../directives/validators/ValidateService.js | 19 ++++++++++++------- src/modules/utils/locales/en.json | 4 +++- src/modules/utils/locales/ru.json | 4 +++- .../utils/modals/sendAsset/send.modal.html | 8 +++++++- .../modals/startLeasing/StartLeasingCtrl.js | 8 ++++---- 7 files changed, 43 insertions(+), 18 deletions(-) diff --git a/src/modules/ui/directives/inputContainer/InputError.js b/src/modules/ui/directives/inputContainer/InputError.js index bb1e05f94a..f0533176fe 100644 --- a/src/modules/ui/directives/inputContainer/InputError.js +++ b/src/modules/ui/directives/inputContainer/InputError.js @@ -52,7 +52,7 @@ return this._getTarget(); } else { const target = this.inputContainer.form[this.name]; - return target ? [target] : []; + return target && target.$$element.get(0) !== document.activeElement ? [target] : []; } } diff --git a/src/modules/utils/directives/validators/Validate.js b/src/modules/utils/directives/validators/Validate.js index c812c36111..a59d8b546d 100644 --- a/src/modules/utils/directives/validators/Validate.js +++ b/src/modules/utils/directives/validators/Validate.js @@ -331,7 +331,9 @@ precisionValidator.value = validator.asset.precision; this._validateByName(name); }, - handler: () => true, + handler: (modelValue, viewValue) => { + return (viewValue && !!modelValue) || !viewValue; + }, parser: (value) => { return Validate._toMoney(value, validator.money); }, @@ -339,7 +341,7 @@ const money = Validate._toMoney($input.val(), validator.money); - if (Validate._isFocused() && (!money || money.eq(value))) { + if (Validate._isFocused() && (!value || (money && money.eq(value)))) { return $input.val(); } else { return Validate._toString(value); @@ -383,6 +385,10 @@ let handler; switch (name) { + case 'lt': + case 'gt': + case 'lte': + case 'gte': case 'precision': handler = function (modelValue, viewValue) { return validateService[name](viewValue, validator.value); @@ -495,7 +501,11 @@ if (!target) { return null; } else { - return target.cloneWithTokens(utils.parseNiceNumber(value)); + try { + return target.cloneWithTokens(utils.parseNiceNumber(value)); + } catch (e) { + return null; + } } } diff --git a/src/modules/utils/directives/validators/ValidateService.js b/src/modules/utils/directives/validators/ValidateService.js index 451d2f8fa7..ba2946565b 100644 --- a/src/modules/utils/directives/validators/ValidateService.js +++ b/src/modules/utils/directives/validators/ValidateService.js @@ -12,26 +12,26 @@ class ValidateService { - @notNullArgs @toBigNumberArgs + @notNullArgs gt(inputValue, validateValue) { return inputValue.gt(validateValue); } - @notNullArgs @toBigNumberArgs + @notNullArgs gte(inputValue, validateValue) { return inputValue.gte(validateValue); } - @notNullArgs @toBigNumberArgs + @notNullArgs lt(inputValue, validateValue) { return inputValue.lt(validateValue); } - @notNullArgs @toBigNumberArgs + @notNullArgs lte(inputValue, validateValue) { return inputValue.lte(validateValue); } @@ -41,9 +41,10 @@ return String(inputValue).length <= length; } + @toBigNumberArgs @notNullArgs precision(inputValue, precision) { - const [int, dec] = inputValue.split('.'); //TODO add separator + const [int, dec] = inputValue.toFixed().split('.'); //TODO add separator return dec ? dec.length <= precision : true; //TODO remove empty zero } @@ -134,14 +135,18 @@ switch (typeof item) { case 'string': case 'number': - return new BigNumber(item); + try { + return new BigNumber(item); + } catch (e) { + return null; + } case 'object': if (item instanceof BigNumber) { return item; } else if (item instanceof Waves.Money) { return item.getTokens(); } else { - throw new Error('Cant convert data to BigNumber'); + return null; } } } diff --git a/src/modules/utils/locales/en.json b/src/modules/utils/locales/en.json index d6e6526a94..d7e4568b7c 100755 --- a/src/modules/utils/locales/en.json +++ b/src/modules/utils/locales/en.json @@ -54,7 +54,9 @@ "errors": { "address": "The address is not valid", "required": "This field is required", - "max": "Insufficient funds" + "max": "Insufficient funds", + "precision": "The number in this field is invalid. It can include a maximum of {{precision}} digits after the decimal point.", + "invalidChars": "The field can only contain numbers" }, "confirm": { "title": "Transaction Details", diff --git a/src/modules/utils/locales/ru.json b/src/modules/utils/locales/ru.json index 4c21f433d5..29fd3c36ba 100644 --- a/src/modules/utils/locales/ru.json +++ b/src/modules/utils/locales/ru.json @@ -54,7 +54,9 @@ "errors": { "address": "Неверный адрес", "required": "Это обязательное поле", - "max": "Недостаточно средств" + "max": "Недостаточно средств", + "precision": "Число в этом поле не может содрержать более {{precision}} знаков после точки.", + "invalidChars": "Это поле может содержать только цифры" }, "confirm": { "title": "Детали транзакции", diff --git a/src/modules/utils/modals/sendAsset/send.modal.html b/src/modules/utils/modals/sendAsset/send.modal.html index e84a058fea..32116f0f9a 100644 --- a/src/modules/utils/modals/sendAsset/send.modal.html +++ b/src/modules/utils/modals/sendAsset/send.modal.html @@ -111,8 +111,14 @@ inputs.errors.required + + modal.send.errors.invalidChars + - inputs.errors.invalidAsset + modal.send.errors.precision + + + modal.send.errors.precision modal.send.errors.max diff --git a/src/modules/utils/modals/startLeasing/StartLeasingCtrl.js b/src/modules/utils/modals/startLeasing/StartLeasingCtrl.js index 94b45fb86f..344b897154 100644 --- a/src/modules/utils/modals/startLeasing/StartLeasingCtrl.js +++ b/src/modules/utils/modals/startLeasing/StartLeasingCtrl.js @@ -41,14 +41,14 @@ } next() { - return waves.node.transactions.createTransaction('lease', { + const tx = waves.node.transactions.createTransaction('lease', { recipient: this.recipient, fee: this.fee, amount: this.amount - }).then((tx) => { - this.tx = tx; - this.step++; }); + + this.tx = tx; + this.step++; } } From 59e1bdf0a0dca186d5b0b3cf8aa6593c2d3c8f11 Mon Sep 17 00:00:00 2001 From: tsigel Date: Mon, 5 Feb 2018 17:04:09 +0300 Subject: [PATCH 17/39] CLIENT-451: fix i18next templates --- src/modules/app/initialize/AppConfig.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/modules/app/initialize/AppConfig.js b/src/modules/app/initialize/AppConfig.js index 6a462d0f22..4d0eddc6c3 100644 --- a/src/modules/app/initialize/AppConfig.js +++ b/src/modules/app/initialize/AppConfig.js @@ -54,9 +54,13 @@ format: function (value, format) { switch (format) { case 'money': - return value.getTokens().toFixed(); + return value && value.getTokens().toFixed() || ''; case 'money-currency': - return value && `${value.getTokens().toFixed()} ${value.asset.displayName}` || ''; + if (value) { + return `${value.getTokens().toFixed()} ${value.asset.displayName}`; + } else { + return ''; + } case 'BigNumber': return value && value.toFixed() || ''; default: From 835666627b06518fa8ada80bc6bebcdbe40ee690 Mon Sep 17 00:00:00 2001 From: tsigel Date: Mon, 5 Feb 2018 18:11:03 +0300 Subject: [PATCH 18/39] CLIENT-451: change package lock --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 6fb1a48a3b..9e4e0ab5e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10804,7 +10804,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, "semver": { From 382448a664a9d655dc65a4a4027cc64d58ca85cc Mon Sep 17 00:00:00 2001 From: tsigel Date: Mon, 5 Feb 2018 18:35:51 +0300 Subject: [PATCH 19/39] CLIENT-451: revert send button from portfolio --- .../wallet/modules/portfolio/templates/portfolio.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/wallet/modules/portfolio/templates/portfolio.html b/src/modules/wallet/modules/portfolio/templates/portfolio.html index 59c2067823..e524e276ab 100644 --- a/src/modules/wallet/modules/portfolio/templates/portfolio.html +++ b/src/modules/wallet/modules/portfolio/templates/portfolio.html @@ -1,9 +1,9 @@
- - - + + + From 9ec8c054c443d92221ce7c640b1e2e22fc7a1846 Mon Sep 17 00:00:00 2001 From: tsigel Date: Mon, 5 Feb 2018 18:49:37 +0300 Subject: [PATCH 20/39] CLIENT-451: fix lieasing --- .../utils/directives/validators/Validate.js | 47 ++++++------------- .../directives/validators/ValidateService.js | 26 ++++++---- 2 files changed, 33 insertions(+), 40 deletions(-) diff --git a/src/modules/utils/directives/validators/Validate.js b/src/modules/utils/directives/validators/Validate.js index a59d8b546d..46d9bc287a 100644 --- a/src/modules/utils/directives/validators/Validate.js +++ b/src/modules/utils/directives/validators/Validate.js @@ -145,20 +145,16 @@ this._validators[name] = Validate._createBigNumberValidator(name); break; case 'alias': - this._validators[name] = Validate._createAliasValidator(name); - break; case 'address': - this._validators[name] = Validate._createAddressValidator(name); - break; case 'wavesAddress': - this._validators[name] = Validate._createWavesAddressValidator(name); - break; - case 'outerBlockchains': - this._validators[name] = this._createOuterBlockchainsValidator(name); + this._validators[name] = this._createAddressValidator(name); break; case 'anyAddress': this._validators[name] = this._createAnyAddressValidator(name); break; + case 'outerBlockchains': + this._validators[name] = this._createOuterBlockchainsValidator(name); + break; case 'pattern': this._validators[name] = this._createPatternValidator(name); break; @@ -377,6 +373,17 @@ return validator; } + _createAddressValidator(name) { + const validator = { + name, + value: null, + handler: (value) => validateService[name](value, validator.value) + }; + this._listenValidatorChanges(name, validator); + + return validator; + } + /** * @param name * @private @@ -440,30 +447,6 @@ return document.activeElement === $input.get(0); } - static _createAddressValidator(name) { - return { - name, - value: null, - handler: validateService.address - }; - } - - static _createAliasValidator(name) { - return { - name, - value: null, - handler: validateService.alias - }; - } - - static _createWavesAddressValidator(name) { - return { - name, - value: null, - handler: validateService.wavesAddress - }; - } - static _createBigNumberValidator(name) { return { name, diff --git a/src/modules/utils/directives/validators/ValidateService.js b/src/modules/utils/directives/validators/ValidateService.js index ba2946565b..f5dedfbe23 100644 --- a/src/modules/utils/directives/validators/ValidateService.js +++ b/src/modules/utils/directives/validators/ValidateService.js @@ -6,9 +6,10 @@ * @param {$q} $q * @param {Object.} outerBlockchains * @param {app.utils} utils + * @param {User} user * @return {ValidateService} */ - const factory = function (waves, $q, outerBlockchains, utils) { + const factory = function (waves, $q, outerBlockchains, utils, user) { class ValidateService { @@ -63,10 +64,10 @@ return this.outerBlockchains(address, assetId) ? true : this.wavesAddress(address); } - wavesAddress(address) { + wavesAddress(address, value) { return utils.whenAll([ - this.alias(address), - this.address(address) + this.alias(address, value), + this.address(address, value) ]).then(([alias = true, address = true]) => { return (alias || address) ? $q.resolve() : $q.reject(); }); @@ -86,7 +87,7 @@ return outerChain.isValidAddress(address); } - alias(address) { + alias(address, value = '') { if (!address) { return true; } @@ -102,11 +103,16 @@ if (!waves.node.aliases.validate(address)) { return false; } else { - return waves.node.aliases.getAddress(address); + if (value && value === 'no-self') { + return !waves.node.aliases.getAliasList().includes(address) && + waves.node.aliases.getAddress(address); + } else { + return waves.node.aliases.getAddress(address); + } } } - address(address) { + address(address, value = '') { if (!address) { return true; } @@ -119,6 +125,10 @@ return false; } + if (value && value === 'no-self' && address === user.address) { + return false; + } + return Waves.API.Node.v1.addresses.balance(address) .then((data) => { if (data && data.balance != null) { @@ -174,7 +184,7 @@ return utils.bind(new ValidateService()); }; - factory.$inject = ['waves', '$q', 'outerBlockchains', 'utils']; + factory.$inject = ['waves', '$q', 'outerBlockchains', 'utils', 'user']; angular.module('app.utils').factory('validateService', factory); })(); From d4a9fe8fc1ca083e2693b15f23db2d76bacbb04a Mon Sep 17 00:00:00 2001 From: tsigel Date: Tue, 6 Feb 2018 13:41:57 +0300 Subject: [PATCH 21/39] CLIENT-451: fix aliases validation --- src/modules/ui/directives/password/password.html | 3 ++- src/modules/utils/modals/accountInfo/AccountInfoCtrl.js | 5 +---- src/modules/utils/modals/accountInfo/account-info.modal.html | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/modules/ui/directives/password/password.html b/src/modules/ui/directives/password/password.html index 70915342d2..b38682e887 100644 --- a/src/modules/ui/directives/password/password.html +++ b/src/modules/ui/directives/password/password.html @@ -34,7 +34,8 @@ class="no-icon big" name="confirm" required - w-compare-to="password" + w-validate + w-validator-compare="password" ng-model="$ctrl.confirmPassword"> diff --git a/src/modules/utils/modals/accountInfo/AccountInfoCtrl.js b/src/modules/utils/modals/accountInfo/AccountInfoCtrl.js index 8b52c715c8..91ee0d48a4 100644 --- a/src/modules/utils/modals/accountInfo/AccountInfoCtrl.js +++ b/src/modules/utils/modals/accountInfo/AccountInfoCtrl.js @@ -41,10 +41,7 @@ this.fee = fee; }); - waves.node.aliases.getAliasList() - .then((aliases) => { - this.aliases = aliases; - }); + this.aliases = waves.node.aliases.getAliasList(); } createAlias() { diff --git a/src/modules/utils/modals/accountInfo/account-info.modal.html b/src/modules/utils/modals/accountInfo/account-info.modal.html index 109acf18b0..64b9142eff 100644 --- a/src/modules/utils/modals/accountInfo/account-info.modal.html +++ b/src/modules/utils/modals/accountInfo/account-info.modal.html @@ -34,7 +34,7 @@ placeholder="modal.account.placeholder" required w-i18n-attr="placeholder" - ng-pattern="/[a-z0-9-.@_]/" + ng-pattern="/^[a-z0-9@_.]*$/" maxlength="30" minlength="4">
Date: Tue, 6 Feb 2018 15:37:16 +0300 Subject: [PATCH 22/39] CLIENT-451: fix Create Token validations --- src/modules/tokens/controllers/TokensCtrl.js | 3 +- src/modules/tokens/templates/tokens.html | 43 +++++++--- .../utils/directives/validators/Validate.js | 84 ++++++++++++++----- .../directives/validators/ValidateService.js | 20 ++++- src/modules/utils/modals/ModalManager.js | 16 ++-- .../utils/modals/sendAsset/send.modal.html | 4 +- 6 files changed, 126 insertions(+), 44 deletions(-) diff --git a/src/modules/tokens/controllers/TokensCtrl.js b/src/modules/tokens/controllers/TokensCtrl.js index bdadee4a91..edb42dd1ec 100644 --- a/src/modules/tokens/controllers/TokensCtrl.js +++ b/src/modules/tokens/controllers/TokensCtrl.js @@ -105,7 +105,7 @@ * @private */ _onChangePrecision({ value }) { - if (value) { + if (value && value.lte(8)) { this.maxCoinsCount = MAX_OF_COINS_COUNT.div(Math.pow(10, Number(value))); } } @@ -128,6 +128,7 @@ this.precision = null; this.maxCoinsCount = null; + this.createForm.$setPristine(); this.createForm.$setUntouched(); } diff --git a/src/modules/tokens/templates/tokens.html b/src/modules/tokens/templates/tokens.html index c3da56434f..d4da14c895 100644 --- a/src/modules/tokens/templates/tokens.html +++ b/src/modules/tokens/templates/tokens.html @@ -12,8 +12,9 @@ @@ -25,6 +26,12 @@ validators.required + + validators.byte.lte + + + validators.byte.gte +
@@ -35,9 +42,11 @@ name="description" ng-model="$ctrl.description" placeholder="placeholders.description" - maxlength="1000" + w-validate + w-validator-byte-lte="1000" w-i18n-attr="placeholder"> - + + validators.descriptionLen @@ -51,10 +60,14 @@ type="text" name="count" ng-model="$ctrl.count" - w-validator-precision="$ctrl.precision.toString()" - w-validator-gt="'0'" - w-validator-lt="$ctrl.maxCoinsCount" + w-validate + w-validator-precision="{{$ctrl.precision.toString()}}" + w-validator-gt="0" + w-validator-lt="{{$ctrl.maxCoinsCount}}" + w-validator-integer + w-validator-number required> +
@@ -71,10 +84,10 @@ validators.required - + validators.minValueCount - + validators.maxValueCount @@ -93,9 +106,11 @@ name="precision" ng-model="$ctrl.precision" required - w-validator-lte="'8'" - w-validator-gte="'0'" + w-validate + w-validator-lte="8" + w-validator-gte="0" w-validator-integer + w-validator-number placeholder="placeholders.precision" w-i18n-attr="placeholder"> @@ -108,6 +123,9 @@ validators.required + + validators.required +
@@ -122,7 +140,8 @@ {{$ctrl.name}}
-
diff --git a/src/modules/utils/directives/validators/Validate.js b/src/modules/utils/directives/validators/Validate.js index 46d9bc287a..73a10ac79c 100644 --- a/src/modules/utils/directives/validators/Validate.js +++ b/src/modules/utils/directives/validators/Validate.js @@ -9,10 +9,13 @@ 'length', 'integer', 'precision', - 'byte', + 'byteLt', + 'byteLte', + 'byteGt', + 'byteGte', + 'number', 'asset', 'compare', - 'number', 'alias', 'address', 'wavesAddress', @@ -21,6 +24,8 @@ 'pattern' ]; + const NUMBER_PATTERN = '[0-9.]'; //TODO Add locale separators + /** * * @param {app.utils} utils @@ -56,11 +61,32 @@ * @private */ this._validatorsReady = new tsUtils.Signal(); + this._ready = false; + + this._validatorsReady.once(() => { + this._ready = true; + }); this._createValidatorList(); $scope.$watch($attrs.ngModel, () => this._validate()); } + _addInputPattern(pattern) { + const create = () => { + const patternName = Validate._getAttrName('pattern'); + if (!$attrs[patternName]) { + $attrs[patternName] = pattern; + this._createValidator('pattern'); + } + }; + + if (this._ready) { + create(); + } else { + this._validatorsReady.once(create); + } + } + /** * @param validators * @private @@ -142,13 +168,16 @@ this._validators[name] = this._createCompareValidator(name); break; case 'number': - this._validators[name] = Validate._createBigNumberValidator(name); + this._validators[name] = this._createBigNumberValidator(name); break; case 'alias': case 'address': case 'wavesAddress': this._validators[name] = this._createAddressValidator(name); break; + case 'integer': + this._validators[name] = this._createIntegerValidator(name); + break; case 'anyAddress': this._validators[name] = this._createAnyAddressValidator(name); break; @@ -174,6 +203,23 @@ return this._validators[name]; } + _createIntegerValidator(name) { + this._createPatternValidator('[0-9]'); + + return { + name, + value: null, + handler: (modelValue) => { + try { + const num = Validate._toBigNumber(modelValue); + return !modelValue || num.round(0).eq(Validate._toBigNumber(modelValue)); + } catch (e) { + return false; + } + } + }; + } + _createOuterBlockchainsValidator(name) { let value = null; @@ -274,7 +320,7 @@ Object.defineProperty(validator, 'value', { get: () => value, set: (val) => { - value = new RegExp(`[${val}]`); + value = new RegExp(val); } }); @@ -308,13 +354,7 @@ _createAssetValidator(name) { const precisionValidator = this._createValidator('precision'); - this._validatorsReady.once(() => { - const patternName = Validate._getAttrName('pattern'); - if (!$attrs[patternName]) { - $attrs[patternName] = '0-9.'; - this._createValidator('pattern'); - } - }); + this._addInputPattern(NUMBER_PATTERN); let value = null; @@ -418,6 +458,19 @@ return validator; } + _createBigNumberValidator(name) { + + this._addInputPattern(NUMBER_PATTERN); + + return { + name, + handler: () => true, + parser: Validate._toBigNumber, + formatter: Validate._toString + }; + } + + /** * @param name * @param validator @@ -447,15 +500,6 @@ return document.activeElement === $input.get(0); } - static _createBigNumberValidator(name) { - return { - name, - handler: () => true, - parser: Validate._toBigNumber, - formatter: Validate._toString - }; - } - static _toAssetId(data) { if (typeof data === 'string') { return data; diff --git a/src/modules/utils/directives/validators/ValidateService.js b/src/modules/utils/directives/validators/ValidateService.js index f5dedfbe23..443f79c6d7 100644 --- a/src/modules/utils/directives/validators/ValidateService.js +++ b/src/modules/utils/directives/validators/ValidateService.js @@ -50,11 +50,29 @@ } @notNullArgs - byte(inputValue, bytes) { + byteLt(inputValue, bytes) { + const blob = new Blob([inputValue], { type: 'text/html' }); + return blob.size < Number(bytes); + } + + @notNullArgs + byteLte(inputValue, bytes) { const blob = new Blob([inputValue], { type: 'text/html' }); return blob.size <= Number(bytes); } + @notNullArgs + byteGt(inputValue, bytes) { + const blob = new Blob([inputValue], { type: 'text/html' }); + return blob.size > Number(bytes); + } + + @notNullArgs + byteGte(inputValue, bytes) { + const blob = new Blob([inputValue], { type: 'text/html' }); + return blob.size >= Number(bytes); + } + @notNullArgs integer(inputValue) { return inputValue.round().eq(inputValue); diff --git a/src/modules/utils/modals/ModalManager.js b/src/modules/utils/modals/ModalManager.js index ef38c42b74..9717ccc6b4 100644 --- a/src/modules/utils/modals/ModalManager.js +++ b/src/modules/utils/modals/ModalManager.js @@ -188,14 +188,14 @@ } showConfirmTx(type, txData) { - return $injector.get('waves').node.transactions.createTransaction(type, txData).then((tx) => { - return this._getModal({ - id: 'confirm-tx', - ns: 'app.ui', - locals: { tx }, - controller: 'ConfirmTxCtrl', - contentUrl: 'modules/utils/modals/confirmTx/confirmTx.modal.html' - }); + const tx = $injector.get('waves').node.transactions.createTransaction(type, txData); + + return this._getModal({ + id: 'confirm-tx', + ns: 'app.ui', + locals: { tx }, + controller: 'ConfirmTxCtrl', + contentUrl: 'modules/utils/modals/confirmTx/confirmTx.modal.html' }); } diff --git a/src/modules/utils/modals/sendAsset/send.modal.html b/src/modules/utils/modals/sendAsset/send.modal.html index 32116f0f9a..d8aef8da2b 100644 --- a/src/modules/utils/modals/sendAsset/send.modal.html +++ b/src/modules/utils/modals/sendAsset/send.modal.html @@ -133,10 +133,10 @@ ng-model="$ctrl.tx.attachment" w-i18n-attr="placeholder" w-validate - w-validator-byte="140" + w-validator-byte-lte="140" placeholder="modal.send.descriptionPlaceholder">
- + modal.send.attachmentLength From 6911c0cd4ffd4bf1309f54a443ce9cdbae5a276d Mon Sep 17 00:00:00 2001 From: tsigel Date: Tue, 6 Feb 2018 18:39:29 +0300 Subject: [PATCH 23/39] CLIENT-451: add custom validator, fix create order validations --- .../app/services/waves/node/content/Assets.js | 27 +---- .../dex/directives/createOrder/CreateOrder.js | 56 ++++++----- .../directives/createOrder/createOrder.html | 20 ++-- .../utils/directives/validators/Asset.js | 99 ------------------- .../utils/directives/validators/Validate.js | 66 ++++++++++--- src/modules/utils/services/utils.js | 9 +- 6 files changed, 108 insertions(+), 169 deletions(-) delete mode 100644 src/modules/utils/directives/validators/Asset.js diff --git a/src/modules/app/services/waves/node/content/Assets.js b/src/modules/app/services/waves/node/content/Assets.js index d3a742428e..204a531ea8 100644 --- a/src/modules/app/services/waves/node/content/Assets.js +++ b/src/modules/app/services/waves/node/content/Assets.js @@ -177,8 +177,7 @@ _getBalanceOrders() { return matcher.getOrders() .then((orders) => orders.filter(Assets._filterOrders)) - .then((orders) => orders.map(Assets._remapOrders)) - .then(Promise.all.bind(Promise)); + .then((orders) => orders.map(Assets._remapOrders)); } /** @@ -226,10 +225,10 @@ static _remapOrders(order) { switch (order.type) { case 'sell': - return Promise.resolve(order.amount.sub(order.filled)); + return order.amount.sub(order.filled); case 'buy': const tokens = order.amount.sub(order.filled).getTokens().mul(order.price.getTokens()); - return Waves.Money.fromTokens(tokens, order.price.asset.id); + return order.price.cloneWithTokens(tokens); } } @@ -250,8 +249,8 @@ * @private */ static _remapBalance([wavesDetails, moneyList, orderMoneyList]) { - const orderMoneyHash = Assets._getMoneyHashFromMoneyList(orderMoneyList); - const eventsMoneyHash = Assets._getMoneyHashFromMoneyList(eventManager.getReservedMoneyList()); + const orderMoneyHash = utils.groupMoney(orderMoneyList); + const eventsMoneyHash = utils.groupMoney(eventManager.getReservedMoneyList()); const wavesNodeRegular = wavesDetails.wavesBalance.regular; const wavesNodeAvailable = wavesDetails.wavesBalance.available; @@ -310,22 +309,6 @@ } } - /** - * @param {Money[]} orderMoneyList - * @return {object} - * @private - */ - static _getMoneyHashFromMoneyList(orderMoneyList) { - return orderMoneyList.reduce((hash, orderMoney) => { - if (!hash[orderMoney.asset.id]) { - hash[orderMoney.asset.id] = orderMoney; - } else { - hash[orderMoney.asset.id] = hash[orderMoney.asset.id].add(orderMoney); - } - return hash; - }, Object.create(null)); - } - } return new Assets(); diff --git a/src/modules/dex/directives/createOrder/CreateOrder.js b/src/modules/dex/directives/createOrder/CreateOrder.js index 5477645827..d8b7a86407 100644 --- a/src/modules/dex/directives/createOrder/CreateOrder.js +++ b/src/modules/dex/directives/createOrder/CreateOrder.js @@ -49,7 +49,7 @@ * Has price balance for buy amount * @type {boolean} */ - this.cantByOrder = false; + this.canByOrder = true; /** * Amount asset balance * @type {Money} @@ -75,14 +75,22 @@ * @private */ this._assetIdPair = null; + /** + * @type {Money} + */ + this.amount = null; + /** + * @type {Money} + */ + this.price = null; Waves.Money.fromTokens('0.003', WavesApp.defaultAssets.WAVES).then((money) => { this.fee = money; }); this.receive(dexDataService.chooseOrderBook, ({ type, price, amount }) => { - this.amount = new BigNumber(amount); - this.price = new BigNumber(price); + this.amount = this.amountBalance.cloneWithTokens(amount); + this.price = this.priceBalance.cloneWithTokens(price); this.expand(type); $scope.$apply(); }); @@ -118,10 +126,10 @@ this.maxAmountBalance = CreateOrder._getMaxAmountBalance(this.type, this.amountBalance, this.fee); switch (type) { case 'sell': - this.price = new BigNumber(this.bid.price); + this.price = this.priceBalance.cloneWithTokens(this.bid.price); break; case 'buy': - this.price = new BigNumber(this.ask.price); + this.price = this.priceBalance.cloneWithTokens(this.ask.price); break; default: throw new Error('Wrong type'); @@ -134,24 +142,24 @@ setMaxAmount() { if (this.amountBalance.asset.id === this.fee.asset.id) { - this.amount = this.amountBalance.sub(this.fee).getTokens() - .round(this.amountBalance.asset.precision, BigNumber.ROUND_FLOOR); + this.amount = this.amountBalance.cloneWithTokens(this.amountBalance.sub(this.fee).getTokens() + .round(this.amountBalance.asset.precision, BigNumber.ROUND_FLOOR)); } else { - this.amount = this.amountBalance.getTokens() - .round(this.amountBalance.asset.precision, BigNumber.ROUND_FLOOR); + this.amount = this.amountBalance.cloneWithTokens(this.amountBalance.getTokens() + .round(this.amountBalance.asset.precision, BigNumber.ROUND_FLOOR)); } } setMaxPrice() { if (this.priceBalance.asset.id === this.fee.asset.id) { - this.amount = this.priceBalance.sub(this.fee) + this.amount = this.amountBalance.cloneWithTokens(this.priceBalance.sub(this.fee) .getTokens() - .div(this.price) - .round(this.amountBalance.asset.precision, BigNumber.ROUND_FLOOR); + .div(this.price.getTokens()) + .round(this.amountBalance.asset.precision, BigNumber.ROUND_FLOOR)); } else { - this.amount = this.priceBalance.getTokens() - .div(this.price) - .round(this.amountBalance.asset.precision, BigNumber.ROUND_FLOOR); + this.amount = this.amountBalance.cloneWithTokens(this.priceBalance.getTokens() + .div(this.price.getTokens()) + .round(this.amountBalance.asset.precision, BigNumber.ROUND_FLOOR)); } } @@ -164,11 +172,9 @@ user.getSeed() .then((seed) => { return Waves.AssetPair.get(this._assetIdPair.amount, this._assetIdPair.price).then((pair) => { - return Promise.all([ - Waves.Money.fromTokens(this.amount.toFixed(), this.amountBalance.asset.id), - Waves.OrderPrice.fromTokens(this.price.toFixed(), pair) - ]); - }).then(([amount, price]) => { + return Waves.OrderPrice.fromTokens(this.price.getTokens(), pair); + }).then((price) => { + const amount = this.amount; this.amount = null; form.$setUntouched(); $scope.$apply(); @@ -232,15 +238,17 @@ } if (!this.price || !this.amount) { - this.totalPrice = new BigNumber(0); + this.totalPrice = this.priceBalance.cloneWithTokens('0'); } else { - this.totalPrice = this.price.mul(this.amount); + this.totalPrice = this.priceBalance.cloneWithTokens( + this.price.getTokens().mul(this.amount.getTokens()) + ); } if (this.type === 'buy') { - this.cantByOrder = this.priceBalance.getTokens().lte(this.totalPrice); + this.canByOrder = !this.priceBalance.lte(this.totalPrice); } else { - this.cantByOrder = false; + this.canByOrder = true; } } diff --git a/src/modules/dex/directives/createOrder/createOrder.html b/src/modules/dex/directives/createOrder/createOrder.html index 23eee378a0..41dcc10e33 100644 --- a/src/modules/dex/directives/createOrder/createOrder.html +++ b/src/modules/dex/directives/createOrder/createOrder.html @@ -64,9 +64,11 @@
@@ -91,11 +93,11 @@ directives.createOrder.errors.balance -
+ directives.createOrder.errors.balance -
+
@@ -106,8 +108,9 @@
@@ -138,8 +141,7 @@
Fee 0.003 WAVES
- - directives.createOrder.placeSellOrder diff --git a/src/modules/utils/directives/validators/Asset.js b/src/modules/utils/directives/validators/Asset.js deleted file mode 100644 index 21bcd00b79..0000000000 --- a/src/modules/utils/directives/validators/Asset.js +++ /dev/null @@ -1,99 +0,0 @@ -(function () { - 'use strict'; - - /** - * @param {typeof Num} Num - * @param {app.utils} utils - * @param {Waves} waves - * @return {Asset} - */ - const factory = function (Num, utils, waves) { - - class Asset extends Num { - - constructor(params) { - super(params); - - /** - * @type {string} - */ - this.assetId = this.$attrs.assetId; - if (!this.assetId) { - throw new Error('Has no asset id attribute for asset validator'); - } - - this.onReady() - .then((asset) => { - /** - * @type {Asset} - */ - this.asset = asset; - - this.registerValidator('asset-input', (modelValue, viewValue) => { - const parts = String(viewValue || 0) - .replace(',', '') - .split('.'); - if (!modelValue) { - return 'required' in this.$attrs; - } - return (!parts[1] || parts[1].length <= asset.precision); - }); - - if (this.$attrs.maxBalance) { - let balance; - - this.registerValidator('asset-max', (modelValue) => { - if (!balance) { - return true; - } else { - return modelValue && modelValue.lte(balance.getTokens()); - } - }); - - this.$scope.$watch(this.$attrs.maxBalance, (value) => { - balance = value; - this.validateByName('asset-max'); - }); - } - - this.$scope.$watch(this.assetId, (id) => { - waves.node.assets.info(id).then((asset) => { - this.asset = asset; - this.validate(); - }); - }); - }); - } - - getFormatter() { - return (value) => { - if (value == null) { - return ''; - } - if (new BigNumber(value).eq(utils.parseNiceNumber(this.$input.val()))) { - if (value.indexOf('e') !== -1) { - return new BigNumber(value).toFixed(this.asset.precision); - } else { - return this.$input.val(); - } - } else { - return value; - } - }; - } - - onReady() { - return super.onReady() - .then(() => waves.node.assets.info(this.$scope.$eval(this.assetId))); - } - - } - - return Asset; - }; - - factory.$inject = ['Num', 'utils', 'waves']; - - angular.module('app.utils') - .factory('Asset', factory); -})(); diff --git a/src/modules/utils/directives/validators/Validate.js b/src/modules/utils/directives/validators/Validate.js index 73a10ac79c..5160d8b048 100644 --- a/src/modules/utils/directives/validators/Validate.js +++ b/src/modules/utils/directives/validators/Validate.js @@ -21,7 +21,8 @@ 'wavesAddress', 'outerBlockchains', 'anyAddress', - 'pattern' + 'pattern', + 'custom' ]; const NUMBER_PATTERN = '[0-9.]'; //TODO Add locale separators @@ -167,6 +168,9 @@ case 'compare': this._validators[name] = this._createCompareValidator(name); break; + case 'custom': + this._validators[name] = this._createCustomValidator(name); + break; case 'number': this._validators[name] = this._createBigNumberValidator(name); break; @@ -203,6 +207,27 @@ return this._validators[name]; } + _createCustomValidator(name) { + + const validator = { + name, + value: null, + handler: function () { + if (validator.value == null) { + return true; + } else if (typeof validator.value === 'function') { + return validator.value(); + } else { + return !!validator.value; + } + } + }; + + this._listenValidatorChanges(name, validator); + + return validator; + } + _createIntegerValidator(name) { this._createPatternValidator('[0-9]'); @@ -291,12 +316,14 @@ Object.defineProperty(validator, 'value', { get: () => value, set: (val) => { - if (validator.$compare) { - validator.$compare.off('input', validator.$compareHandler); + if (utils.isNotEqualValue(value, val)) { + if (validator.$compare) { + validator.$compare.off('input', validator.$compareHandler); + } + validator.$compare = $input.closest('form').find(`input[name="${val}"]`); + validator.$compare.on('input', validator.$compareHandler); + value = val; } - validator.$compare = $input.closest('form').find(`input[name="${val}"]`); - validator.$compare.on('input', validator.$compareHandler); - value = val; } }); @@ -360,11 +387,10 @@ const validator = { name, - asset: null, money: null, value: null, apply: () => { - precisionValidator.value = validator.asset.precision; + precisionValidator.value = validator.money.asset.precision; this._validateByName(name); }, handler: (modelValue, viewValue) => { @@ -389,7 +415,6 @@ get: () => value, set: (assetData) => { - validator.asset = null; validator.money = null; if (!assetData) { @@ -399,10 +424,11 @@ value = Validate._toAssetId(assetData); if (value) { Waves.Money.fromTokens('0', value).then((money) => { - validator.asset = money.asset; - validator.money = money; - validator.apply(); - $ngModel.$modelValue = validator.parser($ngModel.$viewValue); + if (utils.isNotEqualValue(validator.money, money)) { + validator.money = money; + validator.apply(); + $ngModel.$modelValue = validator.parser($ngModel.$viewValue); + } }); } } @@ -438,7 +464,19 @@ case 'gte': case 'precision': handler = function (modelValue, viewValue) { - return validateService[name](viewValue, validator.value); + let value; + + try { + if (viewValue) { + value = utils.parseNiceNumber(viewValue); + } else { + value = null; + } + } catch (e) { + value = null; + } + + return validateService[name](value, validator.value); }; break; default: diff --git a/src/modules/utils/services/utils.js b/src/modules/utils/services/utils.js index 2bd5e3033d..921e76e327 100644 --- a/src/modules/utils/services/utils.js +++ b/src/modules/utils/services/utils.js @@ -449,7 +449,14 @@ } }; } - } + }, + + /** + * @name app.utils#isNotEqualValue + * @param {*} oldValue + * @param {*} newValue + */ + isNotEqualValue: isNotEqualValue }; function _processDecimal(decimal) { From c8e2c458beae221220b539fa2456e295f9e6a5f9 Mon Sep 17 00:00:00 2001 From: tsigel Date: Tue, 6 Feb 2018 19:18:20 +0300 Subject: [PATCH 24/39] CLIENT-451: add tokens locales --- src/modules/tokens/locales/en.json | 7 +++++-- src/modules/tokens/locales/ru.json | 7 +++++-- src/modules/tokens/templates/tokens.html | 6 ------ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/modules/tokens/locales/en.json b/src/modules/tokens/locales/en.json index b6f6861430..14c67a402a 100644 --- a/src/modules/tokens/locales/en.json +++ b/src/modules/tokens/locales/en.json @@ -12,9 +12,12 @@ "precision": "This field defines the number of decimal signs for your token" }, "validators": { - "nameLen": "An asset name must be at least 4-16 characters’ long", + "byte": { + "lte": "Asset name must be between 4 and 16 bytes long", + "gte": "Asset name must be between 4 and 16 bytes long" + }, "required": "This field must be filled", - "descriptionLen": "Entered description is too large", + "descriptionLen": "The description is too long. It must be no more than 1,000 bytes.", "minValuePrecision": "Invalid number. Enter number from 0 to 8", "maxValuePrecision": "Invalid number. Enter number from 0 to 8", "maxValueCount": "Entered number is too large", diff --git a/src/modules/tokens/locales/ru.json b/src/modules/tokens/locales/ru.json index d1726c4e26..3659ac802c 100644 --- a/src/modules/tokens/locales/ru.json +++ b/src/modules/tokens/locales/ru.json @@ -12,9 +12,12 @@ "precision": "В этом поле укажите, сколько знаков после запятой будет у токена" }, "validators": { - "nameLen": "Имя токена должно содержать от 4 до 16 символов", + "byte": { + "lte": "Название токена должно занимать не менее 4 и не более 16 байт.", + "gte": "Название токена должно занимать не менее 4 и не более 16 байт." + }, "required": "Это поле должно быть заполнено", - "descriptionLen": "Описание слишком длинное", + "descriptionLen": "Описание слишком большое. Текст не должен занимать более 1000 байт.", "minValuePrecision": "Неверное число, введите число от 0 до 8", "maxValuePrecision": "Неверное число, введите число от 0 до 8", "maxValueCount": "Число токенов слишком велико", diff --git a/src/modules/tokens/templates/tokens.html b/src/modules/tokens/templates/tokens.html index d4da14c895..66115d0d02 100644 --- a/src/modules/tokens/templates/tokens.html +++ b/src/modules/tokens/templates/tokens.html @@ -17,12 +17,6 @@ w-validator-byte-lte="16" required>
- - validators.nameLen - - - validators.nameLen - validators.required From e812583e0e922755518bbdeddec08c072684bb4b Mon Sep 17 00:00:00 2001 From: Phil Filippak Date: Wed, 7 Feb 2018 12:11:45 +0300 Subject: [PATCH 25/39] Added hyphen as a valid alias character --- src/modules/utils/modals/accountInfo/account-info.modal.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/utils/modals/accountInfo/account-info.modal.html b/src/modules/utils/modals/accountInfo/account-info.modal.html index 64b9142eff..dbc5199840 100644 --- a/src/modules/utils/modals/accountInfo/account-info.modal.html +++ b/src/modules/utils/modals/accountInfo/account-info.modal.html @@ -34,7 +34,7 @@ placeholder="modal.account.placeholder" required w-i18n-attr="placeholder" - ng-pattern="/^[a-z0-9@_.]*$/" + ng-pattern="/^[a-z0-9-@_.]*$/" maxlength="30" minlength="4">
Date: Wed, 7 Feb 2018 13:16:14 +0300 Subject: [PATCH 26/39] CLIENT-451: change package lock --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 0994019e41..96a6a999ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "waves-client", - "version": "1.0.0-beta.10", + "version": "1.0.0-beta.11", "lockfileVersion": 1, "requires": true, "dependencies": { From 3baa09b93f546ad4dea0227e7c51331a965af947 Mon Sep 17 00:00:00 2001 From: tsigel Date: Wed, 7 Feb 2018 13:16:24 +0300 Subject: [PATCH 27/39] CLIENT-451: fix precision error --- src/modules/utils/directives/validators/Validate.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/modules/utils/directives/validators/Validate.js b/src/modules/utils/directives/validators/Validate.js index 5160d8b048..225a347adc 100644 --- a/src/modules/utils/directives/validators/Validate.js +++ b/src/modules/utils/directives/validators/Validate.js @@ -411,6 +411,11 @@ } }; + $input.on('input', () => { + this._validateByName(precisionValidator.name); + $scope.$apply(); + }); + Object.defineProperty(validator, 'value', { get: () => value, set: (assetData) => { From 1a243dcb16bb3304430d777ee41146f36c038869 Mon Sep 17 00:00:00 2001 From: tsigel Date: Wed, 7 Feb 2018 13:44:18 +0300 Subject: [PATCH 28/39] CLIENT-451: fix change amount and amount mirror for send --- src/modules/utils/modals/sendAsset/AssetSendCtrl.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/modules/utils/modals/sendAsset/AssetSendCtrl.js b/src/modules/utils/modals/sendAsset/AssetSendCtrl.js index d8a99033f9..a7932e17bc 100644 --- a/src/modules/utils/modals/sendAsset/AssetSendCtrl.js +++ b/src/modules/utils/modals/sendAsset/AssetSendCtrl.js @@ -102,6 +102,11 @@ * @type {Object.} */ this.moneyHash = null; + /** + * @type {boolean} + * @private + */ + this._noCurrentRate = false; this.syncSettings({ mirrorId: 'baseAssetId' @@ -144,8 +149,10 @@ amount = this.balance; } waves.utils.getRate(this.assetId, this.mirrorId).then((rate) => { + this._noCurrentRate = true; this.mirror = amount.convertTo(this.moneyHash[this.mirrorId].asset, rate); this.tx.amount = amount; + this._noCurrentRate = false; }); } @@ -268,7 +275,7 @@ * @private */ _onChangeAmount() { - if (!this.noMirror && this.tx.amount && this.focus === 'amount') { + if (!this._noCurrentRate && !this.noMirror && this.tx.amount && this.focus === 'amount') { this._fillMirror(); } } @@ -277,7 +284,7 @@ * @private */ _onChangeAmountMirror() { - if (this.mirror && this.focus === 'mirror') { + if (!this._noCurrentRate && this.mirror && this.focus === 'mirror') { this._fillAmount(); } } From 111571fb99de61f2547eb41a52d0e5b2e1265971 Mon Sep 17 00:00:00 2001 From: tsigel Date: Wed, 7 Feb 2018 14:03:48 +0300 Subject: [PATCH 29/39] CLIENT-451: fix validate --- src/modules/utils/directives/validators/Validate.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/modules/utils/directives/validators/Validate.js b/src/modules/utils/directives/validators/Validate.js index 225a347adc..6f36e75b13 100644 --- a/src/modules/utils/directives/validators/Validate.js +++ b/src/modules/utils/directives/validators/Validate.js @@ -397,7 +397,11 @@ return (viewValue && !!modelValue) || !viewValue; }, parser: (value) => { - return Validate._toMoney(value, validator.money); + if (precisionValidator.handler($ngModel.$modelValue, value)) { + return Validate._toMoney(value, validator.money); + } else { + return null; + } }, formatter: (value) => { From aa9be0631121f0deda1f60a5e42ddd89fd71096c Mon Sep 17 00:00:00 2001 From: tsigel Date: Wed, 7 Feb 2018 14:43:19 +0300 Subject: [PATCH 30/39] CLIENT-451: fix asset validator --- src/modules/utils/directives/validators/Validate.js | 8 +++----- src/modules/utils/modals/sendAsset/AssetSendCtrl.js | 5 ++++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/modules/utils/directives/validators/Validate.js b/src/modules/utils/directives/validators/Validate.js index 6f36e75b13..8a40667d5c 100644 --- a/src/modules/utils/directives/validators/Validate.js +++ b/src/modules/utils/directives/validators/Validate.js @@ -405,7 +405,9 @@ }, formatter: (value) => { - const money = Validate._toMoney($input.val(), validator.money); + const viewValue = $input.val(); + const money = precisionValidator.handler($ngModel.$modelValue, viewValue) && + Validate._toMoney(viewValue, validator.money); if (Validate._isFocused() && (!value || (money && money.eq(value)))) { return $input.val(); @@ -467,10 +469,6 @@ let handler; switch (name) { - case 'lt': - case 'gt': - case 'lte': - case 'gte': case 'precision': handler = function (modelValue, viewValue) { let value; diff --git a/src/modules/utils/modals/sendAsset/AssetSendCtrl.js b/src/modules/utils/modals/sendAsset/AssetSendCtrl.js index a7932e17bc..17ec3fe77a 100644 --- a/src/modules/utils/modals/sendAsset/AssetSendCtrl.js +++ b/src/modules/utils/modals/sendAsset/AssetSendCtrl.js @@ -129,13 +129,15 @@ this.tx.amount = this.moneyHash[this.assetId].cloneWithTokens('0'); this.mirror = this.moneyHash[this.mirrorId].cloneWithTokens('0'); - this.observe(['assetId', 'mirrorId'], () => this.poll.restart()); this.observe('assetId', this._onChangeAssetId); this.observe('mirrorId', this._onChangeMirrorId); + this.observe(['assetId', 'mirrorId'], () => this.poll.restart()); this.receive(utils.observe(this.tx, 'recipient'), this._updateGatewayDetails, this); this.receive(utils.observe(this.tx, 'amount'), this._onChangeAmount, this); this.observe('mirror', this._onChangeAmountMirror); + this._onChangeBaseAssets(); + this._updateGatewayDetails(); }); } @@ -244,6 +246,7 @@ } this.tx.amount = this.moneyHash[this.assetId].cloneWithTokens('0'); + this.mirror = this.moneyHash[this.mirrorId].cloneWithTokens('0'); this._updateGatewayDetails(); analytics.push('Send', 'Send.ChangeCurrency', this.assetId); From 95003f296da2823b66d9df35d6adf1944a6b2454 Mon Sep 17 00:00:00 2001 From: tsigel Date: Wed, 7 Feb 2018 14:59:35 +0300 Subject: [PATCH 31/39] CLIENT-451: fix send max with cached rate request --- src/modules/utils/modals/sendAsset/AssetSendCtrl.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/modules/utils/modals/sendAsset/AssetSendCtrl.js b/src/modules/utils/modals/sendAsset/AssetSendCtrl.js index 17ec3fe77a..310f230c66 100644 --- a/src/modules/utils/modals/sendAsset/AssetSendCtrl.js +++ b/src/modules/utils/modals/sendAsset/AssetSendCtrl.js @@ -293,18 +293,16 @@ } _fillMirror() { - waves.utils.getRate(this.assetId, this.mirrorId).then((rate) => { + utils.when(waves.utils.getRate(this.assetId, this.mirrorId)).then((rate) => { const mirror = this.tx.amount.convertTo(this.moneyHash[this.mirrorId].asset, rate); this.mirror = mirror; - $scope.$apply(); }); } _fillAmount() { - waves.utils.getRate(this.mirrorId, this.assetId).then((rate) => { + utils.when(waves.utils.getRate(this.mirrorId, this.assetId)).then((rate) => { const amount = this.mirror.convertTo(this.moneyHash[this.assetId].asset, rate); this.tx.amount = amount; - $scope.$apply(); }); } From a178510abc95a019255cdd9a98678bc842c4aa65 Mon Sep 17 00:00:00 2001 From: tsigel Date: Wed, 7 Feb 2018 15:16:29 +0300 Subject: [PATCH 32/39] CLIENT-470: fix show seed phrase --- src/modules/utils/modals/settings/settings.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/utils/modals/settings/settings.html b/src/modules/utils/modals/settings/settings.html index 02ba8e3010..371eff0060 100644 --- a/src/modules/utils/modals/settings/settings.html +++ b/src/modules/utils/modals/settings/settings.html @@ -49,7 +49,7 @@ modal.settings.security.show -
{{::$ctrl.phrase}}
+
{{::$ctrl.phrase}}
From c2c9752e00e0a7168e700eb52da47b9ba74e38c3 Mon Sep 17 00:00:00 2001 From: tsigel Date: Wed, 7 Feb 2018 15:16:38 +0300 Subject: [PATCH 33/39] CLIENT-470: change package lock --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 0994019e41..96a6a999ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "waves-client", - "version": "1.0.0-beta.10", + "version": "1.0.0-beta.11", "lockfileVersion": 1, "requires": true, "dependencies": { From 0ac6b21b9c5a5ac679c1b33dc2d1b52cee7a39d2 Mon Sep 17 00:00:00 2001 From: xenohunter Date: Wed, 7 Feb 2018 15:42:52 +0300 Subject: [PATCH 34/39] CLIENT-420: changed package.json for Electron --- electron/package.json | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/electron/package.json b/electron/package.json index 08420be985..545662c911 100644 --- a/electron/package.json +++ b/electron/package.json @@ -1,12 +1,7 @@ { - "name": "waves-lite-client", + "name": "waves-client", "version": "1.0.0-beta.X", - "author": { - "name": "Waves Platform", - "email": "info@wavesplatform.com", - "url": "https://wavesplatform.com" - }, - "description": "A lite client for Waves platform", + "description": "The official client application for the Waves platform", "license": "Apache-2.0", "main": "main.js" } From 9978b52ff3f90b0028f3e2779d9193516ff8432b Mon Sep 17 00:00:00 2001 From: xenohunter Date: Wed, 7 Feb 2018 15:51:33 +0300 Subject: [PATCH 35/39] CLIENT-420: removed `-lite` from Waves Client name --- electron-builder.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/electron-builder.json b/electron-builder.json index 465f4e5564..1e2405d299 100644 --- a/electron-builder.json +++ b/electron-builder.json @@ -1,7 +1,7 @@ { "appId": "com.wavesplatform.client.lite", "copyright": "Waves Platform", - "productName": "Waves Lite Client", + "productName": "Waves Client", "files": "**/*", "asar": true, "compression": "normal", @@ -17,7 +17,7 @@ "deb", "zip" ], - "executableName": "waves-lite-client", + "executableName": "waves-client", "icon": "electron/icons/icon128x128.png" }, "mac": { @@ -36,7 +36,7 @@ "icon": "electron/icons/icon.ico" }, "nsis": { - "artifactName": "waves-lite-client[${env.WAVES_CONFIGURATION}]-setup-${version}.${ext}" + "artifactName": "waves-client[${env.WAVES_CONFIGURATION}]-setup-${version}.${ext}" }, "dmg": { "icon": null, From b61cbca44c41b71498fa537d09a63f27711b035a Mon Sep 17 00:00:00 2001 From: uiskander Date: Wed, 7 Feb 2018 21:03:54 +0300 Subject: [PATCH 36/39] client-470-seed: added styles of pre in settings modal --- .../utils/modals/settings/settings.html | 20 +++++++++---------- .../utils/modals/settings/settings.less | 10 ++++++++++ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/modules/utils/modals/settings/settings.html b/src/modules/utils/modals/settings/settings.html index 371eff0060..74e44f7b88 100644 --- a/src/modules/utils/modals/settings/settings.html +++ b/src/modules/utils/modals/settings/settings.html @@ -44,17 +44,17 @@
-
+
modal.settings.security.show -
{{::$ctrl.phrase}}
+
{{::$ctrl.phrase}}
-
+
modal.settings.security.show @@ -63,26 +63,26 @@
-
+
{{::$ctrl.publicKey}}
-
+
{{::$ctrl.address}}
-
+
-
+
@@ -95,17 +95,17 @@
-
+
{{::$ctrl.appName}} {{::$ctrl.appVersion}}
-
© 2017 Waves Platform
+
© 2017 Waves Platform
diff --git a/src/modules/utils/modals/settings/settings.less b/src/modules/utils/modals/settings/settings.less index 88cee813bc..1fcb70d073 100644 --- a/src/modules/utils/modals/settings/settings.less +++ b/src/modules/utils/modals/settings/settings.less @@ -149,6 +149,16 @@ md-dialog.settings-modal { border-radius: 4px; border: 1px dashed @color-basic-200; padding: 0 15px; + overflow: auto; + + pre { + display: block; + position: absolute; + line-height: 1em; + margin: 0; + padding: 19px 0 10px 0; + top: 0; + } input { border-radius: @border-radius; From 91b8ef4d03c9ca516692d2a6ec9d521d5b4d929a Mon Sep 17 00:00:00 2001 From: daniil Date: Thu, 8 Feb 2018 10:37:22 +0300 Subject: [PATCH 37/39] CLIENT-473: up version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 718201f492..94cc3a58be 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "waves-client", - "version": "1.0.0-beta.11", + "version": "1.0.0-beta.12", "description": "The official client application for the Waves platform", "private": true, "repository": { From eeeb2d5285beacd80f98ebc904316cfcf6f1eb41 Mon Sep 17 00:00:00 2001 From: daniil Date: Thu, 8 Feb 2018 10:42:57 +0300 Subject: [PATCH 38/39] CLIENT-473: change package lock --- package-lock.json | 171 +++++++++++++++++++++++----------------------- 1 file changed, 86 insertions(+), 85 deletions(-) diff --git a/package-lock.json b/package-lock.json index 96a6a999ca..a20df19155 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "waves-client", - "version": "1.0.0-beta.11", + "version": "1.0.0-beta.12", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -39,7 +39,7 @@ "@types/babel-core": { "version": "6.25.2", "resolved": "https://registry.npmjs.org/@types/babel-core/-/babel-core-6.25.2.tgz", - "integrity": "sha1-UAt/7yg03Oh7MjEaTWehp1etqsc=", + "integrity": "sha512-+Ush/fQHUDIithA5yDJWZiL6KdOiVOs5yuj4qcgvQOCnmJec+RgzkLgxnpgmM6Ear9RXa3aCcwjPiUnStPp1zA==", "dev": true, "requires": { "@types/babel-generator": "6.25.0", @@ -52,7 +52,7 @@ "@types/babel-generator": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.0.tgz", - "integrity": "sha1-glVGmqFHEvDRYIuZaDyr1bQT2Ws=", + "integrity": "sha512-WbrKGSt8SKOxAivCHB1fsIP59EyCCfMHuCYcA6yenjGxnjh0rK3BOSPHR96RdZD6ukgyDwzMF/biQH4llowTDg==", "dev": true, "requires": { "@types/babel-types": "6.25.1" @@ -61,7 +61,7 @@ "@types/babel-template": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/@types/babel-template/-/babel-template-6.25.0.tgz", - "integrity": "sha1-JQXXtVuI+CHZgEi0/fB7OyJWPTA=", + "integrity": "sha512-TtyfVlrprX92xSuKa8D//7vFz5kBJODBw5IQ1hQXehqO+me26vt1fyNxOZyXhUq2a7jRyT72V8p68IyH4NEZNA==", "dev": true, "requires": { "@types/babel-types": "6.25.1", @@ -71,7 +71,7 @@ "@types/babel-traverse": { "version": "6.25.2", "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.2.tgz", - "integrity": "sha1-PPrr4xb+xRWpZK27hBR7PIlxup8=", + "integrity": "sha512-SO/YPiHOYApenZJecbw1Psd2lopAQ9Wc9HnFevEvM1mOoNXHglV8mHgVkCQJRIrn6UgWqHE/QfvQ1uG1crNgHA==", "dev": true, "requires": { "@types/babel-types": "6.25.1" @@ -80,13 +80,13 @@ "@types/babel-types": { "version": "6.25.1", "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.1.tgz", - "integrity": "sha1-zo8SakQD4R4bADOkJPEWOK+seIk=", + "integrity": "sha512-7Z6r20+HE0viAFhsW0d/UrC1K2tTlpXzGpNlYm8MmCv8z5PbAacFIshrM/MjlGRa5SBqxu2socpy8FHntwZKng==", "dev": true }, "@types/babylon": { "version": "6.16.2", "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz", - "integrity": "sha1-BizmO2k9mvHCRvWu35KLycMFicg=", + "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==", "dev": true, "requires": { "@types/babel-types": "6.25.1" @@ -109,7 +109,7 @@ "@types/connect": { "version": "3.4.31", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.31.tgz", - "integrity": "sha1-H5LWsRfswFB2xJ7NAk95duUoutk=", + "integrity": "sha512-OPSxsP6XqA3984KWDUXq/u05Hu8VWa/2rUVlw/aDUOx87BptIep6xb3NdCxCpKLfLdjZcCE5jR+gouTul3gjdA==", "dev": true, "requires": { "@types/node": "8.0.34" @@ -127,7 +127,7 @@ "@types/express-serve-static-core": { "version": "4.0.53", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.0.53.tgz", - "integrity": "sha1-FyOjXRRH8sVeE8hyHqs0SOQvTYI=", + "integrity": "sha512-zaGeOpEYp5G2EhjaUFdVwysDrfEYc6Q6iPhd3Kl4ip30x0tvVv7SuJvY3yzCUSuFlzAG8N5KsyY6BJg93/cn+Q==", "dev": true, "requires": { "@types/node": "8.0.34" @@ -136,7 +136,7 @@ "@types/fs-extra": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-3.0.3.tgz", - "integrity": "sha1-HWbrZw6/ZX5XwP2gFN80DBnYqgw=", + "integrity": "sha512-o2qkg/J2LWK+sr007+KFBBOrxzxpr9kiP0gMFC75gQJXhUn/E3pQA0kSVdxrQ3lf+rOwsRnuH0wnR5MNTotEKg==", "dev": true, "requires": { "@types/node": "8.0.34" @@ -165,7 +165,7 @@ "@types/gulp": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/gulp/-/gulp-4.0.4.tgz", - "integrity": "sha1-dT/+Ww3a8MmmAQGzRhQbuA5gLyU=", + "integrity": "sha512-5hGc57snkSvGEkUQ42tcYAQmQrU9E41XQJNglP6FtDg7ou9QGyF1HfPZ5POGnrl7ee7uYq0Om0gh1bAmykxaxA==", "dev": true, "requires": { "@types/chokidar": "1.7.1", @@ -222,7 +222,7 @@ "@types/handlebars": { "version": "4.0.36", "resolved": "https://registry.npmjs.org/@types/handlebars/-/handlebars-4.0.36.tgz", - "integrity": "sha1-/1fHf6GrZxO7RGU03cTZeXB6Onk=", + "integrity": "sha512-LjNiTX7TY7wtuC6y3QwC93hKMuqYhgV9A1uXBKNvZtVC8ZvyWAjZkJ5BvT0K7RKqORRYRLMrqCxpw5RgS+MdrQ==", "dev": true }, "@types/html-minifier": { @@ -244,7 +244,7 @@ "@types/jasmine": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.6.0.tgz", - "integrity": "sha1-mXtBondStIUK8mg7xKjYIiwlvQI=", + "integrity": "sha512-1ZZdFvYA5zARDXPj5+VF0bwDZWH/o0QQWJVDc5srdC/DngcCZXskR33eR/4PielGvBjLQpQOd6KiQbmtqVkeZA==", "dev": true }, "@types/jquery": { @@ -268,7 +268,7 @@ "@types/mime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz", - "integrity": "sha1-WnMG42fFObn2VDSZ3o3VGfrDeos=", + "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==", "dev": true }, "@types/minimatch": { @@ -291,7 +291,7 @@ "@types/serve-static": { "version": "1.7.32", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.7.32.tgz", - "integrity": "sha1-D2cy5NqwgTdx3Y/I/hSUDzRyi0w=", + "integrity": "sha512-WpI0g7M1FiOmJ/a97Qrjafq2I938tjAZ3hZr9O7sXyA6oUhH3bqUNZIt7r1KZg8TQAKxcvxt6JjQ5XuLfIBFvg==", "dev": true, "requires": { "@types/express-serve-static-core": "4.0.53", @@ -315,7 +315,7 @@ "@types/uglify-js": { "version": "2.6.29", "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-2.6.29.tgz", - "integrity": "sha1-UhNH9p4gIB0hj1mRrmbhCHivzxo=", + "integrity": "sha512-BdFLCZW0GTl31AbqXSak8ss/MqEZ3DN2MH9rkAyGoTuzK7ifGUlX+u0nfbWeTsa7IPcZhtn8BlpYBXSV+vqGhQ==", "requires": { "@types/source-map": "0.5.2" } @@ -323,7 +323,7 @@ "@types/undertaker": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@types/undertaker/-/undertaker-1.1.2.tgz", - "integrity": "sha1-zw9izcvfYq2fcKTXj4GGmlw0mgk=", + "integrity": "sha512-cfqbNE5SKyXIWKaWdeThRgZewNUX5D1yp4xPnFkuTvr93l6EreBxO9FS3bAluiadarKMBGq6aiFosLZkMsolLw==", "dev": true, "requires": { "@types/undertaker-registry": "1.0.0" @@ -358,7 +358,7 @@ "@uirouter/angularjs": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@uirouter/angularjs/-/angularjs-1.0.8.tgz", - "integrity": "sha1-CedSiIR1L6QHGrHPdDJfEMbW2Mk=", + "integrity": "sha512-GNgCyLmtOryzyBO4o8F+e41wkkLzihEN/6hrClQvmA+vf6zX1yvTaC26bFpNg2CJFUNb+DIv8gY5Id3/F0OvZA==", "requires": { "@uirouter/core": "5.0.10" }, @@ -540,7 +540,7 @@ "ansi-escapes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha1-7D6LTp+AZPwCw6ybZfHCdb2o75I=", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", "dev": true }, "ansi-regex": { @@ -551,7 +551,7 @@ "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { "color-convert": "1.9.0" @@ -560,7 +560,7 @@ "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "requires": { "micromatch": "2.3.11", @@ -594,7 +594,7 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, "array-differ": { @@ -744,7 +744,7 @@ "async": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha1-hDGQ/WtzV6C54clW7d3V7IRitU0=", + "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", "dev": true, "requires": { "lodash": "4.17.4" @@ -771,7 +771,7 @@ "autoprefixer": { "version": "7.1.5", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.5.tgz", - "integrity": "sha1-1l0UuDx80d17yAHaoAVXrd9aBrI=", + "integrity": "sha512-sMN453qIm8Z+tunzYWW+Y490wWkICHhCYm/VohLjjl+N7ARSFuF5au7E6tr7oEbeeXj8mNjpSw2kxjJaO6YCOw==", "dev": true, "requires": { "browserslist": "2.5.1", @@ -1595,7 +1595,7 @@ "bignumber.js": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz", - "integrity": "sha1-228UBnwUC9RmJIFaeRbJLZtsJLE=" + "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==" }, "binary-extensions": { "version": "1.10.0", @@ -1635,7 +1635,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true }, "body-parser": { @@ -2340,7 +2340,7 @@ "chalk": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha1-rFvs8U+iG5nGySynp9fP1bF+dD4=", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", "dev": true, "requires": { "ansi-styles": "3.2.0", @@ -2380,7 +2380,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { "inherits": "2.0.3", @@ -2390,7 +2390,7 @@ "circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", "dev": true }, "clean-css": { @@ -2588,7 +2588,7 @@ "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha1-FXFS/R56bI2YpbcVzzdt+SgARWM=" + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" }, "commoner": { "version": "0.10.8", @@ -2756,7 +2756,7 @@ "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true }, "convert-source-map": { @@ -2786,7 +2786,7 @@ "cosmiconfig": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha1-YXPOvVb6wELB9DkO33r2wHx8uJI=", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", "dev": true, "requires": { "is-directory": "0.3.1", @@ -2866,7 +2866,7 @@ "crypto-browserify": { "version": "3.11.1", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", - "integrity": "sha1-lIlF78Z1ekANbl5a9HGU0QBkJ58=", + "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", "dev": true, "requires": { "browserify-cipher": "1.0.0", @@ -4032,7 +4032,7 @@ "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" @@ -4157,7 +4157,7 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { "md5.js": "1.3.4", @@ -4265,7 +4265,7 @@ "external-editor": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.5.tgz", - "integrity": "sha1-UsJJo5gbm6GHx8rPW+tQvx2Rprw=", + "integrity": "sha512-Msjo64WT5W+NhOpQXh0nOHm+n0RfU1QUwDnKYvJ8dEJ8zlwLrqXNTv5mSUTJpepf41PDJGyhueTw2vNZW+Fr/w==", "dev": true, "requires": { "iconv-lite": "0.4.18", @@ -4276,7 +4276,7 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { "os-tmpdir": "1.0.2" @@ -5103,7 +5103,8 @@ "jsbn": { "version": "0.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "json-schema": { "version": "0.2.3", @@ -5569,7 +5570,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "functional-red-black-tree": { @@ -5771,7 +5772,7 @@ "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, "globby": { @@ -6284,7 +6285,7 @@ "gulp-copy": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gulp-copy/-/gulp-copy-1.0.1.tgz", - "integrity": "sha1-93c724Ab5Mj5EjtXW48zun2x+d8=", + "integrity": "sha512-uhIdHo9SoWkf+pjfjETOMD/6ez10ZItO5/L1bFRfVGH+7lq9zE3TSjkh3WVPuTS9ttPRHA7yW4g1QRE1hPwUOA==", "dev": true, "requires": { "gulp": "3.9.1", @@ -6999,7 +7000,7 @@ "hash.js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha1-NA3tvmKQGHFRweodd3o0SJNd+EY=", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "dev": true, "requires": { "inherits": "2.0.3", @@ -7068,7 +7069,7 @@ "hosted-git-info": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=" + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" }, "html-minifier": { "version": "3.5.7", @@ -7093,7 +7094,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "uglify-js": { "version": "3.2.1", @@ -7154,12 +7155,12 @@ "i18next": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/i18next/-/i18next-9.1.0.tgz", - "integrity": "sha1-QIAF/iYqmQyNk5RqbeDHe7oRZns=" + "integrity": "sha512-oarlBl8AX+2xSae45aT57y/i0dlhRP+MAYhuV2AMtih4Cv+ICpAApOILxtxi0BKPL95FMDStIH4F0PX/4CwfCQ==" }, "i18next-xhr-backend": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/i18next-xhr-backend/-/i18next-xhr-backend-1.4.3.tgz", - "integrity": "sha1-1y9wU2o79qOJImHd41K8d9cIiGo=" + "integrity": "sha512-l9YfIMl0N17Ka/F1KmzLF97iDC6xl5FtmTG60h/ETAfFwFQnYmmZ6B+oUKdNU4bZzBQR1QYWp58zVvUv95c5LA==" }, "iconv-lite": { "version": "0.4.18", @@ -7169,7 +7170,7 @@ "identity-img": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/identity-img/-/identity-img-1.0.0.tgz", - "integrity": "sha1-vkmdR2GqzWf23qyR26JrqiuXMFk=" + "integrity": "sha512-lOl0WslzXMFChhtnE6XeuSg68QjkfL5A1kNgQMlooo5+FDM6qBGiITlg1jMXHnXYoQ+t+4uPpCdjfjpV/wBwOw==" }, "ieee754": { "version": "1.1.8", @@ -7180,7 +7181,7 @@ "ignore": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", - "integrity": "sha1-xOcVRV9gc6jX5drnLS/J1xZj26Y=", + "integrity": "sha512-JLH93mL8amZQhh/p6mfQgVBH3M6epNq3DfsXsTSuSrInVjwyYlFE1nv2AgfRCC8PoOhM0jwQ5v8s9LgbK7yGDw==", "dev": true }, "image-size": { @@ -7249,7 +7250,7 @@ "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha1-ndLyrXZdyrH/BEO0kUQqILoifck=", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "dev": true, "requires": { "ansi-escapes": "3.0.0", @@ -7283,7 +7284,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", @@ -7576,7 +7577,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { "isobject": "3.0.1" @@ -7827,7 +7828,7 @@ "jschardet": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.1.tgz", - "integrity": "sha1-xRn2KfhrOlvtuliojTETCe7Al/k=", + "integrity": "sha512-vE2hT1D0HLZCLLclfBSfkfTTedhVj0fubHpJBHKwwUWX0nSbhPAfk+SG9rTX95BYNmau8rGFfCeaT6T5OW1C2A==", "dev": true }, "jsesc": { @@ -7951,7 +7952,7 @@ "karma": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", - "integrity": "sha1-hcwI6eCiLXzpzKN8ShvoJPaisa4=", + "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==", "dev": true, "requires": { "bluebird": "3.5.0", @@ -7992,7 +7993,7 @@ "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", "dev": true }, "tmp": { @@ -8009,7 +8010,7 @@ "karma-chrome-launcher": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", - "integrity": "sha1-zxudBxNswY/iOTJ9JGVMPbw2is8=", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", "dev": true, "requires": { "fs-access": "1.0.1", @@ -8604,7 +8605,7 @@ "lru-cache": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "dev": true, "requires": { "pseudomap": "1.0.2", @@ -8741,7 +8742,7 @@ "mime": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/mime/-/mime-2.0.3.tgz", - "integrity": "sha1-Q1MzeFR0fEjqSYMw3ANPn0u7zAs=", + "integrity": "sha512-TrpAd/vX3xaLPDgVRm6JkZwLR0KHfukMdU2wTEbqMDdCnY6Yo3mE+mjs9YE6oMNw2QRfXVeBEYpmpO94BIqiug==", "dev": true }, "mime-db": { @@ -8994,7 +8995,7 @@ "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "requires": { "lower-case": "1.1.4" } @@ -9020,7 +9021,7 @@ "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "requires": { "hosted-git-info": "2.5.0", "is-builtin-module": "1.0.0", @@ -9547,7 +9548,7 @@ "pbkdf2": { "version": "3.0.14", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha1-o14TxkeZsGzhUyD0WcIw5o5zut4=", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", "dev": true, "requires": { "create-hash": "1.1.3", @@ -9612,7 +9613,7 @@ "pluralize": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha1-KYuJ34uTsCIdv0Ia0rGx6iP8Z3c=", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, "postcss": { @@ -9703,7 +9704,7 @@ "postcss-reporter": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-5.0.0.tgz", - "integrity": "sha1-oUF3/RNCgp0pFlPyeG79ZxEDMsM=", + "integrity": "sha512-rBkDbaHAu5uywbCR2XE8a25tats3xSOsGNx6mppK6Q9kSFGKc/FyAzfci+fWM2l+K402p1D0pNcfDGxeje5IKg==", "dev": true, "requires": { "chalk": "2.1.0", @@ -9715,7 +9716,7 @@ "log-symbols": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.1.0.tgz", - "integrity": "sha1-81+mDieIMrU43E3dy7R4pF0+O+Y=", + "integrity": "sha512-zLeLrzMA1A2vRF1e/0Mo+LNINzi6jzBylHj5WqvQ/WK/5WCZt8si9SyN4p9llr/HRYvVR1AoXHRHl4WTHyQAzQ==", "dev": true, "requires": { "chalk": "2.1.0" @@ -9799,7 +9800,7 @@ "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { "asap": "2.0.6" } @@ -9850,7 +9851,7 @@ "qrcode-reader": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/qrcode-reader/-/qrcode-reader-1.0.3.tgz", - "integrity": "sha1-QphaxHUcE04FYTLiUJcNaXldE4w=" + "integrity": "sha512-J1UTJS2vGxJdVPXH1KqFAu/nVMaBJsRLVYus1oDnKKcEVUtktUZDGNwmVTYriEgMz0VCM+uPbBX7136VnuRCEQ==" }, "qs": { "version": "6.4.0", @@ -9873,7 +9874,7 @@ "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "dev": true, "requires": { "is-number": "3.0.0", @@ -9914,7 +9915,7 @@ "randombytes": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha1-3ACaJGuNCaF3tLegrne8Vw9LG3k=", + "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", "dev": true, "requires": { "safe-buffer": "5.1.1" @@ -10392,7 +10393,7 @@ "resolve": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha1-p1vgHFPaJdk0qY69DkxKcxL5KoY=", + "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", "dev": true, "requires": { "path-parse": "1.0.5" @@ -10480,7 +10481,7 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true }, "sanitize-filename": { @@ -10501,7 +10502,7 @@ "semver": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=" + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" }, "semver-diff": { "version": "2.1.0", @@ -10515,7 +10516,7 @@ "send": { "version": "0.16.1", "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", - "integrity": "sha1-pw4coh0TgsEdDZ9iMd6ygQgNerM=", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", "dev": true, "requires": { "debug": "2.6.9", @@ -10545,7 +10546,7 @@ "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", "dev": true } } @@ -10559,7 +10560,7 @@ "serve-static": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", - "integrity": "sha1-TFfVNASnYdjy58HooYpH2/J4pxk=", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", "dev": true, "requires": { "encodeurl": "1.0.1", @@ -10672,7 +10673,7 @@ "slice-ansi": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha1-BE8aSdiEL/MHqta1Be0Xi9lQE00=", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0" @@ -11043,7 +11044,7 @@ "stream-http": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha1-QKBQ7I3DtTsz2ZCUFcAsC/Gr+60=", + "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", "dev": true, "requires": { "builtin-status-codes": "3.0.0", @@ -11240,7 +11241,7 @@ "table": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha1-ozRHN1OR52atNNNIbm4q7chNLjY=", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, "requires": { "ajv": "5.2.3", @@ -11278,7 +11279,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", @@ -11440,7 +11441,7 @@ "ts-api-validator": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ts-api-validator/-/ts-api-validator-2.0.0.tgz", - "integrity": "sha1-Au99P+TGvKQlE9yEJDYUuE8yPU4=", + "integrity": "sha512-VovTPe5am/TP6doPConDwTWeWcxF9D04OmagSTaKpOTfvHfRe8rxg0zktyhZMAuo2/EUV6HpgAafVVYf6Z1HUQ==", "requires": { "dts-gen": "0.5.6", "dts-generator": "2.1.0", @@ -11450,14 +11451,14 @@ "ts-utils": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/ts-utils/-/ts-utils-4.5.0.tgz", - "integrity": "sha1-vjz94AN7KfJR/R/EqiEilNg8dlY=" + "integrity": "sha512-nLchzdDOiZ93CxZCsY6Od9q0FwFJivRD0qLSL/au6qjoCE3iBdLr5GnvMENOYdS7Z2ThUBHjq+D1UiMq0aYqng==" } } }, "ts-utils": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/ts-utils/-/ts-utils-6.0.0.tgz", - "integrity": "sha1-b3O1o1oBADD7w4GXTT5w8EcDMkc=" + "integrity": "sha512-4LQHT6Nb2Er942WprkOtrAeYpFW6UZZUfq6meq8wA3jNHcht/MJi4YcGfVqXtK6muUHWA5bPE/o33jnzbS7Mgg==" }, "tty-browserify": { "version": "0.0.0", @@ -11509,7 +11510,7 @@ "typescript": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.5.3.tgz", - "integrity": "sha1-3z3Nw48764ANS8MiZGsEo/bKfw0=" + "integrity": "sha512-ptLSQs2S4QuS6/OD1eAKG+S5G8QQtrU5RT32JULdZQtM1L3WTi34Wsu48Yndzi8xsObRAB9RPt/KhA9wlpEF6w==" }, "ua-parser-js": { "version": "0.7.14", @@ -11519,7 +11520,7 @@ "uglify-es": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.1.3.tgz", - "integrity": "sha1-oh7rFJyxIKH4MCVjaJ4ZSWVQeAs=", + "integrity": "sha512-Nuo5gkv/Q6PmLa+Ui2LvK+87YdMAcuXfRIWF0uVfkHVSfpT3Ue0euCSu4t0b8xv4Bt05lmXUT8bLI9OmnyPj8A==", "dev": true, "requires": { "commander": "2.11.0", @@ -11701,7 +11702,7 @@ "uuid": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", "dev": true }, "v8flags": { @@ -11873,7 +11874,7 @@ "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { "isexe": "2.0.0" @@ -11943,7 +11944,7 @@ "worker-wrapper": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/worker-wrapper/-/worker-wrapper-1.2.2.tgz", - "integrity": "sha1-jYSssjCBFSGaJy94ele0E9g4MEM=" + "integrity": "sha512-rXz1Ct+n1KFq5X24LPwGP/qMYyQiVXaWgaOsuLvoBpQ4H5IrIvSTsR7JCUcLGbDxfRcjh537tDhEw7AwzsIEEA==" }, "wrap-ansi": { "version": "2.1.0", From 2ea87e098a23cf71abb05752dc99668f09815ecc Mon Sep 17 00:00:00 2001 From: beregovoy68 Date: Thu, 8 Feb 2018 23:00:02 +1100 Subject: [PATCH 39/39] CLIENT-473: Reverted author section in electron package.json --- electron/package.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/electron/package.json b/electron/package.json index 545662c911..db67d53226 100644 --- a/electron/package.json +++ b/electron/package.json @@ -1,6 +1,11 @@ { "name": "waves-client", "version": "1.0.0-beta.X", + "author": { + "name": "Waves Platform", + "email": "info@wavesplatform.com", + "url": "https://wavesplatform.com" + }, "description": "The official client application for the Waves platform", "license": "Apache-2.0", "main": "main.js"