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.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +254 -1
  3. data/lib/cck_forms/date_time.rb +4 -0
  4. data/lib/cck_forms/engine.rb +2 -2
  5. data/lib/cck_forms/form_builder_extensions.rb +2 -1
  6. data/lib/cck_forms/neofiles_denormalize.rb +71 -0
  7. data/lib/cck_forms/parameter_type_class/album.rb +15 -11
  8. data/lib/cck_forms/parameter_type_class/base.rb +58 -63
  9. data/lib/cck_forms/parameter_type_class/boolean.rb +6 -0
  10. data/lib/cck_forms/parameter_type_class/checkboxes.rb +31 -15
  11. data/lib/cck_forms/parameter_type_class/date.rb +5 -0
  12. data/lib/cck_forms/parameter_type_class/date_range.rb +8 -2
  13. data/lib/cck_forms/parameter_type_class/date_time.rb +10 -8
  14. data/lib/cck_forms/parameter_type_class/enum.rb +11 -0
  15. data/lib/cck_forms/parameter_type_class/file.rb +27 -20
  16. data/lib/cck_forms/parameter_type_class/float.rb +3 -0
  17. data/lib/cck_forms/parameter_type_class/image.rb +3 -1
  18. data/lib/cck_forms/parameter_type_class/integer.rb +10 -4
  19. data/lib/cck_forms/parameter_type_class/integer_range.rb +18 -0
  20. data/lib/cck_forms/parameter_type_class/map.rb +23 -23
  21. data/lib/cck_forms/parameter_type_class/phones.rb +14 -15
  22. data/lib/cck_forms/parameter_type_class/string.rb +3 -0
  23. data/lib/cck_forms/parameter_type_class/string_collection.rb +6 -0
  24. data/lib/cck_forms/parameter_type_class/text.rb +4 -0
  25. data/lib/cck_forms/parameter_type_class/time.rb +4 -0
  26. data/lib/cck_forms/parameter_type_class/work_hours.rb +24 -36
  27. data/lib/cck_forms/version.rb +1 -1
  28. data/vendor/assets/javascripts/cck_forms/index.js +2 -0
  29. metadata +4 -2
@@ -1,53 +1,46 @@
1
- # Базовая примесь для всех типов полей. Определяет всякие помогайки. Ее нужно включать методом include во все типы,
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
- # CckForms::ParameterTypeClass::NewType.name # 'Новый тип', берется из CckForms::ParameterTypeClass::NewType::name
13
- #
14
- # Использование типов:
7
+ # Standalone usage of real classes:
15
8
  #
16
9
  # field :cover_photo, type: CckForms::ParameterTypeClass::Image
17
- # field :gallery, type: CckForms::ParameterTypeClass::Album
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) все помощники УРЛов вида edit_article_path, включаемые через include Rails.application.routes.url_helpers;
15
+ # 1) URL helpers like edit_article_path accessible via include Rails.application.routes.url_helpers;
23
16
  #
24
- # 2) методы cck_param и value, которые возвращают текущий параметр (module CckForms::*::Parameter) и его значение;
17
+ # 2) methods cck_param & value returning current CCK parameter (module CckForms::*::Parameter) and his current value;
25
18
  #
26
- # 3) методы with_cck_param(param) do ... и with_value(value) do ..., которые устанавливают соотв, значения методов
27
- # cck_param/value на время выполнения блока (еще есть with_cck_param_and_value(param, value) do ...);
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) динамический метод (через method_missing и respond_to?) ..._with_value(value, args*), который делает то же,
30
- # что и with_value, но для вызова 1 метода;
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), который кладет value в hash[:value];
25
+ # 5) utility set_value_in_hash(hash) placing value in hash[:value];
33
26
  #
34
- # 6) помощники для получения ХТМЛ ID form(_builder)?_name_to_id;
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 - код типа из имени модуля (CckForms::ParameterType::RichText -> rich_text)
39
- # self.name - имя типа ("Cтрока")
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
- # Возвращает строку с яваскриптовым кодом для выполнения в БД кода emit операции map-reduce на поле данного типа.
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
- # Пример: есть поле city типа checkboxes, хранящее список городов, то-есть объекты, описываемые этим полем,
96
- # могут быть в разных городах. Если мы хотим сделать группировочный запрос (частный случай map-reduce) в БД, чтобы,
97
- # например, подсчитать кол-во объектов в городах, мы не можем просто сделать emit для всего поля city, поскольку
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
- # По-умолчанию, считаем, что значение, хранимое в поле "#{feild_name}" атомарно, и вызываем emit для него.
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
- # Подробнее про map-reduce см. http://docs.mongodb.org/manual/applications/map-reduce/
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
- # Конвертирует имя элемента формы в ID, например facility[cck_params][1][value] -> facility_cck_params_1_value.
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
- # Имя типа, например, для select>option[value]
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
- # -> [[key1, value1], [key2, value2], ...]
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
- # -> "georgian: грузинская, albanian: албанская"
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
- # Существует ли valid_values_class?
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
- # Если valid_values пустой, и есть valid_values_class, запишет в valid_values все значения
201
- # из valid_values_class. Считает, что класс похож на ActiveRecord, и значения берет из all.
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
- # Строит форму редактирования. Просто input:text со всеми переданными опциями (значение можно определить через
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
- # Вернем в виде HTML
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
- # Чтобы принимать аргумент options
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
- # Формируем поисковый запрос для монго на основе запроса (типа мини-DSL язык запроса, свой для каждого типа).
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
- # Нужен для Rails.application.routes.url_helpers
233
+ # For Rails.application.routes.url_helpers
240
234
  def default_url_options
241
235
  {}
242
236
  end
243
237
 
244
- # Реализация перобразования в/из Монго по умолчанию: берем то, что в value
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
- # См. ClassMethod.form_name_to_id
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
- # Конвертирует имя элемента формы из FormBuilder, см. form_name_to_id.
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
- # options[:block] - задает шаблон sprintf для каждого вхождения
41
- # options[:only] - массив, оставить только эти ключи (можно передать одно, без массива)
42
- # options[:except] - :only наоборот
43
- # options[:glue] - используем его вместо ', ' для склейки значений
44
- # options[:short] - по-возможности сокращать: если указаны все варианты, то вернется строка вида "выбрано все"
45
- # - или "все, кроме xxx", если не выбран только xxx
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
- # Составим строку для map-reduce, чтобы emit вызывался на каждом отмеченном значении, например, в документе хранится:
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
- # Мы вызовем emit('almaty', 1); emit('astana', 1).
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[:block] - задает шаблон sprintf для каждого чекбокса (input, label)
130
- # options[:map] - задает преобразование (ключ-значение) текстов в подписях, например, 'длинный текст' => 'кор. ткст'
131
- # options[:data] - задает data-атрибуты для тэга label, по ключу из valid_values (capital: {almaty: 'yes', astana: 'no'})
132
- # options[:as] - если :select, то показать не в виде чекбоксов, а в виде выпадайки
133
- # options[:only] - только этот ключ (ключи)
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
- # Формирует строковое представление даты и времени. Если options :символ, это эквивалентно options[:символ] = true,
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
- # Ключи options:
26
+ # options:
25
27
  #
26
- # year_obligatory - вывести год, по-умолчанию, он не показывается, если равен текущему
27
- # only_date - только дату, без времени
28
- # rus_date - дату по-русски, типа "2 июля"
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
- # По-умолчанию, вернет строку вида "01.02.2012, 12:49". Если что-то сломалось, вернет пустую строку.
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
- # Если передан Neofiles::File, вернет его идентификатор, если строка - вернет ее, иначе - nil.
19
+ # Converts Neofiles::File or its ID into denormalized Hash to be stored in MongoDB
17
20
  def mongoize
18
- case value
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
- # Попытаемся получить объект Neofiles::File по его идентификатору. Если не получилось, вернем nil.
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
- file_type.find(value) unless value.blank?
27
- rescue Mongoid::Errors::DocumentNotFound
28
- nil
26
+ neofiles_mock_or_load value
29
27
  end
30
28
 
31
- # Строит форму выбора и загрузки 1 картинки.
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
- # Ключи options:
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 file.present? && file.is_a?(String)
55
- temp_id = "temp_file_field_#{file}"
56
- temp_field = '<input id="' + temp_id + '" type="hidden" name="' + input_name + '" value="' + file + '">'
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: file, 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() {
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
- "Файл: #{self.value.try! :name}"
85
+ value.try! :name
79
86
  end
80
87
  end