diff options
| author | mo <mo.khan@gmail.com> | 2017-09-05 19:39:42 -0600 |
|---|---|---|
| committer | mo <mo.khan@gmail.com> | 2017-09-05 19:39:42 -0600 |
| commit | 7cde984301e675b1d75b0fdc2a95ef6cee6561b3 (patch) | |
| tree | 449f663a79cc0c0aba2643f32d4b876b372b3a6b /app | |
| parent | 1e9b754b0997d9a74fccd23752a0a61016c1b173 (diff) | |
validate the login form on the client side.
Diffstat (limited to 'app')
| -rw-r--r-- | app/assets/javascripts/views/auto_view.js.coffee | 11 | ||||
| -rw-r--r-- | app/assets/javascripts/views/sessions/login_form.js.coffee | 35 | ||||
| -rw-r--r-- | app/views/sessions/new.html.erb | 26 |
3 files changed, 53 insertions, 19 deletions
diff --git a/app/assets/javascripts/views/auto_view.js.coffee b/app/assets/javascripts/views/auto_view.js.coffee index c54104fa..6c2c263f 100644 --- a/app/assets/javascripts/views/auto_view.js.coffee +++ b/app/assets/javascripts/views/auto_view.js.coffee @@ -24,6 +24,13 @@ class CakeSide.AutoView extends Backbone.View @views[key] ?= [] @views[key].push(view) - field: (name) -> $("##{@fieldName(name)}") - fieldName: (name) -> "#{@modelKey()}_#{name}" + hideErrors: () -> + @$(':input').removeClass('is-invalid') + @$('.invalid-feedback').html('') + + showError: (field, message) -> + @$(field).addClass('is-invalid').siblings('.invalid-feedback').html(message) + + field: (name) -> @$("##{@fieldName(name)}") + fieldName: (name) -> "#{@modelKey}_#{name}" render: -> @ diff --git a/app/assets/javascripts/views/sessions/login_form.js.coffee b/app/assets/javascripts/views/sessions/login_form.js.coffee index dcdeb408..d41c0d9c 100644 --- a/app/assets/javascripts/views/sessions/login_form.js.coffee +++ b/app/assets/javascripts/views/sessions/login_form.js.coffee @@ -2,14 +2,37 @@ class CakeSide.Views.LoginForm extends CakeSide.AutoView @viewName 'login-form' + modelKey: "session" events: - 'change #session_username': 'render' - 'change #session_password': 'render' + 'keyup #session_username': 'onKeyUp' + 'keyup #session_password': 'onKeyUp' + 'submit form': 'onSubmit' render: -> - @$('input[type=submit]').prop('disabled', !@valid()) + @hideErrors() + @$('input[type=submit]').prop('disabled', !@isValid()) + _.each _.keys(@errors), (key) => + @showError(@field(key), @errors[key]) - valid: -> - !_.isEmpty(@field("username").val()) && !_.isEmpty(@field("password").val()) + isValid: -> + _.keys(@errors).length == 0 - modelKey: -> "session" + validate: -> + @errors = {} + if _.isEmpty(@field("username").val()) + @errors['username'] = "Email is required" + + if _.isEmpty(@field("password").val()) + @errors['password'] = "Password is required" + + onKeyUp: (event) -> + @validate() + @render() + + onSubmit: (event) -> + console.log("SUBMITTED") + @validate() + if !@isValid() + event.preventDefault() + event.stopPropagation() + @render() diff --git a/app/views/sessions/new.html.erb b/app/views/sessions/new.html.erb index 34a26d84..e5ee72e9 100644 --- a/app/views/sessions/new.html.erb +++ b/app/views/sessions/new.html.erb @@ -23,17 +23,21 @@ </div> </div> <div class="col"> - <%= form_for(@session, url: sessions_path(@session), html: { class: "form-horizontal", data: { autoview: 'login-form' } }) do |f| %> - <legend>Got an account? Login!</legend> - <div class="form-group"> - <%= email_field_tag 'session[username]', '', placeholder: 'Email', class: "form-control", required: :required %> - </div> - <div class="form-group"> - <%= password_field_tag 'session[password]', '', placeholder: 'Password', class: "form-control", required: :required %> - </div> - <p><%= link_to "Forgot your password?", new_password_path %></p> - <%= f.submit t(".sign_in"), class: "btn btn-primary" %> - <% end %> + <div data-autoview="login-form"> + <%= form_for(@session, url: sessions_path(@session), html: { class: "form-horizontal needs-validation" }) do |f| %> + <legend>Got an account? Login!</legend> + <div class="form-group"> + <%= email_field_tag 'session[username]', '', placeholder: 'Email', class: "form-control", required: :required %> + <div class="invalid-feedback"></div> + </div> + <div class="form-group"> + <%= password_field_tag 'session[password]', '', placeholder: 'Password', class: "form-control", required: :required %> + <div class="invalid-feedback"></div> + </div> + <p><%= link_to "Forgot your password?", new_password_path %></p> + <%= f.submit t(".sign_in"), class: "btn btn-primary" %> + <% end %> + </div> <%= form_for(User.new, as: :user, url: registration_path, html: { class: 'form-horizontal' }) do |f| %> <fieldset> |
