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.
Files changed (125) hide show
  1. checksums.yaml +5 -5
  2. data/app/assets/javascripts/drg_cms/drg_cms.js +395 -120
  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 +476 -215
  6. data/app/assets/stylesheets/drg_cms/jstree.css +6 -12
  7. data/app/assets/stylesheets/drg_cms/select-multiple.css +19 -13
  8. data/app/assets/stylesheets/drg_cms_cms.css +1 -1
  9. data/app/controllers/cmsedit_controller.rb +474 -233
  10. data/app/controllers/dc_application_controller.rb +264 -41
  11. data/app/controllers/dc_common_controller.rb +75 -63
  12. data/app/{controllers → controls}/browse_models_control.rb +0 -0
  13. data/app/{controllers → controls}/dc_page_control.rb +24 -8
  14. data/app/controls/dc_poll_result_control.rb +88 -0
  15. data/app/controls/dc_report.rb +227 -0
  16. data/app/{controllers → controls}/design_element_settings_control.rb +0 -0
  17. data/app/forms/all_options.yml +70 -12
  18. data/app/forms/cms_menu.yml +26 -17
  19. data/app/forms/dc_ad.yml +11 -22
  20. data/app/forms/dc_big_table.yml +1 -0
  21. data/app/forms/dc_big_table_value.yml +1 -0
  22. data/app/forms/dc_design.yml +19 -16
  23. data/app/forms/dc_filter.yml +3 -6
  24. data/app/forms/dc_gallery.yml +53 -0
  25. data/app/forms/dc_json_ld.yml +59 -0
  26. data/app/forms/dc_key_value.yml +32 -0
  27. data/app/forms/dc_link.yml +16 -10
  28. data/app/forms/dc_menu_item.yml +6 -0
  29. data/app/forms/dc_page.yml +2 -7
  30. data/app/forms/dc_poll.yml +16 -9
  31. data/app/forms/dc_poll_item.yml +2 -1
  32. data/app/forms/dc_poll_result.yml +83 -0
  33. data/app/forms/dc_poll_result_export.yml +35 -0
  34. data/app/forms/dc_removed_url.yml +42 -0
  35. data/app/forms/dc_seo.yml +33 -0
  36. data/app/forms/dc_site.yml +2 -6
  37. data/app/forms/json_ld_schema.yml +168 -0
  38. data/app/helpers/cms_common_helper.rb +311 -0
  39. data/app/helpers/cms_edit_helper.rb +498 -0
  40. data/app/helpers/cms_helper.rb +230 -0
  41. data/app/helpers/cms_index_helper.rb +564 -0
  42. data/app/helpers/dc_application_helper.rb +195 -268
  43. data/app/models/{dc_dummy.rb → __dc_dummy.rb} +0 -0
  44. data/app/models/concerns/dc_page_concern.rb +31 -6
  45. data/app/models/concerns/dc_seo_concern.rb +66 -0
  46. data/app/models/concerns/dc_site_concern.rb +12 -1
  47. data/app/models/concerns/dc_user_concern.rb +5 -3
  48. data/app/models/dc_design.rb +2 -0
  49. data/app/models/dc_filter.rb +37 -20
  50. data/app/models/dc_gallery.rb +64 -0
  51. data/app/models/dc_json_ld.rb +152 -0
  52. data/app/models/dc_key_value.rb +48 -0
  53. data/app/models/dc_link.rb +1 -0
  54. data/app/models/dc_memory.rb +26 -4
  55. data/app/models/dc_page.rb +1 -2
  56. data/app/models/dc_permission.rb +30 -0
  57. data/app/models/dc_poll.rb +39 -19
  58. data/app/models/dc_poll_result.rb +46 -0
  59. data/app/models/dc_removed_url.rb +54 -0
  60. data/app/models/dc_temp.rb +140 -0
  61. data/app/models/drgcms_form_fields.rb +6 -1642
  62. data/app/models/drgcms_form_fields/action.rb +61 -0
  63. data/app/models/drgcms_form_fields/check_box.rb +72 -0
  64. data/app/models/drgcms_form_fields/comment.rb +53 -0
  65. data/app/models/drgcms_form_fields/date_picker.rb +104 -0
  66. data/app/models/drgcms_form_fields/date_select.rb +68 -0
  67. data/app/models/drgcms_form_fields/datetime_picker.rb +89 -0
  68. data/app/models/drgcms_form_fields/datetime_select.rb +73 -0
  69. data/app/models/drgcms_form_fields/drgcms_field.rb +287 -0
  70. data/app/models/drgcms_form_fields/embedded.rb +97 -0
  71. data/app/models/drgcms_form_fields/file_field.rb +52 -0
  72. data/app/models/drgcms_form_fields/file_select.rb +70 -0
  73. data/app/models/drgcms_form_fields/hash_field.rb +86 -0
  74. data/app/models/drgcms_form_fields/hidden_field.rb +52 -0
  75. data/app/models/drgcms_form_fields/html_field.rb +70 -0
  76. data/app/models/drgcms_form_fields/journal_diff.rb +60 -0
  77. data/app/models/drgcms_form_fields/link_to.rb +69 -0
  78. data/app/models/drgcms_form_fields/method.rb +65 -0
  79. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +204 -0
  80. data/app/models/drgcms_form_fields/number_field.rb +92 -0
  81. data/app/models/drgcms_form_fields/password_field.rb +62 -0
  82. data/app/models/drgcms_form_fields/radio.rb +96 -0
  83. data/app/models/drgcms_form_fields/readonly.rb +79 -0
  84. data/app/models/drgcms_form_fields/select.rb +226 -0
  85. data/app/models/drgcms_form_fields/submit_tag.rb +58 -0
  86. data/app/models/drgcms_form_fields/text_area.rb +68 -0
  87. data/app/models/drgcms_form_fields/text_autocomplete.rb +155 -0
  88. data/app/models/drgcms_form_fields/text_field.rb +56 -0
  89. data/app/models/drgcms_form_fields/text_with_select.rb +95 -0
  90. data/app/models/drgcms_form_fields/tree_select.rb +169 -0
  91. data/app/{helpers → renderers}/dc_ad_renderer.rb +0 -0
  92. data/app/{helpers → renderers}/dc_big_menu_renderer.rb +1 -0
  93. data/app/{helpers → renderers}/dc_captcha_renderer.rb +0 -0
  94. data/app/{helpers → renderers}/dc_common_renderer.rb +0 -0
  95. data/app/renderers/dc_gallery_renderer.rb +95 -0
  96. data/app/{helpers → renderers}/dc_menu_renderer.rb +11 -4
  97. data/app/{helpers → renderers}/dc_page_renderer.rb +21 -3
  98. data/app/{helpers → renderers}/dc_part_renderer.rb +5 -4
  99. data/app/{helpers → renderers}/dc_piece_renderer.rb +1 -1
  100. data/app/{helpers → renderers}/dc_poll_renderer.rb +86 -51
  101. data/app/{helpers → renderers}/dc_renderer.rb +1 -0
  102. data/app/{helpers → renderers}/dc_simple_menu_renderer.rb +1 -0
  103. data/app/views/cmsedit/{remove_edit_stuff.js.erb → __remove_edit_stuff.js.erb} +0 -0
  104. data/app/views/cmsedit/{show.html.erb → __show.html.erb} +0 -0
  105. data/app/views/cmsedit/_edit_stuff.html.erb +4 -25
  106. data/app/views/cmsedit/_form.html.erb +4 -3
  107. data/app/views/cmsedit/_result.html.erb +2 -3
  108. data/app/views/cmsedit/edit.html.erb +2 -1
  109. data/app/views/cmsedit/index.html.erb +6 -1
  110. data/app/views/cmsedit/new.html.erb +1 -1
  111. data/config/locales/drgcms_en.yml +15 -3
  112. data/config/locales/drgcms_sl.yml +18 -6
  113. data/config/locales/models_en.yml +103 -19
  114. data/config/locales/models_sl.yml +102 -17
  115. data/drg_cms.gemspec +3 -3
  116. data/lib/drg_cms.rb +6 -2
  117. data/lib/drg_cms/version.rb +2 -2
  118. data/lib/generators/new_drg_form/new_drg_form_generator.rb +9 -2
  119. data/lib/tasks/database.rake +6 -56
  120. data/lib/tasks/dc_cleanup.rake +1 -1
  121. metadata +106 -61
  122. data/app/assets/stylesheets/drg_cms/__jquery-ui.css +0 -339
  123. data/app/helpers/application_helper.rb +0 -2
  124. data/app/helpers/cmsedit_helper.rb +0 -844
  125. 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 => {:action => 'index'})}</div>]
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._id if @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
- if icon
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 = _origin.flash[:error]
391
- war = _origin.flash[:warning]
392
- inf = _origin.flash[:info]
393
- note = _origin.flash[: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
- c = ''
396
- c << "<div class=\"dc-form-error\">#{err}</div>" if err
397
- c << "<div class=\"dc-form-warning\">#{war}</div>" if war
398
- c << "<div class=\"dc-form-info\">#{inf}</div>" if inf
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 =<<EOT
531
- <dl>
552
+ html = %Q[
553
+ <dl>
532
554
  <dt><div class='drgcms_popmenu' href="#">
533
- #{_origin.fa_icon('edit lg', class: 'dc-inline-link', title: title)}</div></dt>
534
- <dd>
535
- <ul class=' div-hidden drgcms_popmenu_class'>
536
- EOT
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.page_table
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.page_table, form_name: opts[:form_name], edit_only: 'body' )
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.page_table};dc_part" )
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.page_table.classify.constantize
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
- %w(0 no - false none).include?(what.to_s.downcase.strip)
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 constructiong iframe for display
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
- else
1307
- 'VARIABLE: UNKNOWN OBJECT'
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
- Rails.logger.debug "Method dc_internal var. Runtime error. #{e.message}"
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