cck_forms 3.3.2 → 3.4.0
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 47a8cd38b248b42275dbcad881170f8d04da4dc9
|
4
|
+
data.tar.gz: 8a0e0fd4447f3330f6709b271094438922a4ec39
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d3bd36c81ce696ee7090d0f7cfba39f9b8fa621a44acbbffa81210f4a87fac291ee8f5cd4e9bbda1fd4234c2d3fac70af702b6147a1a87db62277a37bf98d311
|
7
|
+
data.tar.gz: 3000a75fb172986b3400c538634191e543986d912743472bab1a8d03607cb5917cb66e93ae47d453e325be9bab4b98fee941240aa86d884e708aec35498d0800
|
data/config/locales/ru.yml
CHANGED
@@ -13,10 +13,10 @@ ru:
|
|
13
13
|
image: Картинка
|
14
14
|
integer: Целое число
|
15
15
|
integer_range: Диапазон между двумя целыми числами
|
16
|
+
float_range: Диапазон между двумя дробными числами
|
16
17
|
map: Точка на карте
|
17
18
|
phones: Телефоны
|
18
19
|
string: Строка
|
19
|
-
string_collection: Массив строк
|
20
20
|
text: Текст
|
21
21
|
time: Время
|
22
22
|
watermarkless_album: Альбом без водяного знака
|
@@ -41,6 +41,12 @@ ru:
|
|
41
41
|
less_than: до
|
42
42
|
more_than: свыше
|
43
43
|
|
44
|
+
float_range:
|
45
|
+
till: до
|
46
|
+
from: от
|
47
|
+
less_than: до
|
48
|
+
more_than: свыше
|
49
|
+
|
44
50
|
phones:
|
45
51
|
add_more: Добавить еще телефонов
|
46
52
|
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class CckForms::ParameterTypeClass::FloatRange < CckForms::ParameterTypeClass::NumberRange
|
2
|
+
def normalize_number(number)
|
3
|
+
number.to_f.round(2)
|
4
|
+
end
|
5
|
+
|
6
|
+
def form_field(form_builder_field, field_name, options)
|
7
|
+
default_style = {class: 'form-control input-small'}
|
8
|
+
|
9
|
+
form_builder_field.number_field field_name, options.merge(value: value.try(:[], field_name.to_s), step: 'any').reverse_merge(default_style)
|
10
|
+
end
|
11
|
+
end
|
@@ -1,164 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
# If passed, on each object save the intersection of the target range and :ranges will be calculated and saved into DB
|
5
|
-
# (denormalized) for easy finding later via where('some_field.ranged.300-600' => true).
|
6
|
-
#
|
7
|
-
class CckForms::ParameterTypeClass::IntegerRange # Rover :)
|
8
|
-
include CckForms::ParameterTypeClass::Base
|
9
|
-
|
10
|
-
# {from: 500, to: 1000, ranges: {"300-600" => true, "601-900" => true, "901-1500" => false}}
|
11
|
-
def mongoize
|
12
|
-
value_from_form = value
|
13
|
-
return nil if value_from_form.blank?
|
14
|
-
|
15
|
-
from = value_from_form.try(:[], 'from').to_i
|
16
|
-
till = value_from_form.try(:[], 'till').to_i
|
17
|
-
|
18
|
-
db_representation = {
|
19
|
-
from: from,
|
20
|
-
till: till,
|
21
|
-
ranges: {}
|
22
|
-
}
|
23
|
-
|
24
|
-
if @extra_options[:ranges].respond_to? :each
|
25
|
-
@extra_options[:ranges].each do |range_string|
|
26
|
-
low, high = range_string.split(range_string_delimiter)
|
27
|
-
if high.to_i.to_s != high.to_s
|
28
|
-
high = Integer::MAX_32BIT
|
29
|
-
end
|
30
|
-
low, high = low.to_i, high.to_i
|
31
|
-
|
32
|
-
# -----
|
33
|
-
# [ RANGE ]
|
34
|
-
completely_in_range = (from >= low && till <= high)
|
35
|
-
|
36
|
-
# -------
|
37
|
-
# [ RANGE ]
|
38
|
-
#
|
39
|
-
# ------
|
40
|
-
# [ RANGE ]
|
41
|
-
intersects_range_partially = (from <= low && till >= low) || (from <= high && till >= high)
|
42
|
-
|
43
|
-
# -----------
|
44
|
-
# [ RANGE ]
|
45
|
-
contains_range = from < low && till > high
|
46
|
-
|
47
|
-
db_representation[:ranges][range_string] = completely_in_range || intersects_range_partially || contains_range
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
db_representation
|
52
|
-
end
|
53
|
-
|
54
|
-
# "from 10"
|
55
|
-
# "till 20"
|
56
|
-
# "10-20"
|
57
|
-
#
|
58
|
-
# options:
|
59
|
-
#
|
60
|
-
# delimeter - instead of "-"
|
61
|
-
def to_s(options = {})
|
62
|
-
options ||= {}
|
63
|
-
return '' if value.blank?
|
64
|
-
|
65
|
-
delimiter = options[:delimeter].presence || default_integer_range_delimiter
|
66
|
-
|
67
|
-
from = value.try(:[], 'from').to_i
|
68
|
-
till = value.try(:[], 'till').to_i
|
69
|
-
|
70
|
-
return '' if from.zero? && till.zero?
|
71
|
-
|
72
|
-
if from.zero?
|
73
|
-
[I18n.t('cck_forms.integer_range.till'), till].join(' ')
|
74
|
-
elsif till.zero?
|
75
|
-
[I18n.t('cck_forms.integer_range.from'), from].join(' ')
|
76
|
-
elsif from == till
|
77
|
-
from.to_s
|
78
|
-
else
|
79
|
-
[from, till].join(delimiter)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
# If options[:for] == :search and options[:as] == :select, builds a SELECT with options from extra_options[:rages].
|
84
|
-
# Otherwise, two inputs are built.
|
85
|
-
#
|
86
|
-
# options[:only/:except] are available if the former case.
|
87
|
-
def build_form(form_builder, options)
|
88
|
-
set_value_in_hash options
|
89
|
-
if options.delete(:for) == :search
|
90
|
-
build_search_form(form_builder, options)
|
91
|
-
else
|
92
|
-
build_for_admin_interface_form(form_builder, options)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
# Search with the help of extra_options[:ranges]
|
97
|
-
def search(criteria, field, query)
|
98
|
-
criteria.where("#{field}.ranges.#{query}" => true)
|
99
|
-
end
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
private
|
104
|
-
|
105
|
-
def build_for_admin_interface_form(form_builder, options)
|
106
|
-
delimiter = options[:delimeter].presence || ' — '
|
107
|
-
|
108
|
-
default_style = {class: 'form-control input-small'}
|
109
|
-
result = ['<div class="form-inline">']
|
110
|
-
form_builder.fields_for :value do |ff|
|
111
|
-
from_field = ff.number_field :from, options.merge(value: value.try(:[], 'from')).reverse_merge(default_style)
|
112
|
-
till_field = ff.number_field :till, options.merge(value: value.try(:[], 'till')).reverse_merge(default_style)
|
113
|
-
result << [from_field, till_field].join(delimiter).html_safe
|
114
|
-
end
|
115
|
-
result << '</div>'
|
116
|
-
result.join.html_safe
|
117
|
-
end
|
118
|
-
|
119
|
-
def build_search_form(form_builder, options)
|
120
|
-
delimiter = options[:delimeter].presence || default_integer_range_delimiter
|
121
|
-
form_fields = []
|
122
|
-
visual_representation = options.delete(:as)
|
123
|
-
show_only = options.delete(:only)
|
124
|
-
|
125
|
-
if visual_representation == :select
|
126
|
-
klazz = options.delete :class
|
127
|
-
form_fields << form_builder.select(:value, [['', '']] + humanized_integer_ranges_for_select, options.merge(selected: options[:value]), {class: klazz} )
|
128
|
-
else
|
129
|
-
show_all_fields = !show_only
|
130
|
-
|
131
|
-
if show_all_fields or show_only == :low
|
132
|
-
form_fields << form_builder.text_field(:from, options.merge(index: 'value', value: value.try(:[], 'from')))
|
133
|
-
end
|
134
|
-
|
135
|
-
if show_all_fields or show_only == :high
|
136
|
-
form_fields << form_builder.text_field(:till, options.merge(index: 'value', value: value.try(:[], 'till')))
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
form_fields.join(delimiter).html_safe
|
141
|
-
end
|
142
|
-
|
143
|
-
def default_integer_range_delimiter
|
144
|
-
'–'
|
145
|
-
end
|
146
|
-
|
147
|
-
def humanized_integer_ranges_for_select
|
148
|
-
@extra_options[:ranges].map do |range_string|
|
149
|
-
low, high = range_string.split(range_string_delimiter)
|
150
|
-
if low.to_i.to_s != low.to_s
|
151
|
-
option_text = [I18n.t('cck_forms.integer_range.less_than'), high].join(' ')
|
152
|
-
elsif high.to_i.to_s != high.to_s
|
153
|
-
option_text = [I18n.t('cck_forms.integer_range.more_than'), low].join(' ')
|
154
|
-
else
|
155
|
-
option_text = [low, high].join(default_integer_range_delimiter)
|
156
|
-
end
|
157
|
-
[option_text, range_string]
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
def range_string_delimiter
|
162
|
-
/[-:\\]/
|
1
|
+
class CckForms::ParameterTypeClass::IntegerRange < CckForms::ParameterTypeClass::NumberRange
|
2
|
+
def normalize_number(number)
|
3
|
+
number.to_i
|
163
4
|
end
|
164
5
|
end
|
@@ -0,0 +1,169 @@
|
|
1
|
+
# Represents a decimal range — two integer values.
|
2
|
+
#
|
3
|
+
# Has an extra_options (see base.rb): :ranges
|
4
|
+
# If passed, on each object save the intersection of the target range and :ranges will be calculated and saved into DB
|
5
|
+
# (denormalized) for easy finding later via where('some_field.ranged.300-600' => true).
|
6
|
+
#
|
7
|
+
class CckForms::ParameterTypeClass::NumberRange
|
8
|
+
include CckForms::ParameterTypeClass::Base
|
9
|
+
|
10
|
+
# {from: 500, to: 1000, ranges: {"300-600" => true, "601-900" => true, "901-1500" => false}}
|
11
|
+
def mongoize
|
12
|
+
value_from_form = value
|
13
|
+
return nil if value_from_form.blank?
|
14
|
+
|
15
|
+
from = normalize_number value_from_form.try(:[], 'from')
|
16
|
+
till = normalize_number value_from_form.try(:[], 'till')
|
17
|
+
|
18
|
+
db_representation = {
|
19
|
+
from: from,
|
20
|
+
till: till,
|
21
|
+
ranges: {}
|
22
|
+
}
|
23
|
+
|
24
|
+
if @extra_options[:ranges].respond_to? :each
|
25
|
+
@extra_options[:ranges].each do |range_string|
|
26
|
+
low, high = range_string.split(range_string_delimiter)
|
27
|
+
if normalize_number(high).to_s != high.to_s
|
28
|
+
high = Integer::MAX_32BIT
|
29
|
+
end
|
30
|
+
low, high = normalize_number(low), normalize_number(high)
|
31
|
+
|
32
|
+
# -----
|
33
|
+
# [ RANGE ]
|
34
|
+
completely_in_range = (from >= low && till <= high)
|
35
|
+
|
36
|
+
# -------
|
37
|
+
# [ RANGE ]
|
38
|
+
#
|
39
|
+
# ------
|
40
|
+
# [ RANGE ]
|
41
|
+
intersects_range_partially = (from <= low && till >= low) || (from <= high && till >= high)
|
42
|
+
|
43
|
+
# -----------
|
44
|
+
# [ RANGE ]
|
45
|
+
contains_range = from < low && till > high
|
46
|
+
|
47
|
+
db_representation[:ranges][range_string] = completely_in_range || intersects_range_partially || contains_range
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
db_representation
|
52
|
+
end
|
53
|
+
|
54
|
+
# "from 10"
|
55
|
+
# "till 20"
|
56
|
+
# "10-20"
|
57
|
+
#
|
58
|
+
# options:
|
59
|
+
#
|
60
|
+
# delimeter - instead of "-"
|
61
|
+
def to_s(options = {})
|
62
|
+
options ||= {}
|
63
|
+
return '' if value.blank?
|
64
|
+
|
65
|
+
delimiter = options[:delimeter].presence || default_number_range_delimiter
|
66
|
+
|
67
|
+
from = normalize_number value.try(:[], 'from')
|
68
|
+
till = normalize_number value.try(:[], 'till')
|
69
|
+
|
70
|
+
return '' if from.zero? && till.zero?
|
71
|
+
|
72
|
+
if from.zero?
|
73
|
+
[I18n.t("cck_forms.#{self.class.code}.till"), till].join(' ')
|
74
|
+
elsif till.zero?
|
75
|
+
[I18n.t("cck_forms.#{self.class.code}.from"), from].join(' ')
|
76
|
+
elsif from == till
|
77
|
+
from.to_s
|
78
|
+
else
|
79
|
+
[from, till].join(delimiter)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# If options[:for] == :search and options[:as] == :select, builds a SELECT with options from extra_options[:rages].
|
84
|
+
# Otherwise, two inputs are built.
|
85
|
+
#
|
86
|
+
# options[:only/:except] are available if the former case.
|
87
|
+
def build_form(form_builder, options)
|
88
|
+
set_value_in_hash options
|
89
|
+
if options.delete(:for) == :search
|
90
|
+
build_search_form(form_builder, options)
|
91
|
+
else
|
92
|
+
build_for_admin_interface_form(form_builder, options)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
# Search with the help of extra_options[:ranges]
|
97
|
+
def search(criteria, field, query)
|
98
|
+
criteria.where("#{field}.ranges.#{query}" => true)
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
def form_field(form_builder_field, field_name, options)
|
106
|
+
default_style = {class: 'form-control input-small'}
|
107
|
+
|
108
|
+
form_builder_field.number_field field_name, options.merge(value: value.try(:[], field_name.to_s)).reverse_merge(default_style)
|
109
|
+
end
|
110
|
+
|
111
|
+
def build_for_admin_interface_form(form_builder, options)
|
112
|
+
delimiter = options[:delimeter].presence || ' — '
|
113
|
+
|
114
|
+
result = ['<div class="form-inline">']
|
115
|
+
form_builder.fields_for :value do |ff|
|
116
|
+
from_field = form_field ff, :from, options
|
117
|
+
till_field = form_field ff, :till, options
|
118
|
+
result << [from_field, till_field].join(delimiter).html_safe
|
119
|
+
end
|
120
|
+
result << '</div>'
|
121
|
+
result.join.html_safe
|
122
|
+
end
|
123
|
+
|
124
|
+
def build_search_form(form_builder, options)
|
125
|
+
delimiter = options[:delimeter].presence || default_number_range_delimiter
|
126
|
+
form_fields = []
|
127
|
+
visual_representation = options.delete(:as)
|
128
|
+
show_only = options.delete(:only)
|
129
|
+
|
130
|
+
if visual_representation == :select
|
131
|
+
klazz = options.delete :class
|
132
|
+
form_fields << form_builder.select(:value, [['', '']] + humanized_number_ranges_for_select, options.merge(selected: options[:value]), {class: klazz} )
|
133
|
+
else
|
134
|
+
show_all_fields = !show_only
|
135
|
+
|
136
|
+
if show_all_fields or show_only == :low
|
137
|
+
form_fields << form_builder.text_field(:from, options.merge(index: 'value', value: value.try(:[], 'from')))
|
138
|
+
end
|
139
|
+
|
140
|
+
if show_all_fields or show_only == :high
|
141
|
+
form_fields << form_builder.text_field(:till, options.merge(index: 'value', value: value.try(:[], 'till')))
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
form_fields.join(delimiter).html_safe
|
146
|
+
end
|
147
|
+
|
148
|
+
def default_number_range_delimiter
|
149
|
+
'–'
|
150
|
+
end
|
151
|
+
|
152
|
+
def humanized_number_ranges_for_select
|
153
|
+
@extra_options[:ranges].map do |range_string|
|
154
|
+
low, high = range_string.split(range_string_delimiter)
|
155
|
+
if normalize_number(low).to_s != low.to_s
|
156
|
+
option_text = [I18n.t("cck_forms.#{self.class.code}.less_than"), high].join(' ')
|
157
|
+
elsif normalize_number(high).to_s != high.to_s
|
158
|
+
option_text = [I18n.t("cck_forms.#{self.class.code}.more_than"), low].join(' ')
|
159
|
+
else
|
160
|
+
option_text = [low, high].join(default_number_range_delimiter)
|
161
|
+
end
|
162
|
+
[option_text, range_string]
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def range_string_delimiter
|
167
|
+
/[-:\\]/
|
168
|
+
end
|
169
|
+
end
|
data/lib/cck_forms/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cck_forms
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ilya Konanykhin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-09
|
11
|
+
date: 2018-10-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -78,10 +78,12 @@ files:
|
|
78
78
|
- lib/cck_forms/parameter_type_class/enum.rb
|
79
79
|
- lib/cck_forms/parameter_type_class/file.rb
|
80
80
|
- lib/cck_forms/parameter_type_class/float.rb
|
81
|
+
- lib/cck_forms/parameter_type_class/float_range.rb
|
81
82
|
- lib/cck_forms/parameter_type_class/image.rb
|
82
83
|
- lib/cck_forms/parameter_type_class/integer.rb
|
83
84
|
- lib/cck_forms/parameter_type_class/integer_range.rb
|
84
85
|
- lib/cck_forms/parameter_type_class/map.rb
|
86
|
+
- lib/cck_forms/parameter_type_class/number_range.rb
|
85
87
|
- lib/cck_forms/parameter_type_class/phones.rb
|
86
88
|
- lib/cck_forms/parameter_type_class/string.rb
|
87
89
|
- lib/cck_forms/parameter_type_class/string_collection.rb
|