pcai_client_side_validations 3.1.5 → 3.2.1
Sign up to get free protection for your applications and to get access to all the features.
- metadata +20 -113
- data/client_side_validations.gemspec +0 -42
- data/lib/client_side_validations.rb +0 -13
- data/lib/client_side_validations/action_view.rb +0 -14
- data/lib/client_side_validations/action_view/form_builder.rb +0 -157
- data/lib/client_side_validations/action_view/form_helper.rb +0 -86
- data/lib/client_side_validations/action_view/form_tag_helper.rb +0 -12
- data/lib/client_side_validations/active_model.rb +0 -60
- data/lib/client_side_validations/active_model/acceptance.rb +0 -10
- data/lib/client_side_validations/active_model/exclusion.rb +0 -15
- data/lib/client_side_validations/active_model/format.rb +0 -10
- data/lib/client_side_validations/active_model/inclusion.rb +0 -15
- data/lib/client_side_validations/active_model/length.rb +0 -24
- data/lib/client_side_validations/active_model/numericality.rb +0 -31
- data/lib/client_side_validations/active_model/presence.rb +0 -10
- data/lib/client_side_validations/active_record.rb +0 -11
- data/lib/client_side_validations/active_record/middleware.rb +0 -33
- data/lib/client_side_validations/active_record/uniqueness.rb +0 -28
- data/lib/client_side_validations/core_ext.rb +0 -3
- data/lib/client_side_validations/core_ext/range.rb +0 -10
- data/lib/client_side_validations/core_ext/regexp.rb +0 -14
- data/lib/client_side_validations/engine.rb +0 -6
- data/lib/client_side_validations/files.rb +0 -8
- data/lib/client_side_validations/formtastic.rb +0 -21
- data/lib/client_side_validations/middleware.rb +0 -81
- data/lib/client_side_validations/mongo_mapper.rb +0 -9
- data/lib/client_side_validations/mongo_mapper/middleware.rb +0 -20
- data/lib/client_side_validations/mongo_mapper/uniqueness.rb +0 -28
- data/lib/client_side_validations/mongoid.rb +0 -9
- data/lib/client_side_validations/mongoid/middleware.rb +0 -20
- data/lib/client_side_validations/mongoid/uniqueness.rb +0 -28
- data/lib/client_side_validations/simple_form.rb +0 -24
- data/lib/client_side_validations/version.rb +0 -3
- data/lib/generators/client_side_validations/copy_asset_generator.rb +0 -36
- data/lib/generators/client_side_validations/install_generator.rb +0 -45
- data/lib/generators/templates/client_side_validations/README.rails.3.0 +0 -6
- data/lib/generators/templates/client_side_validations/README.rails.3.1 +0 -7
- data/lib/generators/templates/client_side_validations/initializer.rb +0 -14
- data/vendor/assets/javascripts/rails.validations.js +0 -410
@@ -1,86 +0,0 @@
|
|
1
|
-
module ClientSideValidations::ActionView::Helpers
|
2
|
-
module FormHelper
|
3
|
-
class Error < StandardError; end
|
4
|
-
|
5
|
-
def form_for(record_or_name_or_array, *args, &proc)
|
6
|
-
options = args.extract_options!
|
7
|
-
if options[:validate]
|
8
|
-
|
9
|
-
content_for_name = options[:validate] unless options[:validate] == true
|
10
|
-
|
11
|
-
# Always turn off HTML5 Validations
|
12
|
-
options[:html] ||= {}
|
13
|
-
options[:html][:novalidate] = 'novalidate'
|
14
|
-
|
15
|
-
case record_or_name_or_array
|
16
|
-
when String, Symbol
|
17
|
-
raise ClientSideValidations::ActionView::Helpers::FormHelper::Error, 'Using form_for(:name, @resource) is deprecated in Rails and is not supported with ClientSideValidations. Please use form_for(@resource, :as => :name) instead.'
|
18
|
-
when Array
|
19
|
-
object = record_or_name_or_array.last
|
20
|
-
else
|
21
|
-
object = record_or_name_or_array
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
@validators = {}
|
26
|
-
# Order matters here. Rails mutates the options object
|
27
|
-
script = client_side_form_settings(object, options)
|
28
|
-
form = super(record_or_name_or_array, *(args << options), &proc)
|
29
|
-
# Because of the load order requirement above this sub is necessary
|
30
|
-
# Would be nice to not do this
|
31
|
-
script = insert_validators_into_script(script)
|
32
|
-
if content_for_name
|
33
|
-
content_for(content_for_name) { script.html_safe }
|
34
|
-
script = nil
|
35
|
-
end
|
36
|
-
"#{form}#{script}".html_safe
|
37
|
-
end
|
38
|
-
|
39
|
-
def apply_form_for_options!(object_or_array, options)
|
40
|
-
super
|
41
|
-
options[:html][:validate] = true if options[:validate]
|
42
|
-
end
|
43
|
-
|
44
|
-
def fields_for(record_or_name_or_array, *args, &block)
|
45
|
-
output = super
|
46
|
-
@validators.merge!(args.last ? args.last[:validators] : {}) if @validators
|
47
|
-
output
|
48
|
-
end
|
49
|
-
|
50
|
-
private
|
51
|
-
|
52
|
-
def insert_validators_into_script(script)
|
53
|
-
# There is probably a more performant way of doing this
|
54
|
-
# But using String#sub has some issues. Undocumented "features"
|
55
|
-
if script
|
56
|
-
script = script.split(/"validator_hash"/)
|
57
|
-
script = "#{script[0]}#{@validators.to_json}#{script[1]}"
|
58
|
-
end
|
59
|
-
|
60
|
-
script
|
61
|
-
end
|
62
|
-
|
63
|
-
def client_side_form_settings(object, options)
|
64
|
-
if options[:validate]
|
65
|
-
builder = options[:builder] || ActionView::Base.default_form_builder
|
66
|
-
|
67
|
-
if options[:html] && options[:html][:id]
|
68
|
-
var_name = options[:html][:id]
|
69
|
-
else
|
70
|
-
var_name = if object.respond_to?(:persisted?) && object.persisted?
|
71
|
-
options[:as] ? "#{options[:as]}_edit" : dom_id(object, :edit)
|
72
|
-
else
|
73
|
-
options[:as] ? "#{options[:as]}_new" : dom_id(object)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
content_tag(:script) do
|
78
|
-
"window['#{var_name}'] = #{builder.client_side_form_settings(options, self).merge(:validators => 'validator_hash').to_json};".html_safe
|
79
|
-
end
|
80
|
-
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
@@ -1,12 +0,0 @@
|
|
1
|
-
module ClientSideValidations::ActionView::Helpers
|
2
|
-
module FormTagHelper
|
3
|
-
private
|
4
|
-
def html_options_for_form(url_for_options, options, *parameters_for_url)
|
5
|
-
options.stringify_keys!
|
6
|
-
html_options = {}
|
7
|
-
html_options['data-validate'] = options.delete('validate') if options['validate']
|
8
|
-
html_options.merge!(super(url_for_options, options, *parameters_for_url))
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
@@ -1,60 +0,0 @@
|
|
1
|
-
require 'client_side_validations/core_ext'
|
2
|
-
|
3
|
-
module ClientSideValidations::ActiveModel
|
4
|
-
module Validator
|
5
|
-
|
6
|
-
def client_side_hash(model, attribute)
|
7
|
-
options = self.options.dup
|
8
|
-
{ :message => model.errors.generate_message(attribute, message_type, options) }.merge(options.except(*::ActiveModel::Errors::CALLBACKS_OPTIONS - [:allow_blank, :if, :unless]))
|
9
|
-
end
|
10
|
-
|
11
|
-
private
|
12
|
-
|
13
|
-
def message_type
|
14
|
-
kind
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
module Validations
|
19
|
-
def client_side_validation_hash
|
20
|
-
@client_side_validation_hash ||= _validators.inject({}) do |attr_hash, attr|
|
21
|
-
unless [nil, :block].include?(attr[0])
|
22
|
-
|
23
|
-
validator_hash = attr[1].inject({}) do |kind_hash, validator|
|
24
|
-
client_side_hash = validator.client_side_hash(self, attr[0])
|
25
|
-
# Yeah yeah, #new_record? is not part of ActiveModel :p
|
26
|
-
if (can_use_for_client_side_validation?(client_side_hash, validator))
|
27
|
-
kind_hash.merge!(validator.kind => client_side_hash.except(:on))
|
28
|
-
else
|
29
|
-
kind_hash.merge!({})
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
if validator_hash.present?
|
34
|
-
attr_hash.merge!(attr[0] => validator_hash)
|
35
|
-
else
|
36
|
-
attr_hash
|
37
|
-
end
|
38
|
-
else
|
39
|
-
attr_hash
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
def can_use_for_client_side_validation?(client_side_hash, validator)
|
47
|
-
((self.respond_to?(:new_record?) && validator.options[:on] == (self.new_record? ? :create : :update)) || validator.options[:on].nil?) && validator.kind != :block
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
ActiveModel::Validator.send(:include, ClientSideValidations::ActiveModel::Validator)
|
53
|
-
ActiveModel::Validations.send(:include, ClientSideValidations::ActiveModel::Validations)
|
54
|
-
|
55
|
-
%w{acceptance exclusion inclusion length format numericality presence}.each do |validator|
|
56
|
-
require "client_side_validations/active_model/#{validator}"
|
57
|
-
validator.capitalize!
|
58
|
-
eval "ActiveModel::Validations::#{validator}Validator.send(:include, ClientSideValidations::ActiveModel::#{validator})"
|
59
|
-
end
|
60
|
-
|
@@ -1,24 +0,0 @@
|
|
1
|
-
module ClientSideValidations::ActiveModel
|
2
|
-
module Length
|
3
|
-
|
4
|
-
def client_side_hash(model, attribute)
|
5
|
-
options = self.options.dup
|
6
|
-
hash = { :messages => {} }
|
7
|
-
hash[:js_tokenizer] = options[:js_tokenizer] if options[:js_tokenizer]
|
8
|
-
hash[:allow_blank] = true if options[:allow_blank]
|
9
|
-
|
10
|
-
self.class::MESSAGES.each do |option, message_type|
|
11
|
-
if count = options[option]
|
12
|
-
options[:message] = options[message_type]
|
13
|
-
options.delete(:message) if options[:message].nil?
|
14
|
-
hash[:messages][option] = model.errors.generate_message(attribute, message_type, options.merge(:count => count))
|
15
|
-
hash[option] = count
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
hash
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module ClientSideValidations::ActiveModel
|
2
|
-
module Numericality
|
3
|
-
|
4
|
-
OPTION_MAP = {}
|
5
|
-
|
6
|
-
def self.included(base)
|
7
|
-
OPTION_MAP.merge!(base::CHECKS.keys.inject({}) { |hash, key| hash.merge!(key => key) })
|
8
|
-
end
|
9
|
-
|
10
|
-
def client_side_hash(model, attribute)
|
11
|
-
options = self.options.dup
|
12
|
-
hash = { :messages => { :numericality => model.errors.generate_message(attribute, :not_a_number, options) } }
|
13
|
-
|
14
|
-
if options[:only_integer]
|
15
|
-
hash[:messages][:only_integer] = model.errors.generate_message(attribute, :not_an_integer, options)
|
16
|
-
hash[:only_integer] = true
|
17
|
-
end
|
18
|
-
|
19
|
-
OPTION_MAP.each do |option, message_type|
|
20
|
-
if count = options[option]
|
21
|
-
hash[:messages][option] = model.errors.generate_message(attribute, message_type, options.merge(:count => count))
|
22
|
-
hash[option] = count
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
hash
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
@@ -1,11 +0,0 @@
|
|
1
|
-
require 'client_side_validations/active_model'
|
2
|
-
require 'client_side_validations/active_record/middleware'
|
3
|
-
|
4
|
-
%w{uniqueness}.each do |validator|
|
5
|
-
require "client_side_validations/active_record/#{validator}"
|
6
|
-
validator.capitalize!
|
7
|
-
eval "ActiveRecord::Validations::#{validator}Validator.send(:include, ClientSideValidations::ActiveRecord::#{validator})"
|
8
|
-
end
|
9
|
-
|
10
|
-
ActiveRecord::Base.send(:include, ClientSideValidations::ActiveModel::Validations)
|
11
|
-
|
@@ -1,33 +0,0 @@
|
|
1
|
-
module ClientSideValidations::ActiveRecord
|
2
|
-
class Middleware
|
3
|
-
|
4
|
-
def self.is_unique?(klass, attribute, value, params)
|
5
|
-
column = klass.columns_hash[attribute.to_s]
|
6
|
-
value = column.limit ? value.to_s.mb_chars[0, column.limit] : value.to_s if column.text?
|
7
|
-
|
8
|
-
t = klass.arel_table
|
9
|
-
|
10
|
-
if params[:case_sensitive] == 'true'
|
11
|
-
if t.engine.connection.instance_variable_get("@config")[:adapter] == 'mysql'
|
12
|
-
relation = Arel::Nodes::SqlLiteral.new("BINARY #{t[attribute].eq(value).to_sql}")
|
13
|
-
else
|
14
|
-
relation = t[attribute].eq(value)
|
15
|
-
end
|
16
|
-
else
|
17
|
-
relation = t[attribute].matches(value)
|
18
|
-
end
|
19
|
-
|
20
|
-
if relation.is_a?(Arel::Nodes::SqlLiteral)
|
21
|
-
relation = Arel::Nodes::SqlLiteral.new("BINARY #{t[attribute].eq(value).to_sql} AND #{t.primary_key.not_eq(params[:id]).to_sql}")
|
22
|
-
else
|
23
|
-
relation = relation.and(t.primary_key.not_eq(params[:id])) if params[:id]
|
24
|
-
end
|
25
|
-
|
26
|
-
(params[:scope] || {}).each do |key, value|
|
27
|
-
relation = relation.and(t[key].eq(value))
|
28
|
-
end
|
29
|
-
|
30
|
-
!klass.where(relation).exists?
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
module ClientSideValidations::ActiveRecord
|
2
|
-
module Uniqueness
|
3
|
-
def client_side_hash(model, attribute)
|
4
|
-
hash = {}
|
5
|
-
hash[:message] = model.errors.generate_message(attribute, message_type, options.except(:scope))
|
6
|
-
hash[:case_sensitive] = options[:case_sensitive]
|
7
|
-
hash[:id] = model.id unless model.new_record?
|
8
|
-
if options.key?(:scope) && options[:scope].present?
|
9
|
-
hash[:scope] = Array.wrap(options[:scope]).inject({}) do |scope_hash, scope_item|
|
10
|
-
scope_hash.merge!(scope_item => model.send(scope_item))
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
unless model.class.name.demodulize == model.class.name
|
15
|
-
hash[:class] = model.class.name.underscore
|
16
|
-
end
|
17
|
-
|
18
|
-
hash
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def message_type
|
24
|
-
:taken
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
@@ -1,14 +0,0 @@
|
|
1
|
-
class Regexp
|
2
|
-
def as_json(options = nil)
|
3
|
-
Regexp.new inspect.sub("\\A","^").sub("\\Z","$").sub("\\z","$").sub(/^\//,"").sub(/\/[a-z]*$/,""), self.options
|
4
|
-
end
|
5
|
-
|
6
|
-
def to_json(options = nil)
|
7
|
-
as_json(options).inspect
|
8
|
-
end
|
9
|
-
|
10
|
-
def encode_json(encoder)
|
11
|
-
inspect
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
@@ -1,8 +0,0 @@
|
|
1
|
-
# This is only used by dependant libraries that need to find the files
|
2
|
-
|
3
|
-
module ClientSideValidations
|
4
|
-
module Files
|
5
|
-
Initializer = File.expand_path(File.dirname(__FILE__) + '/../generators/templates/client_side_validations/initializer.rb')
|
6
|
-
Javascript = File.expand_path(File.dirname(__FILE__) + '/../../vendor/assets/javascripts/rails.validations.js')
|
7
|
-
end
|
8
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module ClientSideValidations
|
2
|
-
module Formtastic
|
3
|
-
module FormBuilder
|
4
|
-
|
5
|
-
def self.included(base)
|
6
|
-
base.class_eval do
|
7
|
-
def self.client_side_form_settings(options, form_helper)
|
8
|
-
{
|
9
|
-
:type => self.to_s,
|
10
|
-
:inline_error_class => ::Formtastic::FormBuilder.default_inline_error_class
|
11
|
-
}
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
Formtastic::FormBuilder.send(:include, ClientSideValidations::Formtastic::FormBuilder)
|
21
|
-
|
@@ -1,81 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'client_side_validations/core_ext'
|
4
|
-
|
5
|
-
module ClientSideValidations
|
6
|
-
|
7
|
-
module Middleware
|
8
|
-
class Validators
|
9
|
-
def initialize(app)
|
10
|
-
@app = app
|
11
|
-
end
|
12
|
-
|
13
|
-
def call(env)
|
14
|
-
case env['PATH_INFO']
|
15
|
-
when %r{\/validators\/(\w+)}
|
16
|
-
"::ClientSideValidations::Middleware::#{$1.camelize}".constantize.new(env).response
|
17
|
-
else
|
18
|
-
@app.call(env)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
class Base
|
24
|
-
attr_accessor :request, :body, :status
|
25
|
-
|
26
|
-
def initialize(env)
|
27
|
-
self.body = ''
|
28
|
-
self.status = 200
|
29
|
-
self.request = ActionDispatch::Request.new(env)
|
30
|
-
end
|
31
|
-
|
32
|
-
def response
|
33
|
-
[status, {'Content-Type' => content_type, 'Content-Length' => body.length.to_s}, [body]]
|
34
|
-
end
|
35
|
-
|
36
|
-
def content_type
|
37
|
-
'application/json'
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
class Uniqueness < Base
|
42
|
-
IGNORE_PARAMS = %w{case_sensitive id scope}
|
43
|
-
|
44
|
-
def response
|
45
|
-
if is_unique?
|
46
|
-
self.status = 404
|
47
|
-
self.body = 'true'
|
48
|
-
else
|
49
|
-
self.status = 200
|
50
|
-
self.body = 'false'
|
51
|
-
end
|
52
|
-
super
|
53
|
-
end
|
54
|
-
|
55
|
-
private
|
56
|
-
|
57
|
-
def is_unique?
|
58
|
-
resource = extract_resource
|
59
|
-
klass = resource.classify.constantize
|
60
|
-
attribute = request.params[resource].keys.first
|
61
|
-
value = request.params[resource][attribute]
|
62
|
-
|
63
|
-
if (defined?(::ActiveRecord::Base) && klass < ::ActiveRecord::Base)
|
64
|
-
middleware_klass = ClientSideValidations::ActiveRecord::Middleware
|
65
|
-
elsif (defined?(::Mongoid::Document) && klass.included_modules.include?(::Mongoid::Document))
|
66
|
-
middleware_klass = ClientSideValidations::Mongoid::Middleware
|
67
|
-
elsif (defined?(::MongoMapper::Document) && klass.included_modules.include?(::MongoMapper::Document))
|
68
|
-
middleware_klass = ClientSideValidations::MongoMapper::Middleware
|
69
|
-
end
|
70
|
-
|
71
|
-
middleware_klass.is_unique?(klass, attribute, value, request.params)
|
72
|
-
end
|
73
|
-
|
74
|
-
def extract_resource
|
75
|
-
parent_key = (request.params.keys - IGNORE_PARAMS).first
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
end
|
81
|
-
|