Merge Request #57
Enhancements on RegisterComponent
* Move error messages to shared folder
* Refactor and addition of tests for signup on RegisterComponent
* Display error messages after sumbit registration
* Add new strings on translations files
* Add login link on registration page
-
Also: * Move error messages to shared folder * Refactor and addition of tests for signup on RegisterComponent * Display error messages after sumbit registration * Add new strings on translations files * Add login link on registration page
-
@caiosba @mfdeveloper: esse MR é uma continuação do !47
-
@daniela Por que o arquivo
.htmlcontendo as mensagens de erro foram movidas? Essa pasta shared é um novo local para arquivos desse gênero? Vocês discutiram isso internamente? Esse tipo de abordagem é interessante, mas sugiro a atualização doREADME.mdinformando quais as arquivos devem estar nessa pasta, para que fique claro para todos os envolvidos :) -
O código deste método parece estar duplicado com a definição em
Navbar#openLogin()nao? Acredito que seria melhor acessar o componenteNavbar, ou até mesmo mover esse método para a classeAuthController, para que seja acessível e reutilizável entre os dois componentes. O que você acha @daniela ? -
Parece que há uma duplicidade de valores entre as chaves
account.register.termsOfUseMessageeaccount.register.termsOfUseTitlenao? A única coisa diferente entre os seus valores é o "T" em caixa alta. Essas duas chaves são realmente necessárias? -
Essa chave
emailprecisa mesmo ter uma tradução? -
A utilização deste atributo
errorMessagescontendo os erros gerados pelo backend é realmente a melhor solução? Vocês discutiram internamente em equipe acerca disso @daniela ? Observe que, uma vez que é chamado simplesmente umcatch()daPromiseresultante da requisiçãoREST, mensagens de erros relacionadas a status como500, 503entre outros serão exibidas para o usuário correto?Além disso, uma vez que a validação já é controlada pelo
ngMessages, faz sentido requisitar o servidor para obter "campos requeridos" por exemplo? È bem verdade que é configurável no Noosfero quais campos são ou não obrigatórios no registro de usuário, e que "replicar" essas verificações no front-end parece uma duplicação da regra de negócio, mas de qualquer forma, o usuário teria as duas mensagens exibidas, tanto nos campos quanto acima do form, com o novo HTML adicionado por esse MR.Em suma, qual a avaliação de vocês sobre essas questões? Questiono isso para pensarmos juntos realmente xD
-
Pq criar uma interface só para isso?
errorMessagesnão poderia simplesmente ser um atributo do componenteRegisterComponent? Observe que os atributos de um componente são inseridos automaticamente no$scope, uma vez q ongForwardfaz esse de => para -
Esse
inject()é somente para injetar os serviços do angular? Se sim, existe uma classeAngularServiceFactoryque contém o métodogetAngularService()voltado para esse tipo de "injeção". Salvo em algumas exceções, a idéia é tentar mitigar o máximo possível chamadas explicitas a elementos específicos do Angular 1.x, uma vez que estamos utilizandongForward -
È realmente necessário uma chamada explicita a
$apply()? A classe dongForwardchamadaComponentFixturepossui um métododetectChanges(), que no final das contas faz uma chamada a$apply()por debaixo dos panos. Como vc está utilizando a classeComponentTestHelpernesses testes, nela existe o métododetectChanges()que é um "atalho". Verifique se isso atende ao que você precisa :) -
Uma chamada direta a
Promise.reject()não funcionaria ao invés de injetar o serviço$q? -
Merged manually, thanks!
| 17 | 25 | <span class="input-group-addon" style="font-weight: bold;"><i class="fa fa-globe"></i> {{ ctrl.environment.host }}</span> |
| 18 | 26 | <input type="text" id="username" name="username" class="form-control" placeholder="{{'account.register.usernameLabel' | translate }}" ng-model="ctrl.account.login" required> |
| 19 | 27 | </div> |
| 20 | - <div class="help-block" ng-show="signupForm.username.$touched" ng-messages="signupForm.username.$error"> | |
| 21 | - <ul class="list-unstyled"> | |
| 22 | - <li ng-messages-include="languages/messages.html"></li> | |
| 23 | - </ul> | |
| 28 | + <div class="help-block" ng-messages="signupForm.username.$error"> | |
| 29 | + <div ng-if="signupForm.username.$touched && !signupForm.username.$empty"> | |
| 30 | + <ul class="list-unstyled"> | |
| 31 | + <li ng-messages-include="app/shared/messages/form-errors.html"></li> | |
| 1 |
|
|
| 63 | 72 | scope: this.$scope |
| 64 | 73 | }); |
| 65 | 74 | } |
| 75 | + | |
| 76 | + openLogin() { | |
| 1 |
|
|
| 112 | 112 | "account.register.signupMessage": "Register", |
| 113 | 113 | "account.register.haveAccountMessage": "Already have an account?", |
| 114 | 114 | "account.register.termsOfUseMessage": "terms of use", |
| 115 | + "account.register.termsOfUseTitle": "Terms of use", | |
| 1 |
|
|
| 122 | 123 | "messages.invalid.maxlength": "O valor é muito longo", |
| 123 | 124 | "messages.invalid.minlength": "O valor é muito curto", |
| 124 | 125 | "messages.invalid.email": "Informe um email válido", |
| 125 | - "messages.invalid.passwordMatch": "As senhas não coincidem" | |
| 126 | + "messages.invalid.passwordMatch": "As senhas não coincidem", | |
| 127 | + "account.register.save.failed": "A conta não pode ser criada", | |
| 128 | + "account.register.mandatoryField": "Este campo é obrigatório", | |
| 129 | + "account.register.invalidEmail": "Este campo deve ser um endereço de e-mail válido.", | |
| 130 | + "account.register.shortPassword": "A senha deve ter no mínimo 4 caracteres", | |
| 131 | + "account.register.errorMessagesTitle": "Houve erros com os seguintes campos:", | |
| 132 | + "email is missing": "email não pode ficar em branco", | |
| 133 | + "login is missing": "nome de usuário não pode ficar em branco", | |
| 134 | + "password is missing": "senha não pode ficar em branco", | |
| 135 | + "login": "nome de usuário", | |
| 136 | + "has already been taken": "já está sendo usado", | |
| 137 | + "email": "email", | |
| 1 |
|
|
| 42 | - } else { | |
| 43 | - throw new Error('Invalid attributes'); | |
| 44 | - } | |
| 45 | - }); | |
| 46 | - } else { | |
| 47 | - this.notificationService.error({ message: "account.register.passwordConfirmation.failed" }); | |
| 48 | - } | |
| 37 | + let error = ''; | |
| 38 | + let errors: any; | |
| 39 | + let field = ''; | |
| 40 | + this.$scope.errorMessages = []; | |
| 41 | + this.registerService.createAccount(this.account).then((response) => { | |
| 42 | + this.$state.transitionTo('main.environment'); | |
| 43 | + this.notificationService.success({ title: "account.register.success.title", message: "account.register.success.message" }); | |
| 44 | + }).catch((response) => { | |
| 45 | + if ( response.data.error ) { | |
| 1 |
|
|
| 6 | 6 | $uibModal: ng.ui.bootstrap.IModalService; |
| 7 | 7 | modalInstance: ng.ui.bootstrap.IModalServiceInstance; |
| 8 | 8 | } |
| 9 | + | |
| 10 | +export interface IErrorMessages extends ng.IScope { | |
| 1 |
|
|
| 45 | 41 | helper = new ComponentTestHelper<RegisterComponent>(cls, done); |
| 46 | 42 | }); |
| 47 | 43 | |
| 44 | + beforeEach(inject((_$rootScope_: ng.IRootScopeService, _$q_: ng.IQService) => { | |
| 1 |
|
|
| 48 | 49 | it('register page was rendered', () => { |
| 49 | 50 | expect(helper.debugElement.query('div.register-page').length).toEqual(1); |
| 50 | 51 | }); |
| 51 | 52 | |
| 53 | + it("registers a new user", done => { | |
| 54 | + user_data = { username: "username", password: "password", password_confirmation: "password", email: "user@company.com" }; | |
| 55 | + response = { }; | |
| 56 | + | |
| 57 | + helper.component.account = user_data; | |
| 58 | + | |
| 59 | + deferred = $q.defer(); | |
| 60 | + deferred.resolve({ data: response }); | |
| 61 | + registerService.createAccount = jasmine.createSpy("createAccount").and.returnValue(deferred.promise); | |
| 62 | + | |
| 63 | + helper.component.signup(); | |
| 64 | + $rootScope.$apply(); | |
| 1 |
|
|
| 65 | + | |
| 66 | + expect(registerService.createAccount).toHaveBeenCalledWith(user_data); | |
| 67 | + expect(stateService.transitionTo).toHaveBeenCalledWith("main.environment"); | |
| 68 | + expect(notificationService.success).toHaveBeenCalled(); | |
| 69 | + | |
| 70 | + done(); | |
| 71 | + }); | |
| 72 | + | |
| 73 | + it("gives error when registration fails", done => { | |
| 74 | + user_data = { password: "pas" }; | |
| 75 | + response = { data: { message: '{ "password": ["is too short"] }'}}; | |
| 76 | + | |
| 77 | + helper.component.account = user_data; | |
| 78 | + | |
| 79 | + deferred = $q.defer(); | |
| 80 | + deferred.reject(response); | |
| 1 |
|
|