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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/drg_cms/drg_cms.js +110 -35
- data/app/assets/javascripts/drg_cms/jquery.bpopup.js +372 -0
- data/app/assets/javascripts/drg_cms_application.js +1 -1
- data/app/assets/javascripts/drg_cms_cms.js +1 -1
- data/app/assets/stylesheets/drg_cms/drg_cms.css +126 -36
- data/app/assets/stylesheets/drg_cms/select-multiple.css +6 -7
- data/app/controllers/cmsedit_controller.rb +78 -47
- data/app/controllers/dc_application_controller.rb +22 -25
- data/app/controllers/dc_common_controller.rb +9 -6
- data/app/controllers/dc_main_controller.rb +0 -1
- data/app/controls/{dc_category_control.rb → dc_gallery_control.rb} +15 -30
- data/app/controls/dc_image_control.rb +180 -0
- data/app/controls/dc_page_control.rb +3 -3
- data/app/controls/dc_poll_result_control.rb +38 -39
- data/app/controls/dc_report.rb +9 -4
- data/app/controls/dc_setup_control.rb +53 -0
- data/app/controls/design_element_settings_control.rb +88 -37
- data/app/forms/all_options.yml +20 -9
- data/app/forms/cms_menu.yml +14 -2
- data/app/forms/dc_gallery.yml +1 -1
- data/app/forms/dc_image.yml +122 -0
- data/app/forms/dc_image_search.yml +72 -0
- data/app/forms/dc_page.yml +11 -8
- data/app/forms/dc_poll.yml +2 -1
- data/app/forms/dc_poll_result.yml +10 -7
- data/app/forms/dc_setup.yml +45 -0
- data/app/forms/dc_steps_template.yml +6 -2
- data/app/helpers/cms_common_helper.rb +36 -24
- data/app/helpers/cms_edit_helper.rb +26 -33
- data/app/helpers/cms_helper.rb +29 -12
- data/app/helpers/cms_index_helper.rb +109 -80
- data/app/helpers/dc_application_helper.rb +108 -86
- data/app/helpers/dc_image_helper.rb +127 -0
- data/app/models/concerns/dc_policy_rule_concern.rb +1 -1
- data/app/models/concerns/dc_user_concern.rb +13 -5
- data/app/models/dc_big_table.rb +1 -1
- data/app/models/dc_category.rb +12 -0
- data/app/models/dc_design.rb +5 -4
- data/app/models/dc_filter.rb +24 -27
- data/app/models/dc_image.rb +237 -0
- data/app/models/dc_internals.rb +5 -9
- data/app/models/dc_memory.rb +2 -2
- data/app/models/dc_policy_role.rb +8 -8
- data/app/models/dc_setup.rb +111 -0
- data/app/models/drgcms_form_fields/datetime_picker.rb +1 -1
- data/app/models/drgcms_form_fields/drgcms_field.rb +9 -26
- data/app/models/drgcms_form_fields/embedded.rb +28 -17
- data/app/models/drgcms_form_fields/journal_diff.rb +2 -2
- data/app/models/drgcms_form_fields/multitext_autocomplete.rb +88 -76
- data/app/models/drgcms_form_fields/select.rb +41 -19
- data/app/models/drgcms_form_fields/text_with_select.rb +5 -9
- data/app/renderers/dc_big_menu_renderer.rb +18 -20
- data/app/renderers/dc_gallery_renderer.rb +10 -4
- data/app/renderers/dc_menu_renderer.rb +21 -58
- data/app/renderers/dc_page_renderer.rb +7 -7
- data/app/renderers/dc_poll_renderer.rb +13 -12
- data/app/renderers/dc_simple_menu_renderer.rb +1 -1
- data/app/views/cmsedit/_edit_stuff.html.erb +4 -1
- data/app/views/cmsedit/edit.html.erb +1 -1
- data/app/views/cmsedit/index.html.erb +1 -1
- data/app/views/cmsedit/new.html.erb +1 -0
- data/config/locales/drgcms_en.yml +22 -2
- data/config/locales/drgcms_sl.yml +25 -6
- data/config/locales/models_en.yml +50 -1
- data/config/locales/models_sl.yml +60 -1
- data/drg_cms.gemspec +1 -1
- data/lib/drg_cms/version.rb +1 -1
- data/lib/drg_cms.rb +40 -27
- data/lib/generators/convert_to_ar/USAGE +8 -0
- data/lib/generators/convert_to_ar/convert_to_ar_generator.rb +158 -0
- data/lib/generators/new_drg_form/new_drg_form_generator.rb +32 -14
- metadata +19 -10
- data/app/assets/javascripts/drg_cms/jquery.bpopup.min.js +0 -7
- 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
|
-
|
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
|
-
#
|
55
|
-
|
56
|
-
|
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
|
63
|
-
yaml
|
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
|
-
|
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 =
|
93
|
-
|
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
|
-
|
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 =
|
267
|
-
|
268
|
-
|
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?
|
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
|
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
|
310
|
+
html = '<li>'
|
307
311
|
html << case yaml['type']
|
308
|
-
when 'check'
|
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'
|
316
|
+
when 'edit'
|
313
317
|
parms['action'] = 'edit'
|
314
318
|
parms['id'] = document.id
|
315
|
-
|
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'
|
323
|
+
when 'show'
|
318
324
|
parms['action'] = 'show'
|
319
325
|
parms['id'] = document.id
|
320
326
|
parms['readonly'] = true
|
321
|
-
|
327
|
+
icon = yaml['icon'] || 'eye-o'
|
328
|
+
dc_link_to( caption, icon, parms, title: title )
|
322
329
|
|
323
|
-
when 'duplicate'
|
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
|
-
|
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'
|
338
|
+
when 'delete'
|
331
339
|
parms['action'] = 'destroy'
|
332
340
|
parms['id'] = document.id
|
333
|
-
|
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']
|
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
|
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(
|
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
|
-
|
500
|
-
|
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(/\ |\,|\(|\)/).
|
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
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
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
|
-
|
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
|
-
|
568
|
-
|
569
|
-
|
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
|
-
|
572
|
-
|
573
|
-
|
581
|
+
when respond_to?(method)
|
582
|
+
parms = [document] + parms
|
583
|
+
send(method, *parms)
|
574
584
|
|
575
|
-
|
576
|
-
|
577
|
-
|
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.
|
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
|