drg_cms 0.7.0.2 → 0.7.1.1

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 (75) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/drg_cms/drg_cms.js +110 -35
  3. data/app/assets/javascripts/drg_cms/jquery.bpopup.js +372 -0
  4. data/app/assets/javascripts/drg_cms_application.js +1 -1
  5. data/app/assets/javascripts/drg_cms_cms.js +1 -1
  6. data/app/assets/stylesheets/drg_cms/drg_cms.css +126 -36
  7. data/app/assets/stylesheets/drg_cms/select-multiple.css +6 -7
  8. data/app/controllers/cmsedit_controller.rb +78 -47
  9. data/app/controllers/dc_application_controller.rb +22 -25
  10. data/app/controllers/dc_common_controller.rb +9 -6
  11. data/app/controllers/dc_main_controller.rb +0 -1
  12. data/app/controls/{dc_category_control.rb → dc_gallery_control.rb} +15 -30
  13. data/app/controls/dc_image_control.rb +180 -0
  14. data/app/controls/dc_page_control.rb +3 -3
  15. data/app/controls/dc_poll_result_control.rb +38 -39
  16. data/app/controls/dc_report.rb +9 -4
  17. data/app/controls/dc_setup_control.rb +53 -0
  18. data/app/controls/design_element_settings_control.rb +88 -37
  19. data/app/forms/all_options.yml +20 -9
  20. data/app/forms/cms_menu.yml +14 -2
  21. data/app/forms/dc_gallery.yml +1 -1
  22. data/app/forms/dc_image.yml +122 -0
  23. data/app/forms/dc_image_search.yml +72 -0
  24. data/app/forms/dc_page.yml +11 -8
  25. data/app/forms/dc_poll.yml +2 -1
  26. data/app/forms/dc_poll_result.yml +10 -7
  27. data/app/forms/dc_setup.yml +45 -0
  28. data/app/forms/dc_steps_template.yml +6 -2
  29. data/app/helpers/cms_common_helper.rb +36 -24
  30. data/app/helpers/cms_edit_helper.rb +26 -33
  31. data/app/helpers/cms_helper.rb +29 -12
  32. data/app/helpers/cms_index_helper.rb +109 -80
  33. data/app/helpers/dc_application_helper.rb +108 -86
  34. data/app/helpers/dc_image_helper.rb +127 -0
  35. data/app/models/concerns/dc_policy_rule_concern.rb +1 -1
  36. data/app/models/concerns/dc_user_concern.rb +13 -5
  37. data/app/models/dc_big_table.rb +1 -1
  38. data/app/models/dc_category.rb +12 -0
  39. data/app/models/dc_design.rb +5 -4
  40. data/app/models/dc_filter.rb +24 -27
  41. data/app/models/dc_image.rb +237 -0
  42. data/app/models/dc_internals.rb +5 -9
  43. data/app/models/dc_memory.rb +2 -2
  44. data/app/models/dc_policy_role.rb +8 -8
  45. data/app/models/dc_setup.rb +111 -0
  46. data/app/models/drgcms_form_fields/datetime_picker.rb +1 -1
  47. data/app/models/drgcms_form_fields/drgcms_field.rb +9 -26
  48. data/app/models/drgcms_form_fields/embedded.rb +28 -17
  49. data/app/models/drgcms_form_fields/journal_diff.rb +2 -2
  50. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +88 -76
  51. data/app/models/drgcms_form_fields/select.rb +41 -19
  52. data/app/models/drgcms_form_fields/text_with_select.rb +5 -9
  53. data/app/renderers/dc_big_menu_renderer.rb +18 -20
  54. data/app/renderers/dc_gallery_renderer.rb +10 -4
  55. data/app/renderers/dc_menu_renderer.rb +21 -58
  56. data/app/renderers/dc_page_renderer.rb +7 -7
  57. data/app/renderers/dc_poll_renderer.rb +13 -12
  58. data/app/renderers/dc_simple_menu_renderer.rb +1 -1
  59. data/app/views/cmsedit/_edit_stuff.html.erb +4 -1
  60. data/app/views/cmsedit/edit.html.erb +1 -1
  61. data/app/views/cmsedit/index.html.erb +1 -1
  62. data/app/views/cmsedit/new.html.erb +1 -0
  63. data/config/locales/drgcms_en.yml +22 -2
  64. data/config/locales/drgcms_sl.yml +25 -6
  65. data/config/locales/models_en.yml +50 -1
  66. data/config/locales/models_sl.yml +60 -1
  67. data/drg_cms.gemspec +1 -1
  68. data/lib/drg_cms/version.rb +1 -1
  69. data/lib/drg_cms.rb +40 -27
  70. data/lib/generators/convert_to_ar/USAGE +8 -0
  71. data/lib/generators/convert_to_ar/convert_to_ar_generator.rb +158 -0
  72. data/lib/generators/new_drg_form/new_drg_form_generator.rb +32 -14
  73. metadata +19 -10
  74. data/app/assets/javascripts/drg_cms/jquery.bpopup.min.js +0 -7
  75. data/app/views/layouts/__cmsedit.html.erb +0 -16
@@ -35,12 +35,10 @@ module CmsIndexHelper
35
35
  def dc_actions_for_index
36
36
  @js = @form['script'] || @form['js'] || ''
37
37
  @css = @form['css'] || ''
38
- return '' if @form['index'].nil?
39
-
40
- actions = @form['index']['actions']
38
+ actions = @form.dig('index', 'actions')
41
39
  return '' if actions.blank?
42
40
 
43
- std_actions = {2 => 'new', 3 => 'sort', 4 => 'filter' }
41
+ std_actions = { 2 => 'new', 3 => 'sort', 4 => 'filter' }
44
42
  std_actions.delete(2) if @form['readonly']
45
43
 
46
44
  if actions.class == String
@@ -51,22 +49,16 @@ def dc_actions_for_index
51
49
  end
52
50
 
53
51
  html_left, html_right = '', ''
54
- # Remove actions settings and sort
55
- only_actions = []
56
- actions.each { |key, value| only_actions << [key, value] if key.class == Integer }
57
- only_actions.sort_by!(&:first)
58
- only_actions.each do |key, options|
52
+ # remove settings and sort
53
+ actions_only = actions.inject([]) { |r, action| r << action if action.first.class == Integer; r }.sort_by(&:first)
54
+ actions_only.each do |key, options|
59
55
  session[:form_processing] = "index:actions: #{key}=#{options}"
60
56
  next if options.nil? # must be
61
57
 
62
- url = @form_params.clone
63
- yaml = options.class == String ? {'type' => options} : options # if single definition simulate type parameter
58
+ url = @form_params.clone
59
+ yaml = options.class == String ? { 'type' => options } : options # sinle action. Simulate type parameter
64
60
  action = yaml['type'].to_s.downcase
65
- if action == 'url'
66
- dc_deprecate "action: url will be deprecated. Use action: link in index: actions! Form #{params['form_name']}"
67
- action = 'link'
68
- end
69
- # if return_to is present link directly to URL
61
+
70
62
  if action == 'link' && yaml['url']
71
63
  url = yaml['url']
72
64
  else
@@ -89,10 +81,8 @@ def dc_actions_for_index
89
81
  choices << [ t("helpers.label.#{@form['table']}.#{e}"), e ]
90
82
  end
91
83
  end
92
- data = t('drgcms.sort') + select('sort', 'sort', choices, { include_blank: true }, { class: 'dc-sort-select',
93
- 'data-table' => @form['table'], 'data-form' => CmsHelper.form_param(params)} )
94
- data = mi_icon('sort') + select('sort', 'sort', choices, { include_blank: true }, { class: 'dc-sort-select',
95
- 'data-table' => @form['table'], 'data-form' => CmsHelper.form_param(params)} )
84
+ data = mi_icon('sort') + select('sort', 'sort', choices, { include_blank: true },
85
+ { class: 'dc-sort-select', 'data-table': @form['table'], 'data-form': CmsHelper.form_param(params)} )
96
86
  html_right << %(<li title="#{t('drgcms.sort')}"><div class="dc-sort">#{data}</li>)
97
87
 
98
88
  # filter
@@ -139,12 +129,17 @@ def dc_actions_for_index
139
129
  parms['id'] = params[:ids]
140
130
  parms['table'] = @form['table']
141
131
  dc_link_to( caption, 'reorder', parms, method: :delete )
142
- =end
132
+ =end
133
+
143
134
  when action == 'script'
144
135
  html_left << dc_script_action(options)
145
136
 
146
137
  when action == 'field'
147
- html_right << dc_field_action(yaml)
138
+ if options['position'] && options['position'] == 'left'
139
+ html_left << dc_field_action(yaml)
140
+ else
141
+ html_right << dc_field_action(yaml)
142
+ end
148
143
 
149
144
  when %w(ajax link window popup submit).include?(action)
150
145
  html_left << dc_link_ajax_window_submit_action(options, nil)
@@ -263,9 +258,16 @@ def dc_actions_column
263
258
  actions.delete('standard')
264
259
  end
265
260
  # check must be first action
266
- has_check = actions[0] && actions[0]['type'] == 'check'
267
- width = actions.size == 1 ? 22 : 44
268
- width = 22 if actions.size > 2 && !has_check
261
+ has_check = has_action_type('check', actions)
262
+ # when readonly only check and show are allowed
263
+ if @form['readonly']
264
+ width = has_action_type('show', actions) ? 22 : 0
265
+ width += 22 if has_check
266
+ else
267
+ width = actions.size == 1 ? 22 : 44
268
+ width = 22 if actions.size > 2 && !has_check
269
+ end
270
+
269
271
  [actions, width, has_check]
270
272
  end
271
273
 
@@ -275,7 +277,7 @@ end
275
277
  def dc_actions_column_for_footer
276
278
  return '' unless @form['result_set']['actions']
277
279
 
278
- ignore, width, ignore2 = dc_actions_column
280
+ ignore, width, ignore2 = dc_actions_column()
279
281
  %(<div class="dc-result-actions" style="width: #{width}px;"></div>).html_safe
280
282
  end
281
283
 
@@ -284,10 +286,10 @@ end
284
286
  ############################################################################
285
287
  def dc_actions_for_result(document)
286
288
  actions = @form['result_set']['actions']
287
- return '' if actions.nil? || @form['readonly']
289
+ return '' if actions.nil? #|| @form['readonly']
288
290
 
289
291
  actions, width, has_check = dc_actions_column()
290
- has_sub_menu = actions.size > 2 || (has_check && actions.size > 1)
292
+ has_sub_menu = actions.size > 2 #|| (has_check && actions.size > 1)
291
293
 
292
294
  main_menu, sub_menu = '', ''
293
295
  actions.sort_by(&:first).each do |num, action|
@@ -296,41 +298,48 @@ def dc_actions_for_result(document)
296
298
  # if single definition simulate type parameter
297
299
  yaml = action.class == String ? { 'type' => action } : action
298
300
 
301
+ next if @form['readonly'] && !%[show check].include?(yaml['type'])
302
+
299
303
  if %w(ajax link window popup submit).include?(yaml['type'])
300
304
  @record = document # otherwise document fields can't be used as parameters
301
305
  html = dc_link_ajax_window_submit_action(yaml, document)
302
306
  else
303
307
  caption = dc_get_caption(yaml) || "drgcms.#{yaml['type']}"
304
- title = t(yaml['help'] || caption, '')
308
+ title = t(yaml['title'] || yaml['help'] || caption)
305
309
  caption = has_sub_menu ? t(caption, '') : nil
306
- html = '<li>'
310
+ html = '<li>'
307
311
  html << case yaml['type']
308
- when 'check' then
312
+ when 'check'
309
313
  main_menu << '<li>' + check_box_tag("check-#{document.id}", false, false, { class: 'dc-check' }) + '</li>'
310
314
  next
311
315
 
312
- when 'edit' then
316
+ when 'edit'
313
317
  parms['action'] = 'edit'
314
318
  parms['id'] = document.id
315
- dc_link_to( caption, 'edit-o', parms, title: title )
319
+ parms['readonly'] = yaml['readonly']
320
+ icon = yaml['icon'] || 'edit-o'
321
+ dc_link_to( caption, icon, parms, title: title )
316
322
 
317
- when 'show' then
323
+ when 'show'
318
324
  parms['action'] = 'show'
319
325
  parms['id'] = document.id
320
326
  parms['readonly'] = true
321
- dc_link_to( caption, 'eye', parms, title: title )
327
+ icon = yaml['icon'] || 'eye-o'
328
+ dc_link_to( caption, icon, parms, title: title )
322
329
 
323
- when 'duplicate' then
330
+ when 'duplicate'
324
331
  parms['id'] = document.id
325
332
  # duplicate string will be added to these fields.
326
333
  parms['dup_fields'] = yaml['dup_fields']
327
334
  parms['action'] = 'create'
328
- dc_link_to( caption, 'content_copy-o', parms, data: { confirm: t('drgcms.confirm_dup') }, method: :post, title: title )
335
+ icon = yaml['icon'] || 'content_copy-o'
336
+ dc_link_to( caption, icon, parms, data: { confirm: t('drgcms.confirm_dup') }, method: :post, title: title )
329
337
 
330
- when 'delete' then
338
+ when 'delete'
331
339
  parms['action'] = 'destroy'
332
340
  parms['id'] = document.id
333
- dc_link_to( caption, 'delete-o', parms, data: { confirm: t('drgcms.confirm_delete') }, method: :delete, title: title )
341
+ icon = yaml['icon'] || 'delete-o'
342
+ dc_link_to( caption, icon, parms, data: { confirm: t('drgcms.confirm_delete') }, method: :delete, title: title )
334
343
 
335
344
  else # error.
336
345
  yaml['type'].to_s
@@ -362,7 +371,7 @@ end
362
371
  ############################################################################
363
372
  def dc_header_for_result
364
373
  html = '<div class="dc-result-header">'
365
- if @form['result_set']['actions'] && !@form['readonly']
374
+ if @form['result_set']['actions'] #&& !@form['readonly']
366
375
  ignore, width, has_check = dc_actions_column()
367
376
  check_all = fa_icon('check-box-o', class: 'dc-check-all') if has_check
368
377
  html << %(<div class="dc-result-actions" style="width:#{width}px;">#{check_all}</div>)
@@ -436,7 +445,7 @@ end
436
445
  ############################################################################
437
446
  # Formats value according to format supplied or data type. There is lots of things missing here.
438
447
  ############################################################################
439
- def dc_format_value(value, format=nil)
448
+ def dc_format_value(value, format = nil)
440
449
  return '' if value.nil?
441
450
 
442
451
  klass = value.class.to_s
@@ -444,7 +453,7 @@ def dc_format_value(value, format=nil)
444
453
 
445
454
  format = format.to_s.upcase
446
455
  if format[0] == 'N'
447
- return '' if value == 0 && format.match('Z')
456
+ return '' if format.match('Z') && value.to_s.to_f == 0.0
448
457
 
449
458
  format.gsub!('Z', '')
450
459
  dec = format[1].blank? ? nil : format[1].to_i
@@ -479,7 +488,7 @@ def dc_columns_for_result(document)
479
488
 
480
489
  # convert shortcut to hash
481
490
  v = {'name' => v} if v.class == String
482
- begin
491
+ #begin
483
492
  # as Array (footer)
484
493
  value = if document.class == Array
485
494
  dc_format_value(document[index], v['format']) if document[index]
@@ -491,17 +500,19 @@ def dc_columns_for_result(document)
491
500
  dc_process_column_eval(v, document)
492
501
  # as field
493
502
  elsif document.respond_to?(v['name'])
494
- dc_format_value(document.send( v['name'] ), v['format'])
503
+ dc_format_value(document.send(v['name']), v['format'])
504
+ elsif respond_to?(v['name'])
505
+ dc_format_value(send(v['name'], document), v['format'])
495
506
  else
496
507
  "??? #{v['name']}"
497
508
  end
498
- rescue Exception => e
499
- dc_log_exception(e, 'dc_columns_for_result')
500
- value = '!!!Error'
501
- end
509
+ #rescue Exception => e
510
+ # dc_log_exception(e, 'dc_columns_for_result')
511
+ # value = '!!!Error'
512
+ #end
502
513
  html << '<div class="spacer"></div>'
503
514
  # set class
504
- clas = dc_style_or_class(nil, v['td_class'], value, document)
515
+ clas = dc_style_or_class(nil, v['td_class'] || v['class'], value, document)
505
516
  # set width and align an additional style
506
517
  style = dc_style_or_class(nil, v['td_style'] || v['style'], value, document)
507
518
  flex_align = v['align'].to_s == 'right' ? 'flex-direction:row-reverse;' : ''
@@ -519,19 +530,17 @@ end
519
530
  # Ex. Will split dc_name4_value(one ,"two") => ['dc_name4_value', 'one', 'two']
520
531
  ############################################################################
521
532
  def dc_eval_to_array(expression)
522
- expression.split(/\ |\,|\(|\)/).delete_if {|e| e.blank? }.map {|e| e.gsub(/\'|\"/,'').strip }
533
+ expression.split(/\ |\,|\(|\)/).select(&:present?).map{ _1.gsub(/\'|\"/, '').strip }
523
534
  end
524
535
 
525
- private
526
-
527
536
  ############################################################################
528
537
  # Process eval. Breaks eval option and calls with send method.
529
538
  # Parameters:
530
539
  # evaluate : String : Expression to be evaluated
531
540
  # parameters : Array : array of parameters which will be send to method
532
541
  ############################################################################
533
- def dc_process_eval(evaluate, parameters)
534
- # evaluate by calling send method
542
+ def dc_process_eval(evaluate, parameters = nil)
543
+ # evaluate by calling send method
535
544
  clas, method = evaluate.split('.')
536
545
  if method.nil?
537
546
  send(clas, *parameters)
@@ -541,41 +550,49 @@ def dc_process_eval(evaluate, parameters)
541
550
  end
542
551
  end
543
552
 
553
+ private
554
+
544
555
  ############################################################################
545
- # Process eval option for field value.
556
+ # Process eval option for field value.
557
+ #
546
558
  # Used for processing single field column on result_set or form head.
547
559
  ############################################################################
560
+ #TODO make it universal without parameters complications
548
561
  def dc_process_column_eval(yaml, document)
549
- # dc_name_for_id
550
- if yaml['eval'].match(/dc_name4_id|dc_name_for_id/)
551
- parms = dc_eval_to_array(yaml['eval'])
552
- if parms.size == 3
553
- dc_name_for_id(parms[1], parms[2], nil, document[ yaml['name'] ])
554
- else
555
- dc_name_for_id(parms[1], parms[2], parms[3], document[ yaml['name'] ])
562
+ if yaml['params'].blank?
563
+ parms = dc_eval_to_array(yaml['eval'])
564
+ method = parms.shift
565
+
566
+ # prepare parameters for dc_name_for_* methods
567
+ method.sub!('dc_name4_', 'dc_name_for_') if method.match(/^dc_name4_/)
568
+ if method == 'dc_name_for_id' && parms.size == 2
569
+ parms << 'id'
556
570
  end
557
-
558
- # dc_name_for_value from locale definition
559
- elsif yaml['eval'].match(/dc_name4_value|dc_name_for_value/)
560
- parms = dc_eval_to_array(yaml['eval'])
561
- if parms.size == 1
562
- dc_name_for_value( @form['table'], yaml['name'], document[ yaml['name'] ] )
563
- else
564
- dc_name_for_value( parms[1], parms[2], document[ yaml['name'] ] )
571
+ if method == 'dc_name_for_value' && parms.size < 2
572
+ parms = [@form['table'], yaml['name']]
565
573
  end
566
574
 
567
- # defined in helpers. For example dc_icon_for_boolean
568
- elsif respond_to?(yaml['eval'])
569
- send(yaml['eval'], document, yaml['name'])
575
+ parms << document[yaml['name']]
576
+ parms.map!{ %w[record document].include?(_1.to_s) ? document : _1 }
577
+ case
578
+ when method.match(/^dc_/)
579
+ send(method, *parms)
570
580
 
571
- # defined in model
572
- elsif document.respond_to?(yaml['eval'])
573
- document.send(yaml['eval'])
581
+ when respond_to?(method)
582
+ parms = [document] + parms
583
+ send(method, *parms)
574
584
 
575
- # special eval
576
- elsif yaml['eval'].match('eval ')
577
- # TO DO evaluate with specified parameters
585
+ # model method
586
+ when document.respond_to?(method)
587
+ document.send(method)
578
588
 
589
+ # some class method
590
+ when method.match('.')
591
+ klass, method = method.split('.')
592
+ klass.classify.constantize.send(method, *parms)
593
+ else
594
+ '?????'
595
+ end
579
596
  # eval with params
580
597
  else
581
598
  parms = {}
@@ -594,7 +611,7 @@ end
594
611
  # Defines style or class for row (tr) or column (td)
595
612
  ############################################################################
596
613
  def dc_style_or_class(selector, yaml, value, record)
597
- return '' if yaml.nil?
614
+ return '' if yaml.blank?
598
615
 
599
616
  # alias record and value so both names can be used in eval
600
617
  field, document = value, record
@@ -662,4 +679,16 @@ def form_has_input_field?(field_name)
662
679
  !(field['type'] == 'readonly' || field['readonly'])
663
680
  end
664
681
 
682
+ ############################################################################
683
+ # return true if actions define check or show option
684
+ ############################################################################
685
+ def has_action_type(type, actions)
686
+ h = { 'check' => 0, 'show' => 1 }
687
+ return false unless identifier = h[type]
688
+ return false unless actions[identifier]
689
+
690
+ type_value = actions[identifier].class == String ? actions[identifier] : actions[identifier]['type']
691
+ type_value == type
692
+ end
693
+
665
694
  end