client_side_validations 2.6.2 → 2.6.3

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.
@@ -1,182 +1,55 @@
1
- if (typeof(jQuery) != "undefined") {
2
- jQuery.validator.addMethod("format", function(value, element, params) {
3
- var pattern = new RegExp(params, "i");
4
- return this.optional(element) || pattern.test(value);
5
- }, jQuery.validator.format("Invalid format."));
1
+ jQuery.validator.addMethod("format", function(value, element, params) {
2
+ var pattern = new RegExp(params, "i");
3
+ return this.optional(element) || pattern.test(value);
4
+ }, jQuery.validator.format("Invalid format."));
6
5
 
7
- jQuery.validator.addMethod("acceptance", function(value, element, params) {
8
- return element.checked;
9
- }, jQuery.validator.format("Was not accepted."));
6
+ jQuery.validator.addMethod("acceptance", function(value, element, params) {
7
+ return element.checked;
8
+ }, jQuery.validator.format("Was not accepted."));
10
9
 
11
- jQuery.validator.addMethod("inclusion", function(value, element, params) {
12
- if (this.optional(element)) {
13
- return true;
14
- } else {
15
-
16
- for (var i=0, len=params.length; i<len; ++i ) {
17
- if (value == String(params[i])) {
18
- return true;
19
- }
10
+ jQuery.validator.addMethod("inclusion", function(value, element, params) {
11
+ if (this.optional(element)) {
12
+ return true;
13
+ } else {
14
+
15
+ for (var i=0, len=params.length; i<len; ++i ) {
16
+ if (value == String(params[i])) {
17
+ return true;
20
18
  }
21
19
  }
22
- return false;
23
- }, jQuery.validator.format("Not included in list."));
20
+ }
21
+ return false;
22
+ }, jQuery.validator.format("Not included in list."));
24
23
 
25
- jQuery.validator.addMethod("exclusion", function(value, element, params) {
26
- if (this.optional(element)) {
27
- return true;
28
- } else {
29
- for (var i=0, len=params.length; i<len; ++i ) {
30
- if (value == String(params[i])) {
31
- return false;
32
- }
33
- }
34
- }
24
+ jQuery.validator.addMethod("exclusion", function(value, element, params) {
25
+ if (this.optional(element)) {
35
26
  return true;
36
- }, jQuery.validator.format("Is reserved."));
37
-
38
- $.extend($.fn, {
39
- clientSideValidations: function() {
40
- for (var i in this) {
41
- var form = $(this[i]);
42
- var object = form.attr('object-csv');
43
- var form_id = form.attr('id');
44
- var object_id = null;
45
- var adapter = 'jquery.validate';
46
-
47
- if (/edit/.test(form_id)) {
48
- object_id = /edit_\w+_(\d+)/.exec(form_id)[1];
49
- }
50
-
51
- if (eval("typeof(" + object + "_validation_options)") != "undefined") {
52
- var options = eval(object + '_validation_options');
53
- } else {
54
- var options = { }
55
- }
56
- var client = new ClientSideValidations(object, adapter, object_id)
57
- var rules = eval(object + '_validation_rules');
58
- var validations = client.adaptValidations(rules);
59
- options.rules = validations.rules;
60
- options.messages = validations.messages;
61
- options.ignore = ':hidden';
62
- form.validate(options);
27
+ } else {
28
+ for (var i=0, len=params.length; i<len; ++i ) {
29
+ if (value == String(params[i])) {
30
+ return false;
63
31
  }
64
32
  }
65
- });
66
-
67
- $(document).ready(function() {
68
- $('form[object-csv]').clientSideValidations();
69
- });
70
- }
71
-
72
- ClientSideValidations = function(id, adapter, object_id) {
73
- this.id = id;
74
- this.adapter = adapter;
75
- this.adaptValidations = function(validations) {
76
- this.validations = validations;
77
- this.jQueryValidateAdapter = function() {
78
- rules = {}
79
- messages = {}
80
- for(var attr in this.validations) {
81
- name = this.id + '[' + attr + ']';
82
- rules[name] = {};
83
- messages[name] = {};
84
- for(var validation in this.validations[attr]) {
85
- rule = null;
86
- required = false;
87
- switch(validation) {
88
- case 'presence':
89
- rule = 'required';
90
- value = true;
91
- break;
92
- case 'format':
93
- value = this.validations[attr][validation]['with'];
94
- required = !this.validations[attr][validation]['allow_blank'];
95
- break;
96
- case 'numericality':
97
- rule = 'digits';
98
- value = true;
99
- required = !this.validations[attr][validation]['allow_blank'];
100
- break;
101
- case 'length':
102
- if ('minimum' in this.validations[attr][validation] && 'maximum' in this.validations[attr][validation]) {
103
- maxrule = 'maxlength';
104
- rules[name][maxrule] = this.validations[attr][validation]['maximum'];
105
- messages[name][maxrule] = this.validations[attr][validation]['message_max'];
106
-
107
- rule = 'minlength';
108
- value = this.validations[attr][validation]['minimum'];
109
- this.validations[attr][validation]['message'] = this.validations[attr][validation]['message_min']
110
- } else if('minimum' in this.validations[attr][validation]) {
111
- rule = 'minlength';
112
- value = this.validations[attr][validation]['minimum'];
113
- } else if('maximum' in this.validations[attr][validation]) {
114
- rule = 'maxlength';
115
- value = this.validations[attr][validation]['maximum'];
116
- }
117
- break;
118
- case 'uniqueness':
119
- rule = 'remote';
120
- value = {
121
- url: '/validations/uniqueness.json',
122
- data: {}
123
- }
124
- if(object_id) {
125
- value['data'][this.id + '[id]'] = function() {
126
- return String(object_id);
127
- }
128
- }
129
- required = !this.validations[attr][validation]['allow_blank'];
130
- break;
131
- case 'confirmation':
132
- rule = 'equalTo';
133
- value = "[name='" + this.id + "[" + attr + "_confirmation]" + "']";
134
- break;
135
- case 'acceptance':
136
- rule = 'acceptance';
137
- value = true;
138
- break;
139
- case 'inclusion':
140
- rule = 'inclusion';
141
- value = this.validations[attr][validation]['in']
142
- required = !this.validations[attr][validation]['allow_blank'];
143
- break;
144
- case 'exclusion':
145
- rule = 'exclusion';
146
- value = this.validations[attr][validation]['in']
147
- required = !this.validations[attr][validation]['allow_blank'];
148
- break;
149
-
150
- default:
151
- }
152
- if(rule == null) {
153
- rule = validation;
154
- }
155
-
156
- if (typeof(value) != 'undefined') {
157
- rules[name][rule] = value;
158
- messages[name][rule] = this.validations[attr][validation]['message'];
159
- }
160
- if (required && rules[name]['required'] == null) {
161
- rules[name].required = true;
162
- messages[name].required = this.validations[attr][validation]['message'];
163
- }
164
- }
165
- }
166
-
167
- result = {
168
- rules : rules,
169
- messages : messages
170
- };
171
-
172
- return result;
173
- };
174
-
175
- switch(this.adapter) {
176
- case 'jquery.validate':
177
- return this.jQueryValidateAdapter();
178
- break;
179
- default:
33
+ }
34
+ return true;
35
+ }, jQuery.validator.format("Is reserved."));
36
+
37
+ jQuery.validator.addMethod("islength", function(value, element, length) {
38
+ return this.optional(element) || value.length == length;
39
+ }, jQuery.validator.format("Is the wrong length."));
40
+
41
+ $.extend($.fn, {
42
+ clientSideValidations: function() {
43
+ for (var i = 0; i < this.size(); i++) {
44
+ var form = $(this[i]);
45
+ var object = form.attr('data-csv');
46
+ var validate_options = eval(object + "_validate_options");
47
+ validate_options.options.ignore = ':hidden';
48
+ form.validate(validate_options);
180
49
  }
181
- };
182
- }
50
+ }
51
+ });
52
+
53
+ $(function() {
54
+ $('form[data-csv]').clientSideValidations();
55
+ });
@@ -7,20 +7,18 @@ module DNCLabs
7
7
  def self.included(base)
8
8
  form_method = base.instance_method(:form_for)
9
9
  base.class_eval do
10
+ attr_accessor :validate_options
11
+
10
12
  define_method(:form_for) do |record_or_name_or_array, *args, &proc|
11
- options = args.extract_options!
12
- options.symbolize_keys!
13
+ options = Hash.new { |h, k| h[k] = {}}
14
+ options.merge!(args.extract_options!.symbolize_keys!)
13
15
  script = ""
14
16
  if validations = options.delete(:validations)
15
- unless options.key?(:html)
16
- options[:html] = {}
17
- end
18
- object, rules, csv_options = csv_get_variables(validations, record_or_name_or_array)
19
- options[:html]['object-csv'] = object
20
- csv_rules = %{var #{object}_validation_rules=#{rules};}
21
- script = %{<script type='text/javascript'>#{csv_rules}#{csv_options}</script>}
17
+ set_validate_options(validations, record_or_name_or_array)
18
+ options[:html]['data-csv'] = validate_options.delete('data-csv')
19
+ script = %{<script type='text/javascript'>var #{options[:html]['data-csv']}_validate_options=#{validate_options.to_json};</script>}
22
20
  end
23
- args << options
21
+ args << {}.merge(options)
24
22
  result = form_method.bind(self).call(record_or_name_or_array, *args, &proc)
25
23
 
26
24
  if rails3?
@@ -36,67 +34,102 @@ module DNCLabs
36
34
  private
37
35
 
38
36
  def rails3?
39
- version=
37
+ version =
40
38
  if defined?(ActionPack::VERSION::MAJOR)
41
39
  ActionPack::VERSION::MAJOR
42
40
  end
43
41
  !version.blank? && version >= 3
44
42
  end
45
43
 
46
- def csv_get_variables(validations, record_or_name_or_array)
47
- csv_options = ::ClientSideValidations.default_options || { }
44
+ def set_validate_options(validations, record_or_name_or_array)
45
+ options = ::ClientSideValidations.default_options || { }
46
+
48
47
  case validations
49
48
  when true
50
- object, rules = csv_get_object_and_validation_rules(record_or_name_or_array)
49
+ object_name = get_object_name(record_or_name_or_array)
50
+ data_csv = get_data_csv(record_or_name_or_array)
51
+ validate_options = rules_and_messages(record_or_name_or_array)
51
52
  when Hash
52
53
  validations.symbolize_keys!
53
54
  if validations.has_key?(:instance)
54
- object = validations[:instance].class.to_s.underscore
55
- rules = validations[:instance].validations_to_json
55
+ object_name = get_object_name(validations[:instance])
56
+ data_csv = get_data_csv(validations[:instance])
57
+ validate_options = validations[:instance].validate_options
56
58
  elsif validations.has_key?(:class)
57
- object = validations[:instance].to_s.underscore
58
- rules = validations[:instance].new.validations_to_json
59
+ object_name = get_object_name(validations[:class].new)
60
+ data_csv = get_data_csv(validations[:instance].new)
61
+ validate_options = validations[:class].new.validate_options
59
62
  else
60
- object, rules = csv_get_object_and_validation_rules(record_or_name_or_array)
61
- end
62
- if validations.has_key?(:options)
63
- csv_options.merge!(validations[:options])
63
+ object_name = get_object_name(record_or_name_or_array)
64
+ data_csv = get_data_csv(record_or_name_or_array)
65
+ validate_options = rules_and_messages(record_or_name_or_array)
64
66
  end
67
+
68
+ options.merge!(validations[:options] || {})
65
69
  else
66
- object = validations.to_s.underscore
67
- rules = validations.new.validations_to_json
70
+ object_name = get_object_name(validations)
71
+ data_csv = get_data_csv(validations)
72
+ validate_options = validations.new.validate_options
68
73
  end
69
74
 
70
- if csv_options.empty?
71
- csv_options = ""
72
- else
73
- csv_options = %{var #{object}_validation_options=#{convert_csv_options_to_json(csv_options)};}
75
+ self.validate_options = build_validate_options(object_name, validate_options, options, data_csv)
76
+ end
77
+
78
+ def build_validate_options(object_name, validate_options, options, data_csv)
79
+ %w{rules messages}.each do |option|
80
+ validate_options[option].keys.each do |key|
81
+ validate_options[option]["#{object_name}[#{key}]"] = validate_options[option].delete(key)
82
+ end
74
83
  end
75
84
 
76
- [object, rules, csv_options]
85
+ validate_options['options'] = options unless options.empty?
86
+ validate_options['data-csv'] = data_csv
87
+ validate_options
77
88
  end
78
89
 
79
- def convert_csv_options_to_json(csv_options)
90
+ def convert_options_to_json(options)
80
91
  json = []
81
- csv_options.each do |k, v|
92
+ options.each do |k, v|
82
93
  json << %{#{k}:#{v}}
83
94
  end
84
95
  %{{#{json.join(',')}}}
85
96
  end
86
97
 
87
- def csv_get_object_and_validation_rules(record_or_name_or_array)
98
+ def rules_and_messages(record_or_name_or_array)
88
99
  case record_or_name_or_array
89
100
  when String, Symbol
90
- object = record_or_name_or_array.to_s
91
- rules = object.camelize.constantize.new.validations_to_json
101
+ record_or_name_or_array.to_s.camelize.constantize.new.validate_options
92
102
  when Array
93
- object, rules = csv_get_object_and_validation_rules(record_or_name_or_array.last)
103
+ rules_and_messages(record_or_name_or_array.last)
94
104
  else
95
- object = record_or_name_or_array.class.to_s.underscore
96
- rules = record_or_name_or_array.validations_to_json
105
+ record_or_name_or_array.validate_options
106
+ end
107
+ end
108
+
109
+ def get_data_csv(object)
110
+ case object
111
+ when String, Symbol
112
+ object.to_s
113
+ when Array
114
+ get_data_csv(object.last)
115
+ when Class
116
+ object.to_s.underscore
117
+ else
118
+ dom_id(object)
119
+ end
120
+ end
121
+
122
+ def get_object_name(object)
123
+ case object
124
+ when String, Symbol
125
+ object.to_s
126
+ when Array
127
+ get_object_name(object.last)
128
+ when Class
129
+ get_object_name(object.new)
130
+ else
131
+ ActionController::RecordIdentifier.singular_class_name(object)
97
132
  end
98
-
99
- [object, rules]
100
133
  end
101
134
  end # BaseMethods
102
135
 
@@ -5,7 +5,7 @@ module DNCLabs
5
5
  module Adapters
6
6
  class ActiveModel < ORMBase
7
7
 
8
- def validation_to_hash(attr)
8
+ def validations_to_hash(attr)
9
9
  base._validators[attr.to_sym].inject({}) do |hash, validation|
10
10
  hash.merge!(build_validation_hash(validation.clone))
11
11
  end
@@ -48,7 +48,9 @@ module DNCLabs
48
48
  when :format
49
49
  I18n.translate(i18n_prefix + 'errors.messages.invalid')
50
50
  when :length
51
- if count = validation.options[:minimum]
51
+ if count = validation.options[:is]
52
+ I18n.translate(i18n_prefix + 'errors.messages.wrong_length').sub(orm_error_interpolation(:count), count.to_s)
53
+ elsif count = validation.options[:minimum]
52
54
  I18n.translate(i18n_prefix + 'errors.messages.too_short').sub(orm_error_interpolation(:count), count.to_s)
53
55
  elsif count = validation.options[:maximum]
54
56
  I18n.translate(i18n_prefix + 'errors.messages.too_long').sub(orm_error_interpolation(:count), count.to_s)
@@ -8,7 +8,7 @@ module DNCLabs
8
8
  self.base = base
9
9
  end
10
10
 
11
- def validation_to_hash(attr)
11
+ def validations_to_hash(attr)
12
12
  end
13
13
 
14
14
  def validation_fields
@@ -1,15 +1,138 @@
1
1
  module DNCLabs
2
2
  module ClientSideValidations
3
- def validations_to_json
4
- hash = Hash.new { |h, field| h[field] = {} }
3
+ def validate_options
4
+ rules = Hash.new { |h, field| h[field] = {} }
5
+ messages = Hash.new { |h, field| h[field] = {} }
5
6
  validation_fields.each do |field|
6
- hash[field].merge!(validation_to_hash(field))
7
+ validations = validations_to_hash(field)
8
+ rules[field.to_s].merge!(extract_rules(validations, field))
9
+ messages[field.to_s].merge!(extract_messages(validations))
7
10
  end
8
- hash.to_json
11
+ {"rules" => rules, "messages" => messages}
9
12
  end
10
13
 
11
- def validation_to_hash(field)
12
- dnc_csv_adapter.validation_to_hash(field)
14
+ def validations_to_hash(field)
15
+ dnc_csv_adapter.validations_to_hash(field)
16
+ end
17
+
18
+ private
19
+
20
+ def convert_kind(kind, options = nil)
21
+ case kind
22
+ when 'acceptance', 'exclusion', 'inclusion'
23
+ kind
24
+ when 'confirmation'
25
+ 'equalTo'
26
+ when 'presence'
27
+ 'required'
28
+ when 'numericality'
29
+ 'digits'
30
+ when 'length'
31
+ if options['is']
32
+ 'islength'
33
+ elsif options['minimum'] && options['maximum']
34
+ ['minlength', 'maxlength']
35
+ elsif options['minimum']
36
+ 'minlength'
37
+ elsif options['maximum']
38
+ 'maxlength'
39
+ end
40
+ when 'uniqueness'
41
+ 'remote'
42
+ end
43
+ end
44
+
45
+ def extract_rules(validations, field = nil)
46
+ rules = {}
47
+ validations.each do |kind, options|
48
+ kind = convert_kind(kind, options)
49
+ value = case kind
50
+ when 'acceptance'
51
+ true
52
+ when 'equalTo'
53
+ %{[name="#{field}_confirmation"]}
54
+ when 'required'
55
+ true
56
+ when 'digits'
57
+ true
58
+ when 'exclusion', 'inclusion'
59
+ options['in']
60
+ when 'islength'
61
+ options['is']
62
+ when 'minlength'
63
+ options['minimum']
64
+ when 'maxlength'
65
+ options['maximum']
66
+ when 'remote'
67
+ if self.new_record?
68
+ data = {}
69
+ else
70
+ data = { "#{self.class.to_s.underscore}[id]" => self.id}
71
+ end
72
+ {'url' => '/validations/uniqueness.json', 'data' => data}
73
+ end
74
+
75
+ unless Array === kind
76
+ rules[kind] = value
77
+ else
78
+ kind.each do |k|
79
+ special_rule = case k
80
+ when 'minlength'
81
+ options['minimum']
82
+ when 'maxlength'
83
+ options['maximum']
84
+ end
85
+
86
+ rules[k] = special_rule
87
+ end
88
+ end
89
+
90
+ if required?(kind, options)
91
+ unless rules['required']
92
+ rules['required'] = true
93
+ end
94
+ end
95
+
96
+ end
97
+ rules
98
+ end
99
+
100
+ def extract_messages(validations)
101
+ messages = {}
102
+ validations.each do |kind, options|
103
+ kind = convert_kind(kind, options)
104
+ unless Array === kind
105
+ messages[kind] = options['message']
106
+ else
107
+ kind.each do |k|
108
+ special_message = case k
109
+ when 'minlength'
110
+ options['message'] = options['message_min']
111
+ 'message_min'
112
+ when 'maxlength'
113
+ 'message_max'
114
+ end
115
+
116
+ messages[k] = options[special_message]
117
+ end
118
+ end
119
+
120
+ if required?(kind, options)
121
+ unless messages['required']
122
+ messages['required'] = options['message']
123
+ end
124
+ end
125
+ end
126
+ messages
127
+ end
128
+
129
+ def required?(kind, options)
130
+ case kind
131
+ when 'digits', 'exclusion', 'inclusion', 'islength', 'minlength', 'remote'
132
+ !options['allow_blank']
133
+ when Array
134
+ required?('minlength', options) if kind.include?('minlength')
135
+ end
13
136
  end
14
137
 
15
138
  def validation_fields
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: client_side_validations
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 17
5
5
  prerelease: false
6
6
  segments:
7
7
  - 2
8
8
  - 6
9
- - 2
10
- version: 2.6.2
9
+ - 3
10
+ version: 2.6.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Brian Cardarella
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-22 00:00:00 -04:00
18
+ date: 2010-07-25 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency