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: 193298cd7c3b91ac5f8427f293bf38ae60b09a09
4
- data.tar.gz: 04392a3085d958fb7ab3f73a9c9340ce47fe900c
3
+ metadata.gz: 47a8cd38b248b42275dbcad881170f8d04da4dc9
4
+ data.tar.gz: 8a0e0fd4447f3330f6709b271094438922a4ec39
5
5
  SHA512:
6
- metadata.gz: e9b35ff662f63eedceb15ea6ecf8179bdf04d7991c4379140cd6ed370a478189888030f0b29d1e4e6526ab893eccf4b2f2dff5546c73d460839949677290d0a0
7
- data.tar.gz: a5468e5e66cdfc837f978536e53b7d4f9b03af520ee015fe729df4fea16ff70b8c37debe3db806f72dda07e0017c5ea29624b0d3822accb584a88597243f0bd1
6
+ metadata.gz: d3bd36c81ce696ee7090d0f7cfba39f9b8fa621a44acbbffa81210f4a87fac291ee8f5cd4e9bbda1fd4234c2d3fac70af702b6147a1a87db62277a37bf98d311
7
+ data.tar.gz: 3000a75fb172986b3400c538634191e543986d912743472bab1a8d03607cb5917cb66e93ae47d453e325be9bab4b98fee941240aa86d884e708aec35498d0800
@@ -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
- # 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::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
@@ -1,3 +1,3 @@
1
1
  module CckForms
2
- VERSION = '3.3.2'
2
+ VERSION = '3.4.0'
3
3
  end
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.3.2
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-24 00:00:00.000000000 Z
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