rails4_client_side_validations 0.0.4 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +12 -7
  3. data/lib/client_side_validations.rb +12 -0
  4. data/lib/client_side_validations/action_view.rb +13 -0
  5. data/lib/client_side_validations/action_view/form_builder.rb +105 -0
  6. data/lib/{rails4_client_side_validations → client_side_validations}/action_view/form_helper.rb +13 -17
  7. data/lib/client_side_validations/action_view/form_tag_helper.rb +11 -0
  8. data/lib/{rails4_client_side_validations → client_side_validations}/active_model.rb +31 -9
  9. data/lib/{rails4_client_side_validations → client_side_validations}/active_model/absence.rb +1 -2
  10. data/lib/{rails4_client_side_validations → client_side_validations}/active_model/acceptance.rb +1 -2
  11. data/lib/client_side_validations/active_model/exclusion.rb +7 -0
  12. data/lib/{rails4_client_side_validations → client_side_validations}/active_model/format.rb +1 -2
  13. data/lib/client_side_validations/active_model/inclusion.rb +7 -0
  14. data/lib/{rails4_client_side_validations → client_side_validations}/active_model/length.rb +3 -4
  15. data/lib/{rails4_client_side_validations → client_side_validations}/active_model/numericality.rb +3 -4
  16. data/lib/{rails4_client_side_validations → client_side_validations}/active_model/presence.rb +1 -2
  17. data/lib/client_side_validations/active_record.rb +12 -0
  18. data/lib/{rails4_client_side_validations → client_side_validations}/active_record/middleware.rb +10 -6
  19. data/lib/{rails4_client_side_validations → client_side_validations}/active_record/uniqueness.rb +8 -6
  20. data/lib/{rails4_client_side_validations → client_side_validations}/config.rb +1 -1
  21. data/lib/client_side_validations/core_ext.rb +3 -0
  22. data/lib/{rails4_client_side_validations → client_side_validations}/core_ext/range.rb +0 -1
  23. data/lib/client_side_validations/core_ext/regexp.rb +25 -0
  24. data/lib/client_side_validations/engine.rb +5 -0
  25. data/lib/{rails4_client_side_validations → client_side_validations}/files.rb +2 -2
  26. data/lib/{rails4_client_side_validations → client_side_validations}/generators.rb +2 -3
  27. data/lib/client_side_validations/generators/rails_validations.rb +14 -0
  28. data/lib/{rails4_client_side_validations → client_side_validations}/middleware.rb +61 -16
  29. data/lib/client_side_validations/version.rb +3 -0
  30. data/lib/generators/{rails4_client_side_validations → client_side_validations}/copy_assets_generator.rb +3 -5
  31. data/lib/generators/client_side_validations/install_generator.rb +21 -0
  32. data/lib/generators/templates/{rails4_client_side_validations → client_side_validations}/initializer.rb +4 -4
  33. data/vendor/assets/javascripts/rails.validations.js +111 -98
  34. metadata +141 -81
  35. data/lib/generators/rails4_client_side_validations/install_generator.rb +0 -22
  36. data/lib/rails4_client_side_validations.rb +0 -13
  37. data/lib/rails4_client_side_validations/action_view.rb +0 -14
  38. data/lib/rails4_client_side_validations/action_view/form_builder.rb +0 -105
  39. data/lib/rails4_client_side_validations/action_view/form_tag_helper.rb +0 -12
  40. data/lib/rails4_client_side_validations/active_model/exclusion.rb +0 -27
  41. data/lib/rails4_client_side_validations/active_model/inclusion.rb +0 -26
  42. data/lib/rails4_client_side_validations/active_record.rb +0 -12
  43. data/lib/rails4_client_side_validations/core_ext.rb +0 -3
  44. data/lib/rails4_client_side_validations/core_ext/regexp.rb +0 -13
  45. data/lib/rails4_client_side_validations/engine.rb +0 -6
  46. data/lib/rails4_client_side_validations/generators/rails_validations.rb +0 -15
  47. data/lib/rails4_client_side_validations/version.rb +0 -3
@@ -0,0 +1,12 @@
1
+ require 'client_side_validations/active_model'
2
+ require 'client_side_validations/middleware'
3
+ require 'client_side_validations/active_record/middleware'
4
+
5
+ %w{uniqueness}.each do |validator|
6
+ require "client_side_validations/active_record/#{validator}"
7
+ validator.capitalize!
8
+ eval "ActiveRecord::Validations::#{validator}Validator.send(:include, ClientSideValidations::ActiveRecord::#{validator})"
9
+ end
10
+
11
+ ActiveRecord::Base.send(:include, ClientSideValidations::ActiveModel::Validations)
12
+ ClientSideValidations::Middleware::Uniqueness.register_orm(ClientSideValidations::ActiveRecord::Middleware)
@@ -1,4 +1,4 @@
1
- module Rails4ClientSideValidations::ActiveRecord
1
+ module ClientSideValidations::ActiveRecord
2
2
  class Middleware
3
3
 
4
4
  def self.is_class?(klass)
@@ -7,9 +7,9 @@ module Rails4ClientSideValidations::ActiveRecord
7
7
 
8
8
  def self.is_unique?(klass, attribute, value, params)
9
9
  klass = find_topmost_superclass(klass)
10
- value = type_cast_value(klass, attribute, value)
11
10
  column = klass.columns_hash[attribute.to_s]
12
- value = column.limit ? value.to_s.mb_chars[0, column.limit] : value.to_s if column.text?
11
+ value = type_cast_value(column, value)
12
+ value = column.limit ? value.to_s.mb_chars[0, column.limit] : value.to_s if value.is_a?(String)
13
13
 
14
14
  t = klass.arel_table
15
15
 
@@ -30,7 +30,7 @@ module Rails4ClientSideValidations::ActiveRecord
30
30
  end
31
31
 
32
32
  (params[:scope] || {}).each do |attribute, value|
33
- value = type_cast_value(klass, attribute, value)
33
+ value = type_cast_value(klass.columns_hash[attribute], value)
34
34
  if relation.is_a?(Arel::Nodes::SqlLiteral)
35
35
  relation = Arel::Nodes::SqlLiteral.new("#{relation} AND #{t[attribute].eq(value).to_sql}")
36
36
  else
@@ -43,8 +43,12 @@ module Rails4ClientSideValidations::ActiveRecord
43
43
 
44
44
  private
45
45
 
46
- def self.type_cast_value(klass, attribute, value)
47
- klass.columns_hash[attribute].type_cast(value)
46
+ def self.type_cast_value(column, value)
47
+ if column.respond_to?(:type_cast)
48
+ column.type_cast(value)
49
+ else
50
+ column.type_cast_from_database(value)
51
+ end
48
52
  end
49
53
 
50
54
  def self.find_topmost_superclass(klass)
@@ -1,4 +1,4 @@
1
- module Rails4ClientSideValidations::ActiveRecord
1
+ module ClientSideValidations::ActiveRecord
2
2
  module Uniqueness
3
3
  def client_side_hash(model, attribute, force = nil)
4
4
  hash = {}
@@ -6,16 +6,19 @@ module Rails4ClientSideValidations::ActiveRecord
6
6
  hash[:case_sensitive] = options[:case_sensitive]
7
7
  hash[:id] = model.id unless model.new_record?
8
8
  hash[:allow_blank] = true if options[:allow_blank]
9
+
10
+ if options.key?(:client_validations) && options[:client_validations].key?(:class)
11
+ hash[:class] = options[:client_validations][:class].underscore
12
+ elsif model.class.name.demodulize != model.class.name
13
+ hash[:class] = model.class.name.underscore
14
+ end
15
+
9
16
  if options.key?(:scope) && options[:scope].present?
10
17
  hash[:scope] = Array.wrap(options[:scope]).inject({}) do |scope_hash, scope_item|
11
18
  scope_hash.merge!(scope_item => model.send(scope_item))
12
19
  end
13
20
  end
14
21
 
15
- unless model.class.name.demodulize == model.class.name
16
- hash[:class] = model.class.name.underscore
17
- end
18
-
19
22
  hash
20
23
  end
21
24
 
@@ -26,4 +29,3 @@ module Rails4ClientSideValidations::ActiveRecord
26
29
  end
27
30
  end
28
31
  end
29
-
@@ -1,4 +1,4 @@
1
- module Rails4ClientSideValidations
1
+ module ClientSideValidations
2
2
  module Config
3
3
  class << self
4
4
  attr_accessor :disabled_validators
@@ -0,0 +1,3 @@
1
+ require 'active_support/json'
2
+ require 'client_side_validations/core_ext/range'
3
+ require 'client_side_validations/core_ext/regexp'
@@ -7,4 +7,3 @@ class Range
7
7
  as_json(options).inspect
8
8
  end
9
9
  end
10
-
@@ -0,0 +1,25 @@
1
+ class Regexp
2
+ def as_json(options = nil)
3
+ str = inspect
4
+ .sub('\\A' , '^')
5
+ .sub('\\Z' , '$')
6
+ .sub('\\z' , '$')
7
+ .sub(/^\// , '')
8
+ .sub(/\/[a-z]*$/ , '')
9
+ .gsub(/\(\?#.+\)/ , '')
10
+ .gsub(/\(\?-\w+:/ , '(')
11
+ .gsub(/\s/ , '')
12
+ opts = []
13
+ opts << 'i' if (self.options & Regexp::IGNORECASE) > 0
14
+ opts << 'm' if (self.options & Regexp::MULTILINE) > 0
15
+ { source: Regexp.new(str).source, options: opts.join }
16
+ end
17
+
18
+ def to_json(options = nil)
19
+ as_json(options)
20
+ end
21
+
22
+ def encode_json(encoder)
23
+ inspect
24
+ end
25
+ end
@@ -0,0 +1,5 @@
1
+ module ClientSideValidations
2
+ class Engine < ::Rails::Engine
3
+ config.app_middleware.use ClientSideValidations::Middleware::Validators
4
+ end
5
+ end
@@ -1,8 +1,8 @@
1
1
  # This is only used by dependant libraries that need to find the files
2
2
 
3
- module Rails4ClientSideValidations
3
+ module ClientSideValidations
4
4
  module Files
5
- Initializer = File.expand_path(File.dirname(__FILE__) + '/../generators/templates/rails4_client_side_validations/initializer.rb')
5
+ Initializer = File.expand_path(File.dirname(__FILE__) + '/../generators/templates/client_side_validations/initializer.rb')
6
6
  Javascript = File.expand_path(File.dirname(__FILE__) + '/../../vendor/assets/javascripts/rails.validations.js')
7
7
  end
8
8
  end
@@ -1,4 +1,4 @@
1
- module Rails4ClientSideValidations
1
+ module ClientSideValidations
2
2
  module Generators
3
3
  Assets = []
4
4
 
@@ -8,5 +8,4 @@ module Rails4ClientSideValidations
8
8
  end
9
9
  end
10
10
 
11
- require 'rails4_client_side_validations/generators/rails_validations'
12
-
11
+ require 'client_side_validations/generators/rails_validations'
@@ -0,0 +1,14 @@
1
+ module ClientSideValidations
2
+ module Generators
3
+ class RailsValidations
4
+ def self.assets
5
+ [{
6
+ path: File.expand_path('../../../../vendor/assets/javascripts', __FILE__),
7
+ file: 'rails.validations.js'
8
+ }]
9
+ end
10
+
11
+ Generators.register_assets(self)
12
+ end
13
+ end
14
+ end
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'rails4_client_side_validations/core_ext'
3
+ require 'client_side_validations/core_ext'
4
4
 
5
- module Rails4ClientSideValidations
5
+ module ClientSideValidations
6
6
 
7
7
  module Middleware
8
8
  class Validators
@@ -11,16 +11,32 @@ module Rails4ClientSideValidations
11
11
  end
12
12
 
13
13
  def call(env)
14
- if matches = /^\/validators\/(\w+)$/.match(env['PATH_INFO'])
15
- if Rails4ClientSideValidations::Config.disabled_validators.include?(matches[1].to_sym)
16
- [500, {'Content-Type' => 'application/json', 'Content-Length' => '0'}, ['']]
17
- else
18
- "::Rails4ClientSideValidations::Middleware::#{matches[1].camelize}".constantize.new(env).response
19
- end
14
+ if matches = /\A\/validators\/(\w+)\z/.match(env['PATH_INFO'])
15
+ process_request(matches.captures.first, env)
20
16
  else
21
17
  @app.call(env)
22
18
  end
23
19
  end
20
+
21
+ def process_request(validation, env)
22
+ if disabled_validators.include?(validation)
23
+ error_resp
24
+ else
25
+ klass_name = validation.camelize
26
+ klass_name = "::ClientSideValidations::Middleware::#{klass_name}"
27
+ klass_name.constantize.new(env).response
28
+ end
29
+ rescue => e
30
+ error_resp
31
+ end
32
+
33
+ def disabled_validators
34
+ ClientSideValidations::Config.disabled_validators.map(&:to_s)
35
+ end
36
+
37
+ def error_resp
38
+ [500, {'Content-Type' => 'application/json', 'Content-Length' => '0'}, ['']]
39
+ end
24
40
  end
25
41
 
26
42
  class Base
@@ -80,11 +96,8 @@ module Rails4ClientSideValidations
80
96
 
81
97
  def is_unique?
82
98
  convert_scope_value_from_null_to_nil
83
- resource = extract_resource
84
- klass = resource.classify.constantize
85
- attribute = request.params[resource].keys.first
86
- value = request.params[resource][attribute]
87
- middleware_class = nil
99
+ klass, attribute, value = extract_resources
100
+ middleware_class = nil
88
101
 
89
102
  unless Array.wrap(klass._validators[attribute.to_sym]).find { |v| v.kind == :uniqueness }
90
103
  raise NotValidatable
@@ -110,11 +123,43 @@ module Rails4ClientSideValidations
110
123
  end
111
124
  end
112
125
 
113
- def extract_resource
126
+ def extract_resources
114
127
  parent_key = (request.params.keys - IGNORE_PARAMS).first
128
+
129
+ if nested?(request.params[parent_key], 1)
130
+ klass, attribute, value = uproot(request.params[parent_key])
131
+ klass = klass.classify.constantize
132
+ else
133
+ klass = parent_key.classify.constantize
134
+ attribute = request.params[parent_key].keys.first
135
+ value = request.params[parent_key][attribute]
136
+ end
137
+
138
+ [klass, attribute, value]
139
+ end
140
+
141
+ def uproot(nested_hash = nil)
142
+ uproot_helper(nested_hash)[-3..-1]
143
+ end
144
+
145
+ def uproot_helper(nested_hash = nil, keys = [])
146
+ if nested_hash.respond_to?(:keys)
147
+ keys << nested_hash.keys.first
148
+ uproot_helper(nested_hash[nested_hash.keys.first], keys)
149
+ else
150
+ keys << nested_hash
151
+ end
115
152
  end
153
+
154
+ def nested?(hash = nil, levels = 0)
155
+ i = 0
156
+ until !(hash.respond_to? :keys)
157
+ hash = hash[hash.keys.first]
158
+ i += 1
159
+ end
160
+ i > levels
161
+ end
162
+
116
163
  end
117
164
  end
118
-
119
165
  end
120
-
@@ -0,0 +1,3 @@
1
+ module ClientSideValidations
2
+ VERSION = '4.2.0'.freeze
3
+ end
@@ -1,4 +1,4 @@
1
- module Rails4ClientSideValidations
1
+ module ClientSideValidations
2
2
  module Generators
3
3
  class CopyAssetsGenerator < Rails::Generators::Base
4
4
 
@@ -38,9 +38,8 @@ module Rails4ClientSideValidations
38
38
  end
39
39
 
40
40
  def self.asset_pipeline_enabled?
41
- if Rails.application
42
- (Rails.configuration.respond_to?(:assets) ? (Rails.configuration.assets || {}) : {})[:enabled]
43
- end
41
+ # Rails 4.1 doesn't provide :enabled in asset configuration, so we look for Sprockets
42
+ defined?(Sprockets).present?
44
43
  end
45
44
 
46
45
  def asset_pipeline_enabled?
@@ -55,4 +54,3 @@ module Rails4ClientSideValidations
55
54
  end
56
55
  end
57
56
  end
58
-
@@ -0,0 +1,21 @@
1
+ require 'generators/client_side_validations/copy_assets_generator'
2
+
3
+ module ClientSideValidations
4
+ module Generators
5
+ class InstallGenerator < CopyAssetsGenerator
6
+
7
+ def copy_initializer
8
+ source_paths << File.expand_path('../../templates/client_side_validations', __FILE__)
9
+ copy_file 'initializer.rb', 'config/initializers/client_side_validations.rb'
10
+ end
11
+
12
+ private
13
+
14
+ def self.installation_message
15
+ "Copies initializer into config/initializers and #{super.downcase}"
16
+ end
17
+
18
+ desc installation_message
19
+ end
20
+ end
21
+ end
@@ -6,10 +6,11 @@
6
6
  # Uncomment to validate number format with current I18n locale
7
7
  # ClientSideValidations::Config.number_format_with_locale = true
8
8
 
9
- # Uncomment to set a custom application scope
10
- # ClientSideValidations::Config.root_path = '/your/application/scope'
11
-
12
9
  # Uncomment the following block if you want each input field to have the validation messages attached.
10
+ #
11
+ # Note: client_side_validation requires the error to be encapsulated within
12
+ # <label for="#{instance.send(:tag_id)}" class="message"></label>
13
+ #
13
14
  # ActionView::Base.field_error_proc = Proc.new do |html_tag, instance|
14
15
  # unless html_tag =~ /^<label/
15
16
  # %{<div class="field_with_errors">#{html_tag}<label for="#{instance.send(:tag_id)}" class="message">#{instance.error_message.first}</label></div>}.html_safe
@@ -17,4 +18,3 @@
17
18
  # %{<div class="field_with_errors">#{html_tag}</div>}.html_safe
18
19
  # end
19
20
  # end
20
-
@@ -4,31 +4,31 @@
4
4
 
5
5
  $ = jQuery;
6
6
 
7
- $.fn.disableRails4ClientSideValidations = function() {
8
- Rails4ClientSideValidations.disable(this);
7
+ $.fn.disableClientSideValidations = function() {
8
+ ClientSideValidations.disable(this);
9
9
  return this;
10
10
  };
11
11
 
12
- $.fn.enableRails4ClientSideValidations = function() {
13
- this.filter(Rails4ClientSideValidations.selectors.forms).each(function() {
14
- return Rails4ClientSideValidations.enablers.form(this);
12
+ $.fn.enableClientSideValidations = function() {
13
+ this.filter(ClientSideValidations.selectors.forms).each(function() {
14
+ return ClientSideValidations.enablers.form(this);
15
15
  });
16
- this.filter(Rails4ClientSideValidations.selectors.inputs).each(function() {
17
- return Rails4ClientSideValidations.enablers.input(this);
16
+ this.filter(ClientSideValidations.selectors.inputs).each(function() {
17
+ return ClientSideValidations.enablers.input(this);
18
18
  });
19
19
  return this;
20
20
  };
21
21
 
22
- $.fn.resetRails4ClientSideValidations = function() {
23
- this.filter(Rails4ClientSideValidations.selectors.forms).each(function() {
24
- return Rails4ClientSideValidations.reset(this);
22
+ $.fn.resetClientSideValidations = function() {
23
+ this.filter(ClientSideValidations.selectors.forms).each(function() {
24
+ return ClientSideValidations.reset(this);
25
25
  });
26
26
  return this;
27
27
  };
28
28
 
29
29
  $.fn.validate = function() {
30
- this.filter(Rails4ClientSideValidations.selectors.forms).each(function() {
31
- return $(this).enableRails4ClientSideValidations();
30
+ this.filter(ClientSideValidations.selectors.forms).each(function() {
31
+ return $(this).enableClientSideValidations();
32
32
  });
33
33
  return this;
34
34
  };
@@ -44,41 +44,49 @@
44
44
  };
45
45
 
46
46
  validatorsFor = function(name, validators) {
47
- name = name.replace(/_attributes\]\[\w+\]\[(\w+)\]/g, "_attributes][][$1]");
47
+ var captures, validator, validator_name;
48
+ if (captures = name.match(/\[(\w+_attributes)\].*\[(\w+)\]$/)) {
49
+ for (validator_name in validators) {
50
+ validator = validators[validator_name];
51
+ if (validator_name.match("\\[" + captures[1] + "\\].*\\[\\]\\[" + captures[2] + "\\]$")) {
52
+ name = name.replace(/\[[\da-z_]+\]\[(\w+)\]$/g, "[][$1]");
53
+ }
54
+ }
55
+ }
48
56
  return validators[name] || {};
49
57
  };
50
58
 
51
59
  validateForm = function(form, validators) {
52
60
  var valid;
53
- form.trigger('form:validate:before.Rails4ClientSideValidations');
61
+ form.trigger('form:validate:before.ClientSideValidations');
54
62
  valid = true;
55
- form.find(Rails4ClientSideValidations.selectors.validate_inputs).each(function() {
63
+ form.find(ClientSideValidations.selectors.validate_inputs).each(function() {
56
64
  if (!$(this).isValid(validators)) {
57
65
  valid = false;
58
66
  }
59
67
  return true;
60
68
  });
61
69
  if (valid) {
62
- form.trigger('form:validate:pass.Rails4ClientSideValidations');
70
+ form.trigger('form:validate:pass.ClientSideValidations');
63
71
  } else {
64
- form.trigger('form:validate:fail.Rails4ClientSideValidations');
72
+ form.trigger('form:validate:fail.ClientSideValidations');
65
73
  }
66
- form.trigger('form:validate:after.Rails4ClientSideValidations');
74
+ form.trigger('form:validate:after.ClientSideValidations');
67
75
  return valid;
68
76
  };
69
77
 
70
78
  validateElement = function(element, validators) {
71
79
  var afterValidate, destroyInputName, executeValidators, failElement, local, passElement, remote;
72
- element.trigger('element:validate:before.Rails4ClientSideValidations');
80
+ element.trigger('element:validate:before.ClientSideValidations');
73
81
  passElement = function() {
74
- return element.trigger('element:validate:pass.Rails4ClientSideValidations').data('valid', null);
82
+ return element.trigger('element:validate:pass.ClientSideValidations').data('valid', null);
75
83
  };
76
84
  failElement = function(message) {
77
- element.trigger('element:validate:fail.Rails4ClientSideValidations', message).data('valid', false);
85
+ element.trigger('element:validate:fail.ClientSideValidations', message).data('valid', false);
78
86
  return false;
79
87
  };
80
88
  afterValidate = function() {
81
- return element.trigger('element:validate:after.Rails4ClientSideValidations').data('valid') !== false;
89
+ return element.trigger('element:validate:after.ClientSideValidations').data('valid') !== false;
82
90
  };
83
91
  executeValidators = function(context) {
84
92
  var fn, kind, message, valid, validator, _i, _len, _ref;
@@ -110,44 +118,44 @@
110
118
  return afterValidate();
111
119
  }
112
120
  element.data('changed', false);
113
- local = Rails4ClientSideValidations.validators.local;
114
- remote = Rails4ClientSideValidations.validators.remote;
121
+ local = ClientSideValidations.validators.local;
122
+ remote = ClientSideValidations.validators.remote;
115
123
  if (executeValidators(local) && executeValidators(remote)) {
116
124
  passElement();
117
125
  }
118
126
  return afterValidate();
119
127
  };
120
128
 
121
- if (window.Rails4ClientSideValidations === void 0) {
122
- window.Rails4ClientSideValidations = {};
129
+ if (window.ClientSideValidations === void 0) {
130
+ window.ClientSideValidations = {};
123
131
  }
124
132
 
125
- if (window.Rails4ClientSideValidations.forms === void 0) {
126
- window.Rails4ClientSideValidations.forms = {};
133
+ if (window.ClientSideValidations.forms === void 0) {
134
+ window.ClientSideValidations.forms = {};
127
135
  }
128
136
 
129
- window.Rails4ClientSideValidations.selectors = {
137
+ window.ClientSideValidations.selectors = {
130
138
  inputs: ':input:not(button):not([type="submit"])[name]:visible:enabled',
131
139
  validate_inputs: ':input:enabled:visible[data-validate]',
132
140
  forms: 'form[data-validate]'
133
141
  };
134
142
 
135
- window.Rails4ClientSideValidations.reset = function(form) {
143
+ window.ClientSideValidations.reset = function(form) {
136
144
  var $form, key;
137
145
  $form = $(form);
138
- Rails4ClientSideValidations.disable(form);
139
- for (key in form.Rails4ClientSideValidations.settings.validators) {
140
- form.Rails4ClientSideValidations.removeError($form.find("[name='" + key + "']"));
146
+ ClientSideValidations.disable(form);
147
+ for (key in form.ClientSideValidations.settings.validators) {
148
+ form.ClientSideValidations.removeError($form.find("[name='" + key + "']"));
141
149
  }
142
- return Rails4ClientSideValidations.enablers.form(form);
150
+ return ClientSideValidations.enablers.form(form);
143
151
  };
144
152
 
145
- window.Rails4ClientSideValidations.disable = function(target) {
153
+ window.ClientSideValidations.disable = function(target) {
146
154
  var $target;
147
155
  $target = $(target);
148
- $target.off('.Rails4ClientSideValidations');
156
+ $target.off('.ClientSideValidations');
149
157
  if ($target.is('form')) {
150
- return Rails4ClientSideValidations.disable($target.find(':input'));
158
+ return ClientSideValidations.disable($target.find(':input'));
151
159
  } else {
152
160
  $target.removeData('valid');
153
161
  $target.removeData('changed');
@@ -157,50 +165,50 @@
157
165
  }
158
166
  };
159
167
 
160
- window.Rails4ClientSideValidations.enablers = {
168
+ window.ClientSideValidations.enablers = {
161
169
  form: function(form) {
162
170
  var $form, binding, event, _ref;
163
171
  $form = $(form);
164
- form.Rails4ClientSideValidations = {
165
- settings: window.Rails4ClientSideValidations.forms[$form.attr('id')],
172
+ form.ClientSideValidations = {
173
+ settings: window.ClientSideValidations.forms[$form.attr('id')],
166
174
  addError: function(element, message) {
167
- return Rails4ClientSideValidations.formBuilders[form.Rails4ClientSideValidations.settings.type].add(element, form.Rails4ClientSideValidations.settings, message);
175
+ return ClientSideValidations.formBuilders[form.ClientSideValidations.settings.type].add(element, form.ClientSideValidations.settings, message);
168
176
  },
169
177
  removeError: function(element) {
170
- return Rails4ClientSideValidations.formBuilders[form.Rails4ClientSideValidations.settings.type].remove(element, form.Rails4ClientSideValidations.settings);
178
+ return ClientSideValidations.formBuilders[form.ClientSideValidations.settings.type].remove(element, form.ClientSideValidations.settings);
171
179
  }
172
180
  };
173
181
  _ref = {
174
- 'submit.Rails4ClientSideValidations': function(eventData) {
175
- if (!$form.isValid(form.Rails4ClientSideValidations.settings.validators)) {
182
+ 'submit.ClientSideValidations': function(eventData) {
183
+ if (!$form.isValid(form.ClientSideValidations.settings.validators)) {
176
184
  eventData.preventDefault();
177
185
  return eventData.stopImmediatePropagation();
178
186
  }
179
187
  },
180
- 'ajax:beforeSend.Rails4ClientSideValidations': function(eventData) {
188
+ 'ajax:beforeSend.ClientSideValidations': function(eventData) {
181
189
  if (eventData.target === this) {
182
- return $form.isValid(form.Rails4ClientSideValidations.settings.validators);
190
+ return $form.isValid(form.ClientSideValidations.settings.validators);
183
191
  }
184
192
  },
185
- 'form:validate:after.Rails4ClientSideValidations': function(eventData) {
186
- return Rails4ClientSideValidations.callbacks.form.after($form, eventData);
193
+ 'form:validate:after.ClientSideValidations': function(eventData) {
194
+ return ClientSideValidations.callbacks.form.after($form, eventData);
187
195
  },
188
- 'form:validate:before.Rails4ClientSideValidations': function(eventData) {
189
- return Rails4ClientSideValidations.callbacks.form.before($form, eventData);
196
+ 'form:validate:before.ClientSideValidations': function(eventData) {
197
+ return ClientSideValidations.callbacks.form.before($form, eventData);
190
198
  },
191
- 'form:validate:fail.Rails4ClientSideValidations': function(eventData) {
192
- return Rails4ClientSideValidations.callbacks.form.fail($form, eventData);
199
+ 'form:validate:fail.ClientSideValidations': function(eventData) {
200
+ return ClientSideValidations.callbacks.form.fail($form, eventData);
193
201
  },
194
- 'form:validate:pass.Rails4ClientSideValidations': function(eventData) {
195
- return Rails4ClientSideValidations.callbacks.form.pass($form, eventData);
202
+ 'form:validate:pass.ClientSideValidations': function(eventData) {
203
+ return ClientSideValidations.callbacks.form.pass($form, eventData);
196
204
  }
197
205
  };
198
206
  for (event in _ref) {
199
207
  binding = _ref[event];
200
208
  $form.on(event, binding);
201
209
  }
202
- return $form.find(Rails4ClientSideValidations.selectors.inputs).each(function() {
203
- return Rails4ClientSideValidations.enablers.input(this);
210
+ return $form.find(ClientSideValidations.selectors.inputs).each(function() {
211
+ return ClientSideValidations.enablers.input(this);
204
212
  });
205
213
  },
206
214
  input: function(input) {
@@ -209,30 +217,30 @@
209
217
  form = input.form;
210
218
  $form = $(form);
211
219
  _ref = {
212
- 'focusout.Rails4ClientSideValidations': function() {
213
- return $(this).isValid(form.Rails4ClientSideValidations.settings.validators);
220
+ 'focusout.ClientSideValidations': function() {
221
+ return $(this).isValid(form.ClientSideValidations.settings.validators);
214
222
  },
215
- 'change.Rails4ClientSideValidations': function() {
223
+ 'change.ClientSideValidations': function() {
216
224
  return $(this).data('changed', true);
217
225
  },
218
- 'element:validate:after.Rails4ClientSideValidations': function(eventData) {
219
- return Rails4ClientSideValidations.callbacks.element.after($(this), eventData);
226
+ 'element:validate:after.ClientSideValidations': function(eventData) {
227
+ return ClientSideValidations.callbacks.element.after($(this), eventData);
220
228
  },
221
- 'element:validate:before.Rails4ClientSideValidations': function(eventData) {
222
- return Rails4ClientSideValidations.callbacks.element.before($(this), eventData);
229
+ 'element:validate:before.ClientSideValidations': function(eventData) {
230
+ return ClientSideValidations.callbacks.element.before($(this), eventData);
223
231
  },
224
- 'element:validate:fail.Rails4ClientSideValidations': function(eventData, message) {
232
+ 'element:validate:fail.ClientSideValidations': function(eventData, message) {
225
233
  var element;
226
234
  element = $(this);
227
- return Rails4ClientSideValidations.callbacks.element.fail(element, message, function() {
228
- return form.Rails4ClientSideValidations.addError(element, message);
235
+ return ClientSideValidations.callbacks.element.fail(element, message, function() {
236
+ return form.ClientSideValidations.addError(element, message);
229
237
  }, eventData);
230
238
  },
231
- 'element:validate:pass.Rails4ClientSideValidations': function(eventData) {
239
+ 'element:validate:pass.ClientSideValidations': function(eventData) {
232
240
  var element;
233
241
  element = $(this);
234
- return Rails4ClientSideValidations.callbacks.element.pass(element, function() {
235
- return form.Rails4ClientSideValidations.removeError(element);
242
+ return ClientSideValidations.callbacks.element.pass(element, function() {
243
+ return form.ClientSideValidations.removeError(element);
236
244
  }, eventData);
237
245
  }
238
246
  };
@@ -242,8 +250,8 @@
242
250
  return $(this).attr('data-validate', true);
243
251
  }).on(event, binding);
244
252
  }
245
- $input.filter(':checkbox').on('change.Rails4ClientSideValidations', function() {
246
- return $(this).isValid(form.Rails4ClientSideValidations.settings.validators);
253
+ $input.filter(':checkbox').on('change.ClientSideValidations', function() {
254
+ return $(this).isValid(form.ClientSideValidations.settings.validators);
247
255
  });
248
256
  return $input.filter('[id$=_confirmation]').each(function() {
249
257
  var confirmationElement, element, _ref1, _results;
@@ -251,11 +259,11 @@
251
259
  element = $form.find("#" + (this.id.match(/(.+)_confirmation/)[1]) + ":input");
252
260
  if (element[0]) {
253
261
  _ref1 = {
254
- 'focusout.Rails4ClientSideValidations': function() {
255
- return element.data('changed', true).isValid(form.Rails4ClientSideValidations.settings.validators);
262
+ 'focusout.ClientSideValidations': function() {
263
+ return element.data('changed', true).isValid(form.ClientSideValidations.settings.validators);
256
264
  },
257
- 'keyup.Rails4ClientSideValidations': function() {
258
- return element.data('changed', true).isValid(form.Rails4ClientSideValidations.settings.validators);
265
+ 'keyup.ClientSideValidations': function() {
266
+ return element.data('changed', true).isValid(form.ClientSideValidations.settings.validators);
259
267
  }
260
268
  };
261
269
  _results = [];
@@ -269,9 +277,9 @@
269
277
  }
270
278
  };
271
279
 
272
- window.Rails4ClientSideValidations.validators = {
280
+ window.ClientSideValidations.validators = {
273
281
  all: function() {
274
- return jQuery.extend({}, Rails4ClientSideValidations.validators.local, Rails4ClientSideValidations.validators.remote);
282
+ return jQuery.extend({}, ClientSideValidations.validators.local, ClientSideValidations.validators.remote);
275
283
  },
276
284
  local: {
277
285
  absence: function(element, options) {
@@ -307,17 +315,17 @@
307
315
  }
308
316
  return message;
309
317
  }
310
- if (options["with"] && !options["with"].test(element.val())) {
318
+ if (options["with"] && !new RegExp(options["with"].source, options["with"].options).test(element.val())) {
311
319
  return options.message;
312
320
  }
313
- if (options.without && options.without.test(element.val())) {
321
+ if (options.without && !new RegExp(options.without.source, options.without.options).test(element.val())) {
314
322
  return options.message;
315
323
  }
316
324
  },
317
325
  numericality: function(element, options) {
318
326
  var CHECKS, check, check_value, fn, form, operator, val;
319
327
  val = jQuery.trim(element.val());
320
- if (!Rails4ClientSideValidations.patterns.numericality.test(val)) {
328
+ if (!ClientSideValidations.patterns.numericality.test(val)) {
321
329
  if (options.allow_blank === true && this.presence(element, {
322
330
  message: options.messages.numericality
323
331
  })) {
@@ -325,6 +333,7 @@
325
333
  }
326
334
  return options.messages.numericality;
327
335
  }
336
+ val = val.replace(new RegExp("\\" + ClientSideValidations.number_format.delimiter, 'g'), "").replace(new RegExp("\\" + ClientSideValidations.number_format.separator, 'g'), ".");
328
337
  if (options.only_integer && !/^[+-]?\d+$/.test(val)) {
329
338
  return options.messages.only_integer;
330
339
  }
@@ -348,7 +357,6 @@
348
357
  } else {
349
358
  return;
350
359
  }
351
- val = val.replace(new RegExp("\\" + Rails4ClientSideValidations.number_format.delimiter, 'g'), "").replace(new RegExp("\\" + Rails4ClientSideValidations.number_format.separator, 'g'), ".");
352
360
  fn = new Function("return " + val + " " + operator + " " + check_value);
353
361
  if (!fn()) {
354
362
  return options.messages[check];
@@ -492,7 +500,7 @@
492
500
  remote: {
493
501
  uniqueness: function(element, options) {
494
502
  var data, key, message, name, scope_value, scoped_element, scoped_name, _ref;
495
- message = Rails4ClientSideValidations.validators.local.presence(element, options);
503
+ message = ClientSideValidations.validators.local.presence(element, options);
496
504
  if (message) {
497
505
  if (options.allow_blank === true) {
498
506
  return;
@@ -519,8 +527,8 @@
519
527
  if (scoped_element[0] && scoped_element.val() !== scope_value) {
520
528
  data.scope[key] = scoped_element.val();
521
529
  scoped_element.unbind("change." + element.id).bind("change." + element.id, function() {
522
- element.trigger('change.Rails4ClientSideValidations');
523
- return element.trigger('focusout.Rails4ClientSideValidations');
530
+ element.trigger('change.ClientSideValidations');
531
+ return element.trigger('focusout.ClientSideValidations');
524
532
  });
525
533
  } else {
526
534
  data.scope[key] = scope_value;
@@ -537,11 +545,8 @@
537
545
  name = options['class'] + '[' + name.split('[')[1];
538
546
  }
539
547
  data[name] = element.val();
540
- if (Rails4ClientSideValidations.remote_validators_prefix == null) {
541
- Rails4ClientSideValidations.remote_validators_prefix = "";
542
- }
543
548
  if (jQuery.ajax({
544
- url: "" + Rails4ClientSideValidations.remote_validators_prefix + "/validators/uniqueness",
549
+ url: ClientSideValidations.remote_validators_url_for('uniqueness'),
545
550
  data: data,
546
551
  async: false,
547
552
  cache: false
@@ -552,17 +557,25 @@
552
557
  }
553
558
  };
554
559
 
555
- window.Rails4ClientSideValidations.disableValidators = function() {
560
+ window.ClientSideValidations.remote_validators_url_for = function(validator) {
561
+ if (ClientSideValidations.remote_validators_prefix != null) {
562
+ return "//" + window.location.host + "/" + ClientSideValidations.remote_validators_prefix + "/validators/" + validator;
563
+ } else {
564
+ return "//" + window.location.host + "/validators/" + validator;
565
+ }
566
+ };
567
+
568
+ window.ClientSideValidations.disableValidators = function() {
556
569
  var func, validator, _ref, _results;
557
- if (window.Rails4ClientSideValidations.disabled_validators === void 0) {
570
+ if (window.ClientSideValidations.disabled_validators === void 0) {
558
571
  return;
559
572
  }
560
- _ref = window.Rails4ClientSideValidations.validators.remote;
573
+ _ref = window.ClientSideValidations.validators.remote;
561
574
  _results = [];
562
575
  for (validator in _ref) {
563
576
  func = _ref[validator];
564
- if (window.Rails4ClientSideValidations.disabled_validators.indexOf(validator) !== -1) {
565
- _results.push(delete window.Rails4ClientSideValidations.validators.remote[validator]);
577
+ if (__indexOf.call(window.ClientSideValidations.disabled_validators, validator) >= 0) {
578
+ _results.push(delete window.ClientSideValidations.validators.remote[validator]);
566
579
  } else {
567
580
  _results.push(void 0);
568
581
  }
@@ -570,7 +583,7 @@
570
583
  return _results;
571
584
  };
572
585
 
573
- window.Rails4ClientSideValidations.formBuilders = {
586
+ window.ClientSideValidations.formBuilders = {
574
587
  'ActionView::Helpers::FormBuilder': {
575
588
  add: function(element, settings, message) {
576
589
  var form, inputErrorField, label, labelErrorField;
@@ -608,11 +621,11 @@
608
621
  }
609
622
  };
610
623
 
611
- window.Rails4ClientSideValidations.patterns = {
624
+ window.ClientSideValidations.patterns = {
612
625
  numericality: /^(-|\+)?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d*)?$/
613
626
  };
614
627
 
615
- window.Rails4ClientSideValidations.callbacks = {
628
+ window.ClientSideValidations.callbacks = {
616
629
  element: {
617
630
  after: function(element, eventData) {},
618
631
  before: function(element, eventData) {},
@@ -632,8 +645,8 @@
632
645
  };
633
646
 
634
647
  $(function() {
635
- Rails4ClientSideValidations.disableValidators();
636
- return $(Rails4ClientSideValidations.selectors.forms).validate();
648
+ ClientSideValidations.disableValidators();
649
+ return $(ClientSideValidations.selectors.forms).validate();
637
650
  });
638
651
 
639
652
  }).call(this);