summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormo <mo.khan@gmail.com>2017-09-07 19:29:50 -0600
committermo <mo.khan@gmail.com>2017-09-07 19:29:50 -0600
commitbd64649a0f3e2afb887c62686cb904b5a880fa77 (patch)
tree62a7a90ac9915362677225c54b8940bf9f8a7337
parent773f6781ef904b73a88a6b9ef8b5f95bde99be0d (diff)
load error messages into js for client side validation.
-rw-r--r--Gemfile1
-rw-r--r--Gemfile.lock3
-rw-r--r--app/assets/javascripts/application.js1
-rw-r--r--app/assets/javascripts/models/session.js.coffee21
-rw-r--r--config/locales/en.yml5
-rw-r--r--spec/javascripts/models/session_spec.js.coffee27
6 files changed, 58 insertions, 0 deletions
diff --git a/Gemfile b/Gemfile
index 5bfa4aed..57514df2 100644
--- a/Gemfile
+++ b/Gemfile
@@ -40,6 +40,7 @@ gem 'email_validator'
gem 'font-awesome-rails'
gem 'bootstrap', '4.0.0.beta'
gem 'local_time'
+gem 'i18n-js'
group :development do
gem 'better_errors'
diff --git a/Gemfile.lock b/Gemfile.lock
index 89cbfe49..2fd4a4b1 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -659,6 +659,8 @@ GEM
rack
socksify
i18n (0.8.6)
+ i18n-js (3.0.1)
+ i18n (~> 0.6, >= 0.6.6)
i18n-tasks (0.9.18)
activesupport (>= 4.0.2)
ast (>= 2.1.0)
@@ -969,6 +971,7 @@ DEPENDENCIES
foreman
geoip
github-markdown
+ i18n-js
i18n-tasks
jbuilder (~> 2.0)
jquery-rails
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
index cc3a7093..847e0f9e 100644
--- a/app/assets/javascripts/application.js
+++ b/app/assets/javascripts/application.js
@@ -10,6 +10,7 @@
//= require underscore
//= require local-time
//= require js-routes
+//= require i18n/translations
//= require backbone
//= require backbone.marionette
//= require backbone_rails_sync
diff --git a/app/assets/javascripts/models/session.js.coffee b/app/assets/javascripts/models/session.js.coffee
new file mode 100644
index 00000000..bfea945e
--- /dev/null
+++ b/app/assets/javascripts/models/session.js.coffee
@@ -0,0 +1,21 @@
+class CakeSide.Models.Session extends Backbone.Model
+ modelKey: 'session'
+ defaults:
+ username: null
+ password: null
+
+ requiredFields: ['username', 'password']
+
+ validate: (attributes, options) ->
+ errors = {}
+
+ _.each @requiredFields, (field) =>
+ if _.isEmpty(attributes[field])
+ errors[field] = @errorFor(field, 'blank')
+
+ return errors if _.keys(errors).length > 0
+
+ errorFor: (attribute, scope) ->
+ attributeName = I18n.t("activerecord.attributes.#{@modelKey}.#{attribute}")
+ error = I18n.t("activerecord.errors.messages.#{scope}")
+ "#{attributeName} #{error}"
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 534c58e8..d7f9f0bb 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -20,3 +20,8 @@ en:
sessions: "Sessions"
users: "Users"
profile_saved: Your settings have been updated successfully!
+ activerecord:
+ attributes:
+ session:
+ username: 'Email'
+ password: 'Password'
diff --git a/spec/javascripts/models/session_spec.js.coffee b/spec/javascripts/models/session_spec.js.coffee
new file mode 100644
index 00000000..d47ead7a
--- /dev/null
+++ b/spec/javascripts/models/session_spec.js.coffee
@@ -0,0 +1,27 @@
+describe "CakeSide.Models.Session", ->
+ subject = null
+
+ beforeEach ->
+ subject = new CakeSide.Models.Session()
+
+ it "is invalid, when the email is missing", ->
+ attributeName = I18n.t("activerecord.attributes.session.username")
+ error = I18n.t("activerecord.errors.messages.blank")
+ expectedError = "#{attributeName} #{error}"
+
+ expect(subject.isValid()).toEqual(false)
+ expect(subject.validationError['username']).toEqual(expectedError)
+
+ it "is invalid, when the password is missing", ->
+ attributeName = I18n.t("activerecord.attributes.session.password")
+ error = I18n.t("activerecord.errors.messages.blank")
+ expectedError = "#{attributeName} #{error}"
+
+ expect(subject.isValid()).toEqual(false)
+ expect(subject.validationError['password']).toEqual(expectedError)
+
+ it "is valid", ->
+ subject.set('username', 'x@example.com')
+ subject.set('password', 'password')
+ expect(subject.isValid()).toEqual(true)
+ expect(subject.validationError).toEqual(null)