drg_cms 0.5.52.12 → 0.6.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/app/assets/javascripts/drg_cms/drg_cms.js +395 -120
- data/app/assets/javascripts/drg_cms/jstree.min.js +6 -6
- data/app/assets/javascripts/drg_cms_application.js +1 -1
- data/app/assets/stylesheets/drg_cms/drg_cms.css +476 -215
- data/app/assets/stylesheets/drg_cms/jstree.css +6 -12
- data/app/assets/stylesheets/drg_cms/select-multiple.css +19 -13
- data/app/assets/stylesheets/drg_cms_cms.css +1 -1
- data/app/controllers/cmsedit_controller.rb +474 -233
- data/app/controllers/dc_application_controller.rb +264 -41
- data/app/controllers/dc_common_controller.rb +75 -63
- data/app/{controllers → controls}/browse_models_control.rb +0 -0
- data/app/{controllers → controls}/dc_page_control.rb +24 -8
- data/app/controls/dc_poll_result_control.rb +88 -0
- data/app/controls/dc_report.rb +227 -0
- data/app/{controllers → controls}/design_element_settings_control.rb +0 -0
- data/app/forms/all_options.yml +70 -12
- data/app/forms/cms_menu.yml +26 -17
- data/app/forms/dc_ad.yml +11 -22
- data/app/forms/dc_big_table.yml +1 -0
- data/app/forms/dc_big_table_value.yml +1 -0
- data/app/forms/dc_design.yml +19 -16
- data/app/forms/dc_filter.yml +3 -6
- data/app/forms/dc_gallery.yml +53 -0
- data/app/forms/dc_json_ld.yml +59 -0
- data/app/forms/dc_key_value.yml +32 -0
- data/app/forms/dc_link.yml +16 -10
- data/app/forms/dc_menu_item.yml +6 -0
- data/app/forms/dc_page.yml +2 -7
- data/app/forms/dc_poll.yml +16 -9
- data/app/forms/dc_poll_item.yml +2 -1
- data/app/forms/dc_poll_result.yml +83 -0
- data/app/forms/dc_poll_result_export.yml +35 -0
- data/app/forms/dc_removed_url.yml +42 -0
- data/app/forms/dc_seo.yml +33 -0
- data/app/forms/dc_site.yml +2 -6
- data/app/forms/json_ld_schema.yml +168 -0
- data/app/helpers/cms_common_helper.rb +311 -0
- data/app/helpers/cms_edit_helper.rb +498 -0
- data/app/helpers/cms_helper.rb +230 -0
- data/app/helpers/cms_index_helper.rb +564 -0
- data/app/helpers/dc_application_helper.rb +195 -268
- data/app/models/{dc_dummy.rb → __dc_dummy.rb} +0 -0
- data/app/models/concerns/dc_page_concern.rb +31 -6
- data/app/models/concerns/dc_seo_concern.rb +66 -0
- data/app/models/concerns/dc_site_concern.rb +12 -1
- data/app/models/concerns/dc_user_concern.rb +5 -3
- data/app/models/dc_design.rb +2 -0
- data/app/models/dc_filter.rb +37 -20
- data/app/models/dc_gallery.rb +64 -0
- data/app/models/dc_json_ld.rb +152 -0
- data/app/models/dc_key_value.rb +48 -0
- data/app/models/dc_link.rb +1 -0
- data/app/models/dc_memory.rb +26 -4
- data/app/models/dc_page.rb +1 -2
- data/app/models/dc_permission.rb +30 -0
- data/app/models/dc_poll.rb +39 -19
- data/app/models/dc_poll_result.rb +46 -0
- data/app/models/dc_removed_url.rb +54 -0
- data/app/models/dc_temp.rb +140 -0
- data/app/models/drgcms_form_fields.rb +6 -1642
- data/app/models/drgcms_form_fields/action.rb +61 -0
- data/app/models/drgcms_form_fields/check_box.rb +72 -0
- data/app/models/drgcms_form_fields/comment.rb +53 -0
- data/app/models/drgcms_form_fields/date_picker.rb +104 -0
- data/app/models/drgcms_form_fields/date_select.rb +68 -0
- data/app/models/drgcms_form_fields/datetime_picker.rb +89 -0
- data/app/models/drgcms_form_fields/datetime_select.rb +73 -0
- data/app/models/drgcms_form_fields/drgcms_field.rb +287 -0
- data/app/models/drgcms_form_fields/embedded.rb +97 -0
- data/app/models/drgcms_form_fields/file_field.rb +52 -0
- data/app/models/drgcms_form_fields/file_select.rb +70 -0
- data/app/models/drgcms_form_fields/hash_field.rb +86 -0
- data/app/models/drgcms_form_fields/hidden_field.rb +52 -0
- data/app/models/drgcms_form_fields/html_field.rb +70 -0
- data/app/models/drgcms_form_fields/journal_diff.rb +60 -0
- data/app/models/drgcms_form_fields/link_to.rb +69 -0
- data/app/models/drgcms_form_fields/method.rb +65 -0
- data/app/models/drgcms_form_fields/multitext_autocomplete.rb +204 -0
- data/app/models/drgcms_form_fields/number_field.rb +92 -0
- data/app/models/drgcms_form_fields/password_field.rb +62 -0
- data/app/models/drgcms_form_fields/radio.rb +96 -0
- data/app/models/drgcms_form_fields/readonly.rb +79 -0
- data/app/models/drgcms_form_fields/select.rb +226 -0
- data/app/models/drgcms_form_fields/submit_tag.rb +58 -0
- data/app/models/drgcms_form_fields/text_area.rb +68 -0
- data/app/models/drgcms_form_fields/text_autocomplete.rb +155 -0
- data/app/models/drgcms_form_fields/text_field.rb +56 -0
- data/app/models/drgcms_form_fields/text_with_select.rb +95 -0
- data/app/models/drgcms_form_fields/tree_select.rb +169 -0
- data/app/{helpers → renderers}/dc_ad_renderer.rb +0 -0
- data/app/{helpers → renderers}/dc_big_menu_renderer.rb +1 -0
- data/app/{helpers → renderers}/dc_captcha_renderer.rb +0 -0
- data/app/{helpers → renderers}/dc_common_renderer.rb +0 -0
- data/app/renderers/dc_gallery_renderer.rb +95 -0
- data/app/{helpers → renderers}/dc_menu_renderer.rb +11 -4
- data/app/{helpers → renderers}/dc_page_renderer.rb +21 -3
- data/app/{helpers → renderers}/dc_part_renderer.rb +5 -4
- data/app/{helpers → renderers}/dc_piece_renderer.rb +1 -1
- data/app/{helpers → renderers}/dc_poll_renderer.rb +86 -51
- data/app/{helpers → renderers}/dc_renderer.rb +1 -0
- data/app/{helpers → renderers}/dc_simple_menu_renderer.rb +1 -0
- data/app/views/cmsedit/{remove_edit_stuff.js.erb → __remove_edit_stuff.js.erb} +0 -0
- data/app/views/cmsedit/{show.html.erb → __show.html.erb} +0 -0
- data/app/views/cmsedit/_edit_stuff.html.erb +4 -25
- data/app/views/cmsedit/_form.html.erb +4 -3
- data/app/views/cmsedit/_result.html.erb +2 -3
- data/app/views/cmsedit/edit.html.erb +2 -1
- data/app/views/cmsedit/index.html.erb +6 -1
- data/app/views/cmsedit/new.html.erb +1 -1
- data/config/locales/drgcms_en.yml +15 -3
- data/config/locales/drgcms_sl.yml +18 -6
- data/config/locales/models_en.yml +103 -19
- data/config/locales/models_sl.yml +102 -17
- data/drg_cms.gemspec +3 -3
- data/lib/drg_cms.rb +6 -2
- data/lib/drg_cms/version.rb +2 -2
- data/lib/generators/new_drg_form/new_drg_form_generator.rb +9 -2
- data/lib/tasks/database.rake +6 -56
- data/lib/tasks/dc_cleanup.rake +1 -1
- metadata +106 -61
- data/app/assets/stylesheets/drg_cms/__jquery-ui.css +0 -339
- data/app/helpers/application_helper.rb +0 -2
- data/app/helpers/cmsedit_helper.rb +0 -844
- data/test/fixtures/drg_cms_test_data.rb +0 -87
@@ -54,8 +54,12 @@ attr_reader :part
|
|
54
54
|
attr_accessor :page_title
|
55
55
|
# all parts read from page, design, ...
|
56
56
|
attr_accessor :parts
|
57
|
-
|
57
|
+
#
|
58
|
+
attr_accessor :record
|
59
|
+
#
|
58
60
|
attr_accessor :record_footer
|
61
|
+
# json_ld
|
62
|
+
attr_reader :json_ld
|
59
63
|
|
60
64
|
############################################################################
|
61
65
|
# When @parent is present then helper methods are called from parent class otherwise
|
@@ -94,6 +98,7 @@ def dc_render(renderer, opts={})
|
|
94
98
|
#
|
95
99
|
opts[:edit_mode] = session[:edit_mode]
|
96
100
|
opts[:editparams] = {}
|
101
|
+
|
97
102
|
opts = @options.merge(opts) # merge options with parameters passed on site, page, design ...
|
98
103
|
opts.symbolize_keys! # this makes lots of things easier
|
99
104
|
# Create renderer object
|
@@ -256,7 +261,7 @@ end
|
|
256
261
|
def dc_table_title(text, result_set=nil)
|
257
262
|
c = %Q[<div class="dc-title">#{text}]
|
258
263
|
if result_set and result_set.respond_to?(:current_page)
|
259
|
-
c << %Q[<div class="dc-paginate">#{paginate(result_set, :params => {:
|
264
|
+
c << %Q[<div class="dc-paginate">#{paginate(result_set, :params => {action: 'index', clear: 'no', filter: nil})}</div>]
|
260
265
|
end
|
261
266
|
c << '<div style="clear: both;"></div></div>'
|
262
267
|
c.html_safe
|
@@ -269,6 +274,7 @@ end
|
|
269
274
|
# String. HTML code for title.
|
270
275
|
############################################################################
|
271
276
|
def dc_edit_title()
|
277
|
+
session[:form_processing] = "form:title:"
|
272
278
|
title = @form['form']['title']
|
273
279
|
# defined as form:title:edit
|
274
280
|
if title and title['edit'] and !@form['readonly']
|
@@ -283,7 +289,7 @@ def dc_edit_title()
|
|
283
289
|
dc_deprecate('form:edit_title will be deprecated. Use form:title:field instead.') if @form['form']['edit_title']
|
284
290
|
#
|
285
291
|
c << "#{@record[ title ]} : " if title and @record.respond_to?(title)
|
286
|
-
c << @record.
|
292
|
+
c << @record.id if @record
|
287
293
|
end
|
288
294
|
c
|
289
295
|
end
|
@@ -295,6 +301,7 @@ end
|
|
295
301
|
# String. HTML code for title.
|
296
302
|
############################################################################
|
297
303
|
def dc_new_title()
|
304
|
+
session[:form_processing] = "form:title:"
|
298
305
|
title = @form['form']['title']
|
299
306
|
# defined as form:title:new
|
300
307
|
if title and title['new']
|
@@ -345,8 +352,24 @@ def dc_submit_tag(caption, icon, parms, rest={})
|
|
345
352
|
end
|
346
353
|
end
|
347
354
|
html = icon_image || ''
|
348
|
-
html << submit_tag(t(caption, caption), parms)
|
355
|
+
#html << submit_tag(t(caption, caption), parms)
|
356
|
+
%Q[<button type="submit" class="dc-submit" name="commit" value="#{t(caption, caption)}">#{icon_image} #{t(caption, caption)}</button>].html_safe
|
357
|
+
end
|
358
|
+
|
359
|
+
############################################################################
|
360
|
+
# Returns icon code if icon is specified
|
361
|
+
############################################################################
|
362
|
+
def dc_icon_for_link(icon)
|
363
|
+
return nil unless icon
|
364
|
+
if icon.match(/\./)
|
365
|
+
_origin.image_tag(icon, class: 'dc-link-img dc-animate')
|
366
|
+
elsif icon.match('<i')
|
367
|
+
icon
|
368
|
+
else
|
369
|
+
_origin.fa_icon(icon)
|
370
|
+
end
|
349
371
|
end
|
372
|
+
|
350
373
|
############################################################################
|
351
374
|
# Similar to rails link_to, but also takes care of link icon, translation, ...
|
352
375
|
############################################################################
|
@@ -355,22 +378,13 @@ def dc_link_to(caption, icon, parms, rest={})
|
|
355
378
|
if parms.class == Hash
|
356
379
|
parms.stringify_keys!
|
357
380
|
rest.stringify_keys!
|
358
|
-
rest['class'] = rest['class'].to_s + ' dc-animate'
|
381
|
+
rest['class'] = rest['class'].to_s + ' dc-animate' unless rest['class'].to_s.match('dc-animate')
|
359
382
|
rest['target'] ||= parms.delete('target')
|
360
383
|
parms['controller'] ||= 'cmsedit'
|
361
384
|
icon_pos = parms.delete('icon_pos') || 'first'
|
362
385
|
end
|
363
386
|
#
|
364
|
-
|
365
|
-
icon_image = if icon.match(/\./)
|
366
|
-
_origin.image_tag(icon, class: 'dc-link-img dc-animate')
|
367
|
-
elsif icon.match('<i')
|
368
|
-
icon
|
369
|
-
else
|
370
|
-
_origin.fa_icon(icon)
|
371
|
-
end
|
372
|
-
end
|
373
|
-
#
|
387
|
+
icon_image = dc_icon_for_link(icon)
|
374
388
|
if caption
|
375
389
|
caption = t(caption, caption)
|
376
390
|
icon_image << ' ' if icon_image
|
@@ -387,23 +401,31 @@ end
|
|
387
401
|
# String. HTML code formatted for display.
|
388
402
|
####################################################################
|
389
403
|
def dc_flash_messages()
|
390
|
-
err
|
391
|
-
war
|
392
|
-
inf
|
393
|
-
note
|
404
|
+
err = _origin.flash[:error]
|
405
|
+
war = _origin.flash[:warning]
|
406
|
+
inf = _origin.flash[:info]
|
407
|
+
note = _origin.flash[:note]
|
408
|
+
html = ''
|
394
409
|
unless err.nil? and war.nil? and inf.nil? and note.nil?
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
c << note if note
|
410
|
+
html << "<div class=\"dc-form-error\">#{err}</div>" if err
|
411
|
+
html << "<div class=\"dc-form-warning\">#{war}</div>" if war
|
412
|
+
html << "<div class=\"dc-form-info\">#{inf}</div>" if inf
|
413
|
+
html << note if note
|
400
414
|
_origin.flash[:error] = nil
|
401
415
|
_origin.flash[:warning] = nil
|
402
416
|
_origin.flash[:info] = nil
|
403
417
|
_origin.flash[:note] = nil
|
404
|
-
|
405
|
-
c.html_safe
|
406
418
|
end
|
419
|
+
# Update fields on the form
|
420
|
+
if _origin.flash[:update]
|
421
|
+
html << "<div class=\"dc-form-updates\">\n"
|
422
|
+
_origin.flash[:update].each do |field, value|
|
423
|
+
html << %Q[<div data-field="#{field}" data-value="#{value}"></div>\n]
|
424
|
+
end
|
425
|
+
html << '</div>'
|
426
|
+
_origin.flash[:update] = nil
|
427
|
+
end
|
428
|
+
html.html_safe
|
407
429
|
end
|
408
430
|
|
409
431
|
########################################################################
|
@@ -440,7 +462,7 @@ end
|
|
440
462
|
# String. HTML code formatted for display.
|
441
463
|
####################################################################
|
442
464
|
def dc_error_messages_for(doc)
|
443
|
-
return '' unless doc.errors.any?
|
465
|
+
return '' unless doc and doc.errors.any?
|
444
466
|
msgs = ''
|
445
467
|
doc.errors.each do |attribute, errors_array|
|
446
468
|
label = t("helpers.label.#{decamelize_type(doc.class)}.#{attribute}", attribute)
|
@@ -527,13 +549,15 @@ end
|
|
527
549
|
# Create edit link with edit picture. Subroutine of dc_page_edit_menu.
|
528
550
|
####################################################################
|
529
551
|
def dc_link_menu_tag(title) #:nodoc:
|
530
|
-
html
|
531
|
-
|
552
|
+
html = %Q[
|
553
|
+
<dl>
|
532
554
|
<dt><div class='drgcms_popmenu' href="#">
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
555
|
+
#{_origin.fa_icon('file-text-o lg', class: 'dc-inline-link', title: title)}
|
556
|
+
</div></dt>
|
557
|
+
<dd>
|
558
|
+
<ul class=' div-hidden drgcms_popmenu_class'>
|
559
|
+
]
|
560
|
+
|
537
561
|
yield html
|
538
562
|
html << "</ul></dd></dl>"
|
539
563
|
end
|
@@ -571,7 +595,7 @@ def dc_page_edit_menu(opts=@opts)
|
|
571
595
|
return '' if opts[:edit_mode] < 2
|
572
596
|
# save some data to cookie. This can not go to session.
|
573
597
|
page = opts[:page] || @page
|
574
|
-
table = _origin.site.
|
598
|
+
table = _origin.site.page_class.underscore
|
575
599
|
kukis = { "#{table}.dc_design_id" => page.dc_design_id,
|
576
600
|
# "#{table}.menu_id" => page.menu_id,
|
577
601
|
"#{table}.kats" => page.kats,
|
@@ -583,7 +607,7 @@ def dc_page_edit_menu(opts=@opts)
|
|
583
607
|
opts[:editparams] ||= {}
|
584
608
|
dc_link_menu_tag(title) do |html|
|
585
609
|
opts[:editparams].merge!( controller: 'cmsedit', action: 'edit', 'icon' => 'edit' )
|
586
|
-
opts[:editparams].merge!( :id => page.id, :table => _origin.site.
|
610
|
+
opts[:editparams].merge!( :id => page.id, :table => _origin.site.page_class.underscore, form_name: opts[:form_name], edit_only: 'body' )
|
587
611
|
html << dc_link_for_edit1( opts[:editparams], t('drgcms.edit_content') )
|
588
612
|
|
589
613
|
# opts[:editparams][:edit_only] = nil
|
@@ -595,7 +619,7 @@ def dc_page_edit_menu(opts=@opts)
|
|
595
619
|
html << dc_link_for_edit1( opts[:editparams], t('drgcms.edit_new_page') )
|
596
620
|
|
597
621
|
opts[:editparams].merge!(ids: page.id, form_name: 'dc_part', 'icon' => 'plus-square-o',
|
598
|
-
table: "#{_origin.site.
|
622
|
+
table: "#{_origin.site.page_class.underscore};dc_part" )
|
599
623
|
html << dc_link_for_edit1( opts[:editparams], t('drgcms.edit_new_part') )
|
600
624
|
end.html_safe
|
601
625
|
end
|
@@ -614,7 +638,7 @@ end
|
|
614
638
|
########################################################################
|
615
639
|
def dc_page_class()
|
616
640
|
# dc_get_site.page_class.classify.constantize
|
617
|
-
dc_get_site.
|
641
|
+
dc_get_site.page_klass
|
618
642
|
end
|
619
643
|
|
620
644
|
########################################################################
|
@@ -632,225 +656,6 @@ def dc_menu_class()
|
|
632
656
|
dc_get_site.menu_class.classify.constantize
|
633
657
|
end
|
634
658
|
|
635
|
-
|
636
|
-
####################################################################
|
637
|
-
# Wrapper for i18 t method, with some spice added. If translation is not found English
|
638
|
-
# translation value will be returned. And if still not found default value will be returned if passed.
|
639
|
-
#
|
640
|
-
# Parameters:
|
641
|
-
# [key] String. String to be translated into locale.
|
642
|
-
# [default] String. Value returned if translation is not found.
|
643
|
-
#
|
644
|
-
# Example:
|
645
|
-
# t('translate.this','Enter text for ....')
|
646
|
-
#
|
647
|
-
# Returns:
|
648
|
-
# String. Translated text.
|
649
|
-
####################################################################
|
650
|
-
def t(key, default=nil)
|
651
|
-
c = I18n.t(key)
|
652
|
-
if c.class == Hash or c.match( 'translation missing' )
|
653
|
-
c = I18n.t(key, locale: 'en')
|
654
|
-
# Still not found. Return default if set
|
655
|
-
if c.class == Hash or c.match( 'translation missing' )
|
656
|
-
c = default.nil? ? key : default
|
657
|
-
end
|
658
|
-
end
|
659
|
-
c
|
660
|
-
end
|
661
|
-
|
662
|
-
####################################################################
|
663
|
-
# Returns table (collection) name translation for usage in dialog title. Tablename
|
664
|
-
# title is provided by helpers.label.table_name.tabletitle locale.
|
665
|
-
#
|
666
|
-
# Parameters:
|
667
|
-
# [tablename] String. Table (collection) name to be translated.
|
668
|
-
# [default] String. Value returned if translation is not found.
|
669
|
-
#
|
670
|
-
# Returns:
|
671
|
-
# String. Translated text.
|
672
|
-
####################################################################
|
673
|
-
def t_tablename(tablename, default=nil)
|
674
|
-
t('helpers.label.' + tablename + '.tabletitle', default || tablename)
|
675
|
-
end
|
676
|
-
|
677
|
-
############################################################################
|
678
|
-
# Returns label for field translated to current locale for usage on data entry form.
|
679
|
-
# Translation is provided by lang.helpers.label.table_name.field_name locale. If
|
680
|
-
# translation is not found method will capitalize field_name and replace '_' with ' '.
|
681
|
-
############################################################################
|
682
|
-
def t_name(field_name, default='')
|
683
|
-
c = t("helpers.label.#{@form['table']}.#{field_name}", default)
|
684
|
-
c = field_name.capitalize.gsub('_',' ') if c.match( 'translation missing' )
|
685
|
-
c
|
686
|
-
end
|
687
|
-
|
688
|
-
############################################################################
|
689
|
-
# When select field is used on form options for select can be provided by
|
690
|
-
# helpers.label.table_name.choices4_name locale. This is how select
|
691
|
-
# field options are translated. Method returns selected choice translated
|
692
|
-
# to current locale.
|
693
|
-
#
|
694
|
-
# Parameters:
|
695
|
-
# [model] String. Table (collection) model name (lowercase).
|
696
|
-
# [field] String. Field name used.
|
697
|
-
# [value] String. Value of field which translation will be returned.
|
698
|
-
#
|
699
|
-
# Example:
|
700
|
-
# # usage in program. Choice values for state are 'Deactivated:0,Active:1,Waiting:2'
|
701
|
-
# dc_name4_value('dc_user', 'state', @record.active )
|
702
|
-
#
|
703
|
-
# # usage in form
|
704
|
-
# columns:
|
705
|
-
# 2:
|
706
|
-
# name: state
|
707
|
-
# eval: dc_name4_value dc_user, state
|
708
|
-
#
|
709
|
-
# Returns:
|
710
|
-
# String. Descriptive text (translated) for selected choice value.
|
711
|
-
############################################################################
|
712
|
-
def dc_name4_value(model, field, value)
|
713
|
-
return '' if value.nil?
|
714
|
-
c = t('helpers.label.' + model + '.choices4_' + field )
|
715
|
-
a = c.chomp.split(',').inject([]) {|r,v| r << v.split(':') }
|
716
|
-
a.each {|e| return e.first if e.last.to_s == value.to_s }
|
717
|
-
''
|
718
|
-
end
|
719
|
-
|
720
|
-
############################################################################
|
721
|
-
# Return choices for field in model if choices are defined in localization text.
|
722
|
-
#
|
723
|
-
# Parameters:
|
724
|
-
# [model] String. Table (collection) model name (lowercase).
|
725
|
-
# [field] String. Field name used.
|
726
|
-
#
|
727
|
-
# Example:
|
728
|
-
# dc_choices4_field('dc_user', 'state' )
|
729
|
-
#
|
730
|
-
# Returns:
|
731
|
-
# Array. Choices for select input field
|
732
|
-
############################################################################
|
733
|
-
def dc_choices4_field(model, field)
|
734
|
-
c = t('helpers.label.' + model + '.choices4_' + field )
|
735
|
-
return ['error'] if c.match( 'translation missing' )
|
736
|
-
c.chomp.split(',').inject([]) {|r,v| r << v.split(':') }
|
737
|
-
end
|
738
|
-
|
739
|
-
############################################################################
|
740
|
-
# Will return descriptive text for id key when field in one table (collection) has belongs_to
|
741
|
-
# relation to other table.
|
742
|
-
#
|
743
|
-
# Parameters:
|
744
|
-
# [model] String. Table (collection) model name (lowercase).
|
745
|
-
# [field] String. Field name holding the value of descriptive text.
|
746
|
-
# [field_name] String. ID field name. This is by default id, but can be any other
|
747
|
-
# (preferred unique) field.
|
748
|
-
# [value] Value of id_field. Usually a BSON Key but can be any other data type.
|
749
|
-
#
|
750
|
-
# Example:
|
751
|
-
# # usage in program.
|
752
|
-
# dc_name4_id('dc_user', 'name', nil, dc_page.created_by)
|
753
|
-
#
|
754
|
-
# # usage in form
|
755
|
-
# columns:
|
756
|
-
# 2:
|
757
|
-
# name: site_id
|
758
|
-
# eval: dc_name4_id,site,name
|
759
|
-
# # username is saved to document instead of user.id field
|
760
|
-
# 5:
|
761
|
-
# name: user
|
762
|
-
# eval: dc_name4_id,dc_user,name,username
|
763
|
-
#
|
764
|
-
# Returns:
|
765
|
-
# String. Name (descriptive value) for specified key in table.
|
766
|
-
############################################################################
|
767
|
-
def dc_name4_id(model, field, field_name, id=nil)
|
768
|
-
return '' if id.nil?
|
769
|
-
field_name ||= 'id'
|
770
|
-
model = model.strip.classify.constantize if model.class == String
|
771
|
-
rec = Mongoid::QueryCache.cache { model.find_by(field_name.strip.to_sym => id) }
|
772
|
-
rec.nil? ? '' : (rec.send(field) rescue 'not defined')
|
773
|
-
end
|
774
|
-
|
775
|
-
############################################################################
|
776
|
-
# Return html code for icon presenting boolean value. Icon is a picture of checked or unchecked box.
|
777
|
-
#
|
778
|
-
# Parameters:
|
779
|
-
# [value] Boolean.
|
780
|
-
#
|
781
|
-
# Example:
|
782
|
-
# # usage from program
|
783
|
-
# dc_icon4_boolean(some_value)
|
784
|
-
#
|
785
|
-
# # usage from form description
|
786
|
-
# columns:
|
787
|
-
# 10:
|
788
|
-
# name: active
|
789
|
-
# eval: dc_icon4_boolean
|
790
|
-
############################################################################
|
791
|
-
def dc_icon4_boolean(value)
|
792
|
-
dc_dont?(value, true) ? fa_icon('square-o lg') : fa_icon('check-square-o lg')
|
793
|
-
end
|
794
|
-
|
795
|
-
############################################################################
|
796
|
-
# Returns html code for displaying date/time formatted by strftime. Will return '' if value is nil.
|
797
|
-
#
|
798
|
-
# Parameters:
|
799
|
-
# [value] Date/DateTime/Time.
|
800
|
-
# [format] String. strftime format mask. Defaults to locale's default format.
|
801
|
-
############################################################################
|
802
|
-
def dc_format_date_time(value, format=nil)
|
803
|
-
return '' if value.nil?
|
804
|
-
format ||= value.class == Date ? t('date.formats.default') : t('time.formats.default')
|
805
|
-
value.strftime(format)
|
806
|
-
end
|
807
|
-
|
808
|
-
####################################################################
|
809
|
-
#
|
810
|
-
####################################################################
|
811
|
-
def dc_date_time(value, format) #:nodoc:
|
812
|
-
dc_deprecate 'dc_date_time will be deprecated! Use dc_format_date_time instead.'
|
813
|
-
dc_format_date_time(value, format)
|
814
|
-
end
|
815
|
-
|
816
|
-
############################################################################
|
817
|
-
# Returns html code for displaying formatted number.
|
818
|
-
#
|
819
|
-
# Parameters:
|
820
|
-
# [value] Numeric number.
|
821
|
-
# [decimals] Integer. Number of decimals
|
822
|
-
# [separator] String. Decimals separator
|
823
|
-
# [delimiter] String. Thousands delimiter.
|
824
|
-
# [currency] String. Currency symbol if applied to result string.
|
825
|
-
############################################################################
|
826
|
-
def dc_format_number(value=0, decimals=nil, separator=nil, delimiter=nil, currency=nil)
|
827
|
-
decimals ||= I18n.t('number.currency.format.precision')
|
828
|
-
separator ||= I18n.t('number.currency.format.separator')
|
829
|
-
separator = '' if decimals == 0
|
830
|
-
delimiter ||= I18n.t('number.currency.format.delimiter')
|
831
|
-
whole,dec = value.to_s.split('.')
|
832
|
-
whole = '0' if whole.blank?
|
833
|
-
# remove and remember sign
|
834
|
-
sign = whole[0,1]
|
835
|
-
if sign == '-'
|
836
|
-
whole = whole[1,20]
|
837
|
-
else
|
838
|
-
sign = ''
|
839
|
-
end
|
840
|
-
# format decimals
|
841
|
-
dec ||= '0'
|
842
|
-
dec = dec[0,decimals]
|
843
|
-
while dec.size < decimals do dec += '0' end
|
844
|
-
# slice whole on chunks of 3
|
845
|
-
ar = []
|
846
|
-
while whole.size > 0 do
|
847
|
-
n = whole.size >=3 ? 3 : whole.size
|
848
|
-
ar << whole.slice!(n*-1,n)
|
849
|
-
end
|
850
|
-
# put it all back and format
|
851
|
-
"#{sign}#{ar.reverse.join(delimiter)}#{separator}#{dec}"
|
852
|
-
end
|
853
|
-
|
854
659
|
####################################################################
|
855
660
|
# Parse site name from url and return dc_site document. Site document will be cached in
|
856
661
|
# @site variable.
|
@@ -1025,9 +830,6 @@ def dc_choices4(model, name, id='_id', options = {})
|
|
1025
830
|
qry = qry.in(dc_site_id: sites) if sites
|
1026
831
|
end
|
1027
832
|
qry = qry.and(active: true) if model.method_defined?(:active)
|
1028
|
-
# qry = qry.sort(name => 1)
|
1029
|
-
# choices = []
|
1030
|
-
# qry.each {|v| choices << [ v[name], v[id] ] }
|
1031
833
|
choices = qry.inject([]) {|result,e| result << [ e[name], e[id] ]}
|
1032
834
|
choices.sort_alphabetical_by(&:first) # use UTF-8 sort
|
1033
835
|
end
|
@@ -1176,7 +978,8 @@ end
|
|
1176
978
|
####################################################################
|
1177
979
|
def dc_dont?(what, default=false)
|
1178
980
|
return default if what.nil?
|
1179
|
-
|
981
|
+
|
982
|
+
%w(0 n - no none false).include?(what.to_s.downcase.strip)
|
1180
983
|
end
|
1181
984
|
|
1182
985
|
############################################################################
|
@@ -1284,14 +1087,17 @@ end
|
|
1284
1087
|
# This objects can be params, session, ...
|
1285
1088
|
#
|
1286
1089
|
# Parameters:
|
1287
|
-
# [object] String: Internal object holding variable. Current values can be session, params, site, page
|
1090
|
+
# [object] String: Internal object holding variable. Current values can be session, params, site, page, class
|
1288
1091
|
# [var_name] String[symbol]: Variable name (:user_name, 'user_id', ...)
|
1289
1092
|
#
|
1290
1093
|
# Example:
|
1291
|
-
# # called when
|
1292
|
-
# dc_internal_var(session, :user_id)
|
1293
|
-
# dc_internal_var(params, :some_external_parameter)
|
1294
|
-
# dc_internal_var(site, :name)
|
1094
|
+
# # called when constructing iframe for display
|
1095
|
+
# dc_internal_var('session', :user_id)
|
1096
|
+
# dc_internal_var('params', :some_external_parameter)
|
1097
|
+
# dc_internal_var('site', :name)
|
1098
|
+
# # or even
|
1099
|
+
# dc_internal_var('class', 'ClassName.class_method_name')
|
1100
|
+
#
|
1295
1101
|
#
|
1296
1102
|
# Returns:
|
1297
1103
|
# Value of variable or nil when not found
|
@@ -1303,13 +1109,134 @@ def dc_internal_var(object, var_name)
|
|
1303
1109
|
when object == 'params' then _origin.params[var_name]
|
1304
1110
|
when object == 'site' then _origin.dc_get_site.send(var_name)
|
1305
1111
|
when object == 'page' then _origin.page.send(var_name)
|
1306
|
-
|
1307
|
-
|
1112
|
+
when object == 'record' then _origin.record.send(var_name)
|
1113
|
+
when object == 'class' then
|
1114
|
+
clas, method_name = var_name.split('.')
|
1115
|
+
klas = clas.classify.constantize
|
1116
|
+
# call method. Error will be cought below.
|
1117
|
+
klas.send(method_name)
|
1118
|
+
else
|
1119
|
+
'VARIABLE: UNKNOWN OBJECT'
|
1308
1120
|
end
|
1309
1121
|
rescue Exception => e
|
1310
|
-
|
1122
|
+
logger.error "Method dc_internal_var. Runtime error. #{e.message}"
|
1311
1123
|
'VARIABLE: ERROR'
|
1312
1124
|
end
|
1313
1125
|
end
|
1314
1126
|
|
1127
|
+
########################################################################
|
1128
|
+
# Will return whole path to document if document is embedded in another document.
|
1129
|
+
#
|
1130
|
+
# Parameters:
|
1131
|
+
# [document] Object: Document object
|
1132
|
+
#
|
1133
|
+
# Returns:
|
1134
|
+
# String of ID-s separated by semicolon.
|
1135
|
+
#######################################################################
|
1136
|
+
def dc_document_path(document)
|
1137
|
+
path, parent = [document.id], document._parent
|
1138
|
+
while parent
|
1139
|
+
path << parent.id
|
1140
|
+
parent = parent._parent
|
1141
|
+
end
|
1142
|
+
path.reverse.join(';')
|
1143
|
+
end
|
1144
|
+
|
1145
|
+
########################################################################
|
1146
|
+
# Will return formated code for embedding json+ld data into page
|
1147
|
+
#
|
1148
|
+
# Returns:
|
1149
|
+
# HTML data to be embedded into page header
|
1150
|
+
#######################################################################
|
1151
|
+
def dc_get_json_ld()
|
1152
|
+
return '' if @json_ld.nil? or @json_ld.size == 0
|
1153
|
+
|
1154
|
+
%Q[
|
1155
|
+
<script type="application/ld+json">
|
1156
|
+
#{JSON.pretty_generate({'@context' => 'http://schema.org', '@graph' => @json_ld})}
|
1157
|
+
</script>
|
1158
|
+
].html_safe
|
1159
|
+
end
|
1160
|
+
|
1161
|
+
########################################################################
|
1162
|
+
# Will add new element to json_ld structure
|
1163
|
+
#
|
1164
|
+
# Parameters:
|
1165
|
+
# [element] Hash or Array of hashes: json+ld element
|
1166
|
+
#######################################################################
|
1167
|
+
def dc_add_json_ld(element)
|
1168
|
+
@json_ld ||= []
|
1169
|
+
if element.class == Array
|
1170
|
+
@json_ld += element
|
1171
|
+
else
|
1172
|
+
@json_ld << element
|
1173
|
+
end
|
1174
|
+
end
|
1175
|
+
|
1176
|
+
########################################################################
|
1177
|
+
# Will return meta data for SEO optimizations
|
1178
|
+
#
|
1179
|
+
# Returns:
|
1180
|
+
# HTML data to be embedded into page header
|
1181
|
+
#######################################################################
|
1182
|
+
def dc_get_seo_meta_tags()
|
1183
|
+
html = ''
|
1184
|
+
html << "<link rel=\"canonical\" href=\"#{@page.canonical_link}\">\n " unless @page&.canonical_link.blank?
|
1185
|
+
|
1186
|
+
html << @meta_tags.inject('') do |r, hash|
|
1187
|
+
r << "<meta #{hash.first} content=\"#{hash.last}\">\n "
|
1188
|
+
end if @meta_tags
|
1189
|
+
html.html_safe
|
1190
|
+
end
|
1191
|
+
|
1192
|
+
########################################################################
|
1193
|
+
# Will add a meta tag to internal hash structure. If meta tag already exists it
|
1194
|
+
# will be overwritten.
|
1195
|
+
#
|
1196
|
+
# Parameters:
|
1197
|
+
# [name] String: meta name
|
1198
|
+
# [content] String: meta content
|
1199
|
+
########################################################################
|
1200
|
+
def dc_add_meta_tag(type, name, content)
|
1201
|
+
return if content.blank?
|
1202
|
+
@meta_tags ||= {}
|
1203
|
+
key = "#{type}=\"#{name}\""
|
1204
|
+
@meta_tags[key] = content
|
1205
|
+
end
|
1206
|
+
|
1207
|
+
#######################################################################
|
1208
|
+
# Will return alt image option when text is provided. When text is blank
|
1209
|
+
# it will extract alt name from picture file_name. This method returns
|
1210
|
+
# together with alt="image-tag" tag.
|
1211
|
+
#
|
1212
|
+
# Parameters:
|
1213
|
+
# [file_name] String: Filename of a picture
|
1214
|
+
# [text] String: Alt text name
|
1215
|
+
#
|
1216
|
+
# Returns:
|
1217
|
+
# [String] alt="image-tag"
|
1218
|
+
#######################################################################
|
1219
|
+
def dc_img_alt_tag(file_name, text=nil)
|
1220
|
+
" alt=\"#{dc_img_alt(file_name, text)}\" ".html_safe
|
1221
|
+
end
|
1222
|
+
|
1223
|
+
#######################################################################
|
1224
|
+
# Will return alt image option when text is provided. When text is blank
|
1225
|
+
# it will extract alt name from picture file_name. This method returns just
|
1226
|
+
# alt name.
|
1227
|
+
#
|
1228
|
+
# Parameters:
|
1229
|
+
# [file_name] String: Filename of a picture
|
1230
|
+
# [text] String: Alt text name
|
1231
|
+
#
|
1232
|
+
# Returns:
|
1233
|
+
# [String] alt_image_name
|
1234
|
+
#######################################################################
|
1235
|
+
def dc_img_alt(file_name, text=nil)
|
1236
|
+
return text unless text.blank?
|
1237
|
+
name = File.basename(file_name.to_s)
|
1238
|
+
name[0,name.index('.')].downcase rescue name
|
1239
|
+
end
|
1240
|
+
|
1241
|
+
|
1315
1242
|
end
|