From 6b518708d1fab4b4bef33f42b2d1ffaf62a68682 Mon Sep 17 00:00:00 2001 From: yashar Date: Wed, 7 Jun 2017 16:51:19 +0430 Subject: [PATCH 01/52] fix visual bug with the tabs in main component --- src/components/main/main.js | 1 + src/components/main/main.less | 9 +++++++++ 2 files changed, 10 insertions(+) create mode 100644 src/components/main/main.less diff --git a/src/components/main/main.js b/src/components/main/main.js index 38fa73a01..a97e97449 100644 --- a/src/components/main/main.js +++ b/src/components/main/main.js @@ -1,3 +1,4 @@ +import './main.less'; /** * The main component, used as parent for transaction, forging and delgate tabs. * diff --git a/src/components/main/main.less b/src/components/main/main.less new file mode 100644 index 000000000..49d10c2ac --- /dev/null +++ b/src/components/main/main.less @@ -0,0 +1,9 @@ +md-tabs.main-tabs .md-tab.md-active { + background: white; + box-shadow: none; +} +md-tabs.main-tabs md-tabs-wrapper.md-stretch-tabs md-pagination-wrapper { + padding-left: 0; + box-shadow: 0px 1px 1px 1px rgba(0, 0, 0, 0.12); + margin-left: 2px; +} From 94cf268d5a5aba2521d73da24e5872ab58b2a0a2 Mon Sep 17 00:00:00 2001 From: yashar Date: Wed, 7 Jun 2017 19:50:19 +0430 Subject: [PATCH 02/52] Add Number filter to lisk component and forging component --- src/components/forging/forging.pug | 2 +- src/components/lsk/lsk.pug | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/forging/forging.pug b/src/components/forging/forging.pug index b3a138e0d..2a871cde8 100644 --- a/src/components/forging/forging.pug +++ b/src/components/forging/forging.pug @@ -73,7 +73,7 @@ md-card.offline-hide th(md-column) Reward tbody(md-body, infinite-scroll='$ctrl.loadMoreBlocks()', infinite-scroll-distance='1') tr(md-row, ng-repeat='block in $ctrl.blocks') - td(md-cell data-title='tableBlocks.cols.height', sortable="'height'") {{block.height}} + td(md-cell data-title='tableBlocks.cols.height', sortable="'height'") {{block.height | number:2}} td(md-cell data-title='tableBlocks.cols.blockId', ng-show='$ctrl.showAllColumns') {{block.id}} td(md-cell data-title='tableBlocks.cols.timestamp', sortable="'timestamp'") span(ng-show='block.timestamp > 0') diff --git a/src/components/lsk/lsk.pug b/src/components/lsk/lsk.pug index 3f47e971b..15ebd9aa8 100644 --- a/src/components/lsk/lsk.pug +++ b/src/components/lsk/lsk.pug @@ -1,2 +1,2 @@ -span(ng-bind='$ctrl.amount | lsk') +span(ng-bind='$ctrl.amount | lsk | number:2') span(ng-show='$ctrl.append')= ' LSK' From 86e3c8314cbefbabacaaedf765c36dc0ef76ebec Mon Sep 17 00:00:00 2001 From: reyraa Date: Thu, 8 Jun 2017 17:32:11 +0200 Subject: [PATCH 03/52] Add intro step to second passphrase modal --- src/components/main/secondPass.js | 7 +++++-- src/components/main/secondPass.pug | 24 +++++++++++++++++++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/components/main/secondPass.js b/src/components/main/secondPass.js index 5ad69a312..a8bc45c9b 100644 --- a/src/components/main/secondPass.js +++ b/src/components/main/secondPass.js @@ -8,7 +8,7 @@ import './secondPass.less'; */ app.component('setSecondPass', { template: require('./secondPass.pug')(), - controller($scope, Account, $rootScope, dialog, AccountApi) { + controller($scope, Account, $rootScope, dialog, AccountApi, $mdDialog) { /** * We call this after second passphrase is generated. * Shows an alert with appropriate message in case the request fails. @@ -38,6 +38,9 @@ app.component('setSecondPass', { $scope.onSave = (secondPass) => { $scope.passConfirmSubmit(secondPass); }; + + $scope.cancel = function () { + $mdDialog.hide(); + }; }, - // controllerAs: 'md', }); diff --git a/src/components/main/secondPass.pug b/src/components/main/secondPass.pug index 67cb35fc7..77a46fb01 100644 --- a/src/components/main/secondPass.pug +++ b/src/components/main/secondPass.pug @@ -1,6 +1,24 @@ -div.dialog-second(aria-label='Generate a second passphrase for your account') - form +div.dialog-second(aria-label='Generate a second passphrase for your account', data-ng-init='$ctrl.step = 0') md-toolbar .md-toolbar-tools h2 Generate a second passphrase of your account - passphrase(data-on-save='onSave', data-target='second-pass', data-ok-button-label='Register') + span(flex='') + md-button.md-icon-button(ng-click='cancel()', aria-label='Close dialog') + i.material-icons close + div(layout='row', layout-padding, layout-align="left center", data-ng-if='$ctrl.step === 0') + div(layout-margin) + i.material-icons info + p + span Please click Next, then move around your mouse randomly to generate a random passphrase. + br + br + span Note: After registration completes, your second passphrase will be required for all transactions sent from this account. +
+ span Losing access to this passphrase will mean no funds can be sent from this account. So be sure to keep it safe! + + md-dialog-actions(layout='row', data-ng-if='$ctrl.step === 0') + md-button.md-secondary(ng-disabled='$ctrl.loading', ng-click='cancel()') Cancel + span(flex) + md-button.md-raised.md-primary.submit-button(ng-click='$ctrl.step = 1') Next + section(data-ng-if='$ctrl.step === 1') + passphrase(data-on-save='onSave', data-target='second-pass', data-ok-button-label='Register') From 238b9eb9cea043b8dc3410f61d1015a930f22aae Mon Sep 17 00:00:00 2001 From: Vit Stanislav Date: Fri, 9 Jun 2017 08:21:44 +0200 Subject: [PATCH 04/52] Fix load more transactions jumps to top bug - Closes #361 --- src/components/transactions/transactions.pug | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/transactions/transactions.pug b/src/components/transactions/transactions.pug index 45c961fbd..1fedbaef1 100644 --- a/src/components/transactions/transactions.pug +++ b/src/components/transactions/transactions.pug @@ -1,9 +1,9 @@ md-card.offline-hide - md-card-content(ng-show='$ctrl.loaded') - md-content(layout='row', layout-align='start center', layout-padding, ng-show='!$ctrl.transactions.length') + md-card-content() + md-content(layout='row', layout-align='start center', layout-padding, ng-show='!$ctrl.transactions.length && $ctrl.loaded') div(flex) span.empty No transactions - md-content(layout='column', layout-align='center center', ng-hide='!$ctrl.transactions.length') + md-content(layout='column', layout-align='center center') md-table-container(ng-show='$ctrl.transactions.length') table(md-table) thead(md-head) From 57a169026c437da22656dc5731857631f1c0079c Mon Sep 17 00:00:00 2001 From: Vit Stanislav Date: Fri, 9 Jun 2017 08:55:51 +0200 Subject: [PATCH 05/52] Unify modals fullscreen and width - Closes #358 --- src/components/delegates/delegates.js | 32 ++++----------- src/components/header/header.js | 3 +- src/components/header/header.pug | 4 +- src/liskNano.js | 1 - src/services/dialog.js | 5 ++- src/services/signVerify.js | 36 ----------------- test/components/delegates/delegates.spec.js | 2 +- test/services/signVerify.spec.js | 44 --------------------- test/test.js | 1 - 9 files changed, 14 insertions(+), 114 deletions(-) delete mode 100644 src/services/signVerify.js delete mode 100644 test/services/signVerify.spec.js diff --git a/src/components/delegates/delegates.js b/src/components/delegates/delegates.js index 36bdf24e0..fac85e8e4 100644 --- a/src/components/delegates/delegates.js +++ b/src/components/delegates/delegates.js @@ -21,15 +21,14 @@ app.component('delegates', { * @constructor */ controller: class delegates { - constructor($scope, $rootScope, Peers, $mdDialog, $mdMedia, - dialog, $timeout, delegateApi, Account) { + constructor($scope, $rootScope, Peers, dialog, $mdMedia, + $timeout, delegateApi, Account) { this.$scope = $scope; this.$rootScope = $rootScope; this.peers = Peers; this.delegateApi = delegateApi; - this.$mdDialog = $mdDialog; - this.$mdMedia = $mdMedia; this.dialog = dialog; + this.$mdMedia = $mdMedia; this.$timeout = $timeout; this.account = Account; @@ -339,31 +338,14 @@ app.component('delegates', { } /** - * Uses mdDialog to show vote list directive. + * Uses dialog.modal to show vote list directive. * * @method openVoteDialog - * @todo Use a general dialog service instead. */ openVoteDialog() { - this.$mdDialog.show({ - controllerAs: '$ctrl', - controller: class voteDialog { - constructor($scope, voteList, unvoteList) { - this.$scope = $scope; - this.$scope.voteList = voteList; - this.$scope.unvoteList = unvoteList; - } - }, - template: - '' + - '' + - '' + - '', - fullscreen: (this.$mdMedia('sm') || this.$mdMedia('xs')) && this.$scope.customFullscreen, - locals: { - voteList: this.voteList, - unvoteList: this.unvoteList, - }, + this.dialog.modal('vote', { + 'vote-list': this.voteList, + 'unvote-list': this.unvoteList, }).then((() => { this.setPendingVotes(); })); diff --git a/src/components/header/header.js b/src/components/header/header.js index 5ed22a925..7ec28e68e 100644 --- a/src/components/header/header.js +++ b/src/components/header/header.js @@ -17,10 +17,9 @@ app.component('header', { * @constructor */ controller: class header { - constructor($rootScope, Account, signVerify) { + constructor($rootScope, Account) { this.$rootScope = $rootScope; this.account = Account; - this.signVerify = signVerify; } }, }); diff --git a/src/components/header/header.pug b/src/components/header/header.pug index 2b6e1896a..b78229e4b 100644 --- a/src/components/header/header.pug +++ b/src/components/header/header.pug @@ -16,10 +16,10 @@ md-content.header(layout='row', layout-align='center center', layout-padding) div(layout='row', flex='') p(flex='') Register as delegate md-menu-item - md-button.sign-message(ng-click='$ctrl.signVerify.openSignMessageDialog()') + md-button.sign-message(data-open-dialog='sign-message') div(layout='row', flex='') p(flex='') Sign message md-menu-item - md-button.verify-message(ng-click='$ctrl.signVerify.openVerifyMessageDialog()') + md-button.verify-message(data-open-dialog='verify-message') div(layout='row', flex='') p(flex='') Verify message diff --git a/src/liskNano.js b/src/liskNano.js index fe7d8037f..63834f296 100644 --- a/src/liskNano.js +++ b/src/liskNano.js @@ -30,7 +30,6 @@ import './services/api/forgingApi'; import './services/api/peers'; import './services/dialog'; import './services/lsk'; -import './services/signVerify'; import './services/sync'; import './services/notification'; diff --git a/src/services/dialog.js b/src/services/dialog.js index b5aebb8c3..bed6c218b 100644 --- a/src/services/dialog.js +++ b/src/services/dialog.js @@ -4,7 +4,7 @@ * @module app * @submodule dialog */ -app.factory('dialog', ($mdDialog, $mdToast) => ({ +app.factory('dialog', ($mdDialog, $mdToast, $mdMedia) => ({ /** * Uses mdToast to show a toast with error theme @@ -114,13 +114,14 @@ app.factory('dialog', ($mdDialog, $mdToast) => ({ return $mdDialog.show({ parent: angular.element(document.body), template: ` - + <${component} ${attrs} close-dialog="closeDialog()" > `, locals: { option: options, }, + fullscreen: $mdMedia('xs'), controller: modalController, }); }, diff --git a/src/services/signVerify.js b/src/services/signVerify.js deleted file mode 100644 index 09aaa740b..000000000 --- a/src/services/signVerify.js +++ /dev/null @@ -1,36 +0,0 @@ -app.factory('signVerify', ($mdDialog, $mdMedia) => ({ - /** - * Uses mdDialog to show signMessage form directive. - * - * @todo This should be replaced by a general dialog service - * which can compile any child component in the dialog - * @returns {promise} mdDialog instance promise - */ - openSignMessageDialog() { - return $mdDialog.show({ - template: - '' + - '' + - '', - fullscreen: ($mdMedia('sm') || $mdMedia('xs')), - }); - }, - - /** - * Uses mdDialog to show verifyMessage form directive. - * - * @todo This should be replaced by a general dialog service - * which can compile any child component in the dialog - * @returns {promise} mdDialog instance promise - */ - openVerifyMessageDialog() { - return $mdDialog.show({ - template: - '' + - '' + - '', - fullscreen: ($mdMedia('sm') || $mdMedia('xs')), - }); - }, -})); - diff --git a/test/components/delegates/delegates.spec.js b/test/components/delegates/delegates.spec.js index e6607be8f..fdec0cde3 100644 --- a/test/components/delegates/delegates.spec.js +++ b/test/components/delegates/delegates.spec.js @@ -195,7 +195,7 @@ describe('delegates component controller', () => { describe('openVoteDialog()', () => { it('opens vote dialog', () => { - const spy = sinon.spy(controller.$mdDialog, 'show'); + const spy = sinon.spy(controller.dialog, 'modal'); controller.openVoteDialog(); expect(spy).to.have.been.calledWith(); }); diff --git a/test/services/signVerify.spec.js b/test/services/signVerify.spec.js deleted file mode 100644 index d3d66da67..000000000 --- a/test/services/signVerify.spec.js +++ /dev/null @@ -1,44 +0,0 @@ -const chai = require('chai'); -const sinon = require('sinon'); -const sinonChai = require('sinon-chai'); - -chai.use(sinonChai); - -describe('Factory: signVerify', () => { - let signVerify; - let $mdDialog; - - beforeEach(angular.mock.module('app')); - - beforeEach(inject((_signVerify_, _$mdDialog_) => { - signVerify = _signVerify_; - $mdDialog = _$mdDialog_; - })); - - describe('openSignMessageDialog(account, passphrase)', () => { - let mock; - - beforeEach(() => { - mock = sinon.mock($mdDialog); - mock.expects('show').withArgs(); - }); - - it('opens a $mdDialog', () => { - signVerify.openSignMessageDialog(); - }); - }); - - describe('openVerifyMessageDialog()', () => { - let mock; - - beforeEach(() => { - mock = sinon.mock($mdDialog); - mock.expects('show').withArgs(); - }); - - it('opens a $mdDialog', () => { - signVerify.openVerifyMessageDialog(); - }); - }); -}); - diff --git a/test/test.js b/test/test.js index 37e84aa9f..2849ef44e 100644 --- a/test/test.js +++ b/test/test.js @@ -23,7 +23,6 @@ require('./services/api/forgingApi.spec'); require('./services/api/peers.spec'); require('./services/lsk.spec'); require('./services/passphrase.spec'); -require('./services/signVerify.spec'); require('./services/notification.spec'); require('./run.spec'); From 8d7a6bf5571fe60a9dfca4b953682d7373178b0f Mon Sep 17 00:00:00 2001 From: Vit Stanislav Date: Fri, 9 Jun 2017 09:20:24 +0200 Subject: [PATCH 06/52] Remove extra gray in vote dialog - Closes #330 --- src/components/delegates/vote.pug | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/delegates/vote.pug b/src/components/delegates/vote.pug index 350b667c6..9be065eaf 100644 --- a/src/components/delegates/vote.pug +++ b/src/components/delegates/vote.pug @@ -14,7 +14,6 @@ div.dialog-vote(aria-label='Vote for delegates') md-chip-template {{$chip.username}} md-autocomplete(flex, required, md-input-minlength='2', md-no-cache='false', md-selected-item='$ctrl.selectedVoteDelegate', md-search-text='$ctrl.voteSearchText', md-items='delegate in $ctrl.delegateApi.voteAutocomplete($ctrl.voteSearchText, $ctrl.votedDict)', md-item-text='delegate.username', md-require-match, placeholder='Search by username') span(md-highlight-text='$ctrl.voteSearchText') {{delegate.username}} - md-divider(ng-if='$ctrl.voteList.length && $ctrl.unvoteList.length') div h4 Remove vote from md-chips(ng-model='$ctrl.unvoteList', md-require-match='true', md-max-chips='33') From c488e403618e60a71b7f7c944c4ccb30443895b5 Mon Sep 17 00:00:00 2001 From: reyraa Date: Fri, 9 Jun 2017 09:54:26 +0200 Subject: [PATCH 07/52] Adapt e2e tests with the new step in second passphrase modal --- features/menu.feature | 1 + src/components/main/secondPass.pug | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/features/menu.feature b/features/menu.feature index 2b24d4e92..646ff83e8 100644 --- a/features/menu.feature +++ b/features/menu.feature @@ -2,6 +2,7 @@ Feature: Top right menu Scenario: should allow to set 2nd passphrase Given I'm logged in as "second passphrase candidate" When I click "register second passphrase" in main menu + And I click "second pass next" And I 250 times move mouse randomly And I remember passphrase, click "yes its save button", fill in missing word And I click "ok button" diff --git a/src/components/main/secondPass.pug b/src/components/main/secondPass.pug index 77a46fb01..d1042ec3e 100644 --- a/src/components/main/secondPass.pug +++ b/src/components/main/secondPass.pug @@ -19,6 +19,6 @@ div.dialog-second(aria-label='Generate a second passphrase for your account', da md-dialog-actions(layout='row', data-ng-if='$ctrl.step === 0') md-button.md-secondary(ng-disabled='$ctrl.loading', ng-click='cancel()') Cancel span(flex) - md-button.md-raised.md-primary.submit-button(ng-click='$ctrl.step = 1') Next + md-button.md-raised.md-primary.submit-button.second-pass-next(ng-click='$ctrl.step = 1') Next section(data-ng-if='$ctrl.step === 1') passphrase(data-on-save='onSave', data-target='second-pass', data-ok-button-label='Register') From 61af4bbb1451703a25196cb0f6ded9516def4591 Mon Sep 17 00:00:00 2001 From: Vit Stanislav Date: Fri, 9 Jun 2017 09:59:50 +0200 Subject: [PATCH 08/52] Don't show a fee on new account registration - Closes #363 --- src/components/main/secondPass.pug | 2 +- src/components/passphrase/passphrase.js | 1 + src/components/passphrase/savePassphrase.js | 1 + src/components/passphrase/savePassphrase.pug | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/main/secondPass.pug b/src/components/main/secondPass.pug index 67cb35fc7..4436d5c48 100644 --- a/src/components/main/secondPass.pug +++ b/src/components/main/secondPass.pug @@ -3,4 +3,4 @@ div.dialog-second(aria-label='Generate a second passphrase for your account') md-toolbar .md-toolbar-tools h2 Generate a second passphrase of your account - passphrase(data-on-save='onSave', data-target='second-pass', data-ok-button-label='Register') + passphrase(data-on-save='onSave', data-target='second-pass', data-ok-button-label='Register', data-fee='25') diff --git a/src/components/passphrase/passphrase.js b/src/components/passphrase/passphrase.js index 83823d346..82385d430 100644 --- a/src/components/passphrase/passphrase.js +++ b/src/components/passphrase/passphrase.js @@ -30,6 +30,7 @@ app.directive('passphrase', ($rootScope, $document, Passphrase, dialog, $mdMedia dialog.modal('save-passphrase', { passphrase, label, + fee: attrs.fee, 'on-save': scope.onSave, }).then(() => { $timeout(() => { diff --git a/src/components/passphrase/savePassphrase.js b/src/components/passphrase/savePassphrase.js index 677b2dada..de0e6c64d 100644 --- a/src/components/passphrase/savePassphrase.js +++ b/src/components/passphrase/savePassphrase.js @@ -5,6 +5,7 @@ app.component('savePassphrase', { bindings: { passphrase: '<', label: '<', + fee: '<', onSave: '=', }, controller: class savePassphrase { diff --git a/src/components/passphrase/savePassphrase.pug b/src/components/passphrase/savePassphrase.pug index 5173df69e..0bc0709d8 100644 --- a/src/components/passphrase/savePassphrase.pug +++ b/src/components/passphrase/savePassphrase.pug @@ -30,7 +30,7 @@ form(ng-if='$ctrl.step === 2') md-input-container.md-block(md-is-error='!$ctrl.missing_ok') label Enter the missing word input(ng-model='$ctrl.missing_input', md-autofocus, aria-label='Enter the missing word') - div.fee Fee: 25 LSK + div.fee(ng-if='$ctrl.fee') Fee: {{$ctrl.fee}} LSK md-dialog-actions(layout='row') md-button.back-button(ng-click="$ctrl.back()") Back span(flex) From 83a5109c108956d6b0fb1b9bfbc228672da4d729 Mon Sep 17 00:00:00 2001 From: reyraa Date: Fri, 9 Jun 2017 10:56:09 +0200 Subject: [PATCH 09/52] Hide modal in cancel method --- src/components/delegateRegistration/delegateRegistration.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/delegateRegistration/delegateRegistration.js b/src/components/delegateRegistration/delegateRegistration.js index f4327d1d3..1018def89 100644 --- a/src/components/delegateRegistration/delegateRegistration.js +++ b/src/components/delegateRegistration/delegateRegistration.js @@ -74,7 +74,7 @@ app.component('delegateRegistration', { */ $scope.cancel = (form) => { $scope.reset(form); - // $mdDialog.hide(); + $mdDialog.hide(); }; }, }); From 6bccd8f40750694a1a485fb221af3694ea2c0b8e Mon Sep 17 00:00:00 2001 From: isabello Date: Fri, 9 Jun 2017 11:00:13 +0200 Subject: [PATCH 10/52] Restore karma-jenkins-reporter in karma.conf.js --- karma.conf.js | 1 + 1 file changed, 1 insertion(+) diff --git a/karma.conf.js b/karma.conf.js index 1d68bebf6..dbbeaf088 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -112,6 +112,7 @@ module.exports = function (config) { 'karma-chrome-launcher', 'karma-ng-html2js-preprocessor', 'karma-mocha-reporter', + 'karma-jenkins-reporter', 'karma-coverage', 'karma-coveralls', 'karma-phantomjs-launcher', From 9455c57e470296f41e3d23cc88109ecad9555431 Mon Sep 17 00:00:00 2001 From: Vit Stanislav Date: Fri, 9 Jun 2017 11:03:52 +0200 Subject: [PATCH 11/52] Fix custom save buttons in save passphrase dialog --- src/components/passphrase/passphrase.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/passphrase/passphrase.js b/src/components/passphrase/passphrase.js index 82385d430..723aa8b02 100644 --- a/src/components/passphrase/passphrase.js +++ b/src/components/passphrase/passphrase.js @@ -25,7 +25,7 @@ app.directive('passphrase', ($rootScope, $document, Passphrase, dialog, $mdMedia */ const generateAndDoubleCheck = (seed) => { const passphrase = Passphrase.generatePassPhrase(seed); - const label = 'Save'; + const label = attrs.okButtonLabel || 'Save'; dialog.modal('save-passphrase', { passphrase, From 2a1adf6c1cca61b693fda4803d1d3b30fe12f09c Mon Sep 17 00:00:00 2001 From: Vit Stanislav Date: Fri, 9 Jun 2017 11:23:20 +0200 Subject: [PATCH 12/52] Fix second passphrase registration fee 25 -> 5 LSK --- src/components/main/secondPass.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/main/secondPass.pug b/src/components/main/secondPass.pug index 4436d5c48..12a825234 100644 --- a/src/components/main/secondPass.pug +++ b/src/components/main/secondPass.pug @@ -3,4 +3,4 @@ div.dialog-second(aria-label='Generate a second passphrase for your account') md-toolbar .md-toolbar-tools h2 Generate a second passphrase of your account - passphrase(data-on-save='onSave', data-target='second-pass', data-ok-button-label='Register', data-fee='25') + passphrase(data-on-save='onSave', data-target='second-pass', data-ok-button-label='Register', data-fee='5') From 74dfbea731d77611e5ea4f81ec8657812a5fe713 Mon Sep 17 00:00:00 2001 From: yashar Date: Fri, 9 Jun 2017 14:23:50 +0430 Subject: [PATCH 13/52] Increase numbers can be shown after floating point to 8 numbers --- src/components/lsk/lsk.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/lsk/lsk.pug b/src/components/lsk/lsk.pug index 15ebd9aa8..30e3075ce 100644 --- a/src/components/lsk/lsk.pug +++ b/src/components/lsk/lsk.pug @@ -1,2 +1,2 @@ -span(ng-bind='$ctrl.amount | lsk | number:2') +span(ng-bind='$ctrl.amount | lsk | number:8') span(ng-show='$ctrl.append')= ' LSK' From 4fc35d644424ca21f99b5d72784ad4f47280e02d Mon Sep 17 00:00:00 2001 From: yashar Date: Fri, 9 Jun 2017 14:38:25 +0430 Subject: [PATCH 14/52] Increase numbers can be shown after floating point to 8 numbers in forging companent --- src/components/forging/forging.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/forging/forging.pug b/src/components/forging/forging.pug index 07be2b338..3d7734c69 100644 --- a/src/components/forging/forging.pug +++ b/src/components/forging/forging.pug @@ -67,7 +67,7 @@ md-card.offline-hide th(md-column) Reward tbody(md-body, infinite-scroll='$ctrl.loadMoreBlocks()', infinite-scroll-distance='1') tr(md-row, ng-repeat='block in $ctrl.blocks') - td(md-cell data-title='tableBlocks.cols.height', sortable="'height'") {{block.height | number:2}} + td(md-cell data-title='tableBlocks.cols.height', sortable="'height'") {{block.height | number:8}} td(md-cell data-title='tableBlocks.cols.blockId', ng-show='$ctrl.showAllColumns') {{block.id}} td(md-cell data-title='tableBlocks.cols.timestamp', sortable="'timestamp'") span(ng-show='block.timestamp > 0') From 42c0d0b92ba07513e02c6b9e5d64985bcf2bc685 Mon Sep 17 00:00:00 2001 From: reyraa Date: Fri, 9 Jun 2017 12:20:45 +0200 Subject: [PATCH 15/52] Use dialog service for closing the modal and remove mdDialog from dependency list --- .../delegateRegistration/delegateRegistration.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/components/delegateRegistration/delegateRegistration.js b/src/components/delegateRegistration/delegateRegistration.js index 1018def89..22e9ae3d7 100644 --- a/src/components/delegateRegistration/delegateRegistration.js +++ b/src/components/delegateRegistration/delegateRegistration.js @@ -8,7 +8,10 @@ import './delegateRegistration.less'; */ app.component('delegateRegistration', { template: require('./delegateRegistration.pug')(), - controller($scope, $mdDialog, delegateApi, Account, dialog, $rootScope) { + bindings: { + closeDialog: '&', + }, + controller($scope, delegateApi, Account, dialog, $rootScope) { function checkPendingRegistration() { delegateApi.getDelegate({ username: $scope.username, @@ -74,7 +77,7 @@ app.component('delegateRegistration', { */ $scope.cancel = (form) => { $scope.reset(form); - $mdDialog.hide(); + this.closeDialog(); }; }, }); From 53b7212b825dde618978b5f1023ddcf88d3db6c0 Mon Sep 17 00:00:00 2001 From: reyraa Date: Fri, 9 Jun 2017 12:31:02 +0200 Subject: [PATCH 16/52] Minor fixings --- src/components/delegateRegistration/delegateRegistration.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/delegateRegistration/delegateRegistration.js b/src/components/delegateRegistration/delegateRegistration.js index 22e9ae3d7..a1d230e57 100644 --- a/src/components/delegateRegistration/delegateRegistration.js +++ b/src/components/delegateRegistration/delegateRegistration.js @@ -45,7 +45,7 @@ app.component('delegateRegistration', { checkPendingRegistration(); }); $scope.reset(form); - $mdDialog.hide(); + this.closeDialog(); }); }) .catch((error) => { From 8abaa97ac35e6f26523efe7bf84b084271dadd07 Mon Sep 17 00:00:00 2001 From: isabello Date: Fri, 9 Jun 2017 12:45:03 +0200 Subject: [PATCH 17/52] Update karma preprocessor --- karma.conf.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/karma.conf.js b/karma.conf.js index dbbeaf088..2683b57bb 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -74,7 +74,7 @@ module.exports = function (config) { autoWatch: opts.live, ngHtml2JsPreprocessor: { - stripPrefix: 'app/components/', + stripPrefix: 'src/app/components/', moduleName: 'my.templates', }, From a9fd0ff3d93db4f219af38b41a09aec01de22d40 Mon Sep 17 00:00:00 2001 From: isabello Date: Fri, 9 Jun 2017 13:00:28 +0200 Subject: [PATCH 18/52] Crank up logging for karma --- karma.conf.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/karma.conf.js b/karma.conf.js index 2683b57bb..8159ab26e 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -15,7 +15,6 @@ preprocessors[testLibs] = ['webpack']; preprocessors[test] = ['webpack']; const opts = { - onTravis: process.env.ON_TRAVIS, onJenkins: process.env.ON_JENKINS, live: process.env.LIVE, }; @@ -44,7 +43,7 @@ module.exports = function (config) { // Rest results reporter to use // Possible values: 'dots', 'progress' // Available reporters: https://npmjs.org/browse/keyword/karma-reporter - reporters: ['coverage', 'mocha'].concat(opts.onTravis ? ['coveralls'] : []).concat(opts.onJenkins ? ['coveralls'] : []), + reporters: ['coverage', 'mocha'].concat(opts.onJenkins ? ['coveralls'] : []), preprocessors, @@ -68,7 +67,7 @@ module.exports = function (config) { // config.LOG_WARN // config.LOG_INFO // config.LOG_DEBUG - logLevel: config.LOG_INFO, + logLevel: config.LOG_DEBUG, // Enable / disable watching file and executing tests whenever any file changes autoWatch: opts.live, @@ -82,9 +81,6 @@ module.exports = function (config) { reporters: [{ type: 'text', dir: 'coverage/', - }, { - type: opts.onTravis ? 'lcov' : 'html', - dir: 'coverage/', }, { type: opts.onJenkins ? 'lcov' : 'html', dir: 'coverage/', From b5b5d03b2dbf1e7727dbcd3d5ff3e4f546aec24c Mon Sep 17 00:00:00 2001 From: isabello Date: Fri, 9 Jun 2017 14:49:24 +0200 Subject: [PATCH 19/52] Reduce logging --- Jenkinsfile | 8 +++++--- karma.conf.js | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 3b480cf43..bd89bd644 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,7 +1,9 @@ -environment { - ON_JENKINS = 'TRUE' -} + node('lisk-nano-01'){ + environment { + ON_JENKINS = 'true' + CI_BRANCH = '$BRANCH_NAME' + } lock(resource: "lisk-nano-01", inversePrecedence: true) { stage ('Cleanup Orphaned Processes') { try { diff --git a/karma.conf.js b/karma.conf.js index 8159ab26e..60312b3bc 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -67,7 +67,7 @@ module.exports = function (config) { // config.LOG_WARN // config.LOG_INFO // config.LOG_DEBUG - logLevel: config.LOG_DEBUG, + logLevel: config.LOG_INFO, // Enable / disable watching file and executing tests whenever any file changes autoWatch: opts.live, From c6a77fb69c6d553eca3114f1ad8dfdba894df390 Mon Sep 17 00:00:00 2001 From: Vit Stanislav Date: Fri, 9 Jun 2017 14:56:32 +0200 Subject: [PATCH 20/52] Hide "Load More" button in forging tab - Closes #367 --- src/components/forging/forging.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/forging/forging.pug b/src/components/forging/forging.pug index 8f8884783..f9ecca46e 100644 --- a/src/components/forging/forging.pug +++ b/src/components/forging/forging.pug @@ -76,4 +76,4 @@ md-card.offline-hide td(md-cell data-title='tableBlocks.cols.totalFee', sortable="'totalFee'") {{block.totalFee | lsk}} td(md-cell data-title='tableBlocks.cols.reward', sortable="'reward'") {{block.reward | lsk}} td.width-80(md-cell data-title="''") - md-button.more(ng-show='$ctrl.moreBlocksExist', ng-disabled='!$ctrl.blocksLoaded', ng-click='$ctrl.loadMoreBlocks()') Load More + md-button.more(ng-show='$ctrl.moreBlocksExist && $ctrl.blocksLoaded', ng-click='$ctrl.loadMoreBlocks()') Load More From 5651e4ca67ee6c552849a5038d961e5cd663cfaf Mon Sep 17 00:00:00 2001 From: Vit Stanislav Date: Fri, 9 Jun 2017 15:33:06 +0200 Subject: [PATCH 21/52] Connect to nodes with ssl --- src/components/login/login.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/login/login.js b/src/components/login/login.js index d87b564a2..198f309c8 100644 --- a/src/components/login/login.js +++ b/src/components/login/login.js @@ -25,6 +25,8 @@ app.component('login', { this.networks = [{ name: 'Mainnet', + ssl: true, + port: 443, }, { name: 'Testnet', testnet: true, From d18533f8b877f927ffcdbaca0077e0aa8558cc47 Mon Sep 17 00:00:00 2001 From: Vit Stanislav Date: Fri, 9 Jun 2017 15:33:45 +0200 Subject: [PATCH 22/52] Update lisk-js dependency --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2cae092c6..bb24d117b 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "debug": "=2.2.0", "jasmine-spec-reporter": "=3.3.0", "jquery": "=2.2.4", - "lisk-js": "=0.4.1", + "lisk-js": "=0.4.2", "lodash": "=4.16.4", "moment": "=2.15.1", "ng-infinite-scroll": "=1.3.0", From b52759199c28f9f7d632131159148fd53b6638ee Mon Sep 17 00:00:00 2001 From: yashar Date: Fri, 9 Jun 2017 18:24:23 +0430 Subject: [PATCH 23/52] Create liskNumber filter to conform all numbers with comma --- src/filters/liskNumber.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/filters/liskNumber.js diff --git a/src/filters/liskNumber.js b/src/filters/liskNumber.js new file mode 100644 index 000000000..a9c0e325f --- /dev/null +++ b/src/filters/liskNumber.js @@ -0,0 +1,15 @@ +/** + * This filter format numbers and add comma sperator to them + * + * @module app + */ +app.filter('liskNumber', ($filter) => { + const numberFilter = $filter('number'); + return (input) => { + const temp = input.toString().split('.'); + if (temp.length === 1) { + return numberFilter(temp[0]); + } + return `${numberFilter(temp[0])}.${temp[1]}`; + }; +}); From 253a37bfebc9c44275ff7264908094fc443d21c3 Mon Sep 17 00:00:00 2001 From: yashar Date: Fri, 9 Jun 2017 18:26:16 +0430 Subject: [PATCH 24/52] Use liskNumber in lsk component and forging component --- src/components/forging/forging.pug | 2 +- src/components/lsk/lsk.pug | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/forging/forging.pug b/src/components/forging/forging.pug index 3d7734c69..896b8606e 100644 --- a/src/components/forging/forging.pug +++ b/src/components/forging/forging.pug @@ -67,7 +67,7 @@ md-card.offline-hide th(md-column) Reward tbody(md-body, infinite-scroll='$ctrl.loadMoreBlocks()', infinite-scroll-distance='1') tr(md-row, ng-repeat='block in $ctrl.blocks') - td(md-cell data-title='tableBlocks.cols.height', sortable="'height'") {{block.height | number:8}} + td(md-cell data-title='tableBlocks.cols.height', sortable="'height'") {{block.height | liskNumber}} td(md-cell data-title='tableBlocks.cols.blockId', ng-show='$ctrl.showAllColumns') {{block.id}} td(md-cell data-title='tableBlocks.cols.timestamp', sortable="'timestamp'") span(ng-show='block.timestamp > 0') diff --git a/src/components/lsk/lsk.pug b/src/components/lsk/lsk.pug index 30e3075ce..0a1658113 100644 --- a/src/components/lsk/lsk.pug +++ b/src/components/lsk/lsk.pug @@ -1,2 +1,2 @@ -span(ng-bind='$ctrl.amount | lsk | number:8') +span(ng-bind='$ctrl.amount | lsk | liskNumber') span(ng-show='$ctrl.append')= ' LSK' From 4850629db9175ea1ac5b479d23b53fa03e051558 Mon Sep 17 00:00:00 2001 From: isabello Date: Fri, 9 Jun 2017 15:56:38 +0200 Subject: [PATCH 25/52] Remove env and CI related exports --- Jenkinsfile | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index bd89bd644..2b7afa324 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,9 +1,4 @@ - node('lisk-nano-01'){ - environment { - ON_JENKINS = 'true' - CI_BRANCH = '$BRANCH_NAME' - } lock(resource: "lisk-nano-01", inversePrecedence: true) { stage ('Cleanup Orphaned Processes') { try { @@ -72,6 +67,7 @@ node('lisk-nano-01'){ stage ('Run Tests') { try { sh ''' + export ON_JENKINS=true # Run test cd $WORKSPACE npm run test From 909ab5a9564f8293ac74d477ef0916504078d170 Mon Sep 17 00:00:00 2001 From: yashar Date: Fri, 9 Jun 2017 18:27:01 +0430 Subject: [PATCH 26/52] Add liskNumber filter to loskNano.js --- src/liskNano.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/liskNano.js b/src/liskNano.js index fe7d8037f..e2391e734 100644 --- a/src/liskNano.js +++ b/src/liskNano.js @@ -35,6 +35,7 @@ import './services/sync'; import './services/notification'; import './filters/lsk'; +import './filters/liskNumber'; import './run'; import './states'; From e7fdea1e93b61a2f5f08b271242161506bf8ecd1 Mon Sep 17 00:00:00 2001 From: reyraa Date: Fri, 9 Jun 2017 16:07:52 +0200 Subject: [PATCH 27/52] Separate new account component and show in modal --- src/components/login/login.js | 12 -------- src/components/login/login.pug | 3 +- src/components/login/newAccount.js | 47 +++++++++++++++++++++++++++++ src/components/login/newAccount.pug | 24 +++++++++++++++ src/liskNano.js | 1 + 5 files changed, 74 insertions(+), 13 deletions(-) create mode 100644 src/components/login/newAccount.js create mode 100644 src/components/login/newAccount.pug diff --git a/src/components/login/login.js b/src/components/login/login.js index d87b564a2..2bd4ecc2a 100644 --- a/src/components/login/login.js +++ b/src/components/login/login.js @@ -56,14 +56,6 @@ app.component('login', { this.$scope.$watch(() => this.$mdMedia('xs') || this.$mdMedia('sm'), (wantsFullScreen) => { this.$scope.customFullscreen = wantsFullScreen === true; }); - - this.$scope.onSave = (primaryPass) => { - this.passConfirmSubmit(primaryPass); - }; - - this.$scope.$on('onSignupCancel', () => { - this.generatingNewPassphrase = false; - }); } /** @@ -90,10 +82,6 @@ app.component('login', { } } - generatePassphrase() { - this.generatingNewPassphrase = true; - } - devTestAccount() { const peerStack = this.$location.search().peerStack || this.$cookies.get('peerStack'); if (peerStack === 'localhost') { diff --git a/src/components/login/login.pug b/src/components/login/login.pug index 43d06012b..77337a76f 100644 --- a/src/components/login/login.pug +++ b/src/components/login/login.pug @@ -16,6 +16,7 @@ md-card md-checkbox.md-primary(ng-model="$ctrl.show_passphrase", aria-label="Show passphrase") Show passphrase md-content(layout='row', layout-align='center center') // md-button(ng-disabled='$ctrl.generatingNewPassphrase', ng-click='$ctrl.devTestAccount()') Dev Test Account - md-button.md-primary.new-account-button(ng-disabled='$ctrl.random || $ctrl.generatingNewPassphrase', ng-click='$ctrl.generatePassphrase()') NEW ACCOUNT + md-button.md-primary.new-account-button(ng-disabled='$ctrl.random || $ctrl.generatingNewPassphrase', + data-open-dialog='new-account', data-options='{network: $ctrl.network}') NEW ACCOUNT md-button.md-raised.md-primary.login-button(md-autofocus, ng-disabled='($ctrl.valid != undefined && $ctrl.valid !== 1) || $root.loggingIn', type='submit') Login passphrase(ng-if='$ctrl.generatingNewPassphrase', data-on-save='onSave', data-target='primary-pass', data-ok-button-label='Login') diff --git a/src/components/login/newAccount.js b/src/components/login/newAccount.js new file mode 100644 index 000000000..40a115daa --- /dev/null +++ b/src/components/login/newAccount.js @@ -0,0 +1,47 @@ +/** + * The directive to show the second passphrase form and register it using AccountApi + * + * @module app + * @submodule SetSecondPassCtrl + */ +app.component('newAccount', { + bindings: { + network: '=', + closeDialog: '&', + }, + template: require('./newAccount.pug')(), + controller($scope, Account, $rootScope, $cookies, + Passphrase, $state, Peers) { + /** + * We call this after second passphrase is generated. + * Shows an alert with appropriate message in case the request fails. + * + * @param {String} passphrase - The validated passphrase to register as primary passphrase + */ + $scope.passConfirmSubmit = (passphrase) => { + $rootScope.loggingIn = true; + $scope.$emit('showLoadingBar'); + Peers.setActive(this.network).then(() => { + $rootScope.loggingIn = false; + $scope.$emit('hideLoadingBar'); + if (Peers.online) { + Account.set({ + passphrase, + network: this.network, + }); + $cookies.put('network', JSON.stringify(this.network)); + $state.go($rootScope.landingUrl || 'main.transactions'); + } + }); + }; + + $scope.onSave = (passphrase) => { + $scope.passConfirmSubmit(passphrase); + }; + + $scope.cancel = () => { + this.closeDialog(); + }; + }, + // controllerAs: 'md', +}); diff --git a/src/components/login/newAccount.pug b/src/components/login/newAccount.pug new file mode 100644 index 000000000..2af56cc04 --- /dev/null +++ b/src/components/login/newAccount.pug @@ -0,0 +1,24 @@ +div.dialog-primary(aria-label='Generate a primary passphrase for a new account', data-ng-init='$ctrl.step = 0') + md-toolbar + .md-toolbar-tools + h2 New Account + span(flex='') + md-button.md-icon-button(ng-click='cancel()', aria-label='Close dialog') + i.material-icons close + div(layout='row', layout-padding, layout-align="left center", data-ng-if='$ctrl.step === 0') + div(layout-margin) + i.material-icons info + p + span Please click Next, then move around your mouse randomly to generate a random passphrase. + br + br + span Note: After registration completes, your passphrase will be required for loging in to your account. +
+ span This passphrase is not recoverable and if you lose it, you will lose access to your account forever. Please keep it safe! + + md-dialog-actions(layout='row', data-ng-if='$ctrl.step === 0') + md-button.md-secondary(ng-disabled='$ctrl.loading', ng-click='cancel()') Cancel + span(flex) + md-button.md-raised.md-primary.submit-button.next-button(ng-click='$ctrl.step = 1') Next + section(data-ng-if='$ctrl.step === 1') + passphrase(data-on-save='onSave', data-label='Login') diff --git a/src/liskNano.js b/src/liskNano.js index fe7d8037f..35cba66bb 100644 --- a/src/liskNano.js +++ b/src/liskNano.js @@ -7,6 +7,7 @@ import './components/forging/forging'; import './components/header/header'; import './components/loadingBar/loadingBar'; import './components/login/login'; +import './components/login/newAccount'; import './components/lsk/lsk'; import './components/main/main'; import './components/main/secondPass'; From 47e9a0c7545f5e12603a9ff60d95eb67fee8a36e Mon Sep 17 00:00:00 2001 From: reyraa Date: Fri, 9 Jun 2017 16:10:30 +0200 Subject: [PATCH 28/52] -Remove obsolete event emission. - Remove unused dependecy injections. - Pass confirm button label. --- src/components/main/secondPass.pug | 4 ++-- src/components/passphrase/passphrase.js | 12 ++---------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/components/main/secondPass.pug b/src/components/main/secondPass.pug index d1042ec3e..0da1b80b4 100644 --- a/src/components/main/secondPass.pug +++ b/src/components/main/secondPass.pug @@ -19,6 +19,6 @@ div.dialog-second(aria-label='Generate a second passphrase for your account', da md-dialog-actions(layout='row', data-ng-if='$ctrl.step === 0') md-button.md-secondary(ng-disabled='$ctrl.loading', ng-click='cancel()') Cancel span(flex) - md-button.md-raised.md-primary.submit-button.second-pass-next(ng-click='$ctrl.step = 1') Next + md-button.md-raised.md-primary.submit-button.next-button(ng-click='$ctrl.step = 1') Next section(data-ng-if='$ctrl.step === 1') - passphrase(data-on-save='onSave', data-target='second-pass', data-ok-button-label='Register') + passphrase(data-on-save='onSave', data-label='Register') diff --git a/src/components/passphrase/passphrase.js b/src/components/passphrase/passphrase.js index 83823d346..96af408bd 100644 --- a/src/components/passphrase/passphrase.js +++ b/src/components/passphrase/passphrase.js @@ -1,6 +1,6 @@ import './passphrase.less'; -app.directive('passphrase', ($rootScope, $document, Passphrase, dialog, $mdMedia, $timeout) => { +app.directive('passphrase', ($rootScope, $document, Passphrase, dialog) => { /* eslint no-param-reassign: ["error", { "props": false }] */ const PassphraseLink = function (scope, element, attrs) { const bindEvents = (listener) => { @@ -25,19 +25,11 @@ app.directive('passphrase', ($rootScope, $document, Passphrase, dialog, $mdMedia */ const generateAndDoubleCheck = (seed) => { const passphrase = Passphrase.generatePassPhrase(seed); - const label = 'Save'; dialog.modal('save-passphrase', { passphrase, - label, + label: attrs.label, 'on-save': scope.onSave, - }).then(() => { - $timeout(() => { - $rootScope.$broadcast('onAfterSignup', { - passphrase, - target: attrs.target, - }); - }, 100); }); }; From 6fe9183bb4ab56070fe8e518f482101cb5bea986 Mon Sep 17 00:00:00 2001 From: reyraa Date: Fri, 9 Jun 2017 16:11:34 +0200 Subject: [PATCH 29/52] Use a uniform class name for next button --- features/login.feature | 1 + 1 file changed, 1 insertion(+) diff --git a/features/login.feature b/features/login.feature index ec7916d4a..8e8986634 100644 --- a/features/login.feature +++ b/features/login.feature @@ -14,6 +14,7 @@ Feature: Login page Scenario: should allow to create a new account Given I'm on login page When I click "new account button" + And I click on "next button" And I 250 times move mouse randomly And I remember passphrase, click "yes its save button", fill in missing word And I click "ok button" From 8c298b892e990d6ea5ea1b54328a5d0a7a8022f8 Mon Sep 17 00:00:00 2001 From: reyraa Date: Fri, 9 Jun 2017 16:12:21 +0200 Subject: [PATCH 30/52] Add unit and e2e test for newAccount component --- features/menu.feature | 2 +- test/components/login/login.spec.js | 13 +-- test/components/login/newAccount.spec.js | 103 +++++++++++++++++++++++ test/test.js | 1 + 4 files changed, 106 insertions(+), 13 deletions(-) create mode 100644 test/components/login/newAccount.spec.js diff --git a/features/menu.feature b/features/menu.feature index 646ff83e8..a821dedb2 100644 --- a/features/menu.feature +++ b/features/menu.feature @@ -2,7 +2,7 @@ Feature: Top right menu Scenario: should allow to set 2nd passphrase Given I'm logged in as "second passphrase candidate" When I click "register second passphrase" in main menu - And I click "second pass next" + And I click "next button" And I 250 times move mouse randomly And I remember passphrase, click "yes its save button", fill in missing word And I click "ok button" diff --git a/test/components/login/login.spec.js b/test/components/login/login.spec.js index 64645932a..f396d8951 100644 --- a/test/components/login/login.spec.js +++ b/test/components/login/login.spec.js @@ -61,21 +61,17 @@ describe('Login controller', () => { let testPassphrase; let account; let $cookies; - /* eslint-disable no-unused-vars */ - let $timeout; /* eslint-enable no-unused-vars */ let $q; beforeEach(inject((_$componentController_, _$rootScope_, _$state_, - _Passphrase_, _$cookies_, _$timeout_, _Account_, _$q_) => { + _Passphrase_, _$cookies_, _Account_, _$q_) => { $componentController = _$componentController_; $rootScope = _$rootScope_; $state = _$state_; Passphrase = _Passphrase_; account = _Account_; $cookies = _$cookies_; - /* eslint-disable no-unused-vars */ - $timeout = _$timeout_; /* eslint-enable no-unused-vars */ $q = _$q_; })); @@ -102,13 +98,6 @@ describe('Login controller', () => { }); }); - describe('generatePassphrase()', () => { - it('sets this.generatingNewPassphrase = true', () => { - controller.generatePassphrase(); - expect(controller.generatingNewPassphrase).to.equal(true); - }); - }); - describe('passConfirmSubmit()', () => { let peersMock; let deferred; diff --git a/test/components/login/newAccount.spec.js b/test/components/login/newAccount.spec.js new file mode 100644 index 000000000..21ed9dcb6 --- /dev/null +++ b/test/components/login/newAccount.spec.js @@ -0,0 +1,103 @@ +const chai = require('chai'); +const sinon = require('sinon'); +const sinonChai = require('sinon-chai'); + +const expect = chai.expect; +chai.use(sinonChai); +const VALID_PASSPHRASE = 'illegal symbol search tree deposit youth mixture craft amazing tool soon unit'; + +describe('newAccount component', () => { + let $compile; + let $rootScope; + let $scope; + let element; + + // Load the myApp module, which contains the directive + beforeEach(angular.mock.module('app')); + + // Store references to $rootScope and $compile + // so they are available to all tests in this describe block + beforeEach(inject((_$compile_, _$rootScope_) => { + // The injector unwraps the underscores (_) from around the parameter names when matching + $compile = _$compile_; + $rootScope = _$rootScope_; + })); + + beforeEach(() => { + $scope = $rootScope.$new(); + $scope.network = { + name: 'Mainnet', + }; + // Compile a piece of HTML containing the directive + element = $compile('')($scope); + $scope.$digest(); + }); + + const MODAL_TITLE_TEXT = 'New Account'; + it(`should contain a heading saying "${MODAL_TITLE_TEXT}"`, () => { + expect(element.find('.dialog-primary md-toolbar h2').text()).to.equal(MODAL_TITLE_TEXT); + }); + + const NEXT_BUTTON_TEXT = 'Next'; + it(`should contain a button titled "${NEXT_BUTTON_TEXT}"`, () => { + expect(element.find('.next-button span.ng-scope').text()).to.equal(NEXT_BUTTON_TEXT); + }); +}); + +describe('newAccount controller', () => { + beforeEach(angular.mock.module('app')); + + let $rootScope; + let $scope; + let $state; + let $componentController; + /* eslint-enable no-unused-vars */ + let $q; + let peers; + + beforeEach(inject((_$componentController_, _$rootScope_, _$state_, _$q_, _Peers_) => { + $componentController = _$componentController_; + $rootScope = _$rootScope_; + /* eslint-enable no-unused-vars */ + $q = _$q_; + peers = _Peers_; + $state = _$state_; + })); + + beforeEach(() => { + const scope = $rootScope.$new(); + $componentController('newAccount', scope, { + network: { name: 'Mainnet' }, + }); + scope.$digest(); + $scope = scope.$scope; + }); + + describe('passConfirmSubmit()', () => { + let peersMock; + let deferred; + + beforeEach(() => { + deferred = $q.defer(); + peersMock = sinon.mock(peers); + peersMock.expects('setActive').returns(deferred.promise); + peers.online = true; + }); + + it('redirects to main if passphrase is valid', () => { + const spy = sinon.spy($state, 'go'); + $scope.passConfirmSubmit(VALID_PASSPHRASE); + deferred.resolve(); + $scope.$apply(); + expect(spy).to.have.been.calledWith(); + }); + }); + + describe('onSave()', () => { + it('calls the passConfirmSubmit with the generated passphrase', () => { + const spy = sinon.spy($scope, 'passConfirmSubmit'); + $scope.onSave(VALID_PASSPHRASE); + expect(spy).to.have.been.calledWith(VALID_PASSPHRASE); + }); + }); +}); diff --git a/test/test.js b/test/test.js index 37e84aa9f..026124f90 100644 --- a/test/test.js +++ b/test/test.js @@ -4,6 +4,7 @@ require('./components/delegates/vote.spec'); require('./components/forging/forging.spec'); require('./components/header/header.spec'); require('./components/login/login.spec'); +require('./components/login/newAccount.spec'); require('./components/main/main.spec'); require('./components/main/secondPass.spec'); require('./components/passphrase/passphrase.spec'); From 58317de31480432e5aed933690d73e7756ad7a25 Mon Sep 17 00:00:00 2001 From: Vit Stanislav Date: Fri, 9 Jun 2017 17:12:31 +0200 Subject: [PATCH 31/52] Revert "Fix custom save buttons in save passphrase dialog" This reverts commit 9455c57e470296f41e3d23cc88109ecad9555431. --- src/components/passphrase/passphrase.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/passphrase/passphrase.js b/src/components/passphrase/passphrase.js index 723aa8b02..82385d430 100644 --- a/src/components/passphrase/passphrase.js +++ b/src/components/passphrase/passphrase.js @@ -25,7 +25,7 @@ app.directive('passphrase', ($rootScope, $document, Passphrase, dialog, $mdMedia */ const generateAndDoubleCheck = (seed) => { const passphrase = Passphrase.generatePassPhrase(seed); - const label = attrs.okButtonLabel || 'Save'; + const label = 'Save'; dialog.modal('save-passphrase', { passphrase, From 26e69d309efd3b1376e06aeea823e8702601bf9e Mon Sep 17 00:00:00 2001 From: reyraa Date: Fri, 9 Jun 2017 17:20:53 +0200 Subject: [PATCH 32/52] Fixes the usage of GM --- src/components/transactions/transactions.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/transactions/transactions.pug b/src/components/transactions/transactions.pug index 1fedbaef1..ccb3d82e1 100644 --- a/src/components/transactions/transactions.pug +++ b/src/components/transactions/transactions.pug @@ -32,7 +32,7 @@ md-card.offline-hide span.tx(ng-switch-when='7') Send Lisk from Blockchain Application span(ng-switch-default) span(ng-bind='transaction.senderId', ng-if='transaction.senderId !== $ctrl.account.get().address', - data-open-dialog='send', data-recipient-id='transaction.senderId', class='has-send-modal') + data-open-dialog='send', data-options='{"recipient-id": transaction.senderId}', class='has-send-modal') span(ng-bind='transaction.recipientId', ng-if='transaction.senderId === $ctrl.account.get().address', data-open-dialog='send', data-options='{"recipient-id": transaction.recipientId}', class='has-send-modal') md-tooltip(md-direction='top', md-delay='350') Send to this recipient From 99ddf40208d8b53a0a7f4899dfe91b0a72da9e26 Mon Sep 17 00:00:00 2001 From: yashar Date: Fri, 9 Jun 2017 20:03:55 +0430 Subject: [PATCH 33/52] Add md-primary class to the vote checkboxes in delegates components --- src/components/delegates/delegates.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/delegates/delegates.pug b/src/components/delegates/delegates.pug index 10d4f99b0..e03228e33 100644 --- a/src/components/delegates/delegates.pug +++ b/src/components/delegates/delegates.pug @@ -63,7 +63,7 @@ div.offline-hide td(md-cell, colspan='6') No delegates found tr(md-row, ng-repeat="delegate in ($ctrl.filteredDelegates = ($ctrl.delegates | filter : {username: search} )) | limitTo : $ctrl.delegatesDisplayedCount", ng-class='{"downvote": delegate.status.voted && !delegate.status.selected, "upvote": !delegate.status.voted && delegate.status.selected, "pending": delegate.status.pending}') td(md-cell) - md-checkbox(ng-model='delegate.status.selected', ng-change='$ctrl.selectionChange(delegate)', ng-disabled='delegate.status.pending', aria-label='delegate selected for voting') + md-checkbox.md-primary(ng-model='delegate.status.selected', ng-change='$ctrl.selectionChange(delegate)', ng-disabled='delegate.status.pending', aria-label='delegate selected for voting') td(md-cell, ng-bind='delegate.rank') td(md-cell, ng-bind='delegate.username') td(md-cell, ng-bind='delegate.address') From 50328b70fa750a2646393e10dfc6b87928aaab70 Mon Sep 17 00:00:00 2001 From: yashar Date: Fri, 9 Jun 2017 20:04:48 +0430 Subject: [PATCH 34/52] Highlight voted delegate row in blue --- src/components/delegates/delegates.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/delegates/delegates.less b/src/components/delegates/delegates.less index 1ecd6fd3e..fba4d9a38 100644 --- a/src/components/delegates/delegates.less +++ b/src/components/delegates/delegates.less @@ -34,7 +34,7 @@ delegates { background-color: rgb(255, 228, 220); } .pending { - background-color: #eaeae9; + background-color: rgb(204, 231, 236); } md-card-title { From 1b14fc526a18df553be2f8643522640be5428959 Mon Sep 17 00:00:00 2001 From: yashar Date: Fri, 9 Jun 2017 20:06:10 +0430 Subject: [PATCH 35/52] Change 'Confirm vote' to 'Confirm' in vote dialog button --- src/components/delegates/vote.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/delegates/vote.pug b/src/components/delegates/vote.pug index 9be065eaf..bb3726275 100644 --- a/src/components/delegates/vote.pug +++ b/src/components/delegates/vote.pug @@ -36,4 +36,4 @@ div.dialog-vote(aria-label='Vote for delegates') md-dialog-actions(layout='row') md-button(ng-click="$ctrl.$mdDialog.cancel()") Cancel span(flex) - md-button.md-primary.md-raised.submit-button(ng-disabled='!$ctrl.canVote()', ng-click="$ctrl.vote()") {{$ctrl.votingInProgress ? 'Voting...' : 'Confirm vote'}} + md-button.md-primary.md-raised.submit-button(ng-disabled='!$ctrl.canVote()', ng-click="$ctrl.vote()") {{$ctrl.votingInProgress ? 'Voting...' : 'Confirm'}} From 689fe108afe3e34a9277a3a65c475894a8bb2854 Mon Sep 17 00:00:00 2001 From: yashar Date: Fri, 9 Jun 2017 20:14:21 +0430 Subject: [PATCH 36/52] Remove 'input names' feature from Voting tab --- src/components/delegates/delegates.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/delegates/delegates.pug b/src/components/delegates/delegates.pug index 10d4f99b0..e623872fb 100644 --- a/src/components/delegates/delegates.pug +++ b/src/components/delegates/delegates.pug @@ -23,7 +23,7 @@ div.offline-hide i.material-icons.search-append(ng-click='$ctrl.clearSearch()', ng-if='search') close i.material-icons.search-append(ng-hide='search') search span.pull-right.right-action-buttons - md-button(ng-click='$ctrl.usernameListActive = true') + //md-button(ng-click='$ctrl.usernameListActive = true') i.material-icons list span Input Names md-menu.pull-right.right-action-buttons From c7d8b3166d73d5131bc390b5e06f7e3c80f31203 Mon Sep 17 00:00:00 2001 From: yashar Date: Fri, 9 Jun 2017 20:19:29 +0430 Subject: [PATCH 37/52] Change delegate registration modal header text --- src/components/delegateRegistration/delegateRegistration.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/delegateRegistration/delegateRegistration.pug b/src/components/delegateRegistration/delegateRegistration.pug index 55e446dd1..65bb58667 100644 --- a/src/components/delegateRegistration/delegateRegistration.pug +++ b/src/components/delegateRegistration/delegateRegistration.pug @@ -2,7 +2,7 @@ div.dialog-delegate-registration(aria-label='Vote for delegates') form(name='delegateRegistrationForm', ng-submit='form.onSubmit(delegateRegistrationForm)') md-toolbar .md-toolbar-tools - h2 Delegate Registration + h2 Register as delegate span(flex='') md-button.md-icon-button(ng-click='cancel(delegateRegistrationForm)', aria-label='Close dialog') i.material-icons close From b6b40c470aea599c19612a0daab8d5a439a62bf1 Mon Sep 17 00:00:00 2001 From: Aleksey Popov Date: Sat, 10 Jun 2017 11:37:57 +0300 Subject: [PATCH 38/52] Fix Javascript Error: app.setAboutPanelOptions is not a function --- app/main.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/main.js b/app/main.js index b1d4ef112..69571f2c3 100644 --- a/app/main.js +++ b/app/main.js @@ -185,10 +185,12 @@ app.on('window-all-closed', () => { }); // This will override the values defined in the app’s .plist file (macOS) -app.setAboutPanelOptions({ - applicationName: 'Lisk Nano', - copyright, -}); +if (process.platform === 'darwin') { + app.setAboutPanelOptions({ + applicationName: 'Lisk Nano', + copyright, + }); +} app.on('activate', () => { if (win === null) { From e40947f9c2924766727aaf724f9719214ce515e2 Mon Sep 17 00:00:00 2001 From: reyraa Date: Mon, 12 Jun 2017 14:56:17 +0200 Subject: [PATCH 39/52] Minor fixings to adapt template to the change from directive to component --- src/components/delegateRegistration/delegateRegistration.js | 3 +++ .../delegateRegistration/delegateRegistration.pug | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/delegateRegistration/delegateRegistration.js b/src/components/delegateRegistration/delegateRegistration.js index a1d230e57..0a3c086e8 100644 --- a/src/components/delegateRegistration/delegateRegistration.js +++ b/src/components/delegateRegistration/delegateRegistration.js @@ -12,6 +12,8 @@ app.component('delegateRegistration', { closeDialog: '&', }, controller($scope, delegateApi, Account, dialog, $rootScope) { + $scope.account = Account; + function checkPendingRegistration() { delegateApi.getDelegate({ username: $scope.username, @@ -19,6 +21,7 @@ app.component('delegateRegistration', { Account.set({ isDelegate: true, username: data.delegate.username, + delegate: data.delegate, }); $scope.pendingRegistrationListener(); }); diff --git a/src/components/delegateRegistration/delegateRegistration.pug b/src/components/delegateRegistration/delegateRegistration.pug index 65bb58667..8454f9e92 100644 --- a/src/components/delegateRegistration/delegateRegistration.pug +++ b/src/components/delegateRegistration/delegateRegistration.pug @@ -14,9 +14,9 @@ div.dialog-delegate-registration(aria-label='Vote for delegates') input.username(type='text', name='delegateName', ng-model='form.name', required, ng-disabled='loading', md-autofocus) div(ng-messages='delegateRegistrationForm.name.$error') div(ng-message='required') Required - md-input-container.md-block(ng-if='!$ctrl.account.get().secondSignature') - div.fee Fee: {{$ctrl.form.fee}} LSK - md-input-container.md-block(ng-if='$ctrl.account.get().secondSignature') + md-input-container.md-block(ng-if='!account.get().secondSignature') + div.fee Fee: {{form.fee}} LSK + md-input-container.md-block(ng-if='account.get().secondSignature') label Second Passphrase input(type='password', ng-model='form.secondPassphrase', required) md-input-container.md-block From 62c83952fafad639afedf93e179d4ce2be3d35dd Mon Sep 17 00:00:00 2001 From: reyraa Date: Mon, 12 Jun 2017 15:25:21 +0200 Subject: [PATCH 40/52] Fix template issues in forging tab --- src/components/delegateRegistration/delegateRegistration.js | 1 + src/components/forging/forging.pug | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/delegateRegistration/delegateRegistration.js b/src/components/delegateRegistration/delegateRegistration.js index a1d230e57..75130cb18 100644 --- a/src/components/delegateRegistration/delegateRegistration.js +++ b/src/components/delegateRegistration/delegateRegistration.js @@ -19,6 +19,7 @@ app.component('delegateRegistration', { Account.set({ isDelegate: true, username: data.delegate.username, + delegate: data.delegate, }); $scope.pendingRegistrationListener(); }); diff --git a/src/components/forging/forging.pug b/src/components/forging/forging.pug index f9ecca46e..f74c2bb5b 100644 --- a/src/components/forging/forging.pug +++ b/src/components/forging/forging.pug @@ -1,9 +1,10 @@ md-card.offline-hide div - md-content - div(layout='row', ng-if='$ctrl.delegate && !$ctrl.delegate.username') + md-content(ng-if='!$ctrl.account.get().isDelegate') + div(layout='row') md-card(flex-100, flex-gt-xs=100, layout-align='center center', layout-padding) span.title You need to become a delegate to start forging. If you already registered to become a delegate, your registration hasn't been processed, yet. + md-content(ng-if='$ctrl.account.get().isDelegate') div(layout='column', layout-gt-xs='row') md-card(flex-gt-xs=100, layout-padding) md-card-title From e37af2bffb483f960c52182115b5c4c58ffb8561 Mon Sep 17 00:00:00 2001 From: yashar Date: Mon, 12 Jun 2017 18:45:20 +0430 Subject: [PATCH 41/52] Fix a minor bug in delegate component --- src/components/delegates/delegates.less | 5 ++++- src/components/delegates/delegates.pug | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/components/delegates/delegates.less b/src/components/delegates/delegates.less index fba4d9a38..1f80b19e2 100644 --- a/src/components/delegates/delegates.less +++ b/src/components/delegates/delegates.less @@ -34,7 +34,10 @@ delegates { background-color: rgb(255, 228, 220); } .pending { - background-color: rgb(204, 231, 236); + background-color: #eaeae9; + } + .voted{ + background-color: #d6f0ff; } md-card-title { diff --git a/src/components/delegates/delegates.pug b/src/components/delegates/delegates.pug index e03228e33..8ae53307e 100644 --- a/src/components/delegates/delegates.pug +++ b/src/components/delegates/delegates.pug @@ -61,7 +61,7 @@ div.offline-hide tbody(md-body, infinite-scroll='$ctrl.showMore()', infinite-scroll-distance='1') tr(md-row, ng-if='!$ctrl.filteredDelegates.length && !$ctrl.loading') td(md-cell, colspan='6') No delegates found - tr(md-row, ng-repeat="delegate in ($ctrl.filteredDelegates = ($ctrl.delegates | filter : {username: search} )) | limitTo : $ctrl.delegatesDisplayedCount", ng-class='{"downvote": delegate.status.voted && !delegate.status.selected, "upvote": !delegate.status.voted && delegate.status.selected, "pending": delegate.status.pending}') + tr(md-row, ng-repeat="delegate in ($ctrl.filteredDelegates = ($ctrl.delegates | filter : {username: search} )) | limitTo : $ctrl.delegatesDisplayedCount", ng-class='{"downvote": delegate.status.voted && !delegate.status.selected, "upvote": !delegate.status.voted && delegate.status.selected, "pending": delegate.status.pending, "voted": delegate.status.voted && delegate.status.selected}') td(md-cell) md-checkbox.md-primary(ng-model='delegate.status.selected', ng-change='$ctrl.selectionChange(delegate)', ng-disabled='delegate.status.pending', aria-label='delegate selected for voting') td(md-cell, ng-bind='delegate.rank') From 1414b87180def6e88e6eb9dda2ab499c01a96e2c Mon Sep 17 00:00:00 2001 From: reyraa Date: Mon, 12 Jun 2017 16:31:41 +0200 Subject: [PATCH 42/52] Fix unit tests accordingly --- test/components/forging/forging.spec.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/components/forging/forging.spec.js b/test/components/forging/forging.spec.js index 10a74c9fd..3ad84db93 100644 --- a/test/components/forging/forging.spec.js +++ b/test/components/forging/forging.spec.js @@ -58,6 +58,7 @@ describe('Forging component', () => { balance: lsk.from(100), network, delegate, + isDelegate: true, }; account.set(testAcount); @@ -91,7 +92,7 @@ describe('Forging component', () => { }); it('should contain a card with delegate name', () => { - expect(element.find('md-card').text()).to.contain(delegate.username); + expect(element.find('.delegate-name').text()).to.contain(delegate.username); }); it('should contain a card with rank ', () => { From 4faa4e19d8a5a14daefbbff76c0799ef11c0be18 Mon Sep 17 00:00:00 2001 From: yashar Date: Mon, 12 Jun 2017 19:13:19 +0430 Subject: [PATCH 43/52] Reorder some classes in delegates.less to fix a bug --- src/components/delegates/delegates.less | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/delegates/delegates.less b/src/components/delegates/delegates.less index 1f80b19e2..ce119f5bd 100644 --- a/src/components/delegates/delegates.less +++ b/src/components/delegates/delegates.less @@ -33,12 +33,12 @@ delegates { .downvote { background-color: rgb(255, 228, 220); } - .pending { - background-color: #eaeae9; - } .voted{ background-color: #d6f0ff; } + .pending { + background-color: #eaeae9; + } md-card-title { md-input-container { From e262112d6c311d39bcacc29c966c2761c1fd0755 Mon Sep 17 00:00:00 2001 From: yashar Date: Mon, 12 Jun 2017 19:30:48 +0430 Subject: [PATCH 44/52] Remove 'input names' feature from Voting tab instead of comment it --- src/components/delegates/delegates.pug | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/components/delegates/delegates.pug b/src/components/delegates/delegates.pug index e623872fb..7adc3487b 100644 --- a/src/components/delegates/delegates.pug +++ b/src/components/delegates/delegates.pug @@ -23,9 +23,6 @@ div.offline-hide i.material-icons.search-append(ng-click='$ctrl.clearSearch()', ng-if='search') close i.material-icons.search-append(ng-hide='search') search span.pull-right.right-action-buttons - //md-button(ng-click='$ctrl.usernameListActive = true') - i.material-icons list - span Input Names md-menu.pull-right.right-action-buttons md-button.pull-right.my-votes-button(ng-click='$mdOpenMenu()', ng-disabled='$ctrl.votedList.length == 0') i.material-icons visibility From 4f9efb775a7b365d0aa73e1aa1c9a5dd372b774e Mon Sep 17 00:00:00 2001 From: yashar Date: Mon, 12 Jun 2017 19:32:44 +0430 Subject: [PATCH 45/52] Remove 'input names' button functionality from delegates.js file --- src/components/delegates/delegates.js | 84 --------------------------- 1 file changed, 84 deletions(-) diff --git a/src/components/delegates/delegates.js b/src/components/delegates/delegates.js index fac85e8e4..d6563ccac 100644 --- a/src/components/delegates/delegates.js +++ b/src/components/delegates/delegates.js @@ -253,90 +253,6 @@ app.component('delegates', { }, UPDATE_INTERVAL); } - /** - * Needs summary - * - * @method parseVoteListFromInput - */ - parseVoteListFromInput() { - this._parseListFromInput('voteList'); - } - - /** - * Needs summary - * - * @method parseUnvoteListFromInput - */ - parseUnvoteListFromInput() { - this._parseListFromInput('unvoteList'); - } - - /** - * @private - */ - _parseListFromInput(listName) { - const list = this[listName]; - this.invalidUsernames = []; - this.pendingRequests = 0; - this.usernameList = this.usernameInput.trim().split(this.usernameSeparator); - this.usernameList.forEach((username) => { - if ((listName === 'voteList' && !this.votedDict[username.trim()]) || - (listName === 'unvoteList' && this.votedDict[username.trim()])) { - this._setSelected(username.trim(), list); - } - }); - - if (this.pendingRequests === 0) { - this._selectFinish(true, list); - } - } - - /** - * @private - */ - _selectFinish(success, list) { - if (list.length !== 0) { - this.usernameListActive = false; - this.usernameInput = ''; - this.openVoteDialog(); - } else { - this.dialog.errorToast('No delegate usernames could be parsed from the input'); - } - } - - /** - * @private - */ - _setSelected(username, list) { - const delegate = this.delegates.filter(d => d.username === username)[0]; - if (delegate) { - this._selectDelegate(delegate, list); - } else { - this.pendingRequests++; - this.delegateApi.getDelegate(username, - ).then((data) => { - this._selectDelegate(data.delegate, list); - }).catch(() => { - this.invalidUsernames.push(username); - }).finally(() => { - this.pendingRequests--; - if (this.pendingRequests === 0) { - this._selectFinish(this.invalidUsernames.length === 0, list); - } - }); - } - } - // eslint-disable-next-line class-methods-use-this - _selectDelegate(delegate, list) { - // eslint-disable-next-line no-param-reassign - delegate.status = delegate.status || {}; - // eslint-disable-next-line no-param-reassign - delegate.status.selected = true; - if (list.indexOf(delegate) === -1) { - list.push(delegate); - } - } - /** * Uses dialog.modal to show vote list directive. * From 4f5206a5c775f8e4c40884d09f2946a5deca133b Mon Sep 17 00:00:00 2001 From: yashar Date: Mon, 12 Jun 2017 19:33:54 +0430 Subject: [PATCH 46/52] Remove 'input names' button testing from delegates.spec.js file --- test/components/delegates/delegates.spec.js | 79 --------------------- 1 file changed, 79 deletions(-) diff --git a/test/components/delegates/delegates.spec.js b/test/components/delegates/delegates.spec.js index fdec0cde3..555388731 100644 --- a/test/components/delegates/delegates.spec.js +++ b/test/components/delegates/delegates.spec.js @@ -303,83 +303,4 @@ describe('delegates component controller', () => { $scope.$apply(); }); }); - - describe('parseVoteListFromInput(list)', () => { - let delegateApiMock; - - beforeEach(() => { - delegateApiMock = sinon.mock(controller.delegateApi); - }); - - it('parses this.usernameInput to list of delegates and opens vote dialog if all delegates were immediately resolved', () => { - const spy = sinon.spy(controller, 'openVoteDialog'); - controller.usernameInput = 'genesis_20\ngenesis_42\ngenesis_46\n'; - controller.parseVoteListFromInput(controller.unvoteList); - expect(spy).to.have.been.calledWith(); - }); - - it('parses this.usernameInput to list of delegates and opens vote dialog if all delegates were resolved immediately or from server', () => { - const username = 'not_fetched_yet'; - const deffered = $q.defer(); - delegateApiMock.expects('getDelegate').withArgs(username).returns(deffered.promise); - const spy = sinon.spy(controller, 'openVoteDialog'); - controller.usernameInput = `${username}\ngenesis_42\ngenesis_46`; - - controller.parseVoteListFromInput(controller.unvoteList); - - deffered.resolve({ - success: true, - delegate: { - username, - }, - }); - $scope.$apply(); - expect(spy).to.have.been.calledWith(); - }); - - it('parses this.usernameInput to list of delegates and opens vote dialog if any delegates were resolved', () => { - const username = 'invalid_name'; - const deffered = $q.defer(); - delegateApiMock.expects('getDelegate').withArgs(username).returns(deffered.promise); - const spy = sinon.spy(controller, 'openVoteDialog'); - controller.usernameInput = `${username}\ngenesis_42\ngenesis_46`; - - controller.parseVoteListFromInput(controller.unvoteList); - - deffered.reject({ success: false }); - $scope.$apply(); - expect(spy).to.have.been.calledWith(); - }); - - it('parses this.usernameInput to list of delegates and shows error toast if no delegates were resolved', () => { - const username = 'invalid_name'; - const deffered = $q.defer(); - delegateApiMock.expects('getDelegate').withArgs(username).returns(deffered.promise); - const toastSpy = sinon.spy(controller.dialog, 'errorToast'); - const dialogSpy = sinon.spy(controller, 'openVoteDialog'); - controller.usernameInput = username; - controller.voteList = []; - - controller.parseVoteListFromInput(controller.unvoteList); - - deffered.reject({ success: false }); - $scope.$apply(); - expect(toastSpy).to.have.been.calledWith(); - expect(dialogSpy).to.not.have.been.calledWith(); - }); - }); - - describe('parseUnvoteListFromInput(list)', () => { - it('parses this.usernameInput to list of delegates and opens vote dialog if all delegates were immediately resolved', () => { - const delegate = { - username: 'genesis_20', - status: {}, - }; - const spy = sinon.spy(controller, 'openVoteDialog'); - controller.votedDict[delegate.username] = delegate; - controller.usernameInput = `${delegate.username}\ngenesis_42\ngenesis_46\n`; - controller.parseUnvoteListFromInput(controller.unvoteList); - expect(spy).to.have.been.calledWith(); - }); - }); }); From 2ef574faa26c9e737c5e5995baec8bf66e6a4ba5 Mon Sep 17 00:00:00 2001 From: Vit Stanislav Date: Tue, 13 Jun 2017 08:58:53 +0200 Subject: [PATCH 47/52] Fix pending highligh of delegates selected in vote dialog --- src/components/delegates/delegates.js | 33 +++++++++++++++++++-------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/components/delegates/delegates.js b/src/components/delegates/delegates.js index d6563ccac..8b83d9662 100644 --- a/src/components/delegates/delegates.js +++ b/src/components/delegates/delegates.js @@ -35,6 +35,7 @@ app.component('delegates', { this.$scope.search = ''; this.voteList = []; this.votedDict = {}; + this.delegateStateByAddress = {}; this.votedList = []; this.unvoteList = []; this.loading = true; @@ -117,16 +118,7 @@ app.component('delegates', { this.delegates = this.delegates.concat(data.delegates); } - data.delegates.forEach((delegate) => { - const voted = this.votedDict[delegate.username] !== undefined; - const changed = this.voteList.concat(this.unvoteList) - .map(d => d.username).indexOf(delegate.username) !== -1; - delegate.status = { // eslint-disable-line no-param-reassign - selected: (voted && !changed) || (!voted && changed), - voted, - changed, - }; - }); + this.delegates = this.delegates.map(delegate => this.setDelegateStatus(delegate)); this.delegatesTotalCount = data.totalCount; this.loading = false; @@ -198,6 +190,7 @@ app.component('delegates', { setPendingVotes() { this.voteList.forEach((delegate) => { /* eslint-disable no-param-reassign */ + delegate = this.setDelegateStatus(delegate); delegate.status.changed = false; delegate.status.voted = true; delegate.status.pending = true; @@ -205,6 +198,7 @@ app.component('delegates', { this.votePendingList = this.voteList.splice(0, this.voteList.length); this.unvoteList.forEach((delegate) => { + delegate = this.setDelegateStatus(delegate); delegate.status.changed = false; delegate.status.voted = false; delegate.status.pending = true; @@ -214,6 +208,25 @@ app.component('delegates', { this.checkPendingVotes(); } + /** + * Sets deleagte.status to be always the same object for given delegate.address + * + * @method setDelegateStatus + */ + setDelegateStatus(delegate) { + const voted = this.votedDict[delegate.username] !== undefined; + const changed = this.voteList.concat(this.unvoteList) + .map(d => d.username).indexOf(delegate.username) !== -1; + this.delegateStateByAddress[delegate.address] = + this.delegateStateByAddress[delegate.address] || { + selected: (voted && !changed) || (!voted && changed), + voted, + changed, + }; + delegate.status = this.delegateStateByAddress[delegate.address]; + return delegate; + } + /** * Fetches the list of delegates we've voted for (voted delegates), * and updates the list and removes the confirmed votes from votePendingList From 92de2874d809c7af3919df7769201b5c04a9e75d Mon Sep 17 00:00:00 2001 From: Vit Stanislav Date: Tue, 13 Jun 2017 09:01:10 +0200 Subject: [PATCH 48/52] Remove no longer used code --- src/components/delegates/delegates.pug | 14 -------------- src/components/delegates/vote.js | 16 ---------------- test/components/delegates/vote.spec.js | 13 ------------- 3 files changed, 43 deletions(-) diff --git a/src/components/delegates/delegates.pug b/src/components/delegates/delegates.pug index ac18705f7..ee2f1c942 100644 --- a/src/components/delegates/delegates.pug +++ b/src/components/delegates/delegates.pug @@ -1,18 +1,4 @@ div.offline-hide - md-card(flex-gt-xs=100, ng-if='$ctrl.usernameListActive') - md-card-content(layout='column') - md-input-container - label Insert list of delegate usernames separated by new line - textarea(ng-model='$ctrl.usernameInput') - div - md-button(ng-click='$ctrl.usernameListActive = false') - span Cancel - span.pull-right - md-button(ng-click='$ctrl.parseVoteListFromInput("voteList")', ng-disabled='$ctrl.pendingRequests || !$ctrl.usernameInput') - span Add to vote list - md-button(ng-click='$ctrl.parseUnvoteListFromInput("unvoteList")', ng-disabled='$ctrl.pendingRequests || !$ctrl.usernameInput') - span Add to unvote list - md-progress-linear(md-mode='indeterminate', ng-show='$ctrl.pendingRequests') md-card(flex-gt-xs=100) md-card-title md-card-title-text diff --git a/src/components/delegates/vote.js b/src/components/delegates/vote.js index 8ee052721..4c03e4182 100644 --- a/src/components/delegates/vote.js +++ b/src/components/delegates/vote.js @@ -86,22 +86,6 @@ app.component('vote', { !this.votingInProgress && (!this.account.get().secondSignature || this.secondPassphrase); } - - /** - * Removes the delegate in the given index from votes list - * - * @method removeVote - * @param {object[]} list the votes list - * @param {Number} index the index of the delegate to be removed - */ - // eslint-disable-next-line class-methods-use-this - removeVote(list, index) { - /* eslint-disable no-param-reassign */ - list[index].status.selected = list[index].status.voted; - list[index].status.changed = false; - /* eslint-enable no-param-reassign */ - list.splice(index, 1); - } }, }); diff --git a/test/components/delegates/vote.spec.js b/test/components/delegates/vote.spec.js index c323573b1..c518b2c59 100644 --- a/test/components/delegates/vote.spec.js +++ b/test/components/delegates/vote.spec.js @@ -149,18 +149,5 @@ describe('Vote component controller', () => { $scope.$apply(); }); }); - - describe('removeVote(list, index)', () => { - it('removes vote at index from the list', () => { - const index = 2; - const vote = controller.voteList[index]; - - controller.removeVote(controller.voteList, index); - - expect(vote.status.changed).to.equal(false); - expect(vote.status.selected).to.equal(false); - expect(controller.voteList).to.not.contain(vote); - }); - }); }); From ca2b5950b6c6fc128dee9b966d4a6cd3fbb26341 Mon Sep 17 00:00:00 2001 From: Vit Stanislav Date: Mon, 12 Jun 2017 17:31:14 +0200 Subject: [PATCH 49/52] Fix delegatesApi.listAccountDelegates addresss param --- src/components/delegates/delegates.js | 5 ++--- src/components/delegates/vote.js | 5 ++--- src/services/api/delegateApi.js | 2 +- test/services/api/delegateApi.spec.js | 6 +++--- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/components/delegates/delegates.js b/src/components/delegates/delegates.js index 8b83d9662..ad1eebb1f 100644 --- a/src/components/delegates/delegates.js +++ b/src/components/delegates/delegates.js @@ -66,9 +66,8 @@ app.component('delegates', { this.delegates = []; this.delegatesDisplayedCount = 20; if (this.peers.active) { - this.delegateApi.listAccountDelegates({ - address: this.account.get().address, - }).then((data) => { + this.delegateApi.listAccountDelegates(this.account.get().address, + ).then((data) => { this.votedList = data.delegates || []; this.votedList.forEach((delegate) => { this.votedDict[delegate.username] = delegate; diff --git a/src/components/delegates/vote.js b/src/components/delegates/vote.js index 4c03e4182..ce8f0a0fb 100644 --- a/src/components/delegates/vote.js +++ b/src/components/delegates/vote.js @@ -38,9 +38,8 @@ app.component('vote', { * @method getDelegates */ getDelegates() { - this.delegateApi.listAccountDelegates({ - address: this.account.get().address, - }).then((data) => { + this.delegateApi.listAccountDelegates(this.account.get().address, + ).then((data) => { this.votedList = data.delegates || []; this.votedList.forEach((delegate) => { this.votedDict[delegate.username] = delegate; diff --git a/src/services/api/delegateApi.js b/src/services/api/delegateApi.js index 2aaf1e0c1..2d95838c2 100644 --- a/src/services/api/delegateApi.js +++ b/src/services/api/delegateApi.js @@ -14,7 +14,7 @@ app.factory('delegateApi', Peers => ({ * @returns {promise} Api call promise */ listAccountDelegates(address) { - return Peers.sendRequestPromise('accounts/delegates', address); + return Peers.sendRequestPromise('accounts/delegates', { address }); }, listDelegates(options) { diff --git a/test/services/api/delegateApi.spec.js b/test/services/api/delegateApi.spec.js index 2707a5df3..396b6b72b 100644 --- a/test/services/api/delegateApi.spec.js +++ b/test/services/api/delegateApi.spec.js @@ -32,12 +32,12 @@ describe('Factory: delegateApi', () => { describe('listAccountDelegates(address)', () => { it('returns Peers.sendRequestPromise(\'accounts/delegates\', address);', () => { - const address = { + const params = { address: {}, }; - mock.expects('sendRequestPromise').withArgs('accounts/delegates', address).returns(deffered.promise); + mock.expects('sendRequestPromise').withArgs('accounts/delegates', params).returns(deffered.promise); - const promise = delegateApi.listAccountDelegates(address); + const promise = delegateApi.listAccountDelegates(params.address); expect(promise).to.equal(deffered.promise); }); From 962cff65cccd74f1732cba427822c13b73319655 Mon Sep 17 00:00:00 2001 From: Vit Stanislav Date: Tue, 13 Jun 2017 09:45:08 +0200 Subject: [PATCH 50/52] Add animated bouncer to pending votes --- src/components/delegates/delegates.less | 42 +++++++++++++++++++++++++ src/components/delegates/delegates.pug | 6 +++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/components/delegates/delegates.less b/src/components/delegates/delegates.less index ce119f5bd..c3584be55 100644 --- a/src/components/delegates/delegates.less +++ b/src/components/delegates/delegates.less @@ -82,6 +82,48 @@ delegates { display: inline-block; margin: 0 10px } + + .spinner { + width: 40px; + text-align: center; + margin-left: -10px; + } + + .spinner > div { + width: 8px; + height: 8px; + background-color: #aaa; + + border-radius: 100%; + display: inline-block; + -webkit-animation: sk-bouncedelay 1.4s infinite ease-in-out both; + animation: sk-bouncedelay 1.4s infinite ease-in-out both; + } + + .spinner .bounce1 { + -webkit-animation-delay: -0.32s; + animation-delay: -0.32s; + } + + .spinner .bounce2 { + -webkit-animation-delay: -0.16s; + animation-delay: -0.16s; + } + + @-webkit-keyframes sk-bouncedelay { + 0%, 80%, 100% { -webkit-transform: scale(0.5) } + 40% { -webkit-transform: scale(1.0) } + } + + @keyframes sk-bouncedelay { + 0%, 80%, 100% { + -webkit-transform: scale(0.5); + transform: scale(0.5); + } 40% { + -webkit-transform: scale(1.0); + transform: scale(1.0); + } + } } .lsk-vote-remove-button { diff --git a/src/components/delegates/delegates.pug b/src/components/delegates/delegates.pug index ee2f1c942..ed6fe892c 100644 --- a/src/components/delegates/delegates.pug +++ b/src/components/delegates/delegates.pug @@ -46,7 +46,11 @@ div.offline-hide td(md-cell, colspan='6') No delegates found tr(md-row, ng-repeat="delegate in ($ctrl.filteredDelegates = ($ctrl.delegates | filter : {username: search} )) | limitTo : $ctrl.delegatesDisplayedCount", ng-class='{"downvote": delegate.status.voted && !delegate.status.selected, "upvote": !delegate.status.voted && delegate.status.selected, "pending": delegate.status.pending, "voted": delegate.status.voted && delegate.status.selected}') td(md-cell) - md-checkbox.md-primary(ng-model='delegate.status.selected', ng-change='$ctrl.selectionChange(delegate)', ng-disabled='delegate.status.pending', aria-label='delegate selected for voting') + .spinner(ng-show='delegate.status.pending') + .bounce1 + .bounce2 + .bounce3 + md-checkbox.md-primary(ng-show='!delegate.status.pending', ng-model='delegate.status.selected', ng-change='$ctrl.selectionChange(delegate)', aria-label='delegate selected for voting') td(md-cell, ng-bind='delegate.rank') td(md-cell, ng-bind='delegate.username') td(md-cell, ng-bind='delegate.address') From ff486bd6c578d6087531068dccc98d3ec453874d Mon Sep 17 00:00:00 2001 From: reyraa Date: Tue, 13 Jun 2017 11:25:26 +0200 Subject: [PATCH 51/52] Fix the header for smaller displays --- src/components/top/top.less | 39 +++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/components/top/top.less b/src/components/top/top.less index 52cfc5955..3e7215190 100644 --- a/src/components/top/top.less +++ b/src/components/top/top.less @@ -1,4 +1,40 @@ top { + // layout + @media (max-width: 768px) { + & > .layout-gt-xs-row { + flex: none; + width: 100%; + display: block; + overflow-x: hidden; + padding: 0 8px; + & > .flex-gt-xs-33 { + flex: none; + width: 100%; + max-width: 100%; + margin-right: 0; + margin-left: 0; + + md-card-content { + display: table; + .title { + margin-bottom: 15px; + display: inline-block; + vertical-align: middle; + width: 100px; + margin: 0; + line-height: 70px; + } + .value-wrapper { + display: table-cell; + vertical-align: middle; + .primary { + width: 100%; + } + } + } + } + } + } .peer { position: relative; } @@ -42,6 +78,9 @@ top { height: 51px; line-height: 51px; } + @media (max-width: 1280px) { + font-size: 100%; + } } .secondary { color: #5f696e; From 507ebc97e5e51bd0404c2a5101d61434a2c2f858 Mon Sep 17 00:00:00 2001 From: isabello Date: Tue, 13 Jun 2017 12:20:45 +0200 Subject: [PATCH 52/52] Bumping version --- app/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/package.json b/app/package.json index 50a735557..0c62a7005 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,6 @@ { "name": "lisk-nano", - "version": "1.0.0-rc.2", + "version": "1.0.0-rc.3", "description": "Lisk Nano", "main": "main.js", "author":{ diff --git a/package.json b/package.json index bb24d117b..8d5fa2d55 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lisk-nano", - "version": "1.0.0-rc.2", + "version": "1.0.0-rc.3", "description": "Lisk Nano", "homepage": "https://github.com/LiskHQ/lisk-nano", "bugs": "https://github.com/LiskHQ/lisk-nano/issues",