drg_cms 0.6.1.0 → 0.6.1.6

Sign up to get free protection for your applications and to get access to all the features.
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