drg_cms 0.6.1.0 → 0.6.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +25 -10
  3. data/app/assets/fonts/ibm-plex-sans-300.woff2 +0 -0
  4. data/app/assets/fonts/ibm-plex-sans-400.woff2 +0 -0
  5. data/app/assets/fonts/ibm-plex-sans-500.woff2 +0 -0
  6. data/app/assets/fonts/ibm-plex-sans-600.woff2 +0 -0
  7. data/app/assets/fonts/ibm-plex-sans-700.woff2 +0 -0
  8. data/app/assets/fonts/ibm-plex-sans-italic.woff2 +0 -0
  9. data/app/assets/javascripts/drg_cms/drg_cms.js +178 -55
  10. data/app/assets/stylesheets/drg_cms/drg_cms.css +218 -94
  11. data/app/assets/stylesheets/drg_cms/select-multiple.css +1 -1
  12. data/app/controllers/cmsedit_controller.rb +29 -24
  13. data/app/controllers/dc_application_controller.rb +78 -166
  14. data/app/controllers/dc_common_controller.rb +56 -47
  15. data/app/controls/dc_help_control.rb +12 -0
  16. data/app/controls/dc_report.rb +7 -9
  17. data/app/controls/design_element_settings_control.rb +1 -1
  18. data/app/forms/all_options.yml +25 -6
  19. data/app/forms/dc_big_table.yml +0 -2
  20. data/app/forms/dc_big_table_value.yml +0 -2
  21. data/app/forms/dc_design.yml +1 -2
  22. data/app/forms/dc_folder_permission.yml +0 -2
  23. data/app/forms/dc_help_1.yml +2 -1
  24. data/app/forms/dc_json_ld.yml +0 -3
  25. data/app/forms/dc_menu.yml +6 -12
  26. data/app/forms/dc_menu_item.yml +1 -3
  27. data/app/forms/dc_page.yml +5 -2
  28. data/app/forms/dc_policy.yml +2 -5
  29. data/app/forms/dc_poll.yml +10 -16
  30. data/app/forms/dc_seo.yml +1 -2
  31. data/app/forms/dc_simple_menu.yml +1 -2
  32. data/app/forms/dc_site.yml +5 -7
  33. data/app/helpers/cms_common_helper.rb +2 -3
  34. data/app/helpers/cms_edit_helper.rb +41 -31
  35. data/app/helpers/cms_helper.rb +6 -6
  36. data/app/helpers/cms_index_helper.rb +79 -34
  37. data/app/helpers/dc_application_helper.rb +99 -85
  38. data/app/models/concerns/dc_page_concern.rb +3 -2
  39. data/app/models/concerns/dc_piece_concern.rb +1 -1
  40. data/app/models/concerns/dc_site_concern.rb +10 -4
  41. data/app/models/concerns/dc_user_concern.rb +3 -3
  42. data/app/models/dc_big_table.rb +2 -2
  43. data/app/models/dc_filter.rb +28 -22
  44. data/app/models/dc_site.rb +0 -1
  45. data/app/models/dc_temp.rb +7 -0
  46. data/app/models/drgcms_form_fields/comment.rb +11 -2
  47. data/app/models/drgcms_form_fields/date_picker.rb +2 -0
  48. data/app/models/drgcms_form_fields/drgcms_field.rb +2 -1
  49. data/app/models/drgcms_form_fields/embedded.rb +4 -2
  50. data/app/models/drgcms_form_fields/number_field.rb +4 -3
  51. data/app/models/drgcms_form_fields/readonly.rb +13 -17
  52. data/app/models/drgcms_form_fields/select.rb +16 -18
  53. data/app/models/drgcms_form_fields/text_autocomplete.rb +39 -23
  54. data/app/renderers/dc_page_renderer.rb +7 -6
  55. data/app/renderers/dc_poll_renderer.rb +16 -20
  56. data/app/views/cmsedit/_edit_stuff.html.erb +5 -2
  57. data/app/views/cmsedit/_form.html.erb +3 -2
  58. data/app/views/cmsedit/_result.html.erb +21 -18
  59. data/app/views/cmsedit/edit.html.erb +2 -1
  60. data/app/views/cmsedit/index.html.erb +1 -1
  61. data/app/views/cmsedit/new.html.erb +3 -2
  62. data/app/views/dc_common/_help.html.erb +12 -3
  63. data/app/views/layouts/cms.html.erb +3 -5
  64. data/config/locales/drgcms_en.yml +5 -2
  65. data/config/locales/drgcms_sl.yml +5 -2
  66. data/config/locales/models_en.yml +2 -0
  67. data/config/locales/models_sl.yml +5 -3
  68. data/drg_cms.gemspec +16 -16
  69. data/lib/drg_cms/version.rb +1 -1
  70. data/lib/drg_cms.rb +46 -12
  71. metadata +35 -29
@@ -1,4 +1,3 @@
1
- #coding: utf-8
2
1
  #--
3
2
  # Copyright (c) 2012+ Damjan Rems
4
3
  #
@@ -95,17 +94,17 @@ end
95
94
  ############################################################################
96
95
  def dc_render(renderer, opts={})
97
96
  return dc_render_design_part(renderer[:part]) if renderer.class == Hash
98
- #
97
+
99
98
  opts[:edit_mode] = session[:edit_mode]
100
99
  opts[:editparams] = {}
101
100
 
102
101
  opts = @options.merge(opts) # merge options with parameters passed on site, page, design ...
103
102
  opts.symbolize_keys! # this makes lots of things easier
104
- # Create renderer object
103
+ # Create renderer object
105
104
  klass = renderer.to_s.downcase
106
105
  klass += '_renderer' unless klass.match('_renderer') #
107
106
  obj = Kernel.const_get(klass.classify, Class.new).new(self, opts) rescue nil
108
- #
107
+
109
108
  if obj
110
109
  html = obj.render_html
111
110
  @css << obj.render_css.to_s
@@ -133,7 +132,7 @@ def dc_replace_in_design(opts={})
133
132
  design = opts[:piece] ? DcPiece.find(name: opts[:piece]).script : dc_get_site.design
134
133
  layout = opts[:layout] || (dc_get_site.site_layout.size > 2 ? dc_get_site.site_layout : nil)
135
134
  if opts[:replace]
136
- # replace more than one part of code
135
+ # replace more than one part of code
137
136
  if opts[:replace].class == Array
138
137
  0.upto(opts[:replace].size - 1) {|i| design.sub!(opts[:replace][i], opts[:with][i])}
139
138
  else
@@ -179,13 +178,12 @@ end
179
178
  #
180
179
  # This helper is replacement dc_render_from_site method which will soon be deprecated.
181
180
  ########################################################################
182
- def dc_render_design_part(part)
183
-
181
+ def dc_render_design_part(part)
184
182
  case
185
183
  when part.nil? then logger.error('ERROR dc_render_design_part! part is NIL !'); ''
186
- # Send as array. Part may be defined with options on page. First element has
187
- # name of element which defines what to do. If not defined default behaviour is
188
- # called. That is what is defined in second part of array.
184
+ # Send as array. Part may be defined with options on page. First element has
185
+ # name of element which defines what to do. If not defined default behaviour is
186
+ # called. That is what is defined in second part of array.
189
187
  when part.class == Array then
190
188
  if @options.dig(:settings, part.first)
191
189
  #TODO to be defined
@@ -196,9 +194,9 @@ def dc_render_design_part(part)
196
194
  when part.class == Proc then
197
195
  result = part.call
198
196
  result.class == Array ? result.first : result
199
- # Send as string. Evaluate content of string
197
+ # Send as string. Evaluate content of string
200
198
  when part.class == String then eval part
201
- # For future maybe. Just call objects to_s method.
199
+ # For future maybe. Just call objects to_s method.
202
200
  else
203
201
  part.to_s
204
202
  end.html_safe
@@ -231,9 +229,9 @@ end
231
229
  ########################################################################
232
230
  # Helper for rendering top CMS menu when in editing mode
233
231
  ########################################################################
234
- def dc_page_top()
235
- if @design and !@design.rails_view.blank?
236
- # Evaluate parameters in design body
232
+ def dc_page_top
233
+ if @design && @design.rails_view.present?
234
+ # Evaluate parameters in design body
237
235
  eval(@design.body)
238
236
  end
239
237
  session[:edit_mode] > 0 ? render(partial: 'cmsedit/edit_stuff') : ''
@@ -282,18 +280,18 @@ end
282
280
  def dc_edit_title
283
281
  session[:form_processing] = "form:title:"
284
282
  title = @form['form']['title']
285
- # defined as form:title:edit
283
+ # defined as form:title:edit
286
284
  if title and title['edit'] and !@form['readonly']
287
285
  t( title['edit'], title['edit'] )
288
286
  elsif title and title['show'] and @form['readonly']
289
287
  t( title['show'], title['show'] )
290
288
  else
291
- # concatenate title
289
+ # concatenate title
292
290
  c = (@form['readonly'] ? t('drgcms.show') : t('drgcms.edit')) + " : "
293
- c << (@form['title'] ? t( @form['title'], @form['title'] ) : t_tablename(@form['table'])) + ' : '
291
+ c << (@form['title'].class == String ? t( @form['title'], @form['title'] ) : t_tablename(@form['table'])) + ' : '
294
292
  title = (title and title['field']) ? title['field'] : @form['form']['edit_title']
295
293
  dc_deprecate('form:edit_title will be deprecated. Use form:title:field instead.') if @form['form']['edit_title']
296
- #
294
+
297
295
  c << "#{@record[ title ]} : " if title and @record.respond_to?(title)
298
296
  c << @record.id if @record
299
297
  end
@@ -309,15 +307,11 @@ end
309
307
  def dc_new_title()
310
308
  session[:form_processing] = "form:title:"
311
309
  title = @form['form']['title']
312
- # defined as form:title:new
310
+ # defined as form:title:new
313
311
  if title and title['new']
314
312
  t( title['new'], title['new'] )
315
313
  else
316
- if @form['table'] == 'dc_dummy'
317
- dc_deprecate('dc_dummy will be deprecated. Use dc_memory instead.')
318
- @form['table'] = 'dc_memory'
319
- end
320
- # in memory variables
314
+ # in memory structures
321
315
  if @form['table'] == 'dc_memory'
322
316
  t( @form['title'], @form['title'] )
323
317
  else
@@ -366,7 +360,8 @@ end
366
360
  # Returns icon code if icon is specified
367
361
  ############################################################################
368
362
  def dc_icon_for_link(icon)
369
- return nil unless icon
363
+ return nil if icon.nil?
364
+
370
365
  if icon.match(/\./)
371
366
  _origin.image_tag(icon, class: 'dc-link-img dc-animate')
372
367
  elsif icon.match('<i')
@@ -439,22 +434,13 @@ end
439
434
  # Therefore it is very unwise to use non ascii chars for table (collection) names.
440
435
  #
441
436
  # Parameters:
442
- # [string] String. String to be converted into decamelized string.
437
+ # [Object] model_string. String or model to be converted into decamelized string.
443
438
  #
444
439
  # Returns:
445
440
  # String. Decamelized string.
446
441
  ########################################################################
447
- def decamelize_type(string)
448
- return nil if string.nil?
449
- r = ''
450
- string.to_s.each_char do |c|
451
- r << case
452
- when r.size == 0 then c.downcase
453
- when c.downcase != c then '_' + c.downcase
454
- else c
455
- end
456
- end
457
- r
442
+ def decamelize_type(model_string)
443
+ model_string ? model_string.to_s.underscore : nil
458
444
  end
459
445
 
460
446
  ####################################################################
@@ -468,20 +454,49 @@ end
468
454
  # String. HTML code formatted for display.
469
455
  ####################################################################
470
456
  def dc_error_messages_for(doc)
471
- return '' unless doc and doc.errors.any?
472
- msgs = ''
473
- doc.errors.each do |attribute, errors_array|
474
- label = t("helpers.label.#{decamelize_type(doc.class)}.#{attribute}", attribute)
475
- msgs << "<li>#{label} : #{errors_array}</li>"
457
+ return '' unless doc && doc.errors.any?
458
+
459
+ msgs = doc.errors.inject('') do |r, error|
460
+ label = t("helpers.label.#{decamelize_type(doc.class)}.#{error.attribute}", error.attribute)
461
+ r << "<li>#{label} : #{error.message}</li>"
476
462
  end
477
-
478
- c = <<eot
463
+
464
+ html = <<eot
479
465
  <div class="dc-form-error">
480
466
  <h2>#{t('drgcms.errors_no')} #{doc.errors.size}</h2>
481
467
  <ul>#{msgs}</ul>
482
468
  </div>
483
469
  eot
484
- c.html_safe
470
+ html.html_safe
471
+ end
472
+
473
+ ####################################################################
474
+ # Returns warning messages if any set in a model.
475
+ #
476
+ # When warnings array is added to model its content can be written on top of the form.
477
+ #
478
+ # Parameters:
479
+ # [doc] Document. Document record which will be checked for errors.
480
+ #
481
+ # Returns:
482
+ # String. HTML code formatted for display.
483
+ ####################################################################
484
+ def dc_warning_messages_for(doc)
485
+ return ''
486
+ return '' unless doc && doc.respond_to?(:warnings)
487
+
488
+ msgs = doc.warnings.inject('') do |r, error|
489
+ label = t("helpers.label.#{decamelize_type(doc.class)}.#{error.attribute}", error.attribute)
490
+ msgs << "<li>#{label} : #{error.message}</li>"
491
+ end
492
+
493
+ html = <<eot
494
+ <div class="dc-form-warning">
495
+ <h2>#{t('drgcms.warnings_no')} #{doc.warnings.size}</h2>
496
+ <ul>#{msgs}</ul>
497
+ </div>
498
+ eot
499
+ html.html_safe
485
500
  end
486
501
 
487
502
  ####################################################################
@@ -555,14 +570,14 @@ end
555
570
  # Create edit link with edit picture. Subroutine of dc_page_edit_menu.
556
571
  ####################################################################
557
572
  def dc_link_menu_tag(title) #:nodoc:
558
- html = %Q[
573
+ html = %(
559
574
  <dl>
560
575
  <dt><div class='drgcms_popmenu' href="#">
561
576
  #{_origin.fa_icon('file-text-o lg', class: 'dc-inline-link', title: title)}
562
577
  </div></dt>
563
578
  <dd>
564
579
  <ul class=' div-hidden drgcms_popmenu_class'>
565
- ]
580
+ )
566
581
 
567
582
  yield html
568
583
  html << "</ul></dd></dl>"
@@ -596,10 +611,11 @@ end
596
611
  # Returns:
597
612
  # String. HTML code required for manipulation of currently processed document.
598
613
  ########################################################################
599
- def dc_page_edit_menu(opts=@opts)
614
+ def dc_page_edit_menu(opts = @opts)
600
615
  opts[:edit_mode] ||= _origin.session[:edit_mode]
601
616
  return '' if opts[:edit_mode] < 2
602
- # save some data to cookie. This can not go to session.
617
+
618
+ # save some data to cookie. This can not go to session.
603
619
  page = opts[:page] || @page
604
620
  table = _origin.site.page_class.underscore
605
621
  kukis = { "#{table}.dc_design_id" => page.dc_design_id,
@@ -616,11 +632,9 @@ def dc_page_edit_menu(opts=@opts)
616
632
  opts[:editparams].merge!( :id => page.id, :table => _origin.site.page_class.underscore, form_name: opts[:form_name], edit_only: 'body' )
617
633
  html << dc_link_for_edit1( opts[:editparams], t('drgcms.edit_content') )
618
634
 
619
- # opts[:editparams][:edit_only] = nil
620
635
  opts[:editparams].merge!( edit_only: nil, 'icon' => 'pencil' )
621
636
  html << dc_link_for_edit1( opts[:editparams], t('drgcms.edit_advanced') )
622
637
 
623
- # opts[:editparams][:action] = 'new'
624
638
  opts[:editparams].merge!( action: 'new', 'icon' => 'plus' )
625
639
  html << dc_link_for_edit1( opts[:editparams], t('drgcms.edit_new_page') )
626
640
 
@@ -642,8 +656,7 @@ end
642
656
  # type: text_with_select
643
657
  # eval: 'dc_page_class.all_pages_for_site(@parent.dc_get_site)'
644
658
  ########################################################################
645
- def dc_page_class()
646
- # dc_get_site.page_class.classify.constantize
659
+ def dc_page_class
647
660
  dc_get_site.page_klass
648
661
  end
649
662
 
@@ -658,7 +671,7 @@ end
658
671
  # type: tree_view
659
672
  # eval: 'dc_menu_class.all_menus_for_site(@parent.dc_get_site)'
660
673
  ########################################################################
661
- def dc_menu_class()
674
+ def dc_menu_class
662
675
  dc_get_site.menu_class.classify.constantize
663
676
  end
664
677
 
@@ -672,23 +685,20 @@ end
672
685
  # Returns:
673
686
  # DCSite. Site document.
674
687
  ####################################################################
675
- def dc_get_site()
688
+ def dc_get_site
676
689
  return @site if @site # already cached
677
- #
690
+
678
691
  req = _origin.request.url # different when called from renderer
679
692
  uri = URI.parse(req)
680
693
  @site = DcSite.find_by(name: uri.host)
681
- # Site can be aliased
682
- if @site and !@site.alias_for.blank?
683
- @site = DcSite.find_by(name: @site.alias_for)
684
- end
685
- # Development environment. Check if site with name test exists and use
686
- # alias_for field as pointer to real site name.
687
- if @site.nil? and ENV["RAILS_ENV"] != 'production'
694
+ # Site can be aliased
695
+ @site = DcSite.find_by(name: @site.alias_for) if @site&.alias_for.present?
696
+ # Development. If site with name test exists use alias_for field as pointer to real site data
697
+ if @site.nil? && ENV["RAILS_ENV"] != 'production'
688
698
  @site = DcSite.find_by(name: 'test')
689
699
  @site = DcSite.find_by(name: @site.alias_for) if @site
690
700
  end
691
- @site = nil if @site and !@site.active # site is disabled
701
+ @site = nil if @site && !@site.active # site is disabled
692
702
  @site
693
703
  end
694
704
 
@@ -704,9 +714,9 @@ end
704
714
  # html:
705
715
  # include_blank: true
706
716
  ############################################################################
707
- def dc_choices4_site_policies()
717
+ def dc_choices4_site_policies
708
718
  site = dc_get_site()
709
- site.dc_policies.all.inject([]) { |r, policy| r << [ policy.name, policy.id] if policy.active }
719
+ site.dc_policies.where(active: true).order_by(name: 1).map { |policy| [ policy.name, policy.id] }
710
720
  end
711
721
 
712
722
  ############################################################################
@@ -727,7 +737,7 @@ def dc_choices4_all_collections
727
737
  DrgCms.paths(:forms).reverse.each do |path|
728
738
  filename = "#{path}/cms_menu.yml"
729
739
  next unless File.exist?(filename)
730
- #
740
+
731
741
  menu = YAML.load_file(filename) rescue nil # load menu
732
742
  next if menu.nil? or !menu['menu'] # not menu or error
733
743
  menu['menu'].each do |section|
@@ -754,14 +764,14 @@ def forms_merge(hash1, hash2) #:nodoc:
754
764
  end
755
765
  target[key] = hash2[key] == '/' ? nil : hash2[key]
756
766
  end
757
- # delete keys with nil value
758
- target.delete_if{ |k,v| v.nil? }
767
+ # delete keys with nil value
768
+ target.delete_if{ |k, v| v.nil? }
759
769
  end
760
770
 
761
771
  ##########################################################################
762
772
  # Returns choices for creating collection edit select field on CMS top menu.
763
773
  ##########################################################################
764
- def dc_choices4_cmsmenu()
774
+ def dc_choices4_cmsmenu
765
775
  menus = {}
766
776
  DrgCms.paths(:forms).reverse.each do |path|
767
777
  filename = "#{path}/cms_menu.yml"
@@ -770,7 +780,7 @@ def dc_choices4_cmsmenu()
770
780
  next if menu.nil? or !menu['menu'] # not menu or error
771
781
  menus = forms_merge(menu['menu'], menus) # ignore top level part
772
782
  end
773
- #
783
+
774
784
  html = '<ul>'
775
785
  menus.to_a.sort.each do |index, menu| # sort menus, result is array of sorted hashes
776
786
  next unless menu['caption']
@@ -835,9 +845,11 @@ def dc_choices4(model, name, id='_id', options = {})
835
845
  sites << nil if param == :with_nil
836
846
  qry = qry.in(dc_site_id: sites) if sites
837
847
  end
838
- qry = qry.and(active: true) if model.method_defined?(:active)
839
- choices = qry.inject([]) {|result,e| result << [ e[name], e[id] ]}
840
- choices.sort_alphabetical_by(&:first) # use UTF-8 sort
848
+ qry = qry.and(active: true) if model.method_defined?(:active)
849
+ qry = qry.order_by(name => 1).collation(locale: I18n.locale.to_s)
850
+ #choices = qry.inject([]) {|result,e| result << [ e[name], e[id] ]}
851
+ #choices.sort_alphabetical_by(&:first) # use UTF-8 sort
852
+ qry.map { |e| [e[name], e[id]] }
841
853
  end
842
854
 
843
855
  ############################################################################
@@ -898,35 +910,35 @@ end
898
910
  ############################################################################
899
911
  def dc_user_can_view(ctrl, policy_id)
900
912
  policy_id = policy_id.policy_id if policy_id and policy_id.respond_to?(:policy_id)
901
- # Eventualy object without policy_id will be checked. This is to prevent error
913
+ # Eventualy object without policy_id will be checked. This is to prevent error
902
914
  policy_id = nil unless policy_id.class == BSON::ObjectId
903
- #
915
+
904
916
  site = ctrl.site
905
917
  policies = if site.inherit_policy.blank?
906
918
  site.dc_policies
907
919
  else
908
920
  Mongoid::QueryCache.cache { DcSite.find(site.inherit_policy) }.dc_policies
909
921
  end
910
- # permission defined by default policy
922
+ # permission defined by default policy
911
923
  default_policy = Mongoid::QueryCache.cache { policies.find_by(is_default: true) }
912
924
  return false, 'Default access policy not found for the site!' unless default_policy
913
- #
925
+
914
926
  permissions = {}
915
927
  default_policy.dc_policy_rules.to_a.each { |v| permissions[v.dc_policy_role_id] = v.permission }
916
- # update permissions with defined policy
928
+ # update permissions with defined policy
917
929
  part_policy = nil
918
930
  if policy_id
919
931
  part_policy = Mongoid::QueryCache.cache { policies.find(policy_id) }
920
932
  return false, 'Access policy not found for part!' unless part_policy
921
933
  part_policy.dc_policy_rules.to_a.each { |v| permissions[v.dc_policy_role_id] = v.permission }
922
934
  end
923
- # apply guest role if no roles defined
935
+ # apply guest role if no roles defined
924
936
  if ctrl.session[:user_roles].nil?
925
937
  role = Mongoid::QueryCache.cache { DcPolicyRole.find_by(system_name: 'guest', active: true) }
926
938
  return false, 'System guest role not defined!' unless role
927
939
  ctrl.session[:user_roles] = [role.id]
928
940
  end
929
- # Check if user has any role that allows him to view part
941
+ # Check if user has any role that allows him to view part
930
942
  can_view, msg = false,''
931
943
  ctrl.session[:user_roles].each do |role|
932
944
  next unless permissions[role] # role not yet defined. Will die in next line.
@@ -962,10 +974,10 @@ def dc_user_has_role( role, user=nil, roles=nil )
962
974
  roles = _origin.session[:user_roles] if roles.nil?
963
975
  user = _origin.session[:user_id] if user.nil?
964
976
  return false if user.nil? or roles.nil?
965
- #
977
+
966
978
  role = DcPolicyRole.get_role(role)
967
979
  return false if role.nil?
968
- # role is included in roles array
980
+ # role is included in roles array
969
981
  roles.include?(role._id)
970
982
  end
971
983
 
@@ -1004,6 +1016,7 @@ end
1004
1016
  ############################################################################
1005
1017
  def dc_limit_string(string, size)
1006
1018
  return string if string.size < size
1019
+
1007
1020
  string = string[0,size]
1008
1021
  string.chop! until (string[-1,1] == ' ' or string == '')
1009
1022
  string << '...'
@@ -1031,10 +1044,11 @@ def dc_big_table(key)
1031
1044
  bt = DcBigTable.find_by(key: key, site: dc_get_site._id, active: true)
1032
1045
  bt = DcBigTable.find_by(key: key, site: nil, active: true) if bt.nil?
1033
1046
  return ret if bt.nil?
1034
- #
1047
+
1035
1048
  locale = I18n.locale.to_s
1036
1049
  bt.dc_big_table_values.each do |v| # iterate each value
1037
1050
  next unless v.active
1051
+
1038
1052
  desc = ''
1039
1053
  v.dc_big_table_locales.each do |l| # iterate each locale
1040
1054
  if l.locale == locale
@@ -36,11 +36,12 @@ field :subject_link, type: String, default: ''
36
36
  field :alt_link, type: String, default: ''
37
37
  field :sub_subject, type: String, default: ''
38
38
  field :picture, type: String
39
- field :gallery, type: Boolean, default: false
39
+ field :gallery, type: Mongoid::Boolean, default: false
40
40
  field :body, type: String, default: ''
41
41
  field :css, type: String, default: ''
42
42
  field :script, type: String, default: ''
43
43
  field :params, type: String
44
+ field :div_class, type: String
44
45
  field :menu_id, type: String
45
46
  field :author_id, type: BSON::ObjectId
46
47
  field :dc_poll_id, type: BSON::ObjectId
@@ -50,7 +51,7 @@ field :user_name, type: String
50
51
  field :valid_from, type: DateTime
51
52
  field :valid_to, type: DateTime
52
53
  field :comments, type: Integer, default: 1 # 0 => not allowed, 1 => allowed
53
- field :active, type: Boolean, default: true
54
+ field :active, type: Mongoid::Boolean, default: true
54
55
  field :created_by, type: BSON::ObjectId
55
56
  field :updated_by, type: BSON::ObjectId
56
57
  field :kats, type: Array # Categories
@@ -45,7 +45,7 @@ module DcPieceConcern
45
45
  field :div_id, type: String
46
46
  field :site_id, type: BSON::ObjectId
47
47
  field :order, type: Integer, default: 0
48
- field :active, type: Boolean, default: true
48
+ field :active, type: Mongoid::Boolean, default: true
49
49
  field :valid_from, type: DateTime
50
50
  field :valid_to, type: DateTime
51
51
 
@@ -40,14 +40,13 @@ field :css, type: String, default: ''
40
40
  field :route_name, type: String, default: ''
41
41
  field :page_title, type: String
42
42
  field :document_extension, type: String
43
- field :page_table, type: String
44
43
  field :page_class, type: String, default: 'DcPage'
45
44
  field :site_layout, type: String, default: 'content'
46
45
  field :menu_class, type: String, default: 'DcSimpleMenu'
47
46
  field :request_processor, type: String
48
47
  field :files_directory, type: String
49
48
  field :logo, type: String
50
- field :active, type: Boolean, default: true
49
+ field :active, type: Mongoid::Boolean, default: true
51
50
  field :created_by, type: BSON::ObjectId
52
51
  field :updated_by, type: BSON::ObjectId
53
52
  field :menu_name, type: String
@@ -87,10 +86,17 @@ def params(what=nil)
87
86
  end
88
87
 
89
88
  ########################################################################
90
- # Returns class object of collection name
89
+ # Returns class object of page collection
91
90
  ########################################################################
92
91
  def page_klass
93
- (self.page_table.blank? ? self.page_class : self.page_table).classify.constantize
92
+ page_class.classify.constantize
93
+ end
94
+
95
+ ########################################################################
96
+ # Returns collection name for page collection
97
+ ########################################################################
98
+ def page_table
99
+ page_class.underscore
94
100
  end
95
101
 
96
102
  ########################################################################
@@ -50,13 +50,13 @@ field :picture, type: String
50
50
  field :birthdate, type: Date
51
51
  field :about, type: String
52
52
  field :last_visit, type: Time
53
- field :active, type: Boolean, default: true
53
+ field :active, type: Mongoid::Boolean, default: true
54
54
  field :valid_from, type: Date
55
55
  field :valid_to, type: Date
56
56
  field :created_by, type: BSON::ObjectId
57
57
  field :updated_by, type: BSON::ObjectId
58
58
 
59
- field :group, type: Boolean, default: false # false => User, true => Group
59
+ field :group, type: Mongoid::Boolean, default: false # false => User, true => Group
60
60
  field :member, type: Array
61
61
 
62
62
  embeds_many :dc_user_roles
@@ -151,7 +151,7 @@ private
151
151
  # when entry is left empty.
152
152
  ##########################################################################
153
153
  def do_before_save
154
- self.name = "#{title} #{first_name} #{middle_name + ' ' unless middle_name.blank?}#{last_name}".strip
154
+ self.name = "#{title} #{first_name} #{middle_name + ' ' unless middle_name.blank?}#{last_name}".squish
155
155
  # to ensure unique e-mail
156
156
  self.email = "unknown@#{id}" if email.blank?
157
157
  end
@@ -78,10 +78,10 @@ class DcBigTable
78
78
  ########################################################################
79
79
  # Will return possible choices for specified key prepared for usega in select input field.
80
80
  ########################################################################
81
- def self.choices4(key, site, locale=nil)
81
+ def self.choices4(key, site = nil, locale = nil)
82
82
  result = []
83
83
  choices = find_by(key: key, site: site)
84
- choices = find_by(key: key, site: nil) if choices.nil?
84
+ choices = find_by(key: key, site: nil) if site && choices.nil?
85
85
  if choices
86
86
  choices.dc_big_table_values.each do |choice|
87
87
  description = choice.description
@@ -106,8 +106,9 @@ end
106
106
  ############################################################################
107
107
  # Return filter input field for entering variable filter values on index form
108
108
  ############################################################################
109
- def self.get_filter_field(parent)
109
+ def self.get_filter_field(parent)
110
110
  return '' if parent.session[ parent.form['table'] ].nil?
111
+
111
112
  filter = parent.session[ parent.form['table'] ][:filter]
112
113
  return '' if filter.nil?
113
114
 
@@ -115,8 +116,11 @@ def self.get_filter_field(parent)
115
116
  return '' if filter.nil?
116
117
 
117
118
  field = get_field_form_definition(filter['field'], parent)
118
- return '' if field.nil? and filter['input'].nil?
119
- field = {} if field.nil?
119
+ return '' if field.nil? && filter['input'].nil?
120
+
121
+ saved_readonly = parent.form['readonly']
122
+ parent.form['readonly'] = false # must be
123
+ field ||= {}
120
124
  # If field has choices available in labels, use them. This is most likely select input field.
121
125
  if field['name']
122
126
  choices = parent.t('helpers.label.' + parent.form['table'] + '.choices4_' + field['name'] )
@@ -129,35 +133,37 @@ def self.get_filter_field(parent)
129
133
  field['type'] = filter['input'] if filter['input'].to_s.size > 5
130
134
  field['type'] ||= 'text_field'
131
135
  field['readonly'] = false # must be
132
- field['html'] ||= {}
133
- field['html']['size'] = 20
136
+ field['html'] ||= {}
137
+ field['html']['size'] = 20
134
138
  # Start with last entered value
135
139
  field['html']['value'] = filter['value'] unless filter['value'] == '#NIL'
136
140
  field['html']['selected'] = field['html']['value'] # for select field
137
141
  # url for filter ON action
138
142
  field['html']['data-url'] = parent.url_for(
139
- controller: 'cmsedit',action: :index, filter: 'on',
143
+ controller: 'cmsedit', action: :index, filter: 'on',
140
144
  table: parent.form['table'], form_name: parent.params['form_name'])
141
145
  url = field['html']['data-url']
142
146
  # remove if present
143
147
  field['with_new'] = nil if field['with_new']
144
- # create input field object
145
- klas_string = field['type'].camelize
146
- klas = DrgcmsFormFields::const_get(klas_string) rescue nil
147
- return '' if klas.nil?
148
- # return data from object and create html code to display field
149
- object = klas.new(parent, nil, field).render rescue nil
150
- # Error. Forget filter and return
151
- if object.nil?
152
- parent.session[ parent.form['table'] ][:filter] = nil
153
- return ''
148
+ # create input field object
149
+ html = ''
150
+ klass_string = field['type'].camelize
151
+ klass = DrgcmsFormFields::const_get(klass_string) rescue nil
152
+ # return data from object and create html code to display field
153
+ if klass
154
+ if drg_field = klass.new(parent, nil, field).render rescue nil
155
+ js = drg_field.js.blank? ? '' : parent.javascript_tag(drg_field.js)
156
+ html = %(<li class="no-background">
157
+ <span class="filter_field" data-url="#{url}">#{drg_field.html}
158
+ #{parent.fa_icon('search lg', class: 'record_filter_field_icon')}
159
+ #{js}</span></li>)
160
+ else
161
+ # Error. Forget filter
162
+ parent.session[ parent.form['table'] ][:filter] = nil
163
+ end
154
164
  end
155
- js = object.js.blank? ? '' : parent.javascript_tag(object.js)
156
- %Q[<li class="no-background">
157
- <span class="filter_field" data-url="#{url}">#{object.html}
158
- #{parent.fa_icon('search lg', class: 'record_filter_field_icon')}
159
- #{js}</span>
160
- </li>]
165
+ parent.form['readonly'] = saved_readonly
166
+ html
161
167
  end
162
168
 
163
169
  ######################################################################
@@ -38,7 +38,6 @@
38
38
  # route_name String Default route name for creating page link. ex. page. Leave blank if not used.
39
39
  # page_title String Default page title displayed in browser's top menu when title can not be extracted from document
40
40
  # document_extension String Default document extension eg. html
41
- # page_table String Name of table holding data for pages
42
41
  # page_class String Rails model class name which defines table holding pages data usually DcPage
43
42
  # site_layout String Rails layout used to draw response. This is by default content layout.
44
43
  # menu_class String Rails model class name which defines table holding menu data usually DcMenu
@@ -137,4 +137,11 @@ def self.prepare(key:, clear: nil)
137
137
  self.where(key: key)
138
138
  end
139
139
 
140
+ ########################################################################
141
+ # Order data by new key. Will update order field with values from new field
142
+ ########################################################################
143
+ def self.reorder_by(key, new_order)
144
+ self.where(key: key).each { |doc| doc.order = data[key]; doc.save }
145
+ end
146
+
140
147
  end