drg_cms 0.6.0.6 → 0.6.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +25 -10
  3. data/app/assets/javascripts/drg_cms/drg_cms.js +281 -106
  4. data/app/assets/stylesheets/drg_cms/drg_cms.css +417 -152
  5. data/app/assets/stylesheets/drg_cms/select-multiple.css +9 -12
  6. data/app/assets/stylesheets/drg_cms_cms.css +1 -1
  7. data/app/controllers/cmsedit_controller.rb +247 -175
  8. data/app/controllers/dc_application_controller.rb +251 -173
  9. data/app/controllers/dc_common_controller.rb +81 -48
  10. data/app/controls/dc_help_control.rb +126 -0
  11. data/app/controls/dc_report.rb +223 -0
  12. data/app/forms/all_options.yml +38 -10
  13. data/app/forms/cms_menu.yml +7 -1
  14. data/app/forms/dc_big_table.yml +1 -0
  15. data/app/forms/dc_big_table_value.yml +1 -0
  16. data/app/forms/dc_category.yml +2 -1
  17. data/app/forms/dc_design.yml +1 -0
  18. data/app/forms/dc_help_1.yml +109 -0
  19. data/app/forms/dc_journal.yml +3 -1
  20. data/app/forms/dc_link.yml +1 -1
  21. data/app/forms/dc_menu.yml +2 -0
  22. data/app/forms/dc_menu_item.yml +1 -0
  23. data/app/forms/dc_page.yml +6 -0
  24. data/app/forms/dc_part.yml +1 -0
  25. data/app/forms/dc_piece.yml +1 -0
  26. data/app/forms/dc_poll.yml +15 -5
  27. data/app/forms/dc_poll_item.yml +2 -1
  28. data/app/forms/dc_poll_result.yml +9 -0
  29. data/app/forms/dc_simple_menu.yml +2 -0
  30. data/app/forms/dc_site.yml +4 -12
  31. data/app/forms/dc_user.yml +27 -11
  32. data/app/forms/dc_user_role.yml +3 -0
  33. data/app/helpers/cms_common_helper.rb +375 -0
  34. data/app/helpers/{cmsedit_edit_helper.rb → cms_edit_helper.rb} +109 -65
  35. data/app/helpers/{cmsedit_helper.rb → cms_helper.rb} +93 -48
  36. data/app/helpers/{cmsedit_index_helper.rb → cms_index_helper.rb} +240 -206
  37. data/app/helpers/dc_application_helper.rb +108 -327
  38. data/app/models/concerns/dc_page_concern.rb +14 -4
  39. data/app/models/concerns/dc_piece_concern.rb +1 -1
  40. data/app/models/concerns/dc_policy_rule_concern.rb +20 -8
  41. data/app/models/concerns/dc_site_concern.rb +67 -44
  42. data/app/models/concerns/dc_user_concern.rb +58 -19
  43. data/app/models/dc_design.rb +29 -19
  44. data/app/models/dc_filter.rb +26 -18
  45. data/app/models/dc_key_value_store.rb +1 -0
  46. data/app/models/dc_permission.rb +49 -9
  47. data/app/models/dc_policy.rb +25 -14
  48. data/app/models/dc_policy_role.rb +22 -11
  49. data/app/models/dc_poll.rb +1 -0
  50. data/app/models/dc_poll_result.rb +4 -2
  51. data/app/models/dc_temp.rb +6 -3
  52. data/app/models/dc_user_role.rb +2 -2
  53. data/app/models/drgcms_form_fields/date_picker.rb +6 -3
  54. data/app/models/drgcms_form_fields/datetime_picker.rb +4 -3
  55. data/app/models/drgcms_form_fields/drgcms_field.rb +20 -5
  56. data/app/models/drgcms_form_fields/embedded.rb +23 -16
  57. data/app/models/drgcms_form_fields/file_field.rb +2 -2
  58. data/app/models/drgcms_form_fields/file_select.rb +2 -2
  59. data/app/models/drgcms_form_fields/hash_field.rb +11 -7
  60. data/app/models/drgcms_form_fields/hidden_field.rb +1 -1
  61. data/app/models/drgcms_form_fields/link_to.rb +2 -2
  62. data/app/models/drgcms_form_fields/method.rb +66 -0
  63. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +18 -12
  64. data/app/models/drgcms_form_fields/number_field.rb +4 -3
  65. data/app/models/drgcms_form_fields/radio.rb +10 -5
  66. data/app/models/drgcms_form_fields/readonly.rb +13 -17
  67. data/app/models/drgcms_form_fields/select.rb +58 -41
  68. data/app/models/drgcms_form_fields/text_autocomplete.rb +41 -33
  69. data/app/models/drgcms_form_fields.rb +12 -1
  70. data/app/renderers/dc_big_menu_renderer.rb +1 -0
  71. data/app/renderers/dc_gallery_renderer.rb +1 -0
  72. data/app/renderers/dc_menu_renderer.rb +1 -0
  73. data/app/renderers/dc_page_renderer.rb +8 -6
  74. data/app/renderers/dc_part_renderer.rb +1 -0
  75. data/app/renderers/dc_piece_renderer.rb +1 -1
  76. data/app/renderers/dc_poll_renderer.rb +56 -55
  77. data/app/renderers/dc_renderer.rb +1 -0
  78. data/app/renderers/dc_simple_menu_renderer.rb +1 -0
  79. data/app/views/cmsedit/_edit_stuff.html.erb +5 -2
  80. data/app/views/cmsedit/edit.html.erb +4 -1
  81. data/app/views/cmsedit/index.html.erb +3 -2
  82. data/app/views/cmsedit/new.html.erb +5 -2
  83. data/app/views/dc_common/_help.html.erb +17 -0
  84. data/app/views/layouts/models.html.erb +2 -1
  85. data/config/locales/drgcms_en.yml +17 -2
  86. data/config/locales/drgcms_sl.yml +22 -4
  87. data/config/locales/models_en.yml +16 -7
  88. data/config/locales/models_sl.yml +21 -12
  89. data/drg_cms.gemspec +16 -16
  90. data/lib/drg_cms/version.rb +1 -1
  91. data/lib/drg_cms.rb +98 -0
  92. data/lib/generators/new_drg_form/new_drg_form_generator.rb +5 -3
  93. data/lib/tasks/database.rake +6 -56
  94. metadata +39 -35
  95. data/app/helpers/application_helper.rb +0 -2
  96. data/app/models/__dc_dummy.rb +0 -102
@@ -0,0 +1,375 @@
1
+ #--
2
+ # Copyright (c) 2012+ Damjan Rems
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+
25
+ ####################################################################
26
+ # Common methods which may also come handy in controllers or models or any
27
+ # other module of program.
28
+ #
29
+ # Usage: include CmsCommonHelper
30
+ ####################################################################
31
+ module CmsCommonHelper
32
+
33
+ ####################################################################
34
+ # Wrapper for i18 t method, with some spice added. If translation is not found English
35
+ # translation value will be returned. And if still not found default value will be returned if passed.
36
+ #
37
+ # Parameters:
38
+ # [key] String. String to be translated into locale.
39
+ # [default] String. Value returned if translation is not found.
40
+ #
41
+ # Example:
42
+ # t('translate.this','Enter text for ....')
43
+ #
44
+ # Returns:
45
+ # String. Translated text.
46
+ ####################################################################
47
+ def self.t(key, default=nil)
48
+ c = I18n.t(key)
49
+ if c.class == Hash or c.match( 'translation missing' )
50
+ c = I18n.t(key, locale: 'en')
51
+ # Still not found. Return default if set
52
+ if c.class == Hash or c.match( 'translation missing' )
53
+ c = default.nil? ? key : default
54
+ end
55
+ end
56
+ c
57
+ end
58
+
59
+ ####################################################################
60
+ def t(key, default=nil) #:nodoc
61
+ CmsCommonHelper.t(key, default)
62
+ end
63
+
64
+ ####################################################################
65
+ # Returns table (collection) name translation for usage in dialog title. Tablename
66
+ # title is provided by helpers.label.table_name.tabletitle locale.
67
+ #
68
+ # Parameters:
69
+ # [tablename] String. Table (collection) name to be translated.
70
+ # [default] String. Value returned if translation is not found.
71
+ #
72
+ # Returns:
73
+ # String. Translated text.
74
+ ####################################################################
75
+ def t_tablename(tablename, default=nil)
76
+ t('helpers.label.' + tablename + '.tabletitle', default || tablename)
77
+ end
78
+
79
+ ############################################################################
80
+ # Returns label for field translated to current locale for usage on data entry form.
81
+ # Translation is provided by lang.helpers.label.table_name.field_name locale. If
82
+ # translation is not found method will capitalize field_name and replace '_' with ' '.
83
+ ############################################################################
84
+ def t_name(field_name, default='')
85
+ c = t("helpers.label.#{@form['table']}.#{field_name}", default)
86
+ c = field_name.capitalize.gsub('_',' ') if c.match( 'translation missing' )
87
+ c
88
+ end
89
+
90
+ ###########################################################################
91
+ # When select field is used on form options for select can be provided by
92
+ # helpers.label.table_name.choices4_name locale. This is how select
93
+ # field options are translated. Method returns selected choice translated
94
+ # to current locale.
95
+ #
96
+ # Parameters:
97
+ # [model] String. Table (collection) model name (lowercase).
98
+ # [field] String. Field name used.
99
+ # [value] String. Value of field which translation will be returned.
100
+ #
101
+ # Example:
102
+ # # usage in program. Choice values for state are 'Deactivated:0,Active:1,Waiting:2'
103
+ # dc_name4_value('dc_user', 'state', @record.active )
104
+ #
105
+ # # usage in form
106
+ # columns:
107
+ # 2:
108
+ # name: state
109
+ # eval: dc_name4_value dc_user, state
110
+ #
111
+ # Returns:
112
+ # String. Descriptive text (translated) for selected choice value.
113
+ ############################################################################
114
+ def self.dc_name_for_value(model, field, value)
115
+ return '' if value.nil?
116
+ c = t('helpers.label.' + model + '.choices4_' + field )
117
+ a = c.chomp.split(',').inject([]) {|r,v| r << v.split(':') }
118
+ a.each {|e| return e.first if e.last.to_s == value.to_s }
119
+ '???'
120
+ end
121
+
122
+ ############################################################################
123
+ def dc_name_for_value(model, field, value)
124
+ CmsCommonHelper.dc_name_for_value(model, field, value)
125
+ end
126
+
127
+ ############################################################################
128
+ #
129
+ ############################################################################
130
+ def dc_name4_value(model, field, value) #nodoc
131
+ #dc_deprecate('dc_name4_value will be deprecated. Use dc_name_for_value instead.')
132
+ CmsCommonHelper.dc_name_for_value(model, field, value)
133
+ end
134
+
135
+ ############################################################################
136
+ # Return choices for field in model if choices are defined in localization text.
137
+ #
138
+ # Parameters:
139
+ # [model] String. Table (collection) model name (lowercase).
140
+ # [field] String. Field name used.
141
+ #
142
+ # Example:
143
+ # dc_choices4_field('dc_user', 'state' )
144
+ #
145
+ # Returns:
146
+ # Array. Choices for select input field
147
+ ############################################################################
148
+ def self.dc_choices_for_field(model, field)
149
+ c = CmsCommonHelper.t('helpers.label.' + model + '.choices4_' + field )
150
+ return ['error'] if c.match( 'translation missing' )
151
+ c.chomp.split(',').inject([]) {|r,v| r << v.split(':') }
152
+ end
153
+
154
+ ############################################################################
155
+ def dc_choices_for_field(model, field)
156
+ CmsCommonHelper.dc_choices_for_field(model, field)
157
+ end
158
+
159
+ ############################################################################
160
+ #
161
+ ############################################################################
162
+ def dc_choices4_field(model, field) #nodoc
163
+ #dc_deprecate('dc_choices4_field will be deprecated. Use dc_choices_for_field instead.')
164
+ CmsCommonHelper.dc_choices_for_field(model, field)
165
+ end
166
+
167
+ ############################################################################
168
+ # Will return descriptive text for id key when field in one table (collection) has belongs_to
169
+ # relation to other table.
170
+ #
171
+ # Parameters:
172
+ # [model] String. Table (collection) model name (lowercase).
173
+ # [field] String. Field name holding the value of descriptive text.
174
+ # [field_name] String. ID field name. This is by default id, but can be any other
175
+ # (preferred unique) field.
176
+ # [value] Value of id_field. Usually a BSON Key but can be any other data type.
177
+ #
178
+ # Example:
179
+ # # usage in program.
180
+ # dc_name4_id('dc_user', 'name', nil, dc_page.created_by)
181
+ #
182
+ # # usage in form
183
+ # columns:
184
+ # 2:
185
+ # name: site_id
186
+ # eval: dc_name4_id,site,name
187
+ # # username is saved to document instead of user.id field
188
+ # 5:
189
+ # name: user
190
+ # eval: dc_name4_id,dc_user,name,username
191
+ #
192
+ # Returns:
193
+ # String. Name (descriptive value) for specified key in table.
194
+ ############################################################################
195
+ def dc_name_for_id(model, field, field_name, id=nil)
196
+ return '' if id.nil?
197
+
198
+ field_name = (field_name || 'id').strip.to_sym
199
+ field = field.strip.to_sym
200
+ model = model.strip.classify.constantize if model.class == String
201
+ doc = Mongoid::QueryCache.cache { model.find_by(field_name => id) }
202
+
203
+ doc.nil? ? '' : (doc.send(field) rescue 'not defined')
204
+ end
205
+
206
+ ############################################################################
207
+ #
208
+ ############################################################################
209
+ def dc_name4_id(model, field, field_name, id=nil) #nodoc
210
+ #dc_deprecate('dc_name4_id will be deprecated. Use dc_name_for_id instead.')
211
+ dc_name_for_id(model, field, field_name, id)
212
+ end
213
+
214
+ ############################################################################
215
+ # Return html code for icon presenting boolean value. Icon is a picture of checked or unchecked box.
216
+ #
217
+ # Parameters:
218
+ # [value] Boolean.
219
+ #
220
+ # Example:
221
+ # # usage from program
222
+ # dc_icon4_boolean(some_value)
223
+ #
224
+ # # usage from form description
225
+ # columns:
226
+ # 10:
227
+ # name: active
228
+ # eval: dc_icon4_boolean
229
+ ############################################################################
230
+ def dc_icon_for_boolean(value=false)
231
+ dc_dont?(value, true) ? fa_icon('square-o lg') : fa_icon('check-square-o lg')
232
+ end
233
+
234
+ ############################################################################
235
+ #
236
+ ############################################################################
237
+ def dc_icon4_boolean(value=false) #nodoc
238
+ #dc_deprecate('dc_icon4_boolean will be deprecated. Use dc_icon_for_boolean instead.')
239
+ dc_icon_for_boolean(value)
240
+ end
241
+
242
+ ############################################################################
243
+ # Returns html code for displaying date/time formatted by strftime. Will return '' if value is nil.
244
+ #
245
+ # Parameters:
246
+ # [value] Date/DateTime/Time.
247
+ # [format] String. strftime format mask. Defaults to locale's default format.
248
+ ############################################################################
249
+ def self.dc_format_date_time(value, format=nil)
250
+ return '' if value.blank?
251
+
252
+ format ||= value.class == Date ? t('date.formats.default') : t('time.formats.default')
253
+ if format.size == 1
254
+ format = format.match(/d/i) ? t('date.formats.default') : t('time.formats.default')
255
+ end
256
+ value.strftime(format)
257
+ end
258
+
259
+ ############################################################################
260
+ # Returns html code for displaying date/time formatted by strftime. Will return '' if value is nil.
261
+ #
262
+ # Parameters:
263
+ # [value] Date/DateTime/Time.
264
+ # [format] String. strftime format mask. Defaults to locale's default format.
265
+ ############################################################################
266
+ def dc_format_date_time(value, format=nil) #:nodoc:
267
+ CmsCommonHelper.dc_format_date_time(value, format)
268
+ end
269
+
270
+ ####################################################################
271
+ #
272
+ ####################################################################
273
+ def dc_date_time(value, format) #:nodoc:
274
+ dc_deprecate 'dc_date_time will be deprecated! Use dc_format_date_time instead.'
275
+ dc_format_date_time(value, format)
276
+ end
277
+
278
+ ############################################################################
279
+ # Returns html code for displaying formatted number.
280
+ #
281
+ # Parameters:
282
+ # [value] Numeric number.
283
+ # [decimals] Integer. Number of decimals
284
+ # [separator] String. Decimals separator
285
+ # [delimiter] String. Thousands delimiter.
286
+ # [currency] String. Currency symbol if applied to result string.
287
+ ############################################################################
288
+ def self.dc_format_number(value=0, decimals=nil, separator=nil, delimiter=nil, currency=nil)
289
+ decimals ||= I18n.t('number.currency.format.precision')
290
+ separator ||= I18n.t('number.currency.format.separator')
291
+ separator = '' if decimals == 0
292
+ delimiter ||= I18n.t('number.currency.format.delimiter')
293
+ whole, dec = value.to_s.split('.')
294
+ whole = '0' if whole.blank?
295
+ # remove and remember sign
296
+ sign = ''
297
+ if whole[0] == '-'
298
+ whole.delete_prefix!('-')
299
+ sign << '-'
300
+ end
301
+ # format decimals
302
+ dec ||= '0'
303
+ dec = dec[0,decimals]
304
+ while dec.size < decimals do dec += '0' end
305
+ # slice whole on chunks of 3
306
+ ar = []
307
+ while whole.size > 0 do
308
+ n = whole.size >=3 ? 3 : whole.size
309
+ ar << whole.slice!(n*-1,n)
310
+ end
311
+ # put it all back and format
312
+ "#{sign}#{ar.reverse.join(delimiter)}#{separator}#{dec}"
313
+ end
314
+
315
+ ############################################################################
316
+ # Returns html code for displaying formatted number.
317
+ #
318
+ # Parameters:
319
+ # [value] Numeric number.
320
+ # [decimals] Integer. Number of decimals
321
+ # [separator] String. Decimals separator
322
+ # [delimiter] String. Thousands delimiter.
323
+ # [currency] String. Currency symbol if applied to result string.
324
+ ############################################################################
325
+ def dc_format_number(value=0, decimals=nil, separator=nil, delimiter=nil, currency=nil) #:nodoc:
326
+ CmsCommonHelper.dc_format_number(value, decimals, separator, delimiter, currency)
327
+ end
328
+
329
+ ############################################################################
330
+ # Create help text for fields on single tab
331
+ ############################################################################
332
+ def dc_help_for_tab(tab)
333
+ return '' if tab.nil?
334
+
335
+ html = ''
336
+ if tab.class == Array
337
+ tab_name = tab.last['caption'] || tab.first
338
+ tab_label, tab_help = dc_tab_label_help(tab_name)
339
+ html << %(<div class="help-tab">#{tab_label}</div><div class="help-tab-help">#{tab_help}</div>)
340
+
341
+ tab = tab.last
342
+ end
343
+
344
+ tab.each do |field|
345
+ label, help = dc_label_help(field.last)
346
+ next if help.blank?
347
+
348
+ html << %(<div class="help-field"><div class="help-label">#{label}</div><div class="help-text">#{help}</div></div>)
349
+ end
350
+ html
351
+ end
352
+
353
+ ############################################################################
354
+ # Will scoop fields and help text associated with them to create basic help text.
355
+ ############################################################################
356
+ def dc_help_fields
357
+ return '' if @form['form'].nil?
358
+
359
+ html = '<a id="fields"></a>'
360
+ if @form['form']['tabs']
361
+ @form['form']['tabs'].each { |tab| html << dc_help_for_tab(tab) }
362
+ else
363
+ html << dc_help_for_tab(@form['form']['fields'])
364
+ end
365
+ html.html_safe
366
+ end
367
+
368
+ ############################################################################
369
+ # Will return text from help files
370
+ ############################################################################
371
+ def dc_help_body
372
+ (params[:type] == 'index' ? @help['index'] : @help['form']).html_safe
373
+ end
374
+
375
+ end