cck_forms 3.0.1 → 3.1.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 +4 -4
- data/README.md +254 -1
- data/lib/cck_forms/date_time.rb +4 -0
- data/lib/cck_forms/engine.rb +2 -2
- data/lib/cck_forms/form_builder_extensions.rb +2 -1
- data/lib/cck_forms/neofiles_denormalize.rb +71 -0
- data/lib/cck_forms/parameter_type_class/album.rb +15 -11
- data/lib/cck_forms/parameter_type_class/base.rb +58 -63
- data/lib/cck_forms/parameter_type_class/boolean.rb +6 -0
- data/lib/cck_forms/parameter_type_class/checkboxes.rb +31 -15
- data/lib/cck_forms/parameter_type_class/date.rb +5 -0
- data/lib/cck_forms/parameter_type_class/date_range.rb +8 -2
- data/lib/cck_forms/parameter_type_class/date_time.rb +10 -8
- data/lib/cck_forms/parameter_type_class/enum.rb +11 -0
- data/lib/cck_forms/parameter_type_class/file.rb +27 -20
- data/lib/cck_forms/parameter_type_class/float.rb +3 -0
- data/lib/cck_forms/parameter_type_class/image.rb +3 -1
- data/lib/cck_forms/parameter_type_class/integer.rb +10 -4
- data/lib/cck_forms/parameter_type_class/integer_range.rb +18 -0
- data/lib/cck_forms/parameter_type_class/map.rb +23 -23
- data/lib/cck_forms/parameter_type_class/phones.rb +14 -15
- data/lib/cck_forms/parameter_type_class/string.rb +3 -0
- data/lib/cck_forms/parameter_type_class/string_collection.rb +6 -0
- data/lib/cck_forms/parameter_type_class/text.rb +4 -0
- data/lib/cck_forms/parameter_type_class/time.rb +4 -0
- data/lib/cck_forms/parameter_type_class/work_hours.rb +24 -36
- data/lib/cck_forms/version.rb +1 -1
- data/vendor/assets/javascripts/cck_forms/index.js +2 -0
- metadata +4 -2
@@ -1,3 +1,5 @@
|
|
1
|
+
# Represents a floating point value.
|
2
|
+
#
|
1
3
|
class CckForms::ParameterTypeClass::Float
|
2
4
|
include CckForms::ParameterTypeClass::Base
|
3
5
|
|
@@ -13,6 +15,7 @@ class CckForms::ParameterTypeClass::Float
|
|
13
15
|
value.to_f != 0.0 ? value.to_f : ''
|
14
16
|
end
|
15
17
|
|
18
|
+
# HTML input
|
16
19
|
def build_form(form_builder, options)
|
17
20
|
set_value_in_hash options
|
18
21
|
form_builder.number_field :value, {class: 'form-control input-small'}.merge(options)
|
@@ -1,5 +1,6 @@
|
|
1
|
+
# Represents a single image. A subclass of File.
|
2
|
+
#
|
1
3
|
class CckForms::ParameterTypeClass::Image < CckForms::ParameterTypeClass::File
|
2
|
-
include CckForms::ParameterTypeClass::Base
|
3
4
|
|
4
5
|
def self.name
|
5
6
|
'Картинка'
|
@@ -13,6 +14,7 @@ class CckForms::ParameterTypeClass::Image < CckForms::ParameterTypeClass::File
|
|
13
14
|
self.class.file_type
|
14
15
|
end
|
15
16
|
|
17
|
+
# Returns a 64x64 IMG
|
16
18
|
def to_diff_value(options = {})
|
17
19
|
view_context = options[:view_context]
|
18
20
|
"<img style='width: 64px; height: 64px;' src='#{view_context.neofiles_image_path(id: value, format: '64x64', crop: 1)}'>".html_safe
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# Represents a decimal value.
|
2
|
+
#
|
1
3
|
class CckForms::ParameterTypeClass::Integer
|
2
4
|
include CckForms::ParameterTypeClass::Base
|
3
5
|
|
@@ -39,11 +41,15 @@ class CckForms::ParameterTypeClass::Integer
|
|
39
41
|
end
|
40
42
|
end
|
41
43
|
|
42
|
-
#
|
44
|
+
# Examples of options[:values] (works only if options[:as] == :select or options[:for] == :search):
|
43
45
|
#
|
44
|
-
#
|
45
|
-
#
|
46
|
-
#
|
46
|
+
# ranges: [['not more that 10', '/10'], ['11-20', '11/20'], ['21-30', '21/30'], ['more that 30', '31/']]
|
47
|
+
# counting: [['one', '1'], ['two', '2'], ['three', '3']]
|
48
|
+
# combined: [['one', '1'], ['two', '2'], ['three and more', '3/']]
|
49
|
+
#
|
50
|
+
# Other options:
|
51
|
+
#
|
52
|
+
# only - leave only these keys (array/string)
|
47
53
|
def build_form(form_builder, options = {})
|
48
54
|
set_value_in_hash options
|
49
55
|
|
@@ -1,3 +1,9 @@
|
|
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
|
+
#
|
1
7
|
class CckForms::ParameterTypeClass::IntegerRange # Rover :)
|
2
8
|
include CckForms::ParameterTypeClass::Base
|
3
9
|
|
@@ -49,6 +55,13 @@ class CckForms::ParameterTypeClass::IntegerRange # Rover :)
|
|
49
55
|
db_representation
|
50
56
|
end
|
51
57
|
|
58
|
+
# "from 10"
|
59
|
+
# "till 20"
|
60
|
+
# "10-20"
|
61
|
+
#
|
62
|
+
# options:
|
63
|
+
#
|
64
|
+
# delimeter - instead of "-"
|
52
65
|
def to_s(options = {})
|
53
66
|
options ||= {}
|
54
67
|
return '' if value.blank?
|
@@ -71,6 +84,10 @@ class CckForms::ParameterTypeClass::IntegerRange # Rover :)
|
|
71
84
|
end
|
72
85
|
end
|
73
86
|
|
87
|
+
# If options[:for] == :search and options[:as] == :select, builds a SELECT with options from extra_options[:rages].
|
88
|
+
# Otherwise, two inputs are built.
|
89
|
+
#
|
90
|
+
# options[:only/:except] are available if the former case.
|
74
91
|
def build_form(form_builder, options)
|
75
92
|
set_value_in_hash options
|
76
93
|
if options.delete(:for) == :search
|
@@ -80,6 +97,7 @@ class CckForms::ParameterTypeClass::IntegerRange # Rover :)
|
|
80
97
|
end
|
81
98
|
end
|
82
99
|
|
100
|
+
# Search with the help of extra_options[:ranges]
|
83
101
|
def search(criteria, field, query)
|
84
102
|
criteria.where("#{field}.ranges.#{query}" => true)
|
85
103
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# Represents a map point in Google Maps or Yandex.Maps.
|
2
|
+
#
|
1
3
|
class CckForms::ParameterTypeClass::Map
|
2
4
|
include CckForms::ParameterTypeClass::Base
|
3
5
|
|
@@ -14,9 +16,9 @@ class CckForms::ParameterTypeClass::Map
|
|
14
16
|
'Точка на карте'
|
15
17
|
end
|
16
18
|
|
17
|
-
#
|
19
|
+
# In MongoDB: {latlon: [x, y], zoom: z}
|
18
20
|
#
|
19
|
-
#
|
21
|
+
# In application: {
|
20
22
|
# latitude: x,
|
21
23
|
# longitude: y,
|
22
24
|
# zoom: z
|
@@ -39,13 +41,13 @@ class CckForms::ParameterTypeClass::Map
|
|
39
41
|
end
|
40
42
|
|
41
43
|
|
42
|
-
#
|
44
|
+
# In application: {
|
43
45
|
# latitude: x,
|
44
46
|
# longitude: y,
|
45
47
|
# zoom: z
|
46
48
|
# }
|
47
49
|
#
|
48
|
-
#
|
50
|
+
# In MongoDB: {latlon: [x, y], zoom: z}
|
49
51
|
def mongoize
|
50
52
|
value = self.value.is_a?(Hash) ? self.value : {}
|
51
53
|
return {
|
@@ -55,7 +57,7 @@ class CckForms::ParameterTypeClass::Map
|
|
55
57
|
}
|
56
58
|
end
|
57
59
|
|
58
|
-
#
|
60
|
+
# Call #img_tag if :width & :height
|
59
61
|
def to_s(options = {})
|
60
62
|
options ||= {}
|
61
63
|
if options[:width].to_i > 0 and options[:height].to_i > 0
|
@@ -66,8 +68,10 @@ class CckForms::ParameterTypeClass::Map
|
|
66
68
|
''
|
67
69
|
end
|
68
70
|
|
69
|
-
#
|
70
|
-
#
|
71
|
+
# IMG tag of options[:with] X options[:height] size with a point on it in the current value position (unless value
|
72
|
+
# is empty, of course).
|
73
|
+
#
|
74
|
+
# See Google/Yandex Maps Static API.
|
71
75
|
def img_tag(width, height, options = {})
|
72
76
|
map_type = value['type']
|
73
77
|
|
@@ -105,7 +109,7 @@ class CckForms::ParameterTypeClass::Map
|
|
105
109
|
end
|
106
110
|
end
|
107
111
|
|
108
|
-
#
|
112
|
+
# <A> tag with a link to the Google/Yandex Maps with marker placed on the current value position
|
109
113
|
def a_tag(content, attrs)
|
110
114
|
if attrs[:href] = url
|
111
115
|
attrs_strings = []
|
@@ -116,7 +120,7 @@ class CckForms::ParameterTypeClass::Map
|
|
116
120
|
end
|
117
121
|
end
|
118
122
|
|
119
|
-
#
|
123
|
+
# Returns a URL to Google/Yandex Maps map with marker placed on the current value position
|
120
124
|
def url
|
121
125
|
if value['latitude'].present? and value['longitude'].present?
|
122
126
|
if value['type'] == MAP_TYPE_GOOGLE
|
@@ -137,25 +141,20 @@ class CckForms::ParameterTypeClass::Map
|
|
137
141
|
end
|
138
142
|
end
|
139
143
|
|
140
|
-
#
|
141
|
-
# на который вешается карта Гугла, и с помощью скриптов изменение полей привязывается к кликам на карте и изменению
|
142
|
-
# масштаба.
|
144
|
+
# 3 hidden field: latitude, longitude, zoom. Next we place a DIV nearby on which Google/Yandex Map is hooked.
|
143
145
|
#
|
144
|
-
# 1
|
145
|
-
# (очищаем поля).
|
146
|
+
# 1 click on a map places a point (writing to hidden fields). 1 click on a point removes it (emptying fields).
|
146
147
|
#
|
147
|
-
#
|
148
|
-
# городов отцентровать карту на выбранном городе.
|
148
|
+
# TODO: remove listeners of "city" events, it's out of scope for this gem
|
149
149
|
#
|
150
150
|
# options:
|
151
151
|
#
|
152
|
-
# value -
|
153
|
-
# width -
|
154
|
-
# height -
|
155
|
-
# latitude -
|
156
|
-
# longitude -
|
157
|
-
# zoom -
|
158
|
-
|
152
|
+
# value - current point
|
153
|
+
# width - map width
|
154
|
+
# height - map height
|
155
|
+
# latitude - default map center lat
|
156
|
+
# longitude - default map center lon
|
157
|
+
# zoom - default map center zoom
|
159
158
|
def build_form(form_builder, options)
|
160
159
|
set_value_in_hash options
|
161
160
|
|
@@ -252,6 +251,7 @@ class CckForms::ParameterTypeClass::Map
|
|
252
251
|
|
|
253
252
|
end
|
254
253
|
|
254
|
+
# Returns a 64x64 IMG with a marker (see #img_tag)
|
255
255
|
def to_diff_value(options = {})
|
256
256
|
demongoize_value!
|
257
257
|
img_tag(64, 64, marker_size: :small)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# Represents a set of phone numbers.
|
2
|
+
#
|
1
3
|
class CckForms::ParameterTypeClass::Phones
|
2
4
|
include CckForms::ParameterTypeClass::Base
|
3
5
|
|
@@ -10,12 +12,12 @@ class CckForms::ParameterTypeClass::Phones
|
|
10
12
|
'Телефоны'
|
11
13
|
end
|
12
14
|
|
13
|
-
#
|
14
|
-
#
|
15
|
+
# Filters input array for phone-like Hashes: prefix: ..., code: ..., number: ...
|
16
|
+
# Cleans them up and returns.
|
15
17
|
#
|
16
|
-
#
|
18
|
+
# In application: [{prefix: '+7'}, {code: ' 123 ', number: '1234567', zzz: ''}]
|
17
19
|
#
|
18
|
-
#
|
20
|
+
# In MongoDB: [{prefix: '', code: '123', number: '1234567'}]
|
19
21
|
def mongoize
|
20
22
|
value = self.value
|
21
23
|
return [] unless value.respond_to? :each
|
@@ -43,7 +45,7 @@ class CckForms::ParameterTypeClass::Phones
|
|
43
45
|
result
|
44
46
|
end
|
45
47
|
|
46
|
-
#
|
48
|
+
# Cleanup phone format
|
47
49
|
def self.demongoize_value(value, parameter_type_class=nil)
|
48
50
|
if value
|
49
51
|
value.map do |phone|
|
@@ -57,12 +59,9 @@ class CckForms::ParameterTypeClass::Phones
|
|
57
59
|
end
|
58
60
|
end
|
59
61
|
|
60
|
-
#
|
61
|
-
# будут добавлены пустые.
|
62
|
+
# A form with pre-set MIN_PHONES_IN_FORM empty phones.
|
62
63
|
#
|
63
|
-
#
|
64
|
-
#
|
65
|
-
# Возвращает ХТМЛ.
|
64
|
+
# If MIN_PHONES_IN_FORM are taken, add one more field to add more phones.
|
66
65
|
def build_form(form_builder, options)
|
67
66
|
set_value_in_hash options
|
68
67
|
value = options[:value].presence
|
@@ -76,7 +75,7 @@ class CckForms::ParameterTypeClass::Phones
|
|
76
75
|
sprintf '<div id="%s">%s</div>%s', id, result.join, script(id)
|
77
76
|
end
|
78
77
|
|
79
|
-
#
|
78
|
+
# HTML for sinle phone number
|
80
79
|
def build_single_form(form_builder, phone)
|
81
80
|
phone = {} unless phone.is_a? Hash
|
82
81
|
phone = blank_phone.merge phone
|
@@ -92,7 +91,7 @@ class CckForms::ParameterTypeClass::Phones
|
|
92
91
|
sprintf '<p class="form-inline">%s — %s — %s</p>', phone_form[0], phone_form[1], phone_form[2]
|
93
92
|
end
|
94
93
|
|
95
|
-
#
|
94
|
+
# 1 empty phone Hash: {prefix: '+7', code: '', number: ''}
|
96
95
|
def blank_phone
|
97
96
|
{
|
98
97
|
'prefix' => PREFIX,
|
@@ -176,12 +175,12 @@ HTML
|
|
176
175
|
number.gsub /\D/, ''
|
177
176
|
end
|
178
177
|
|
179
|
-
# 1234567 -> 123 45 67
|
178
|
+
# 1234567 -> 123 45 67 with tags
|
180
179
|
def split_number(number)
|
181
180
|
if number.length > 4
|
182
181
|
tokens = []
|
183
182
|
|
184
|
-
#
|
183
|
+
# reverse & split by doubles
|
185
184
|
number.reverse.scan(/.(?:.|$)/) do |token|
|
186
185
|
token.reverse!
|
187
186
|
if token.length == 1
|
@@ -191,7 +190,7 @@ HTML
|
|
191
190
|
end
|
192
191
|
end
|
193
192
|
|
194
|
-
#
|
193
|
+
# merge back
|
195
194
|
tokens.reverse!
|
196
195
|
tokens.tap do |tokens|
|
197
196
|
tokens.map! { |token| yield token } if block_given?
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# Represents a short text string.
|
2
|
+
#
|
1
3
|
class CckForms::ParameterTypeClass::String
|
2
4
|
include CckForms::ParameterTypeClass::Base
|
3
5
|
|
@@ -5,6 +7,7 @@ class CckForms::ParameterTypeClass::String
|
|
5
7
|
'Строка'
|
6
8
|
end
|
7
9
|
|
10
|
+
# HTML input element
|
8
11
|
def build_form(form_builder, options)
|
9
12
|
set_value_in_hash options
|
10
13
|
attrs = @extra_options.slice(:maxlength, :pattern)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# Represents a collection of text strings (tags etc.)
|
2
|
+
#
|
1
3
|
class CckForms::ParameterTypeClass::StringCollection
|
2
4
|
include CckForms::ParameterTypeClass::Base
|
3
5
|
|
@@ -5,6 +7,8 @@ class CckForms::ParameterTypeClass::StringCollection
|
|
5
7
|
'Массив строк'
|
6
8
|
end
|
7
9
|
|
10
|
+
# String: "aaa\r\nxxx" -> ["aaa", "xxx"]
|
11
|
+
# :each: -> array
|
8
12
|
def mongoize
|
9
13
|
if value.is_a? String
|
10
14
|
value.split "\r\n"
|
@@ -13,6 +17,7 @@ class CckForms::ParameterTypeClass::StringCollection
|
|
13
17
|
end
|
14
18
|
end
|
15
19
|
|
20
|
+
# Everything to array
|
16
21
|
def self.demongoize_value(value, parameter_type_class=nil)
|
17
22
|
if value.is_a? String
|
18
23
|
value = [value]
|
@@ -22,6 +27,7 @@ class CckForms::ParameterTypeClass::StringCollection
|
|
22
27
|
super
|
23
28
|
end
|
24
29
|
|
30
|
+
# Builds a TEXTAREA, each string is a separate line
|
25
31
|
def build_form(form_builder, options)
|
26
32
|
set_value_in_hash options
|
27
33
|
options[:value] = value.join("\r\n") if value
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# Represents a long text string (TEXTAREA).
|
2
|
+
#
|
1
3
|
class CckForms::ParameterTypeClass::Text
|
2
4
|
include CckForms::ParameterTypeClass::Base
|
3
5
|
|
@@ -5,11 +7,13 @@ class CckForms::ParameterTypeClass::Text
|
|
5
7
|
'Текст'
|
6
8
|
end
|
7
9
|
|
10
|
+
# Builds a TEXTAREA
|
8
11
|
def build_form(form_builder, options)
|
9
12
|
set_value_in_hash options
|
10
13
|
form_builder.text_area :value, {cols: 50, rows: 5, class: 'form-control'}.merge(options)
|
11
14
|
end
|
12
15
|
|
16
|
+
# Wrap DIFF output to .wall (bootstrap-specific bounded block)
|
13
17
|
def to_diff_value(options = {})
|
14
18
|
to_html.presence.try do |html|
|
15
19
|
"<div class='well well-small'>#{html}</div>".html_safe
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# Represents a single time.
|
2
|
+
#
|
1
3
|
class CckForms::ParameterTypeClass::Time
|
2
4
|
include CckForms::ParameterTypeClass::Base
|
3
5
|
include CckForms::DateTime
|
@@ -6,6 +8,7 @@ class CckForms::ParameterTypeClass::Time
|
|
6
8
|
'Время'
|
7
9
|
end
|
8
10
|
|
11
|
+
# Time SELECT
|
9
12
|
def build_form(form_builder, options)
|
10
13
|
set_value_in_hash options
|
11
14
|
value = CckForms::ParameterTypeClass::Time::date_object_from_what_stored_in_database(options[:value])
|
@@ -15,6 +18,7 @@ class CckForms::ParameterTypeClass::Time
|
|
15
18
|
('<div class="form-inline">%s</div>' % form_builder.fields_for(:value) { |datetime_builder| datetime_builder.time_select '', form_element_options, form_element_html})
|
16
19
|
end
|
17
20
|
|
21
|
+
# "19:34"
|
18
22
|
def to_s(options = nil)
|
19
23
|
if value.is_a? Time
|
20
24
|
the_value = {
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# Represents a set of weekly based work hours: essentially a set of SELECTs one for each week day.
|
2
|
+
#
|
1
3
|
class CckForms::ParameterTypeClass::WorkHours
|
2
4
|
include CckForms::ParameterTypeClass::Base
|
3
5
|
|
@@ -13,11 +15,7 @@ class CckForms::ParameterTypeClass::WorkHours
|
|
13
15
|
DAYS_RU_SHORT[DAYS.index(day.to_s)]
|
14
16
|
end
|
15
17
|
|
16
|
-
#
|
17
|
-
#
|
18
|
-
# mon: {open_time: ..., open_24_hours: ...}, tue: {...}, ...
|
19
|
-
#
|
20
|
-
# преобразует в хэш для Монго.
|
18
|
+
# mon: {open_time: ..., open_24_hours: ...}, tue: {...}, ... -> MongoDB Hash
|
21
19
|
def mongoize
|
22
20
|
return {} unless value.is_a? Hash
|
23
21
|
|
@@ -27,7 +25,7 @@ class CckForms::ParameterTypeClass::WorkHours
|
|
27
25
|
end
|
28
26
|
end
|
29
27
|
|
30
|
-
#
|
28
|
+
# Makes a Hash of WorkHoursDay (key - day name of form :mon, see DAYS)
|
31
29
|
def self.demongoize_value(value, parameter_type_class=nil)
|
32
30
|
return {} unless value.is_a? Hash
|
33
31
|
value.reduce({}) do |r, (day_name, day_row)|
|
@@ -37,7 +35,7 @@ class CckForms::ParameterTypeClass::WorkHours
|
|
37
35
|
end
|
38
36
|
end
|
39
37
|
|
40
|
-
#
|
38
|
+
# Builds HTML form. 1 row — 1 day
|
41
39
|
def build_form(form_builder, options)
|
42
40
|
set_value_in_hash options
|
43
41
|
|
@@ -70,7 +68,7 @@ class CckForms::ParameterTypeClass::WorkHours
|
|
70
68
|
sprintf '<div class="work-hours" id="%1$s">%2$s</div><script type="text/javascript">$(function() {$("#%1$s").workhours()})</script>', form_builder_name_to_id(form_builder), result.join
|
71
69
|
end
|
72
70
|
|
73
|
-
#
|
71
|
+
# Makes a string: "Mon—Wed 10:00—23:00; Thu-Sat 24h"
|
74
72
|
def to_html(options = nil)
|
75
73
|
value = self.value
|
76
74
|
return value.to_s unless value.respond_to? :each
|
@@ -79,7 +77,7 @@ class CckForms::ParameterTypeClass::WorkHours
|
|
79
77
|
|
80
78
|
value = value.deep_stringify_keys if value.respond_to? :deep_stringify_keys
|
81
79
|
|
82
|
-
#
|
80
|
+
# split by groups with equal value: {'25h' => %w{mon tue wed}, ...}
|
83
81
|
groups = {}
|
84
82
|
value.send(value.respond_to?(:each_value) ? :each_value : :each) do |day|
|
85
83
|
day = CckForms::ParameterTypeClass::WorkHours::WorkHoursDay.new(day) unless day.is_a? CckForms::ParameterTypeClass::WorkHours::WorkHoursDay
|
@@ -88,7 +86,7 @@ class CckForms::ParameterTypeClass::WorkHours
|
|
88
86
|
groups[hash] << day.day
|
89
87
|
end
|
90
88
|
|
91
|
-
#
|
89
|
+
# make string for each group
|
92
90
|
result = []
|
93
91
|
groups.each_pair do |hours_description, days|
|
94
92
|
if hours_description.present?
|
@@ -116,10 +114,10 @@ class CckForms::ParameterTypeClass::WorkHours
|
|
116
114
|
to_html with_tags: false
|
117
115
|
end
|
118
116
|
|
119
|
-
#
|
117
|
+
# %w{mon, tue, wed, sat} -> "Mon—Wed, Sat"
|
120
118
|
def self.grouped_days_string(days)
|
121
119
|
|
122
|
-
#
|
120
|
+
# split by continuous blocks: [%w{mon tue wed}, %w{sat}]
|
123
121
|
days.sort! { |a, b| DAYS.index(a) <=> DAYS.index(b) }
|
124
122
|
prev_index = -2
|
125
123
|
groups = []
|
@@ -133,7 +131,7 @@ class CckForms::ParameterTypeClass::WorkHours
|
|
133
131
|
prev_index = index
|
134
132
|
end
|
135
133
|
|
136
|
-
#
|
134
|
+
# convert to string and join
|
137
135
|
groups.map do |group|
|
138
136
|
if group.length == 1
|
139
137
|
group[0]
|
@@ -147,16 +145,14 @@ class CckForms::ParameterTypeClass::WorkHours
|
|
147
145
|
|
148
146
|
|
149
147
|
|
150
|
-
#
|
151
|
-
# для удобства работы (чтобы не с хэшами возиться).
|
148
|
+
# A utility model for one work day.
|
152
149
|
#
|
153
|
-
# day -
|
154
|
-
# open_time
|
150
|
+
# day - one of CckForms::ParameterTypeClass::WorkHours::DAYS.
|
151
|
+
# open_time & close_time are hashes: {hours: 10, minutes: 5}
|
155
152
|
class WorkHoursDay
|
156
153
|
|
157
154
|
attr_accessor :day, :open_time, :close_time, :open_24_hours, :open_until_last_client
|
158
155
|
|
159
|
-
# Инициализирует свои поля из хэша.
|
160
156
|
def initialize(other)
|
161
157
|
if other.is_a? Hash
|
162
158
|
other = other.symbolize_keys
|
@@ -174,7 +170,7 @@ class CckForms::ParameterTypeClass::WorkHours
|
|
174
170
|
end
|
175
171
|
end
|
176
172
|
|
177
|
-
#
|
173
|
+
# Are equal if all fields are equal
|
178
174
|
def ==(other)
|
179
175
|
other = self.class.new(other) unless other.is_a? self.class
|
180
176
|
|
@@ -185,12 +181,12 @@ class CckForms::ParameterTypeClass::WorkHours
|
|
185
181
|
self.open_until_last_client == other.open_until_last_client
|
186
182
|
end
|
187
183
|
|
188
|
-
#
|
184
|
+
# Hash key for grouping (all fields except for day)
|
189
185
|
def hash_without_day
|
190
186
|
sprintf('%s:%s:%s:%s', open_time, close_time, open_24_hours, open_until_last_client).hash
|
191
187
|
end
|
192
188
|
|
193
|
-
#
|
189
|
+
# "from 12:00 till last client"
|
194
190
|
def to_s_without_day
|
195
191
|
result = ''
|
196
192
|
if open_24_hours
|
@@ -214,7 +210,7 @@ class CckForms::ParameterTypeClass::WorkHours
|
|
214
210
|
result
|
215
211
|
end
|
216
212
|
|
217
|
-
#
|
213
|
+
# Single day form HTML
|
218
214
|
def build_form(form_builder, template = false, options = {})
|
219
215
|
form_builder.object = self
|
220
216
|
|
@@ -270,24 +266,24 @@ HTML
|
|
270
266
|
|
271
267
|
private
|
272
268
|
|
273
|
-
#
|
269
|
+
# HTML form to boolean: '1' -> true
|
274
270
|
def form_to_boolean(value)
|
275
271
|
return value == '1' if value.is_a? String
|
276
272
|
!!value
|
277
273
|
end
|
278
274
|
|
279
|
-
#
|
275
|
+
# {hours: ..., minutes: ...} -> "10:42"
|
280
276
|
def time_to_s(time)
|
281
277
|
return nil unless time.is_a?(Hash) and time['hours'].present? and time['minutes'].present?
|
282
278
|
sprintf '%s:%s', time['hours'].to_s.rjust(2, '0'), time['minutes'].to_s.rjust(2, '0')
|
283
279
|
end
|
284
280
|
|
285
|
-
#
|
281
|
+
# Time present?
|
286
282
|
def time_present?(time)
|
287
283
|
return time.is_a?(Hash) && time['hours'].present? && time['minutes'].present?
|
288
284
|
end
|
289
285
|
|
290
|
-
#
|
286
|
+
# SELECTs: [18]:[45]
|
291
287
|
def build_time_form(form_builder, value)
|
292
288
|
hours = []
|
293
289
|
24.times { |hour| hours << [hour.to_s.rjust(2, '0'), hour] }
|
@@ -306,7 +302,6 @@ HTML
|
|
306
302
|
|
307
303
|
public
|
308
304
|
|
309
|
-
# Преборазование самого себя для сохранения в Монго (хэш).
|
310
305
|
def mongoize
|
311
306
|
{
|
312
307
|
'day' => day.to_s,
|
@@ -319,7 +314,6 @@ HTML
|
|
319
314
|
|
320
315
|
class << self
|
321
316
|
|
322
|
-
# Преборазование самого себя из представления Монго (из хэша).
|
323
317
|
def demongoize(object)
|
324
318
|
object = object.symbolize_keys
|
325
319
|
WorkHoursDay.new(
|
@@ -331,7 +325,6 @@ HTML
|
|
331
325
|
)
|
332
326
|
end
|
333
327
|
|
334
|
-
# "Статическое" преборазование самого себя для сохранения в Монго (хэш).
|
335
328
|
def mongoize(object)
|
336
329
|
case object
|
337
330
|
when WorkHoursDay then object.mongoize
|
@@ -340,14 +333,12 @@ HTML
|
|
340
333
|
end
|
341
334
|
end
|
342
335
|
|
343
|
-
# TODO:
|
336
|
+
# TODO: make evolve
|
344
337
|
def evolve(object)
|
345
338
|
object
|
346
339
|
end
|
347
340
|
|
348
|
-
#
|
349
|
-
#
|
350
|
-
# {hours: 10, minutes: 5}
|
341
|
+
# Time/DateTime -> {hours: 10, minutes: 5}
|
351
342
|
def mongoize_time(time)
|
352
343
|
if time.is_a? Time or time.is_a? DateTime
|
353
344
|
{'hours' => time.hour, 'minutes' => time.min}
|
@@ -357,9 +348,6 @@ HTML
|
|
357
348
|
end
|
358
349
|
end
|
359
350
|
|
360
|
-
# Преобразовываем значение времени для Монго. Берет Time или DateTime или хэш и выдает хэш вида:
|
361
|
-
#
|
362
|
-
# {hours: 10, minutes: 5}
|
363
351
|
def demongoize_time(time)
|
364
352
|
mongoize_time(time)
|
365
353
|
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.0
|
4
|
+
version: 3.1.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:
|
11
|
+
date: 2017-02-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -66,6 +66,7 @@ files:
|
|
66
66
|
- lib/cck_forms/date_time.rb
|
67
67
|
- lib/cck_forms/engine.rb
|
68
68
|
- lib/cck_forms/form_builder_extensions.rb
|
69
|
+
- lib/cck_forms/neofiles_denormalize.rb
|
69
70
|
- lib/cck_forms/parameter_type_class/album.rb
|
70
71
|
- lib/cck_forms/parameter_type_class/base.rb
|
71
72
|
- lib/cck_forms/parameter_type_class/boolean.rb
|
@@ -87,6 +88,7 @@ files:
|
|
87
88
|
- lib/cck_forms/parameter_type_class/time.rb
|
88
89
|
- lib/cck_forms/parameter_type_class/work_hours.rb
|
89
90
|
- lib/cck_forms/version.rb
|
91
|
+
- vendor/assets/javascripts/cck_forms/index.js
|
90
92
|
- vendor/assets/javascripts/cck_forms/jquery.workhours.js
|
91
93
|
- vendor/assets/javascripts/cck_forms/map.js.coffee
|
92
94
|
homepage: http://github.com/ilya-konanykhin/cck_forms
|