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,53 +1,46 @@
|
|
1
|
-
#
|
2
|
-
# например, String, Checkboxes и т. п.
|
1
|
+
# Base module for all field types. Is included in type classes like Album, Image etc.
|
3
2
|
#
|
4
3
|
# class CckForms::ParameterTypeClass::NewType
|
5
4
|
# include CckForms::ParameterTypeClass::Base
|
6
|
-
#
|
7
|
-
# def self.name
|
8
|
-
# 'Новый тип'
|
9
|
-
# end
|
10
5
|
# end
|
11
6
|
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
# Использование типов:
|
7
|
+
# Standalone usage of real classes:
|
15
8
|
#
|
16
9
|
# field :cover_photo, type: CckForms::ParameterTypeClass::Image
|
17
|
-
# field :gallery,
|
10
|
+
# field :gallery, type: CckForms::ParameterTypeClass::Album
|
18
11
|
# field :description, type: CckForms::ParameterTypeClass::Text
|
19
12
|
#
|
20
|
-
#
|
13
|
+
# Base module includes:
|
21
14
|
#
|
22
|
-
# 1)
|
15
|
+
# 1) URL helpers like edit_article_path accessible via include Rails.application.routes.url_helpers;
|
23
16
|
#
|
24
|
-
# 2)
|
17
|
+
# 2) methods cck_param & value returning current CCK parameter (module CckForms::*::Parameter) and his current value;
|
25
18
|
#
|
26
|
-
# 3)
|
27
|
-
#
|
19
|
+
# 3) methods with_cck_param(param) do ..., with_value(value) do ... and with_cck_param_and_value(param, value) do ...
|
20
|
+
# which set the corresponding values for the block duration;
|
28
21
|
#
|
29
|
-
# 4)
|
30
|
-
#
|
22
|
+
# 4) dynamic method (via method_missing & respond_to?) ..._with_value(value, args*) which is basically the same as
|
23
|
+
# with_value do... but for one method invocation only: foo_with_value(v) <=> with_value(v) { foo }
|
31
24
|
#
|
32
|
-
# 5) set_value_in_hash(hash)
|
25
|
+
# 5) utility set_value_in_hash(hash) placing value in hash[:value];
|
33
26
|
#
|
34
|
-
# 6)
|
27
|
+
# 6) utilities to get HTML ID: form(_builder)?_name_to_id;
|
35
28
|
#
|
36
|
-
# 7)
|
29
|
+
# 7) methods to be consumed by the type classes:
|
37
30
|
#
|
38
|
-
# self.code
|
39
|
-
# self.name
|
31
|
+
# self.code - type code (e.g. rich_text for CckForms::ParameterType::RichText)
|
32
|
+
# self.name - type name (e.g. "A text string")
|
40
33
|
#
|
41
34
|
module CckForms::ParameterTypeClass::Base
|
42
35
|
extend ActiveSupport::Concern
|
43
36
|
|
44
37
|
included do
|
45
|
-
# Кое-где понадобятся помогайки-пути, сразу их включим.
|
46
38
|
include Rails.application.routes.url_helpers
|
47
39
|
|
48
40
|
attr_accessor :value
|
49
41
|
attr_reader :valid_values_class_name, :cck_parameter
|
50
42
|
|
43
|
+
# Store options into instance variables like @valid_values and so on
|
51
44
|
def initialize(options)
|
52
45
|
options = options.symbolize_keys
|
53
46
|
|
@@ -70,14 +63,20 @@ module CckForms::ParameterTypeClass::Base
|
|
70
63
|
|
71
64
|
|
72
65
|
module ClassMethods
|
66
|
+
# Called on a class to construct its instance from a MongoDB Hash.
|
67
|
+
# By default simply create a new object.
|
73
68
|
def demongoize(something_from_database)
|
74
69
|
new value: demongoize_value(something_from_database)
|
75
70
|
end
|
76
71
|
|
72
|
+
# Only converts a value from MongoDB to its in-memory (Ruby) form.
|
73
|
+
# By default, return the value itself.
|
77
74
|
def demongoize_value(value, parameter_type_class=nil)
|
78
75
|
value
|
79
76
|
end
|
80
77
|
|
78
|
+
# Called on an class to get a MongoDB Hash form of an instance object.
|
79
|
+
# By default simply calls mongoize of the instance.
|
81
80
|
def mongoize(object)
|
82
81
|
case object
|
83
82
|
when self then object.mongoize
|
@@ -87,43 +86,38 @@ module CckForms::ParameterTypeClass::Base
|
|
87
86
|
end
|
88
87
|
end
|
89
88
|
|
90
|
-
#
|
91
|
-
#
|
92
|
-
# различается, мы вынуждены отдельно описывать операцию emit, там где это необходимо. Смысл в том, чтобы этот метод
|
93
|
-
# вызвал emit для каждого хранимого значения.
|
89
|
+
# Returns Javascript emit function body to be used as a part of map/reduce "emit" step, see
|
90
|
+
# http://docs.mongodb.org/manual/applications/map-reduce/
|
94
91
|
#
|
95
|
-
#
|
96
|
-
#
|
97
|
-
#
|
98
|
-
# оно содержит список городов. Мы должны вызывать emit для каждого элемента массива (т. е., для каждого идентификатора
|
99
|
-
# города). Генерацией этого кода и занимается этот метод.
|
92
|
+
# The reason for this is every type class has its own notion of "current value" and stores it specifically. Say,
|
93
|
+
# Checkboxes store an array of values and if we want to get distinct values we need a way to extract each "single
|
94
|
+
# value" from this array.
|
100
95
|
#
|
101
|
-
#
|
102
|
-
#
|
96
|
+
# Example: imagine a field "city" of type Checkboxes. To make an aggregate query (a subtype of map-reduce)
|
97
|
+
# to count objects in different cities, for example, we can not run emit for the field as a whole since it is an
|
98
|
+
# array. We must call emit for each array value, that is for each city ID. This method does exactly this.
|
103
99
|
#
|
104
|
-
#
|
100
|
+
# In particular, it is used in counting popular values (like "give me a list of cities sorted by the number of
|
101
|
+
# host objects (ads? companies?) in them").
|
105
102
|
#
|
106
|
-
#
|
103
|
+
# By default considers a value in "#{feild_name}" atomic and call emit for it.
|
107
104
|
def emit_map_reduce(feild_name)
|
108
105
|
field_name = 'this.' + feild_name
|
109
106
|
"if(#{field_name} && #{field_name} != '') emit(#{field_name}, 1)"
|
110
107
|
end
|
111
108
|
|
112
|
-
#
|
109
|
+
# Converts input name intp HTML ID, e.g. facility[cck_params][1][value] -> facility_cck_params_1_value.
|
113
110
|
def form_name_to_id(name)
|
114
111
|
name.gsub(/\]\[|[^-a-zA-Z0-9:.]/, '_').sub(/_\z/, '')
|
115
112
|
end
|
116
113
|
|
117
|
-
# Методы, которые нужны наследникам (CckForms::ParameterTypeClass::*) для отображения, сортировки и прочей настройки самих типов.
|
118
|
-
# Эти методы не нужны обычным объектам - пользователям типов.
|
119
|
-
|
120
114
|
# CckForms::ParameterTypeClass::Checkboxes -> 'checkboxes'
|
121
115
|
# CckForms::ParameterTypeClass::RichText -> 'rich_text'
|
122
116
|
def code
|
123
117
|
self.to_s.demodulize.underscore
|
124
118
|
end
|
125
119
|
|
126
|
-
#
|
120
|
+
# A type name, e.g. "A text string"
|
127
121
|
def name
|
128
122
|
nil
|
129
123
|
end
|
@@ -131,7 +125,7 @@ module CckForms::ParameterTypeClass::Base
|
|
131
125
|
|
132
126
|
|
133
127
|
|
134
|
-
#
|
128
|
+
# Load all type classes
|
135
129
|
# TODO: relies on all classes to reside in this class' directory
|
136
130
|
def self.load_type_classes
|
137
131
|
return if @type_classes_loaded
|
@@ -146,10 +140,9 @@ module CckForms::ParameterTypeClass::Base
|
|
146
140
|
|
147
141
|
|
148
142
|
|
149
|
-
#
|
143
|
+
# Usual methods available to type classes (consumers of this module)
|
150
144
|
|
151
|
-
#
|
152
|
-
# Нужен для построения ХТМЛ СЕЛЕКТов.
|
145
|
+
# Generates valid_values in form consumable to SELECT helper builders: [[key1, value1], [key2, value2], ...]
|
153
146
|
def valid_values_enum
|
154
147
|
valid_values = self.valid_values
|
155
148
|
return [] if valid_values.blank?
|
@@ -161,13 +154,12 @@ module CckForms::ParameterTypeClass::Base
|
|
161
154
|
result
|
162
155
|
end
|
163
156
|
|
164
|
-
#
|
165
|
-
# Нужен для построения ХТМЛа и строк.
|
157
|
+
# Generates valid values as a comma-separated string: "georgian: грузинская, albanian: албанская" (for HTML puproses)
|
166
158
|
def valid_values_as_string
|
167
159
|
valid_values_enum.map { |enum| "#{enum[1]}: #{enum[0]}" }.join "\n"
|
168
160
|
end
|
169
161
|
|
170
|
-
#
|
162
|
+
# Convert HTML form back into Hash again:
|
171
163
|
# = f.text_field :valid_values_as_string
|
172
164
|
def valid_values_as_string=(string)
|
173
165
|
new_valid_values = {}
|
@@ -178,13 +170,12 @@ module CckForms::ParameterTypeClass::Base
|
|
178
170
|
self.valid_values = new_valid_values
|
179
171
|
end
|
180
172
|
|
181
|
-
# Вернет класс, указанный как valid_values_class_name.
|
182
173
|
# "City" -> City
|
183
174
|
def valid_values_class
|
184
175
|
if valid_values_class_name.present?
|
185
176
|
if valid_values_class_name.is_a? Class
|
186
177
|
valid_values_class_name
|
187
|
-
else #
|
178
|
+
else # raises exception if this is not a string
|
188
179
|
valid_values_class_name.constantize
|
189
180
|
end
|
190
181
|
else
|
@@ -192,13 +183,13 @@ module CckForms::ParameterTypeClass::Base
|
|
192
183
|
end
|
193
184
|
end
|
194
185
|
|
195
|
-
#
|
186
|
+
# Is valid_values_class exist at all?
|
196
187
|
def valid_values_class?
|
197
188
|
not valid_values_class.nil?
|
198
189
|
end
|
199
190
|
|
200
|
-
#
|
201
|
-
#
|
191
|
+
# If valid_values is empty and valid_values_class is not, extracts all values from this class into valid_values.
|
192
|
+
# Makes use of ActiveRecord-like method .all for this
|
202
193
|
def valid_values
|
203
194
|
@valid_values ||= begin
|
204
195
|
if vv_class = valid_values_class
|
@@ -209,39 +200,43 @@ module CckForms::ParameterTypeClass::Base
|
|
209
200
|
end
|
210
201
|
end
|
211
202
|
|
212
|
-
#
|
213
|
-
# options[:value]).
|
203
|
+
# Builds an edit form in HTML.
|
204
|
+
# By default an input:text (value can be set via options[:value]).
|
214
205
|
def build_form(form_builder, options)
|
215
206
|
set_value_in_hash options
|
216
207
|
form_builder.text_field :value, options
|
217
208
|
end
|
218
209
|
|
219
|
-
#
|
210
|
+
# HTML form of a type class.
|
211
|
+
# By default to_s.
|
220
212
|
def to_html(options = nil)
|
221
213
|
to_s options
|
222
214
|
end
|
223
215
|
|
224
|
-
#
|
216
|
+
# Redefines to allow passing of options.
|
217
|
+
# By default, call to_s on the current value.
|
225
218
|
def to_s(options = nil)
|
226
219
|
value.to_s
|
227
220
|
end
|
228
221
|
|
229
|
-
#
|
222
|
+
# Was-became HTML for admin panels etc. (like a type image with map preview for Map).
|
230
223
|
def to_diff_value(options = nil)
|
231
224
|
to_html options
|
232
225
|
end
|
233
226
|
|
234
|
-
#
|
227
|
+
# Transforms DSL-like query (specific to each type) into Mongoid query.
|
228
|
+
# By default use simple where(field: query.to_s).
|
235
229
|
def search(selectable, field, query)
|
236
230
|
selectable.where(field => query.to_s)
|
237
231
|
end
|
238
232
|
|
239
|
-
#
|
233
|
+
# For Rails.application.routes.url_helpers
|
240
234
|
def default_url_options
|
241
235
|
{}
|
242
236
|
end
|
243
237
|
|
244
|
-
#
|
238
|
+
# Transforms the value into MongoDB form.
|
239
|
+
# By default returns the value itself.
|
245
240
|
def mongoize
|
246
241
|
value
|
247
242
|
end
|
@@ -263,12 +258,12 @@ module CckForms::ParameterTypeClass::Base
|
|
263
258
|
options[:value] = value unless options.has_key? :value
|
264
259
|
end
|
265
260
|
|
266
|
-
#
|
261
|
+
# See ClassMethod.form_name_to_id
|
267
262
|
def form_name_to_id(name)
|
268
263
|
self.class.form_name_to_id name
|
269
264
|
end
|
270
265
|
|
271
|
-
#
|
266
|
+
# Converts FormBuilder name to ID, see form_name_to_id
|
272
267
|
def form_builder_name_to_id(form_builder, suffix = '')
|
273
268
|
form_name_to_id([form_builder.options[:namespace], form_builder.object_name].compact.join('_') + suffix)
|
274
269
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# Represents a single checkbox.
|
2
|
+
#
|
1
3
|
class CckForms::ParameterTypeClass::Boolean
|
2
4
|
include CckForms::ParameterTypeClass::Base
|
3
5
|
|
@@ -5,18 +7,22 @@ class CckForms::ParameterTypeClass::Boolean
|
|
5
7
|
'Галочка (да/нет)'
|
6
8
|
end
|
7
9
|
|
10
|
+
# Is it true?
|
8
11
|
def value?
|
9
12
|
value.present? && value != '0'
|
10
13
|
end
|
11
14
|
|
15
|
+
# Anything -> boolean
|
12
16
|
def mongoize
|
13
17
|
value?
|
14
18
|
end
|
15
19
|
|
20
|
+
# 'yes/no' string
|
16
21
|
def to_s(options = nil)
|
17
22
|
value? ? 'да' : 'нет'
|
18
23
|
end
|
19
24
|
|
25
|
+
# Checkbox HTML
|
20
26
|
def build_form(form_builder, options)
|
21
27
|
set_value_in_hash options
|
22
28
|
form_builder.check_box :value, options.merge(value: 1, checked: value?)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# Represents a series of checkboxes. The values are take from valid_values, see base.rb
|
2
|
+
#
|
1
3
|
class CckForms::ParameterTypeClass::Checkboxes
|
2
4
|
include CckForms::ParameterTypeClass::Base
|
3
5
|
|
@@ -25,7 +27,7 @@ class CckForms::ParameterTypeClass::Checkboxes
|
|
25
27
|
end
|
26
28
|
|
27
29
|
# ['kazakh', 'english'] -> {'kazakh' => 1, 'russain' => 0, 'english' => 1}
|
28
|
-
# (
|
30
|
+
# (for for builders)
|
29
31
|
def self.demongoize_value(value, parameter_type_class=nil)
|
30
32
|
value.present? or return {}
|
31
33
|
|
@@ -36,13 +38,14 @@ class CckForms::ParameterTypeClass::Checkboxes
|
|
36
38
|
end
|
37
39
|
end
|
38
40
|
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
43
|
-
#
|
44
|
-
#
|
45
|
-
#
|
41
|
+
# Comma-separated list of checked entries. Options:
|
42
|
+
#
|
43
|
+
# block - sprintf template for each entry
|
44
|
+
# only - leave only these keys (array/string)
|
45
|
+
# except - reverse of :only
|
46
|
+
# glue - use instead of ', ' for .join
|
47
|
+
# short - make the string shorter, if possible: if all variants are checked, returns string "all selected"
|
48
|
+
# if few are not checked, returns "all except xxx, yyy, ..."
|
46
49
|
def to_s(options = nil)
|
47
50
|
checked_keys, checked_elements = [], []
|
48
51
|
return '' if value.blank?
|
@@ -92,6 +95,10 @@ class CckForms::ParameterTypeClass::Checkboxes
|
|
92
95
|
checked_elements.join glue
|
93
96
|
end
|
94
97
|
|
98
|
+
# Construct Mongoid query from our internal. If query is a Hash, find all objects where field has ALL of the Hash keys.
|
99
|
+
# Key 'all' selected all objects.
|
100
|
+
#
|
101
|
+
# Otherwise, use usual where(field => query).
|
95
102
|
def search(selectable, field, query)
|
96
103
|
if query.respond_to? :each_pair
|
97
104
|
keys = []
|
@@ -112,11 +119,11 @@ class CckForms::ParameterTypeClass::Checkboxes
|
|
112
119
|
selectable
|
113
120
|
end
|
114
121
|
|
115
|
-
#
|
122
|
+
# Construct emit func for map/reduce to emit on each array value in MongoDB. For example, for object:
|
116
123
|
#
|
117
124
|
# cck_params.city: ['almaty', 'astana']
|
118
125
|
#
|
119
|
-
#
|
126
|
+
# we will emit('almaty', 1); emit('astana', 1).
|
120
127
|
def self.emit_map_reduce(field_name)
|
121
128
|
field_name = 'this.' + field_name
|
122
129
|
return "if(#{field_name} && #{field_name} instanceof Array) {
|
@@ -126,11 +133,15 @@ class CckForms::ParameterTypeClass::Checkboxes
|
|
126
133
|
}"
|
127
134
|
end
|
128
135
|
|
129
|
-
# options
|
130
|
-
#
|
131
|
-
#
|
132
|
-
#
|
133
|
-
#
|
136
|
+
# options:
|
137
|
+
#
|
138
|
+
# block - sprintf template for each entry (input, label)
|
139
|
+
# map - convert entry labels, e.g. 'long label text' => 'sh.txt'
|
140
|
+
# data - data-attrs for label, Hash (e.g. capital: {almaty: 'yes', astana: 'no'})
|
141
|
+
# as - if :select, construct a SELECT, not a checkboxes list
|
142
|
+
# only - see #to_s
|
143
|
+
# except - see #to_s
|
144
|
+
# for - if :search, do not add false-value checkbox
|
134
145
|
def build_form(form_builder, options)
|
135
146
|
return '' unless valid_values.is_a?(Hash) || valid_values.is_a?(Array)
|
136
147
|
|
@@ -176,6 +187,11 @@ class CckForms::ParameterTypeClass::Checkboxes
|
|
176
187
|
|
177
188
|
private
|
178
189
|
|
190
|
+
# options:
|
191
|
+
#
|
192
|
+
# only - see #to_s
|
193
|
+
# except - see #to_s
|
194
|
+
# required - HTML required attr
|
179
195
|
def build_select_form(form_builder, options)
|
180
196
|
set_value_in_hash options
|
181
197
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# Represents a single date.
|
2
|
+
#
|
1
3
|
class CckForms::ParameterTypeClass::Date
|
2
4
|
include CckForms::ParameterTypeClass::Base
|
3
5
|
include CckForms::DateTime
|
@@ -6,11 +8,13 @@ class CckForms::ParameterTypeClass::Date
|
|
6
8
|
'Дата'
|
7
9
|
end
|
8
10
|
|
11
|
+
# Date SELECT
|
9
12
|
def build_form(form_builder, options)
|
10
13
|
set_value_in_hash options
|
11
14
|
self.class.build_date_form(form_builder, options)
|
12
15
|
end
|
13
16
|
|
17
|
+
# Date SELECT as a set of 3 SELECTS: year, month, date
|
14
18
|
def self.build_date_form(form_builder, options, type = '')
|
15
19
|
val = options[:value].is_a?(Hash) ? options[:value][type] : options[:value]
|
16
20
|
val = CckForms::ParameterTypeClass::Time::date_object_from_what_stored_in_database(val)
|
@@ -19,6 +23,7 @@ class CckForms::ParameterTypeClass::Date
|
|
19
23
|
('<div class="form-inline">%s</div>' % form_builder.fields_for(:value) { |datetime_builder| datetime_builder.date_select type, form_element_options, form_element_html}).html_safe
|
20
24
|
end
|
21
25
|
|
26
|
+
# "12.12.2012"
|
22
27
|
def to_s(options = nil)
|
23
28
|
if value.is_a? Time
|
24
29
|
the_value = {
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# Represents a pair of date SELECTs (date range).
|
2
|
+
#
|
1
3
|
class CckForms::ParameterTypeClass::DateRange
|
2
4
|
include CckForms::ParameterTypeClass::Base
|
3
5
|
|
@@ -5,6 +7,7 @@ class CckForms::ParameterTypeClass::DateRange
|
|
5
7
|
'Диапазон между двумя датами'
|
6
8
|
end
|
7
9
|
|
10
|
+
# Converts input hash of type {from: ..., till: ...} to MongoDB format
|
8
11
|
def mongoize
|
9
12
|
value_from_form = value
|
10
13
|
return nil if value_from_form.blank?
|
@@ -21,6 +24,7 @@ class CckForms::ParameterTypeClass::DateRange
|
|
21
24
|
db_representation
|
22
25
|
end
|
23
26
|
|
27
|
+
# 2 date SELECTs
|
24
28
|
def build_form(form_builder, options)
|
25
29
|
result = []
|
26
30
|
set_value_in_hash options
|
@@ -32,6 +36,9 @@ class CckForms::ParameterTypeClass::DateRange
|
|
32
36
|
result.join.html_safe
|
33
37
|
end
|
34
38
|
|
39
|
+
# "from 21.12.2012"
|
40
|
+
# "till 22.12.2012"
|
41
|
+
# "21.12.2012 - 22.12.2012"
|
35
42
|
def to_s
|
36
43
|
return '' unless value.present? && value.is_a?(Hash)
|
37
44
|
types = {}
|
@@ -49,5 +56,4 @@ class CckForms::ParameterTypeClass::DateRange
|
|
49
56
|
end
|
50
57
|
|
51
58
|
end
|
52
|
-
|
53
|
-
end
|
59
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# Represents a single date & time.
|
2
|
+
#
|
1
3
|
class CckForms::ParameterTypeClass::DateTime
|
2
4
|
include CckForms::ParameterTypeClass::Base
|
3
5
|
include CckForms::DateTime
|
@@ -6,6 +8,7 @@ class CckForms::ParameterTypeClass::DateTime
|
|
6
8
|
'Дата и время'
|
7
9
|
end
|
8
10
|
|
11
|
+
# Date and time SELECTs
|
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,19 +18,18 @@ class CckForms::ParameterTypeClass::DateTime
|
|
15
18
|
('<div class="form-inline">%s</div>' % form_builder.fields_for(:value) { |datetime_builder| datetime_builder.datetime_select '', form_element_options, form_element_html})
|
16
19
|
end
|
17
20
|
|
18
|
-
#
|
19
|
-
# например:
|
21
|
+
# Options is a :symbol -> options[:symbol] = true:
|
20
22
|
#
|
21
23
|
# date_attr.to_s :only_date
|
22
|
-
# date_attr.to_s :only_date => true #
|
24
|
+
# date_attr.to_s :only_date => true # equivalent
|
23
25
|
#
|
24
|
-
#
|
26
|
+
# options:
|
25
27
|
#
|
26
|
-
# year_obligatory -
|
27
|
-
# only_date -
|
28
|
-
# rus_date -
|
28
|
+
# year_obligatory - force year in output (by default current year is skipped)
|
29
|
+
# only_date - hide time
|
30
|
+
# rus_date - Russian date, like "2 июля"
|
29
31
|
#
|
30
|
-
#
|
32
|
+
# By default: "01.02.2012, 12:49".
|
31
33
|
def to_s(options=nil)
|
32
34
|
value = if self.value.is_a? Time
|
33
35
|
{
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# Represents a enum (SELECT).
|
2
|
+
#
|
1
3
|
class CckForms::ParameterTypeClass::Enum
|
2
4
|
include CckForms::ParameterTypeClass::Base
|
3
5
|
|
@@ -9,11 +11,14 @@ class CckForms::ParameterTypeClass::Enum
|
|
9
11
|
value.presence
|
10
12
|
end
|
11
13
|
|
14
|
+
# Current string value from valid_values
|
12
15
|
def to_s(options = nil)
|
13
16
|
return '' if value.blank?
|
14
17
|
valid_values[value].to_s
|
15
18
|
end
|
16
19
|
|
20
|
+
# Constructs MongoDB query. If query is a Hash, find all objects where field is any of the hash keys, for which value
|
21
|
+
# is '1'. Otherwise treat query as where(filed => query).
|
17
22
|
def search(selectable, field, query)
|
18
23
|
if query.is_a? Hash
|
19
24
|
query = query.map { |k, v| v == '1' ? k : nil }.compact
|
@@ -27,6 +32,12 @@ class CckForms::ParameterTypeClass::Enum
|
|
27
32
|
end
|
28
33
|
end
|
29
34
|
|
35
|
+
# options:
|
36
|
+
#
|
37
|
+
# as - if 'checkboxes', display a set of checkboxes, not SELECT
|
38
|
+
# only - leave only these keys (array/string)
|
39
|
+
# except - reverse of :only
|
40
|
+
# required - HTML required attr
|
30
41
|
def build_form(form_builder, options)
|
31
42
|
|
32
43
|
if options.is_a? Hash and options[:as] == 'checkboxes'
|
@@ -1,5 +1,8 @@
|
|
1
|
+
# Represents a single file.
|
2
|
+
#
|
1
3
|
class CckForms::ParameterTypeClass::File
|
2
4
|
include CckForms::ParameterTypeClass::Base
|
5
|
+
include CckForms::NeofilesDenormalize
|
3
6
|
|
4
7
|
def self.name
|
5
8
|
'Файл'
|
@@ -13,29 +16,23 @@ class CckForms::ParameterTypeClass::File
|
|
13
16
|
self.class.file_type
|
14
17
|
end
|
15
18
|
|
16
|
-
#
|
19
|
+
# Converts Neofiles::File or its ID into denormalized Hash to be stored in MongoDB
|
17
20
|
def mongoize
|
18
|
-
|
19
|
-
when file_type then value.id
|
20
|
-
when ::String then value
|
21
|
-
end
|
21
|
+
self.class.neofiles_attrs_or_id value, file_type
|
22
22
|
end
|
23
23
|
|
24
|
-
#
|
24
|
+
# Converts denormalized attrs hash or ID to Neofiles::File instance (possibly lazy loadable)
|
25
25
|
def self.demongoize_value(value, parameter_type_class=nil)
|
26
|
-
|
27
|
-
rescue Mongoid::Errors::DocumentNotFound
|
28
|
-
nil
|
26
|
+
neofiles_mock_or_load value
|
29
27
|
end
|
30
28
|
|
31
|
-
#
|
32
|
-
#
|
33
|
-
# Ставит ДИВ и делает аяксовый вызов метода file_compact контроллера Neofiles::AdminController.
|
29
|
+
# Constructs HTML form for image upload & manipulation. Basically, it is a DIV with some ID and a Javascript widget
|
30
|
+
# creation for that DIV.
|
34
31
|
#
|
35
|
-
#
|
36
|
-
#
|
37
|
-
# value - текущее значение (идентификатор или объект Neofiles::File)
|
32
|
+
# options:
|
38
33
|
#
|
34
|
+
# value - current value (ID or Neofiles::File)
|
35
|
+
# with_desc - if true, show the description edit richtext (default false)
|
39
36
|
def build_form(form_builder, options)
|
40
37
|
set_value_in_hash options
|
41
38
|
self.class.create_load_form helper: self,
|
@@ -45,15 +42,23 @@ class CckForms::ParameterTypeClass::File
|
|
45
42
|
with_desc: options[:with_desc]
|
46
43
|
end
|
47
44
|
|
45
|
+
# Create image load DIV & script. A separate function to allow other (non-CCK) fields to utilize this functionality.
|
46
|
+
#
|
47
|
+
# helper - view context for HTML generation (`self` in views or `view_context` in controllers)
|
48
|
+
# file - Neofiles::File or ID
|
49
|
+
# widget_id - DIV ID
|
50
|
+
# input_name, append_create, clean_remove, disabled, multiple, with_desc
|
51
|
+
# - Neofiles arguments, see Neofiles::AdminController
|
48
52
|
def self.create_load_form(helper:, file:, input_name:, append_create: false, clean_remove: false, widget_id: nil, disabled: false, multiple: false, with_desc: false)
|
49
53
|
cont_id = 'container_' + (widget_id.presence || form_name_to_id(input_name))
|
50
54
|
|
51
55
|
# создаем временное поле, чтобы пока аяксовый ответ не вернется, мы могли все же отправить родительскую форму
|
52
56
|
# и не потерять при этом данные из поля
|
57
|
+
file_id = file.is_a?(file_type) ? file.id.to_s : file.to_s
|
53
58
|
temp_field, remove_temp_field = '', ''
|
54
|
-
if
|
55
|
-
temp_id = "temp_file_field_#{
|
56
|
-
temp_field = '<input id="' + temp_id + '" type="hidden" name="' + input_name + '" value="' +
|
59
|
+
if file_id.present?
|
60
|
+
temp_id = "temp_file_field_#{file_id}"
|
61
|
+
temp_field = '<input id="' + temp_id + '" type="hidden" name="' + input_name + '" value="' + file_id + '">'
|
57
62
|
remove_temp_field = '$("#' + temp_id + '").remove();'
|
58
63
|
end
|
59
64
|
|
@@ -62,7 +67,7 @@ class CckForms::ParameterTypeClass::File
|
|
62
67
|
|
63
68
|
<script type="text/javascript">
|
64
69
|
$(function() {
|
65
|
-
$("#' + cont_id + '").load("' + helper.neofiles_file_compact_path(id:
|
70
|
+
$("#' + cont_id + '").load("' + helper.neofiles_file_compact_path(id: file_id, input_name: input_name, widget_id: widget_id, append_create: append_create ? '1' : nil, clean_remove: clean_remove ? '1' : nil, disabled: disabled ? '1' : nil, multiple: multiple ? '1' : nil, with_desc: with_desc ? '1' : nil) + '", null, function() {
|
66
71
|
$(this).children().unwrap();
|
67
72
|
' + remove_temp_field + '
|
68
73
|
});
|
@@ -70,11 +75,13 @@ class CckForms::ParameterTypeClass::File
|
|
70
75
|
</script>'
|
71
76
|
end
|
72
77
|
|
78
|
+
# Returns empty string
|
73
79
|
def to_s
|
74
80
|
''
|
75
81
|
end
|
76
82
|
|
83
|
+
# Returns a file name
|
77
84
|
def to_diff_value(options = {})
|
78
|
-
|
85
|
+
value.try! :name
|
79
86
|
end
|
80
87
|
end
|