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.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/drg_cms/drg_cms.js +446 -144
  3. data/app/assets/javascripts/drg_cms/jstree.min.js +6 -6
  4. data/app/assets/javascripts/drg_cms_application.js +1 -1
  5. data/app/assets/stylesheets/drg_cms/drg_cms.css +625 -243
  6. data/app/assets/stylesheets/drg_cms/jstree.css +6 -12
  7. data/app/assets/stylesheets/drg_cms/select-multiple.css +18 -12
  8. data/app/assets/stylesheets/drg_cms_cms.css +1 -1
  9. data/app/controllers/cmsedit_controller.rb +536 -331
  10. data/app/controllers/dc_application_controller.rb +380 -117
  11. data/app/controllers/dc_common_controller.rb +105 -14
  12. data/app/{controllers → controls}/browse_models_control.rb +0 -0
  13. data/app/controls/dc_help_control.rb +126 -0
  14. data/app/{controllers → controls}/dc_page_control.rb +24 -8
  15. data/app/controls/dc_poll_result_control.rb +88 -0
  16. data/app/controls/dc_report.rb +225 -0
  17. data/app/{controllers → controls}/design_element_settings_control.rb +0 -0
  18. data/app/forms/all_options.yml +50 -9
  19. data/app/forms/cms_menu.yml +28 -18
  20. data/app/forms/dc_ad.yml +11 -22
  21. data/app/forms/dc_big_table.yml +1 -0
  22. data/app/forms/dc_big_table_value.yml +1 -0
  23. data/app/forms/dc_category.yml +2 -1
  24. data/app/forms/dc_design.yml +20 -16
  25. data/app/forms/dc_filter.yml +3 -6
  26. data/app/forms/dc_help_1.yml +109 -0
  27. data/app/forms/dc_journal.yml +3 -1
  28. data/app/forms/dc_json_ld.yml +59 -0
  29. data/app/forms/dc_key_value.yml +32 -0
  30. data/app/forms/dc_link.yml +1 -1
  31. data/app/forms/dc_menu.yml +2 -0
  32. data/app/forms/dc_menu_item.yml +2 -0
  33. data/app/forms/dc_page.yml +3 -5
  34. data/app/forms/dc_part.yml +1 -0
  35. data/app/forms/dc_piece.yml +1 -0
  36. data/app/forms/dc_poll.yml +19 -9
  37. data/app/forms/dc_poll_item.yml +2 -1
  38. data/app/forms/dc_poll_result.yml +83 -0
  39. data/app/forms/dc_poll_result_export.yml +35 -0
  40. data/app/forms/dc_seo.yml +33 -0
  41. data/app/forms/dc_simple_menu.yml +2 -0
  42. data/app/forms/dc_site.yml +4 -12
  43. data/app/forms/dc_user.yml +27 -11
  44. data/app/forms/dc_user_role.yml +3 -0
  45. data/app/forms/json_ld_schema.yml +168 -0
  46. data/app/helpers/cms_common_helper.rb +376 -0
  47. data/app/helpers/cms_edit_helper.rb +506 -0
  48. data/app/helpers/cms_helper.rb +268 -0
  49. data/app/helpers/cms_index_helper.rb +576 -0
  50. data/app/helpers/dc_application_helper.rb +183 -271
  51. data/app/models/concerns/dc_page_concern.rb +40 -6
  52. data/app/models/concerns/dc_policy_rule_concern.rb +20 -8
  53. data/app/models/concerns/dc_seo_concern.rb +66 -0
  54. data/app/models/concerns/dc_site_concern.rb +67 -44
  55. data/app/models/concerns/dc_user_concern.rb +62 -21
  56. data/app/models/dc_design.rb +30 -18
  57. data/app/models/dc_filter.rb +22 -13
  58. data/app/models/dc_json_ld.rb +152 -0
  59. data/app/models/dc_key_value.rb +48 -0
  60. data/app/models/dc_key_value_store.rb +1 -0
  61. data/app/models/dc_memory.rb +8 -1
  62. data/app/models/dc_page.rb +0 -1
  63. data/app/models/dc_permission.rb +49 -9
  64. data/app/models/dc_policy.rb +25 -14
  65. data/app/models/dc_policy_role.rb +22 -11
  66. data/app/models/dc_poll.rb +39 -19
  67. data/app/models/{drgcms_form_fields/drgcms_form_fields.rb → dc_poll_result.rb} +23 -2
  68. data/app/models/dc_temp.rb +140 -0
  69. data/app/models/dc_user_role.rb +2 -2
  70. data/app/models/drgcms_form_fields.rb +14 -6
  71. data/app/models/drgcms_form_fields/action.rb +61 -0
  72. data/app/models/drgcms_form_fields/check_box.rb +3 -0
  73. data/app/models/drgcms_form_fields/comment.rb +8 -4
  74. data/app/models/drgcms_form_fields/date_picker.rb +11 -9
  75. data/app/models/drgcms_form_fields/date_select.rb +1 -1
  76. data/app/models/drgcms_form_fields/{date_time_picker.rb → datetime_picker.rb} +12 -10
  77. data/app/models/drgcms_form_fields/datetime_select.rb +1 -1
  78. data/app/models/drgcms_form_fields/drgcms_field.rb +55 -9
  79. data/app/models/drgcms_form_fields/embedded.rb +26 -16
  80. data/app/models/drgcms_form_fields/file_field.rb +52 -0
  81. data/app/models/drgcms_form_fields/file_select.rb +2 -2
  82. data/app/models/drgcms_form_fields/hash_field.rb +90 -0
  83. data/app/models/drgcms_form_fields/hidden_field.rb +1 -1
  84. data/app/models/drgcms_form_fields/html_field.rb +1 -1
  85. data/app/models/drgcms_form_fields/link_to.rb +2 -2
  86. data/app/models/drgcms_form_fields/method.rb +66 -0
  87. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +23 -14
  88. data/app/models/drgcms_form_fields/number_field.rb +15 -6
  89. data/app/models/drgcms_form_fields/radio.rb +96 -0
  90. data/app/models/drgcms_form_fields/readonly.rb +2 -2
  91. data/app/models/drgcms_form_fields/select.rb +92 -29
  92. data/app/models/drgcms_form_fields/text_area.rb +1 -1
  93. data/app/models/drgcms_form_fields/text_autocomplete.rb +29 -17
  94. data/app/models/drgcms_form_fields/text_field.rb +1 -1
  95. data/app/models/drgcms_form_fields/text_with_select.rb +6 -3
  96. data/app/models/drgcms_form_fields/tree_select.rb +29 -10
  97. data/app/{helpers → renderers}/dc_ad_renderer.rb +0 -0
  98. data/app/{helpers → renderers}/dc_big_menu_renderer.rb +1 -0
  99. data/app/{helpers → renderers}/dc_captcha_renderer.rb +0 -0
  100. data/app/{helpers → renderers}/dc_common_renderer.rb +0 -0
  101. data/app/{helpers → renderers}/dc_gallery_renderer.rb +1 -0
  102. data/app/{helpers → renderers}/dc_menu_renderer.rb +11 -4
  103. data/app/{helpers → renderers}/dc_page_renderer.rb +1 -0
  104. data/app/{helpers → renderers}/dc_part_renderer.rb +5 -4
  105. data/app/{helpers → renderers}/dc_piece_renderer.rb +1 -1
  106. data/app/{helpers → renderers}/dc_poll_renderer.rb +84 -48
  107. data/app/{helpers → renderers}/dc_renderer.rb +1 -0
  108. data/app/{helpers → renderers}/dc_simple_menu_renderer.rb +1 -0
  109. data/app/views/cmsedit/{remove_edit_stuff.js.erb → __remove_edit_stuff.js.erb} +0 -0
  110. data/app/views/cmsedit/{show.html.erb → __show.html.erb} +0 -0
  111. data/app/views/cmsedit/_edit_stuff.html.erb +4 -25
  112. data/app/views/cmsedit/_form.html.erb +4 -3
  113. data/app/views/cmsedit/_result.html.erb +2 -3
  114. data/app/views/cmsedit/edit.html.erb +4 -1
  115. data/app/views/cmsedit/index.html.erb +7 -1
  116. data/app/views/cmsedit/new.html.erb +3 -1
  117. data/app/views/dc_common/_help.html.erb +8 -0
  118. data/app/views/layouts/models.html.erb +2 -1
  119. data/config/locales/drgcms_en.yml +26 -3
  120. data/config/locales/drgcms_sl.yml +31 -5
  121. data/config/locales/models_en.yml +66 -18
  122. data/config/locales/models_sl.yml +71 -20
  123. data/drg_cms.gemspec +3 -3
  124. data/lib/drg_cms.rb +63 -1
  125. data/lib/drg_cms/version.rb +2 -2
  126. data/lib/generators/new_drg_form/new_drg_form_generator.rb +9 -2
  127. data/lib/tasks/database.rake +6 -56
  128. metadata +81 -63
  129. data/app/assets/stylesheets/drg_cms/__jquery-ui.css +0 -339
  130. data/app/helpers/application_helper.rb +0 -2
  131. data/app/helpers/cmsedit_helper.rb +0 -885
  132. data/app/models/dc_dummy.rb +0 -102
  133. 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
- %Q[<style type="text/css">#{@css}</style>#{javascript_tag @js}].html_safe
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 = %Q[<div class="dc-title">#{text}]
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 << %Q[<div class="dc-paginate">#{paginate(result_set, :params => {:action => 'index'})}</div>]
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
- if icon
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 = _origin.flash[:error]
393
- war = _origin.flash[:warning]
394
- inf = _origin.flash[:info]
395
- note = _origin.flash[: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
- c = ''
398
- c << "<div class=\"dc-form-error\">#{err}</div>" if err
399
- c << "<div class=\"dc-form-warning\">#{war}</div>" if war
400
- c << "<div class=\"dc-form-info\">#{inf}</div>" if inf
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.page_table
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.page_table, form_name: opts[:form_name], edit_only: 'body' )
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.page_table};dc_part" )
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.page_table.classify.constantize
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
- %w(0 no - false none).include?(what.to_s.downcase.strip)
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 internal DRG variables.
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. Current values can be session, params, site, page
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 nil when not found
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
- when object == 'session' then _origin.session[var_name]
1307
- when object == 'params' then _origin.params[var_name]
1308
- when object == 'site' then _origin.dc_get_site.send(var_name)
1309
- when object == 'page' then _origin.page.send(var_name)
1310
- when object == 'record' then _origin.record.send(var_name)
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.error "Method dc_internal var. Runtime error. #{e.message}"
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