cck_forms 3.3.2 → 3.4.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.
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
|