drg_cms 0.7.0.2 → 0.7.1.1

Sign up to get free protection for your applications and to get access to all the features.
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