pcai_client_side_validations 3.1.5 → 3.2.1
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.
- 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
|
-
|