drg_cms 0.5.52.16 → 0.6.1.0
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 +446 -144
- 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 +625 -243
- data/app/assets/stylesheets/drg_cms/jstree.css +6 -12
- data/app/assets/stylesheets/drg_cms/select-multiple.css +18 -12
- data/app/assets/stylesheets/drg_cms_cms.css +1 -1
- data/app/controllers/cmsedit_controller.rb +536 -331
- data/app/controllers/dc_application_controller.rb +380 -117
- data/app/controllers/dc_common_controller.rb +105 -14
- data/app/{controllers → controls}/browse_models_control.rb +0 -0
- data/app/controls/dc_help_control.rb +126 -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 +225 -0
- data/app/{controllers → controls}/design_element_settings_control.rb +0 -0
- data/app/forms/all_options.yml +50 -9
- data/app/forms/cms_menu.yml +28 -18
- 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_category.yml +2 -1
- data/app/forms/dc_design.yml +20 -16
- data/app/forms/dc_filter.yml +3 -6
- data/app/forms/dc_help_1.yml +109 -0
- data/app/forms/dc_journal.yml +3 -1
- data/app/forms/dc_json_ld.yml +59 -0
- data/app/forms/dc_key_value.yml +32 -0
- data/app/forms/dc_link.yml +1 -1
- data/app/forms/dc_menu.yml +2 -0
- data/app/forms/dc_menu_item.yml +2 -0
- data/app/forms/dc_page.yml +3 -5
- data/app/forms/dc_part.yml +1 -0
- data/app/forms/dc_piece.yml +1 -0
- data/app/forms/dc_poll.yml +19 -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_seo.yml +33 -0
- data/app/forms/dc_simple_menu.yml +2 -0
- data/app/forms/dc_site.yml +4 -12
- data/app/forms/dc_user.yml +27 -11
- data/app/forms/dc_user_role.yml +3 -0
- data/app/forms/json_ld_schema.yml +168 -0
- data/app/helpers/cms_common_helper.rb +376 -0
- data/app/helpers/cms_edit_helper.rb +506 -0
- data/app/helpers/cms_helper.rb +268 -0
- data/app/helpers/cms_index_helper.rb +576 -0
- data/app/helpers/dc_application_helper.rb +183 -271
- data/app/models/concerns/dc_page_concern.rb +40 -6
- data/app/models/concerns/dc_policy_rule_concern.rb +20 -8
- data/app/models/concerns/dc_seo_concern.rb +66 -0
- data/app/models/concerns/dc_site_concern.rb +67 -44
- data/app/models/concerns/dc_user_concern.rb +62 -21
- data/app/models/dc_design.rb +30 -18
- data/app/models/dc_filter.rb +22 -13
- data/app/models/dc_json_ld.rb +152 -0
- data/app/models/dc_key_value.rb +48 -0
- data/app/models/dc_key_value_store.rb +1 -0
- data/app/models/dc_memory.rb +8 -1
- data/app/models/dc_page.rb +0 -1
- data/app/models/dc_permission.rb +49 -9
- data/app/models/dc_policy.rb +25 -14
- data/app/models/dc_policy_role.rb +22 -11
- data/app/models/dc_poll.rb +39 -19
- data/app/models/{drgcms_form_fields/drgcms_form_fields.rb → dc_poll_result.rb} +23 -2
- data/app/models/dc_temp.rb +140 -0
- data/app/models/dc_user_role.rb +2 -2
- data/app/models/drgcms_form_fields.rb +14 -6
- data/app/models/drgcms_form_fields/action.rb +61 -0
- data/app/models/drgcms_form_fields/check_box.rb +3 -0
- data/app/models/drgcms_form_fields/comment.rb +8 -4
- data/app/models/drgcms_form_fields/date_picker.rb +11 -9
- data/app/models/drgcms_form_fields/date_select.rb +1 -1
- data/app/models/drgcms_form_fields/{date_time_picker.rb → datetime_picker.rb} +12 -10
- data/app/models/drgcms_form_fields/datetime_select.rb +1 -1
- data/app/models/drgcms_form_fields/drgcms_field.rb +55 -9
- data/app/models/drgcms_form_fields/embedded.rb +26 -16
- data/app/models/drgcms_form_fields/file_field.rb +52 -0
- data/app/models/drgcms_form_fields/file_select.rb +2 -2
- data/app/models/drgcms_form_fields/hash_field.rb +90 -0
- data/app/models/drgcms_form_fields/hidden_field.rb +1 -1
- data/app/models/drgcms_form_fields/html_field.rb +1 -1
- data/app/models/drgcms_form_fields/link_to.rb +2 -2
- data/app/models/drgcms_form_fields/method.rb +66 -0
- data/app/models/drgcms_form_fields/multitext_autocomplete.rb +23 -14
- data/app/models/drgcms_form_fields/number_field.rb +15 -6
- data/app/models/drgcms_form_fields/radio.rb +96 -0
- data/app/models/drgcms_form_fields/readonly.rb +2 -2
- data/app/models/drgcms_form_fields/select.rb +92 -29
- data/app/models/drgcms_form_fields/text_area.rb +1 -1
- data/app/models/drgcms_form_fields/text_autocomplete.rb +29 -17
- data/app/models/drgcms_form_fields/text_field.rb +1 -1
- data/app/models/drgcms_form_fields/text_with_select.rb +6 -3
- data/app/models/drgcms_form_fields/tree_select.rb +29 -10
- 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/{helpers → renderers}/dc_gallery_renderer.rb +1 -0
- data/app/{helpers → renderers}/dc_menu_renderer.rb +11 -4
- data/app/{helpers → renderers}/dc_page_renderer.rb +1 -0
- 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 +84 -48
- 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 +4 -1
- data/app/views/cmsedit/index.html.erb +7 -1
- data/app/views/cmsedit/new.html.erb +3 -1
- data/app/views/dc_common/_help.html.erb +8 -0
- data/app/views/layouts/models.html.erb +2 -1
- data/config/locales/drgcms_en.yml +26 -3
- data/config/locales/drgcms_sl.yml +31 -5
- data/config/locales/models_en.yml +66 -18
- data/config/locales/models_sl.yml +71 -20
- data/drg_cms.gemspec +3 -3
- data/lib/drg_cms.rb +63 -1
- 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
- metadata +81 -63
- 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 -885
- data/app/models/dc_dummy.rb +0 -102
- data/test/fixtures/drg_cms_test_data.rb +0 -87
@@ -58,6 +58,8 @@ attr_accessor :parts
|
|
58
58
|
attr_accessor :record
|
59
59
|
#
|
60
60
|
attr_accessor :record_footer
|
61
|
+
# json_ld
|
62
|
+
attr_reader :json_ld
|
61
63
|
|
62
64
|
############################################################################
|
63
65
|
# When @parent is present then helper methods are called from parent class otherwise
|
@@ -96,6 +98,7 @@ def dc_render(renderer, opts={})
|
|
96
98
|
#
|
97
99
|
opts[:edit_mode] = session[:edit_mode]
|
98
100
|
opts[:editparams] = {}
|
101
|
+
|
99
102
|
opts = @options.merge(opts) # merge options with parameters passed on site, page, design ...
|
100
103
|
opts.symbolize_keys! # this makes lots of things easier
|
101
104
|
# Create renderer object
|
@@ -240,8 +243,8 @@ end
|
|
240
243
|
# Helper for adding additional css and javascript code added by documents
|
241
244
|
# and renderers during page rendering.
|
242
245
|
########################################################################
|
243
|
-
def dc_page_bottom
|
244
|
-
%
|
246
|
+
def dc_page_bottom
|
247
|
+
%(<style type="text/css">#{@css}</style>#{javascript_tag @js}).html_safe
|
245
248
|
end
|
246
249
|
|
247
250
|
############################################################################
|
@@ -255,10 +258,16 @@ end
|
|
255
258
|
# Returns:
|
256
259
|
# String. HTML code for title.
|
257
260
|
############################################################################
|
258
|
-
def dc_table_title(text, result_set=nil)
|
259
|
-
c = %
|
261
|
+
def dc_table_title(text, result_set = nil)
|
262
|
+
c = %(<div class="dc-title">#{text})
|
263
|
+
# help button
|
264
|
+
type = result_set.nil? ? 'form' : 'index'
|
265
|
+
form_name = params[:form_name] || params[:table]
|
266
|
+
url = url_for(controller: :dc_common, action: :help, type: type, form_name: form_name)
|
267
|
+
c << %(<div class="dc-help dc-link-ajax" data-url=#{url}>#{fa_icon('question-circle')}</div>)
|
268
|
+
|
260
269
|
if result_set and result_set.respond_to?(:current_page)
|
261
|
-
c << %
|
270
|
+
c << %(<div class="dc-paginate">#{paginate(result_set, :params => {action: 'index', clear: 'no', filter: nil})}</div>)
|
262
271
|
end
|
263
272
|
c << '<div style="clear: both;"></div></div>'
|
264
273
|
c.html_safe
|
@@ -270,7 +279,8 @@ end
|
|
270
279
|
# Returns:
|
271
280
|
# String. HTML code for title.
|
272
281
|
############################################################################
|
273
|
-
def dc_edit_title
|
282
|
+
def dc_edit_title
|
283
|
+
session[:form_processing] = "form:title:"
|
274
284
|
title = @form['form']['title']
|
275
285
|
# defined as form:title:edit
|
276
286
|
if title and title['edit'] and !@form['readonly']
|
@@ -297,6 +307,7 @@ end
|
|
297
307
|
# String. HTML code for title.
|
298
308
|
############################################################################
|
299
309
|
def dc_new_title()
|
310
|
+
session[:form_processing] = "form:title:"
|
300
311
|
title = @form['form']['title']
|
301
312
|
# defined as form:title:new
|
302
313
|
if title and title['new']
|
@@ -347,8 +358,24 @@ def dc_submit_tag(caption, icon, parms, rest={})
|
|
347
358
|
end
|
348
359
|
end
|
349
360
|
html = icon_image || ''
|
350
|
-
html << submit_tag(t(caption, caption), parms)
|
361
|
+
#html << submit_tag(t(caption, caption), parms)
|
362
|
+
%Q[<button type="submit" class="dc-submit" name="commit" value="#{t(caption, caption)}">#{icon_image} #{t(caption, caption)}</button>].html_safe
|
363
|
+
end
|
364
|
+
|
365
|
+
############################################################################
|
366
|
+
# Returns icon code if icon is specified
|
367
|
+
############################################################################
|
368
|
+
def dc_icon_for_link(icon)
|
369
|
+
return nil unless icon
|
370
|
+
if icon.match(/\./)
|
371
|
+
_origin.image_tag(icon, class: 'dc-link-img dc-animate')
|
372
|
+
elsif icon.match('<i')
|
373
|
+
icon
|
374
|
+
else
|
375
|
+
_origin.fa_icon(icon)
|
376
|
+
end
|
351
377
|
end
|
378
|
+
|
352
379
|
############################################################################
|
353
380
|
# Similar to rails link_to, but also takes care of link icon, translation, ...
|
354
381
|
############################################################################
|
@@ -357,22 +384,13 @@ def dc_link_to(caption, icon, parms, rest={})
|
|
357
384
|
if parms.class == Hash
|
358
385
|
parms.stringify_keys!
|
359
386
|
rest.stringify_keys!
|
360
|
-
rest['class'] = rest['class'].to_s + ' dc-animate'
|
387
|
+
rest['class'] = rest['class'].to_s + ' dc-animate' unless rest['class'].to_s.match('dc-animate')
|
361
388
|
rest['target'] ||= parms.delete('target')
|
362
389
|
parms['controller'] ||= 'cmsedit'
|
363
390
|
icon_pos = parms.delete('icon_pos') || 'first'
|
364
391
|
end
|
365
392
|
#
|
366
|
-
|
367
|
-
icon_image = if icon.match(/\./)
|
368
|
-
_origin.image_tag(icon, class: 'dc-link-img dc-animate')
|
369
|
-
elsif icon.match('<i')
|
370
|
-
icon
|
371
|
-
else
|
372
|
-
_origin.fa_icon(icon)
|
373
|
-
end
|
374
|
-
end
|
375
|
-
#
|
393
|
+
icon_image = dc_icon_for_link(icon)
|
376
394
|
if caption
|
377
395
|
caption = t(caption, caption)
|
378
396
|
icon_image << ' ' if icon_image
|
@@ -389,23 +407,31 @@ end
|
|
389
407
|
# String. HTML code formatted for display.
|
390
408
|
####################################################################
|
391
409
|
def dc_flash_messages()
|
392
|
-
err
|
393
|
-
war
|
394
|
-
inf
|
395
|
-
note
|
410
|
+
err = _origin.flash[:error]
|
411
|
+
war = _origin.flash[:warning]
|
412
|
+
inf = _origin.flash[:info]
|
413
|
+
note = _origin.flash[:note]
|
414
|
+
html = ''
|
396
415
|
unless err.nil? and war.nil? and inf.nil? and note.nil?
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
c << note if note
|
416
|
+
html << "<div class=\"dc-form-error\">#{err}</div>" if err
|
417
|
+
html << "<div class=\"dc-form-warning\">#{war}</div>" if war
|
418
|
+
html << "<div class=\"dc-form-info\">#{inf}</div>" if inf
|
419
|
+
html << note if note
|
402
420
|
_origin.flash[:error] = nil
|
403
421
|
_origin.flash[:warning] = nil
|
404
422
|
_origin.flash[:info] = nil
|
405
423
|
_origin.flash[:note] = nil
|
406
|
-
|
407
|
-
c.html_safe
|
408
424
|
end
|
425
|
+
# Update fields on the form
|
426
|
+
if _origin.flash[:update]
|
427
|
+
html << "<div class=\"dc-form-updates\">\n"
|
428
|
+
_origin.flash[:update].each do |field, value|
|
429
|
+
html << %Q[<div data-field="#{field}" data-value="#{value}"></div>\n]
|
430
|
+
end
|
431
|
+
html << '</div>'
|
432
|
+
_origin.flash[:update] = nil
|
433
|
+
end
|
434
|
+
html.html_safe
|
409
435
|
end
|
410
436
|
|
411
437
|
########################################################################
|
@@ -575,7 +601,7 @@ def dc_page_edit_menu(opts=@opts)
|
|
575
601
|
return '' if opts[:edit_mode] < 2
|
576
602
|
# save some data to cookie. This can not go to session.
|
577
603
|
page = opts[:page] || @page
|
578
|
-
table = _origin.site.
|
604
|
+
table = _origin.site.page_class.underscore
|
579
605
|
kukis = { "#{table}.dc_design_id" => page.dc_design_id,
|
580
606
|
# "#{table}.menu_id" => page.menu_id,
|
581
607
|
"#{table}.kats" => page.kats,
|
@@ -587,7 +613,7 @@ def dc_page_edit_menu(opts=@opts)
|
|
587
613
|
opts[:editparams] ||= {}
|
588
614
|
dc_link_menu_tag(title) do |html|
|
589
615
|
opts[:editparams].merge!( controller: 'cmsedit', action: 'edit', 'icon' => 'edit' )
|
590
|
-
opts[:editparams].merge!( :id => page.id, :table => _origin.site.
|
616
|
+
opts[:editparams].merge!( :id => page.id, :table => _origin.site.page_class.underscore, form_name: opts[:form_name], edit_only: 'body' )
|
591
617
|
html << dc_link_for_edit1( opts[:editparams], t('drgcms.edit_content') )
|
592
618
|
|
593
619
|
# opts[:editparams][:edit_only] = nil
|
@@ -599,7 +625,7 @@ def dc_page_edit_menu(opts=@opts)
|
|
599
625
|
html << dc_link_for_edit1( opts[:editparams], t('drgcms.edit_new_page') )
|
600
626
|
|
601
627
|
opts[:editparams].merge!(ids: page.id, form_name: 'dc_part', 'icon' => 'plus-square-o',
|
602
|
-
table: "#{_origin.site.
|
628
|
+
table: "#{_origin.site.page_class.underscore};dc_part" )
|
603
629
|
html << dc_link_for_edit1( opts[:editparams], t('drgcms.edit_new_part') )
|
604
630
|
end.html_safe
|
605
631
|
end
|
@@ -618,7 +644,7 @@ end
|
|
618
644
|
########################################################################
|
619
645
|
def dc_page_class()
|
620
646
|
# dc_get_site.page_class.classify.constantize
|
621
|
-
dc_get_site.
|
647
|
+
dc_get_site.page_klass
|
622
648
|
end
|
623
649
|
|
624
650
|
########################################################################
|
@@ -636,225 +662,6 @@ def dc_menu_class()
|
|
636
662
|
dc_get_site.menu_class.classify.constantize
|
637
663
|
end
|
638
664
|
|
639
|
-
|
640
|
-
####################################################################
|
641
|
-
# Wrapper for i18 t method, with some spice added. If translation is not found English
|
642
|
-
# translation value will be returned. And if still not found default value will be returned if passed.
|
643
|
-
#
|
644
|
-
# Parameters:
|
645
|
-
# [key] String. String to be translated into locale.
|
646
|
-
# [default] String. Value returned if translation is not found.
|
647
|
-
#
|
648
|
-
# Example:
|
649
|
-
# t('translate.this','Enter text for ....')
|
650
|
-
#
|
651
|
-
# Returns:
|
652
|
-
# String. Translated text.
|
653
|
-
####################################################################
|
654
|
-
def t(key, default=nil)
|
655
|
-
c = I18n.t(key)
|
656
|
-
if c.class == Hash or c.match( 'translation missing' )
|
657
|
-
c = I18n.t(key, locale: 'en')
|
658
|
-
# Still not found. Return default if set
|
659
|
-
if c.class == Hash or c.match( 'translation missing' )
|
660
|
-
c = default.nil? ? key : default
|
661
|
-
end
|
662
|
-
end
|
663
|
-
c
|
664
|
-
end
|
665
|
-
|
666
|
-
####################################################################
|
667
|
-
# Returns table (collection) name translation for usage in dialog title. Tablename
|
668
|
-
# title is provided by helpers.label.table_name.tabletitle locale.
|
669
|
-
#
|
670
|
-
# Parameters:
|
671
|
-
# [tablename] String. Table (collection) name to be translated.
|
672
|
-
# [default] String. Value returned if translation is not found.
|
673
|
-
#
|
674
|
-
# Returns:
|
675
|
-
# String. Translated text.
|
676
|
-
####################################################################
|
677
|
-
def t_tablename(tablename, default=nil)
|
678
|
-
t('helpers.label.' + tablename + '.tabletitle', default || tablename)
|
679
|
-
end
|
680
|
-
|
681
|
-
############################################################################
|
682
|
-
# Returns label for field translated to current locale for usage on data entry form.
|
683
|
-
# Translation is provided by lang.helpers.label.table_name.field_name locale. If
|
684
|
-
# translation is not found method will capitalize field_name and replace '_' with ' '.
|
685
|
-
############################################################################
|
686
|
-
def t_name(field_name, default='')
|
687
|
-
c = t("helpers.label.#{@form['table']}.#{field_name}", default)
|
688
|
-
c = field_name.capitalize.gsub('_',' ') if c.match( 'translation missing' )
|
689
|
-
c
|
690
|
-
end
|
691
|
-
|
692
|
-
############################################################################
|
693
|
-
# When select field is used on form options for select can be provided by
|
694
|
-
# helpers.label.table_name.choices4_name locale. This is how select
|
695
|
-
# field options are translated. Method returns selected choice translated
|
696
|
-
# to current locale.
|
697
|
-
#
|
698
|
-
# Parameters:
|
699
|
-
# [model] String. Table (collection) model name (lowercase).
|
700
|
-
# [field] String. Field name used.
|
701
|
-
# [value] String. Value of field which translation will be returned.
|
702
|
-
#
|
703
|
-
# Example:
|
704
|
-
# # usage in program. Choice values for state are 'Deactivated:0,Active:1,Waiting:2'
|
705
|
-
# dc_name4_value('dc_user', 'state', @record.active )
|
706
|
-
#
|
707
|
-
# # usage in form
|
708
|
-
# columns:
|
709
|
-
# 2:
|
710
|
-
# name: state
|
711
|
-
# eval: dc_name4_value dc_user, state
|
712
|
-
#
|
713
|
-
# Returns:
|
714
|
-
# String. Descriptive text (translated) for selected choice value.
|
715
|
-
############################################################################
|
716
|
-
def dc_name4_value(model, field, value)
|
717
|
-
return '' if value.nil?
|
718
|
-
c = t('helpers.label.' + model + '.choices4_' + field )
|
719
|
-
a = c.chomp.split(',').inject([]) {|r,v| r << v.split(':') }
|
720
|
-
a.each {|e| return e.first if e.last.to_s == value.to_s }
|
721
|
-
''
|
722
|
-
end
|
723
|
-
|
724
|
-
############################################################################
|
725
|
-
# Return choices for field in model if choices are defined in localization text.
|
726
|
-
#
|
727
|
-
# Parameters:
|
728
|
-
# [model] String. Table (collection) model name (lowercase).
|
729
|
-
# [field] String. Field name used.
|
730
|
-
#
|
731
|
-
# Example:
|
732
|
-
# dc_choices4_field('dc_user', 'state' )
|
733
|
-
#
|
734
|
-
# Returns:
|
735
|
-
# Array. Choices for select input field
|
736
|
-
############################################################################
|
737
|
-
def dc_choices4_field(model, field)
|
738
|
-
c = t('helpers.label.' + model + '.choices4_' + field )
|
739
|
-
return ['error'] if c.match( 'translation missing' )
|
740
|
-
c.chomp.split(',').inject([]) {|r,v| r << v.split(':') }
|
741
|
-
end
|
742
|
-
|
743
|
-
############################################################################
|
744
|
-
# Will return descriptive text for id key when field in one table (collection) has belongs_to
|
745
|
-
# relation to other table.
|
746
|
-
#
|
747
|
-
# Parameters:
|
748
|
-
# [model] String. Table (collection) model name (lowercase).
|
749
|
-
# [field] String. Field name holding the value of descriptive text.
|
750
|
-
# [field_name] String. ID field name. This is by default id, but can be any other
|
751
|
-
# (preferred unique) field.
|
752
|
-
# [value] Value of id_field. Usually a BSON Key but can be any other data type.
|
753
|
-
#
|
754
|
-
# Example:
|
755
|
-
# # usage in program.
|
756
|
-
# dc_name4_id('dc_user', 'name', nil, dc_page.created_by)
|
757
|
-
#
|
758
|
-
# # usage in form
|
759
|
-
# columns:
|
760
|
-
# 2:
|
761
|
-
# name: site_id
|
762
|
-
# eval: dc_name4_id,site,name
|
763
|
-
# # username is saved to document instead of user.id field
|
764
|
-
# 5:
|
765
|
-
# name: user
|
766
|
-
# eval: dc_name4_id,dc_user,name,username
|
767
|
-
#
|
768
|
-
# Returns:
|
769
|
-
# String. Name (descriptive value) for specified key in table.
|
770
|
-
############################################################################
|
771
|
-
def dc_name4_id(model, field, field_name, id=nil)
|
772
|
-
return '' if id.nil?
|
773
|
-
field_name ||= 'id'
|
774
|
-
model = model.strip.classify.constantize if model.class == String
|
775
|
-
rec = Mongoid::QueryCache.cache { model.find_by(field_name.strip.to_sym => id) }
|
776
|
-
rec.nil? ? '' : (rec.send(field) rescue 'not defined')
|
777
|
-
end
|
778
|
-
|
779
|
-
############################################################################
|
780
|
-
# Return html code for icon presenting boolean value. Icon is a picture of checked or unchecked box.
|
781
|
-
#
|
782
|
-
# Parameters:
|
783
|
-
# [value] Boolean.
|
784
|
-
#
|
785
|
-
# Example:
|
786
|
-
# # usage from program
|
787
|
-
# dc_icon4_boolean(some_value)
|
788
|
-
#
|
789
|
-
# # usage from form description
|
790
|
-
# columns:
|
791
|
-
# 10:
|
792
|
-
# name: active
|
793
|
-
# eval: dc_icon4_boolean
|
794
|
-
############################################################################
|
795
|
-
def dc_icon4_boolean(value)
|
796
|
-
dc_dont?(value, true) ? fa_icon('square-o lg') : fa_icon('check-square-o lg')
|
797
|
-
end
|
798
|
-
|
799
|
-
############################################################################
|
800
|
-
# Returns html code for displaying date/time formatted by strftime. Will return '' if value is nil.
|
801
|
-
#
|
802
|
-
# Parameters:
|
803
|
-
# [value] Date/DateTime/Time.
|
804
|
-
# [format] String. strftime format mask. Defaults to locale's default format.
|
805
|
-
############################################################################
|
806
|
-
def dc_format_date_time(value, format=nil)
|
807
|
-
return '' if value.nil?
|
808
|
-
format ||= value.class == Date ? t('date.formats.default') : t('time.formats.default')
|
809
|
-
value.strftime(format)
|
810
|
-
end
|
811
|
-
|
812
|
-
####################################################################
|
813
|
-
#
|
814
|
-
####################################################################
|
815
|
-
def dc_date_time(value, format) #:nodoc:
|
816
|
-
dc_deprecate 'dc_date_time will be deprecated! Use dc_format_date_time instead.'
|
817
|
-
dc_format_date_time(value, format)
|
818
|
-
end
|
819
|
-
|
820
|
-
############################################################################
|
821
|
-
# Returns html code for displaying formatted number.
|
822
|
-
#
|
823
|
-
# Parameters:
|
824
|
-
# [value] Numeric number.
|
825
|
-
# [decimals] Integer. Number of decimals
|
826
|
-
# [separator] String. Decimals separator
|
827
|
-
# [delimiter] String. Thousands delimiter.
|
828
|
-
# [currency] String. Currency symbol if applied to result string.
|
829
|
-
############################################################################
|
830
|
-
def dc_format_number(value=0, decimals=nil, separator=nil, delimiter=nil, currency=nil)
|
831
|
-
decimals ||= I18n.t('number.currency.format.precision')
|
832
|
-
separator ||= I18n.t('number.currency.format.separator')
|
833
|
-
separator = '' if decimals == 0
|
834
|
-
delimiter ||= I18n.t('number.currency.format.delimiter')
|
835
|
-
whole,dec = value.to_s.split('.')
|
836
|
-
whole = '0' if whole.blank?
|
837
|
-
# remove and remember sign
|
838
|
-
sign = whole[0,1]
|
839
|
-
if sign == '-'
|
840
|
-
whole = whole[1,20]
|
841
|
-
else
|
842
|
-
sign = ''
|
843
|
-
end
|
844
|
-
# format decimals
|
845
|
-
dec ||= '0'
|
846
|
-
dec = dec[0,decimals]
|
847
|
-
while dec.size < decimals do dec += '0' end
|
848
|
-
# slice whole on chunks of 3
|
849
|
-
ar = []
|
850
|
-
while whole.size > 0 do
|
851
|
-
n = whole.size >=3 ? 3 : whole.size
|
852
|
-
ar << whole.slice!(n*-1,n)
|
853
|
-
end
|
854
|
-
# put it all back and format
|
855
|
-
"#{sign}#{ar.reverse.join(delimiter)}#{separator}#{dec}"
|
856
|
-
end
|
857
|
-
|
858
665
|
####################################################################
|
859
666
|
# Parse site name from url and return dc_site document. Site document will be cached in
|
860
667
|
# @site variable.
|
@@ -1029,9 +836,6 @@ def dc_choices4(model, name, id='_id', options = {})
|
|
1029
836
|
qry = qry.in(dc_site_id: sites) if sites
|
1030
837
|
end
|
1031
838
|
qry = qry.and(active: true) if model.method_defined?(:active)
|
1032
|
-
# qry = qry.sort(name => 1)
|
1033
|
-
# choices = []
|
1034
|
-
# qry.each {|v| choices << [ v[name], v[id] ] }
|
1035
839
|
choices = qry.inject([]) {|result,e| result << [ e[name], e[id] ]}
|
1036
840
|
choices.sort_alphabetical_by(&:first) # use UTF-8 sort
|
1037
841
|
end
|
@@ -1180,7 +984,8 @@ end
|
|
1180
984
|
####################################################################
|
1181
985
|
def dc_dont?(what, default=false)
|
1182
986
|
return default if what.nil?
|
1183
|
-
|
987
|
+
|
988
|
+
%w(0 n - no none false).include?(what.to_s.downcase.strip)
|
1184
989
|
end
|
1185
990
|
|
1186
991
|
############################################################################
|
@@ -1284,40 +1089,50 @@ def dc_iframe_edit(table, opts={})
|
|
1284
1089
|
end
|
1285
1090
|
|
1286
1091
|
########################################################################
|
1287
|
-
# Will return value from
|
1288
|
-
# This objects can be params, session,
|
1092
|
+
# Will return value from Rails and DRG internal objects.
|
1093
|
+
# This objects can be params, session, record, site, page
|
1289
1094
|
#
|
1290
1095
|
# Parameters:
|
1291
|
-
# [object] String: Internal object holding variable.
|
1096
|
+
# [object] String: Internal object holding variable. Possible values are session, params, record, site, page, class
|
1292
1097
|
# [var_name] String[symbol]: Variable name (:user_name, 'user_id', ...)
|
1098
|
+
# [current_document] Object: If passed and object is 'record' then it will be used for retrieving data.
|
1293
1099
|
#
|
1294
1100
|
# Example:
|
1295
1101
|
# # called when constructing iframe for display
|
1296
|
-
# dc_internal_var(session, :user_id)
|
1297
|
-
# dc_internal_var(params, :some_external_parameter)
|
1298
|
-
# dc_internal_var(site, :name)
|
1102
|
+
# dc_internal_var('session', :user_id)
|
1103
|
+
# dc_internal_var('params', :some_external_parameter)
|
1104
|
+
# dc_internal_var('site', :name)
|
1105
|
+
# # or even
|
1106
|
+
# dc_internal_var('class', 'ClassName.class_method_name')
|
1107
|
+
#
|
1299
1108
|
#
|
1300
1109
|
# Returns:
|
1301
|
-
# Value of variable or
|
1110
|
+
# Value of variable or error when not found
|
1302
1111
|
########################################################################
|
1303
|
-
def dc_internal_var(object, var_name)
|
1112
|
+
def dc_internal_var(object, var_name, current_document = nil)
|
1304
1113
|
begin
|
1305
1114
|
case
|
1306
|
-
|
1307
|
-
|
1308
|
-
|
1309
|
-
|
1310
|
-
|
1115
|
+
when object == 'session' then _origin.session[var_name]
|
1116
|
+
when object == 'params' then _origin.params[var_name]
|
1117
|
+
when object == 'site' then _origin.dc_get_site.send(var_name)
|
1118
|
+
when object == 'page' then _origin.page.send(var_name)
|
1119
|
+
when object == 'record' then
|
1120
|
+
current_document ? current_document.send(var_name) : _origin.record.send(var_name)
|
1121
|
+
when object == 'class' then
|
1122
|
+
clas, method_name = var_name.split('.')
|
1123
|
+
klas = clas.classify.constantize
|
1124
|
+
# call method. Error will be caught below.
|
1125
|
+
klas.send(method_name)
|
1311
1126
|
else
|
1312
1127
|
'VARIABLE: UNKNOWN OBJECT'
|
1313
1128
|
end
|
1314
1129
|
rescue Exception => e
|
1315
|
-
Rails.logger.
|
1130
|
+
Rails.logger.debug "\ndc_internal_var. Runtime error. #{e.message}\n"
|
1131
|
+
Rails.logger.debug(e.backtrace.join($/)) if Rails.env.development?
|
1316
1132
|
'VARIABLE: ERROR'
|
1317
1133
|
end
|
1318
1134
|
end
|
1319
1135
|
|
1320
|
-
|
1321
1136
|
########################################################################
|
1322
1137
|
# Will return whole path to document if document is embedded in another document.
|
1323
1138
|
#
|
@@ -1336,4 +1151,101 @@ def dc_document_path(document)
|
|
1336
1151
|
path.reverse.join(';')
|
1337
1152
|
end
|
1338
1153
|
|
1154
|
+
########################################################################
|
1155
|
+
# Will return formated code for embedding json+ld data into page
|
1156
|
+
#
|
1157
|
+
# Returns:
|
1158
|
+
# HTML data to be embedded into page header
|
1159
|
+
#######################################################################
|
1160
|
+
def dc_get_json_ld()
|
1161
|
+
return '' if @json_ld.nil? or @json_ld.size == 0
|
1162
|
+
|
1163
|
+
%Q[
|
1164
|
+
<script type="application/ld+json">
|
1165
|
+
#{JSON.pretty_generate({'@context' => 'http://schema.org', '@graph' => @json_ld})}
|
1166
|
+
</script>
|
1167
|
+
].html_safe
|
1168
|
+
end
|
1169
|
+
|
1170
|
+
########################################################################
|
1171
|
+
# Will add new element to json_ld structure
|
1172
|
+
#
|
1173
|
+
# Parameters:
|
1174
|
+
# [element] Hash or Array of hashes: json+ld element
|
1175
|
+
#######################################################################
|
1176
|
+
def dc_add_json_ld(element)
|
1177
|
+
@json_ld ||= []
|
1178
|
+
if element.class == Array
|
1179
|
+
@json_ld += element
|
1180
|
+
else
|
1181
|
+
@json_ld << element
|
1182
|
+
end
|
1183
|
+
end
|
1184
|
+
|
1185
|
+
########################################################################
|
1186
|
+
# Will return meta data for SEO optimizations
|
1187
|
+
#
|
1188
|
+
# Returns:
|
1189
|
+
# HTML data to be embedded into page header
|
1190
|
+
#######################################################################
|
1191
|
+
def dc_get_seo_meta_tags()
|
1192
|
+
html = ''
|
1193
|
+
html << "<link rel=\"canonical\" href=\"#{@page.canonical_link}\">\n " unless @page&.canonical_link.blank?
|
1194
|
+
|
1195
|
+
html << @meta_tags.inject('') do |r, hash|
|
1196
|
+
r << "<meta #{hash.first} content=\"#{hash.last}\">\n "
|
1197
|
+
end if @meta_tags
|
1198
|
+
html.html_safe
|
1199
|
+
end
|
1200
|
+
|
1201
|
+
########################################################################
|
1202
|
+
# Will add a meta tag to internal hash structure. If meta tag already exists it
|
1203
|
+
# will be overwritten.
|
1204
|
+
#
|
1205
|
+
# Parameters:
|
1206
|
+
# [name] String: meta name
|
1207
|
+
# [content] String: meta content
|
1208
|
+
########################################################################
|
1209
|
+
def dc_add_meta_tag(type, name, content)
|
1210
|
+
return if content.blank?
|
1211
|
+
@meta_tags ||= {}
|
1212
|
+
key = "#{type}=\"#{name}\""
|
1213
|
+
@meta_tags[key] = content
|
1214
|
+
end
|
1215
|
+
|
1216
|
+
#######################################################################
|
1217
|
+
# Will return alt image option when text is provided. When text is blank
|
1218
|
+
# it will extract alt name from picture file_name. This method returns
|
1219
|
+
# together with alt="image-tag" tag.
|
1220
|
+
#
|
1221
|
+
# Parameters:
|
1222
|
+
# [file_name] String: Filename of a picture
|
1223
|
+
# [text] String: Alt text name
|
1224
|
+
#
|
1225
|
+
# Returns:
|
1226
|
+
# [String] alt="image-tag"
|
1227
|
+
#######################################################################
|
1228
|
+
def dc_img_alt_tag(file_name, text=nil)
|
1229
|
+
" alt=\"#{dc_img_alt(file_name, text)}\" ".html_safe
|
1230
|
+
end
|
1231
|
+
|
1232
|
+
#######################################################################
|
1233
|
+
# Will return alt image option when text is provided. When text is blank
|
1234
|
+
# it will extract alt name from picture file_name. This method returns just
|
1235
|
+
# alt name.
|
1236
|
+
#
|
1237
|
+
# Parameters:
|
1238
|
+
# [file_name] String: Filename of a picture
|
1239
|
+
# [text] String: Alt text name
|
1240
|
+
#
|
1241
|
+
# Returns:
|
1242
|
+
# [String] alt_image_name
|
1243
|
+
#######################################################################
|
1244
|
+
def dc_img_alt(file_name, text=nil)
|
1245
|
+
return text unless text.blank?
|
1246
|
+
name = File.basename(file_name.to_s)
|
1247
|
+
name[0,name.index('.')].downcase rescue name
|
1248
|
+
end
|
1249
|
+
|
1250
|
+
|
1339
1251
|
end
|