drg_cms 0.7.0.2 → 0.7.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/drg_cms/drg_cms.js +63 -18
- 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 +37 -5
- data/app/assets/stylesheets/drg_cms/select-multiple.css +2 -2
- data/app/controllers/cmsedit_controller.rb +22 -24
- data/app/controllers/dc_application_controller.rb +8 -8
- 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 +7 -8
- data/app/controls/dc_report.rb +9 -4
- data/app/controls/design_element_settings_control.rb +88 -37
- data/app/forms/all_options.yml +18 -7
- data/app/forms/cms_menu.yml +7 -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_steps_template.yml +2 -1
- data/app/helpers/cms_common_helper.rb +24 -16
- data/app/helpers/cms_edit_helper.rb +26 -33
- data/app/helpers/cms_helper.rb +21 -5
- data/app/helpers/cms_index_helper.rb +53 -38
- data/app/helpers/dc_application_helper.rb +64 -72
- 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 +12 -4
- data/app/models/dc_category.rb +12 -0
- data/app/models/dc_design.rb +5 -4
- data/app/models/dc_filter.rb +19 -18
- data/app/models/dc_image.rb +237 -0
- data/app/models/dc_internals.rb +5 -9
- data/app/models/dc_policy_role.rb +8 -8
- data/app/models/drgcms_form_fields/drgcms_field.rb +9 -26
- data/app/models/drgcms_form_fields/embedded.rb +11 -8
- data/app/models/drgcms_form_fields/journal_diff.rb +2 -2
- data/app/models/drgcms_form_fields/multitext_autocomplete.rb +51 -47
- data/app/models/drgcms_form_fields/select.rb +20 -14
- data/app/models/drgcms_form_fields/text_with_select.rb +5 -9
- data/app/renderers/dc_gallery_renderer.rb +10 -4
- data/app/renderers/dc_page_renderer.rb +7 -7
- data/app/renderers/dc_poll_renderer.rb +13 -12
- data/app/views/cmsedit/_edit_stuff.html.erb +1 -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 +14 -2
- data/config/locales/drgcms_sl.yml +13 -2
- data/config/locales/models_en.yml +33 -0
- data/config/locales/models_sl.yml +44 -1
- data/drg_cms.gemspec +1 -1
- data/lib/drg_cms/version.rb +1 -1
- data/lib/drg_cms.rb +19 -5
- data/lib/generators/convert_to_ar/USAGE +8 -0
- data/lib/generators/convert_to_ar/convert_to_ar_generator.rb +158 -0
- metadata +16 -10
- data/app/assets/javascripts/drg_cms/jquery.bpopup.min.js +0 -7
- data/app/views/layouts/__cmsedit.html.erb +0 -16
@@ -44,17 +44,11 @@ def dc_value_for_parameter(param, current_document = nil)#:nodoc:
|
|
44
44
|
end
|
45
45
|
|
46
46
|
############################################################################
|
47
|
-
#
|
48
|
-
#
|
49
|
-
#
|
50
|
-
# has value 2, back link will force readonly form. Value 1 or not set will result in
|
51
|
-
# normal link.
|
47
|
+
# Determine if action button on the form is active. Action will be greyed out otherwise.
|
48
|
+
#
|
49
|
+
# @return : Boolean : defined by 'active' option'. Default is True.
|
52
50
|
############################################################################
|
53
51
|
def dc_is_action_active?(options)
|
54
|
-
if options['when_new']
|
55
|
-
dc_deprecate("when_option will be deprecated and replaced by active: not_new_record! Form #{CmsHelper.form_param(params)}")
|
56
|
-
return !(dc_dont?(options['when_new']) && @record.new_record?)
|
57
|
-
end
|
58
52
|
return true unless options['active']
|
59
53
|
|
60
54
|
# alias record and document so both can be used in eval
|
@@ -322,25 +316,25 @@ def dc_head_for_form
|
|
322
316
|
caption = options['caption']
|
323
317
|
span = options['span'] || 1
|
324
318
|
@css << "\n#{options['css']}" unless options['css'].blank?
|
325
|
-
label
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
319
|
+
label = if caption.blank?
|
320
|
+
''
|
321
|
+
elsif options['name'] == caption
|
322
|
+
t_label_for_field(options['name'], options['name'].capitalize.gsub('_', ' ') )
|
323
|
+
else
|
324
|
+
t(caption, caption)
|
325
|
+
end
|
332
326
|
# Field value
|
333
327
|
begin
|
334
328
|
field = if options['eval']
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
329
|
+
dc_process_column_eval(options, @record)
|
330
|
+
else
|
331
|
+
dc_format_value(@record.send(options['name']), options['format'])
|
332
|
+
end
|
339
333
|
rescue Exception => e
|
340
334
|
dc_log_exception(e, 'dc_head_for_form')
|
341
335
|
field = '!!!Error'
|
342
336
|
end
|
343
|
-
|
337
|
+
|
344
338
|
klass = dc_style_or_class(nil, options['class'], field, @record)
|
345
339
|
style = dc_style_or_class(nil, options['style'], field, @record)
|
346
340
|
html << %(<div class="dc-column #{klass}" style="width:#{percent*span}%;#{style}">
|
@@ -487,18 +481,17 @@ def dc_input_form_create(fields_on_tab) #:nodoc:
|
|
487
481
|
</div> )
|
488
482
|
else
|
489
483
|
# no label
|
490
|
-
if dc_dont?(options['caption'])
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
help.gsub!('<br>',"\n") if help.present?
|
484
|
+
label_width, data_width = if dc_dont?(options['caption'])
|
485
|
+
label = ''
|
486
|
+
[0, 100]
|
487
|
+
elsif group_option == 1
|
488
|
+
[14, 85]
|
489
|
+
elsif group_option == 2
|
490
|
+
group_count == 2 ? [14, 21] : [10, 45]
|
491
|
+
elsif group_option == 3
|
492
|
+
group_count == 3 ? [14, 21] : [10, 21]
|
493
|
+
end
|
494
|
+
help.gsub!('<br>', "\n") if help.present?
|
502
495
|
%(
|
503
496
|
<div class="dc-form-label dc-color-#{odd_even} dc-align-#{labels_pos} dc-width-#{label_width}" title="#{help}">
|
504
497
|
<label for="record_#{options['name']}">#{label} </label>
|
data/app/helpers/cms_helper.rb
CHANGED
@@ -110,7 +110,7 @@ end
|
|
110
110
|
############################################################################
|
111
111
|
def dc_label_help(options)
|
112
112
|
# no label or help in comments
|
113
|
-
return [nil, nil] if %w
|
113
|
+
return [nil, nil] if %w[comment action].include?(options['type'])
|
114
114
|
|
115
115
|
label = options['caption'] || options['text'] || options['label']
|
116
116
|
if options['name']
|
@@ -122,8 +122,16 @@ def dc_label_help(options)
|
|
122
122
|
end
|
123
123
|
# help text can be defined in form or in translations starting with helpers. or as helpers.help.collection.field
|
124
124
|
help = options['help']
|
125
|
-
help
|
126
|
-
|
125
|
+
if help.blank?
|
126
|
+
help = if options['name']
|
127
|
+
# if defined as i18n_prefix replace "label" with "help"
|
128
|
+
prefix = @form['i18n_prefix'] ? @form['i18n_prefix'].sub('label', 'help') : "helpers.help.#{@form['table']}"
|
129
|
+
"#{prefix}.#{options['name']}"
|
130
|
+
end
|
131
|
+
help = help.to_s
|
132
|
+
end
|
133
|
+
help = t(help, ' ') if help.to_s.match(/help\./)
|
134
|
+
|
127
135
|
[label, help]
|
128
136
|
end
|
129
137
|
|
@@ -300,10 +308,18 @@ def dc_log_exception(exception, where = '')
|
|
300
308
|
end
|
301
309
|
|
302
310
|
############################################################################
|
303
|
-
# Will return form id
|
311
|
+
# Will return form id. id can be used for css selecting of fields on form.
|
312
|
+
# Form id is by default form_name || table parameter.
|
304
313
|
############################################################################
|
305
314
|
def dc_form_id
|
306
|
-
%(
|
315
|
+
%(id="#{CmsHelper.form_param(params) || CmsHelper.table_param(params)}" ).html_safe
|
316
|
+
end
|
317
|
+
|
318
|
+
############################################################################
|
319
|
+
# Will return class for form. Class can be used for different styling of forms.
|
320
|
+
############################################################################
|
321
|
+
def dc_form_class(additional_class = nil)
|
322
|
+
%(class="#{additional_class} #{@form['class']}" ).html_safe
|
307
323
|
end
|
308
324
|
|
309
325
|
############################################################################
|
@@ -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
|
@@ -263,9 +253,16 @@ def dc_actions_column
|
|
263
253
|
actions.delete('standard')
|
264
254
|
end
|
265
255
|
# check must be first action
|
266
|
-
has_check =
|
267
|
-
|
268
|
-
|
256
|
+
has_check = has_action_type('check', actions)
|
257
|
+
# when readonly only check and show are allowed
|
258
|
+
if @form['readonly']
|
259
|
+
width = has_action_type('show', actions) ? 22 : 0
|
260
|
+
width += 22 if has_check
|
261
|
+
else
|
262
|
+
width = actions.size == 1 ? 22 : 44
|
263
|
+
width = 22 if actions.size > 2 && !has_check
|
264
|
+
end
|
265
|
+
|
269
266
|
[actions, width, has_check]
|
270
267
|
end
|
271
268
|
|
@@ -275,7 +272,7 @@ end
|
|
275
272
|
def dc_actions_column_for_footer
|
276
273
|
return '' unless @form['result_set']['actions']
|
277
274
|
|
278
|
-
ignore, width, ignore2 = dc_actions_column
|
275
|
+
ignore, width, ignore2 = dc_actions_column()
|
279
276
|
%(<div class="dc-result-actions" style="width: #{width}px;"></div>).html_safe
|
280
277
|
end
|
281
278
|
|
@@ -284,10 +281,10 @@ end
|
|
284
281
|
############################################################################
|
285
282
|
def dc_actions_for_result(document)
|
286
283
|
actions = @form['result_set']['actions']
|
287
|
-
return '' if actions.nil?
|
284
|
+
return '' if actions.nil? #|| @form['readonly']
|
288
285
|
|
289
286
|
actions, width, has_check = dc_actions_column()
|
290
|
-
has_sub_menu = actions.size > 2
|
287
|
+
has_sub_menu = actions.size > 2 #|| (has_check && actions.size > 1)
|
291
288
|
|
292
289
|
main_menu, sub_menu = '', ''
|
293
290
|
actions.sort_by(&:first).each do |num, action|
|
@@ -296,14 +293,16 @@ def dc_actions_for_result(document)
|
|
296
293
|
# if single definition simulate type parameter
|
297
294
|
yaml = action.class == String ? { 'type' => action } : action
|
298
295
|
|
296
|
+
next if @form['readonly'] && !%[show check].include?(yaml['type'])
|
297
|
+
|
299
298
|
if %w(ajax link window popup submit).include?(yaml['type'])
|
300
299
|
@record = document # otherwise document fields can't be used as parameters
|
301
300
|
html = dc_link_ajax_window_submit_action(yaml, document)
|
302
301
|
else
|
303
302
|
caption = dc_get_caption(yaml) || "drgcms.#{yaml['type']}"
|
304
|
-
title = t(yaml['help'] || caption
|
303
|
+
title = t(yaml['title'] || yaml['help'] || caption)
|
305
304
|
caption = has_sub_menu ? t(caption, '') : nil
|
306
|
-
html
|
305
|
+
html = '<li>'
|
307
306
|
html << case yaml['type']
|
308
307
|
when 'check' then
|
309
308
|
main_menu << '<li>' + check_box_tag("check-#{document.id}", false, false, { class: 'dc-check' }) + '</li>'
|
@@ -312,13 +311,15 @@ def dc_actions_for_result(document)
|
|
312
311
|
when 'edit' then
|
313
312
|
parms['action'] = 'edit'
|
314
313
|
parms['id'] = document.id
|
314
|
+
parms['readonly'] = yaml['readonly']
|
315
315
|
dc_link_to( caption, 'edit-o', parms, title: title )
|
316
316
|
|
317
317
|
when 'show' then
|
318
318
|
parms['action'] = 'show'
|
319
319
|
parms['id'] = document.id
|
320
320
|
parms['readonly'] = true
|
321
|
-
|
321
|
+
icon = yaml['icon'] || 'eye-o'
|
322
|
+
dc_link_to( caption, icon, parms, title: title )
|
322
323
|
|
323
324
|
when 'duplicate' then
|
324
325
|
parms['id'] = document.id
|
@@ -362,7 +363,7 @@ end
|
|
362
363
|
############################################################################
|
363
364
|
def dc_header_for_result
|
364
365
|
html = '<div class="dc-result-header">'
|
365
|
-
if @form['result_set']['actions']
|
366
|
+
if @form['result_set']['actions'] #&& !@form['readonly']
|
366
367
|
ignore, width, has_check = dc_actions_column()
|
367
368
|
check_all = fa_icon('check-box-o', class: 'dc-check-all') if has_check
|
368
369
|
html << %(<div class="dc-result-actions" style="width:#{width}px;">#{check_all}</div>)
|
@@ -436,7 +437,7 @@ end
|
|
436
437
|
############################################################################
|
437
438
|
# Formats value according to format supplied or data type. There is lots of things missing here.
|
438
439
|
############################################################################
|
439
|
-
def dc_format_value(value, format=nil)
|
440
|
+
def dc_format_value(value, format = nil)
|
440
441
|
return '' if value.nil?
|
441
442
|
|
442
443
|
klass = value.class.to_s
|
@@ -444,7 +445,7 @@ def dc_format_value(value, format=nil)
|
|
444
445
|
|
445
446
|
format = format.to_s.upcase
|
446
447
|
if format[0] == 'N'
|
447
|
-
return '' if
|
448
|
+
return '' if format.match('Z') && value.to_s.to_f == 0.0
|
448
449
|
|
449
450
|
format.gsub!('Z', '')
|
450
451
|
dec = format[1].blank? ? nil : format[1].to_i
|
@@ -491,7 +492,9 @@ def dc_columns_for_result(document)
|
|
491
492
|
dc_process_column_eval(v, document)
|
492
493
|
# as field
|
493
494
|
elsif document.respond_to?(v['name'])
|
494
|
-
dc_format_value(document.send(
|
495
|
+
dc_format_value(document.send(v['name']), v['format'])
|
496
|
+
elsif respond_to?(v['name'])
|
497
|
+
dc_format_value(send(v['name'], document), v['format'])
|
495
498
|
else
|
496
499
|
"??? #{v['name']}"
|
497
500
|
end
|
@@ -501,7 +504,7 @@ def dc_columns_for_result(document)
|
|
501
504
|
end
|
502
505
|
html << '<div class="spacer"></div>'
|
503
506
|
# set class
|
504
|
-
clas = dc_style_or_class(nil, v['td_class'], value, document)
|
507
|
+
clas = dc_style_or_class(nil, v['td_class'] || v['class'], value, document)
|
505
508
|
# set width and align an additional style
|
506
509
|
style = dc_style_or_class(nil, v['td_style'] || v['style'], value, document)
|
507
510
|
flex_align = v['align'].to_s == 'right' ? 'flex-direction:row-reverse;' : ''
|
@@ -522,15 +525,13 @@ def dc_eval_to_array(expression)
|
|
522
525
|
expression.split(/\ |\,|\(|\)/).delete_if {|e| e.blank? }.map {|e| e.gsub(/\'|\"/,'').strip }
|
523
526
|
end
|
524
527
|
|
525
|
-
private
|
526
|
-
|
527
528
|
############################################################################
|
528
529
|
# Process eval. Breaks eval option and calls with send method.
|
529
530
|
# Parameters:
|
530
531
|
# evaluate : String : Expression to be evaluated
|
531
532
|
# parameters : Array : array of parameters which will be send to method
|
532
533
|
############################################################################
|
533
|
-
def dc_process_eval(evaluate, parameters)
|
534
|
+
def dc_process_eval(evaluate, parameters = nil)
|
534
535
|
# evaluate by calling send method
|
535
536
|
clas, method = evaluate.split('.')
|
536
537
|
if method.nil?
|
@@ -541,6 +542,8 @@ def dc_process_eval(evaluate, parameters)
|
|
541
542
|
end
|
542
543
|
end
|
543
544
|
|
545
|
+
private
|
546
|
+
|
544
547
|
############################################################################
|
545
548
|
# Process eval option for field value.
|
546
549
|
# Used for processing single field column on result_set or form head.
|
@@ -594,7 +597,7 @@ end
|
|
594
597
|
# Defines style or class for row (tr) or column (td)
|
595
598
|
############################################################################
|
596
599
|
def dc_style_or_class(selector, yaml, value, record)
|
597
|
-
return '' if yaml.
|
600
|
+
return '' if yaml.blank?
|
598
601
|
|
599
602
|
# alias record and value so both names can be used in eval
|
600
603
|
field, document = value, record
|
@@ -662,4 +665,16 @@ def form_has_input_field?(field_name)
|
|
662
665
|
!(field['type'] == 'readonly' || field['readonly'])
|
663
666
|
end
|
664
667
|
|
668
|
+
############################################################################
|
669
|
+
# return true if actions define check or show option
|
670
|
+
############################################################################
|
671
|
+
def has_action_type(type, actions)
|
672
|
+
h = { 'check' => 0, 'show' => 1 }
|
673
|
+
return false unless identifier = h[type]
|
674
|
+
return false unless actions[identifier]
|
675
|
+
|
676
|
+
type_value = actions[identifier].class == String ? actions[identifier] : actions[identifier]['type']
|
677
|
+
type_value == type
|
678
|
+
end
|
679
|
+
|
665
680
|
end
|
@@ -260,7 +260,7 @@ def dc_table_title(text, result_set = nil)
|
|
260
260
|
c = %(<div class="dc-title">#{text})
|
261
261
|
c << dc_help_button(result_set)
|
262
262
|
|
263
|
-
if result_set
|
263
|
+
if result_set&.respond_to?(:current_page)
|
264
264
|
c << %(<div class="dc-paginate">#{paginate(result_set, :params => {action: 'index', clear: 'no', filter: nil})}</div>)
|
265
265
|
end
|
266
266
|
c << '<div style="clear: both;"></div></div>'
|
@@ -268,26 +268,27 @@ def dc_table_title(text, result_set = nil)
|
|
268
268
|
end
|
269
269
|
|
270
270
|
############################################################################
|
271
|
-
# Creates title for cmsedit edit action dialog.
|
272
|
-
#
|
271
|
+
# Creates title for cmsedit edit action dialog.
|
272
|
+
#
|
273
273
|
# Returns:
|
274
274
|
# String. HTML code for title.
|
275
275
|
############################################################################
|
276
276
|
def dc_edit_title
|
277
277
|
session[:form_processing] = "form:title:"
|
278
|
-
|
278
|
+
title_data = @form['form']['title']
|
279
|
+
if title_data.class == String
|
280
|
+
t(title_data, title_data)
|
279
281
|
# defined as form:title:edit
|
280
|
-
|
281
|
-
t(
|
282
|
-
elsif
|
283
|
-
t(
|
282
|
+
elsif title_data&.dig('edit') && !@form['readonly']
|
283
|
+
t( title_data['edit'], title_data['edit'] )
|
284
|
+
elsif title_data&.dig('show') && @form['readonly']
|
285
|
+
t( title_data['show'], title_data['show'] )
|
284
286
|
else
|
285
|
-
# concatenate title
|
286
287
|
c = (@form['readonly'] ? t('drgcms.show') : t('drgcms.edit')) + " : "
|
287
288
|
c << (@form['title'].class == String ? t( @form['title'], @form['title'] ) : t_tablename(@form['table']))
|
288
|
-
|
289
|
-
|
290
|
-
c << "#{@record[
|
289
|
+
# add description field value to title
|
290
|
+
field_name = title_data['field'] if title_data
|
291
|
+
c << " : #{@record[ field_name ]}" if field_name && @record.respond_to?(field_name)
|
291
292
|
c
|
292
293
|
end
|
293
294
|
end
|
@@ -300,14 +301,18 @@ end
|
|
300
301
|
############################################################################
|
301
302
|
def dc_new_title
|
302
303
|
session[:form_processing] = "form:title:"
|
303
|
-
|
304
|
+
title_data = @form['form']['title']
|
305
|
+
if title_data.class == String
|
306
|
+
t(title_data, title_data)
|
304
307
|
# defined as form:title:new
|
305
|
-
|
306
|
-
t(
|
308
|
+
elsif title_data&.dig('new')
|
309
|
+
t( title_data['new'], title_data['new'] )
|
307
310
|
else
|
308
311
|
# in memory structures
|
309
312
|
if @form['table'] == 'dc_memory'
|
310
|
-
t( @form['title'], @form['title'] )
|
313
|
+
return t( @form['title'], @form['title'] ) if @form['title']
|
314
|
+
|
315
|
+
t("#{@form['i18n_prefix']}.tabletitle", '')
|
311
316
|
else
|
312
317
|
"#{t('drgcms.new')} : #{t_tablename(@form['table'])}"
|
313
318
|
end
|
@@ -684,51 +689,40 @@ end
|
|
684
689
|
############################################################################
|
685
690
|
# Returns list of all collections (tables) as array of choices for usage in select fields.
|
686
691
|
# List is collected from cms_menu.yml files and may not include all collections used in application.
|
687
|
-
# Currently list is only used for helping defining collection names on dc_permission form.
|
688
|
-
#
|
692
|
+
# Currently list is only used for helping defining collection names on dc_permission form.
|
693
|
+
#
|
689
694
|
# Example (as used in forms):
|
690
695
|
# form:
|
691
696
|
# fields:
|
692
697
|
# 10:
|
693
698
|
# name: table_name
|
694
699
|
# type: text_with_select
|
695
|
-
# eval: dc_choices4_all_collections
|
700
|
+
# eval: dc_choices4_all_collections
|
696
701
|
############################################################################
|
697
702
|
def dc_choices4_all_collections
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
menu = YAML.load_file(filename) rescue nil # load menu
|
704
|
-
next if menu.nil? or !menu['menu'] # not menu or error
|
705
|
-
menu['menu'].each do |section|
|
706
|
-
next unless section.last['items'] # next if no items
|
707
|
-
section.last['items'].each do |k, v| # look for caption and
|
708
|
-
key = v['table']
|
709
|
-
choices[key] ||= "#{key} - #{t(v['caption'], v['caption'])}"
|
710
|
-
end
|
711
|
-
end
|
712
|
-
end
|
713
|
-
choices.invert.to_a.sort # hash has to be inverted for values to be returned right
|
703
|
+
models = Mongoid.models.map(&:to_s).uniq.map(&:underscore).delete_if { |e| e.match('/') }
|
704
|
+
models.sort.inject([]) do |r, model_name|
|
705
|
+
r << ["#{model_name} - #{t("helpers.label.#{model_name}.tabletitle", '')}", model_name]
|
706
|
+
end
|
714
707
|
end
|
715
708
|
|
716
709
|
##########################################################################
|
717
|
-
#
|
710
|
+
# Code for top CMS menu.
|
718
711
|
##########################################################################
|
719
|
-
def
|
712
|
+
def dc_cms_menu
|
720
713
|
menus = {}
|
721
714
|
DrgCms.paths(:forms).reverse.each do |path|
|
722
715
|
filename = "#{path}/cms_menu.yml"
|
723
|
-
next
|
724
|
-
|
725
|
-
|
726
|
-
menus = CmsHelper.forms_merge(menu['menu'], menus)
|
727
|
-
|
716
|
+
next if !File.exist?(filename)
|
717
|
+
|
718
|
+
menu = YAML.load_file(filename) rescue nil # load menu
|
719
|
+
menus = CmsHelper.forms_merge(menu['menu'], menus) if menu.dig('menu') # merge menus
|
720
|
+
end
|
728
721
|
|
729
722
|
html = '<ul>'
|
730
723
|
menus.to_a.sort.each do |index, menu| # sort menus, result is array of sorted hashes
|
731
724
|
next unless menu['caption']
|
725
|
+
|
732
726
|
icon = menu['icon'].match('/') ? image_tag(menu['icon']) : fa_icon(menu['icon']) #external or fa- image
|
733
727
|
html << %(<li class="cmsedit-top-level-menu"><div>#{icon}#{t(menu['caption'])}</div><ul>)
|
734
728
|
menu['items'].to_a.sort.each do |index1, value| # again, sort menu items first
|
@@ -736,19 +730,18 @@ def dc_choices4_cmsmenu
|
|
736
730
|
opts = { target: value['target'] || 'iframe_cms' }
|
737
731
|
"<li>#{dc_link_to(t(value['caption']), value['icon'] || '', value['link'], opts)}</li>"
|
738
732
|
else
|
739
|
-
opts =
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
|
745
|
-
}
|
733
|
+
opts = { controller: value['controller'], action: value['action'],
|
734
|
+
table: value['table'], form_name: value['form_name'] || value['table'],
|
735
|
+
target: value['target'] || 'iframe_cms',
|
736
|
+
}
|
737
|
+
# additional parameters
|
738
|
+
value['params'].each { |k, v| opts[k] = dc_value_for_parameter(v) } if value['params']
|
746
739
|
"<li>#{dc_link_to(t(value['caption']), value['icon'] || '', opts)}</li>"
|
747
740
|
end
|
748
741
|
end
|
749
742
|
html << '</ul></li>'
|
750
743
|
end
|
751
|
-
html
|
744
|
+
html.html_safe
|
752
745
|
end
|
753
746
|
|
754
747
|
############################################################################
|
@@ -760,7 +753,7 @@ def dc_choices4_folders_list
|
|
760
753
|
home = File.join(public,dc_get_site.files_directory)
|
761
754
|
choices = Dir.glob(home + '/**/*/').select { |fn| File.directory?(fn) }
|
762
755
|
choices << home # add home
|
763
|
-
choices.collect! {|e| e.gsub(public,'')} # remove public part
|
756
|
+
choices.collect! { |e| e.gsub(public,'') } # remove public part
|
764
757
|
choices.sort
|
765
758
|
end
|
766
759
|
|
@@ -782,7 +775,7 @@ end
|
|
782
775
|
# type: select
|
783
776
|
# eval: dc_choices4('dc_poll','name','_id')
|
784
777
|
############################################################################
|
785
|
-
def dc_choices4(model, name, id='_id', options = {})
|
778
|
+
def dc_choices4(model, name, id = '_id', options = {})
|
786
779
|
model = model.classify.constantize
|
787
780
|
qry = model.only(id, name)
|
788
781
|
if (param = options[:site])
|
@@ -792,8 +785,6 @@ def dc_choices4(model, name, id='_id', options = {})
|
|
792
785
|
end
|
793
786
|
qry = qry.and(active: true) if model.method_defined?(:active)
|
794
787
|
qry = qry.order_by(name => 1).collation(locale: I18n.locale.to_s)
|
795
|
-
#choices = qry.inject([]) {|result,e| result << [ e[name], e[id] ]}
|
796
|
-
#choices.sort_alphabetical_by(&:first) # use UTF-8 sort
|
797
788
|
qry.map { |e| [e[name], e[id]] }
|
798
789
|
end
|
799
790
|
|
@@ -1073,25 +1064,25 @@ end
|
|
1073
1064
|
########################################################################
|
1074
1065
|
def dc_internal_var(object, var_name, current_document = nil)
|
1075
1066
|
begin
|
1076
|
-
case
|
1077
|
-
when
|
1078
|
-
when
|
1079
|
-
when
|
1080
|
-
when
|
1081
|
-
when
|
1067
|
+
case object
|
1068
|
+
when 'session' then _origin.session[var_name]
|
1069
|
+
when 'params' then _origin.params[var_name]
|
1070
|
+
when 'site' then _origin.dc_get_site.send(var_name)
|
1071
|
+
when 'page' then _origin.page.send(var_name)
|
1072
|
+
when 'record' then
|
1082
1073
|
current_document ? current_document.send(var_name) : _origin.record.send(var_name)
|
1083
|
-
when
|
1074
|
+
when 'class' then
|
1084
1075
|
clas, method_name = var_name.split('.')
|
1085
1076
|
klas = clas.classify.constantize
|
1086
1077
|
# call method. Error will be caught below.
|
1087
1078
|
klas.send(method_name)
|
1088
1079
|
else
|
1089
|
-
'
|
1080
|
+
'dc_internal: UNKNOWN OBJECT'
|
1090
1081
|
end
|
1091
1082
|
rescue Exception => e
|
1092
1083
|
Rails.logger.debug "\ndc_internal_var. Runtime error. #{e.message}\n"
|
1093
1084
|
Rails.logger.debug(e.backtrace.join($/)) if Rails.env.development?
|
1094
|
-
'
|
1085
|
+
'dc_internal: ERROR'
|
1095
1086
|
end
|
1096
1087
|
end
|
1097
1088
|
|
@@ -1122,11 +1113,10 @@ end
|
|
1122
1113
|
def dc_get_json_ld()
|
1123
1114
|
return '' if @json_ld.nil? or @json_ld.size == 0
|
1124
1115
|
|
1125
|
-
%
|
1116
|
+
%(
|
1126
1117
|
<script type="application/ld+json">
|
1127
1118
|
#{JSON.pretty_generate({'@context' => 'http://schema.org', '@graph' => @json_ld})}
|
1128
|
-
</script>
|
1129
|
-
].html_safe
|
1119
|
+
</script>).html_safe
|
1130
1120
|
end
|
1131
1121
|
|
1132
1122
|
########################################################################
|
@@ -1150,12 +1140,12 @@ end
|
|
1150
1140
|
# Returns:
|
1151
1141
|
# HTML data to be embedded into page header
|
1152
1142
|
#######################################################################
|
1153
|
-
def dc_get_seo_meta_tags
|
1143
|
+
def dc_get_seo_meta_tags
|
1154
1144
|
html = ''
|
1155
|
-
html <<
|
1145
|
+
html << %(<link rel="canonical" href="#{@page.canonical_link}">\n ) if @page&.canonical_link.present?
|
1156
1146
|
|
1157
1147
|
html << @meta_tags.inject('') do |r, hash|
|
1158
|
-
r <<
|
1148
|
+
r << %(<meta #{hash.first} content="#{hash.last}">\n )
|
1159
1149
|
end if @meta_tags
|
1160
1150
|
html.html_safe
|
1161
1151
|
end
|
@@ -1170,6 +1160,7 @@ end
|
|
1170
1160
|
########################################################################
|
1171
1161
|
def dc_add_meta_tag(type, name, content)
|
1172
1162
|
return if content.blank?
|
1163
|
+
|
1173
1164
|
@meta_tags ||= {}
|
1174
1165
|
key = "#{type}=\"#{name}\""
|
1175
1166
|
@meta_tags[key] = content
|
@@ -1188,7 +1179,7 @@ end
|
|
1188
1179
|
# [String] alt="image-tag"
|
1189
1180
|
#######################################################################
|
1190
1181
|
def dc_img_alt_tag(file_name, text=nil)
|
1191
|
-
|
1182
|
+
%( alt="#{dc_img_alt(file_name, text)}" ).html_safe
|
1192
1183
|
end
|
1193
1184
|
|
1194
1185
|
#######################################################################
|
@@ -1204,9 +1195,10 @@ end
|
|
1204
1195
|
# [String] alt_image_name
|
1205
1196
|
#######################################################################
|
1206
1197
|
def dc_img_alt(file_name, text=nil)
|
1207
|
-
return text
|
1198
|
+
return text if text.present?
|
1199
|
+
|
1208
1200
|
name = File.basename(file_name.to_s)
|
1209
|
-
name[0,name.index('.')].downcase rescue name
|
1201
|
+
name[0, name.index('.')].downcase rescue name
|
1210
1202
|
end
|
1211
1203
|
|
1212
1204
|
private
|