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: 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