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.
- checksums.yaml +4 -4
- data/README.md +25 -10
- data/app/assets/fonts/ibm-plex-sans-300.woff2 +0 -0
- data/app/assets/fonts/ibm-plex-sans-400.woff2 +0 -0
- data/app/assets/fonts/ibm-plex-sans-500.woff2 +0 -0
- data/app/assets/fonts/ibm-plex-sans-600.woff2 +0 -0
- data/app/assets/fonts/ibm-plex-sans-700.woff2 +0 -0
- data/app/assets/fonts/ibm-plex-sans-italic.woff2 +0 -0
- data/app/assets/javascripts/drg_cms/drg_cms.js +178 -55
- data/app/assets/stylesheets/drg_cms/drg_cms.css +218 -94
- data/app/assets/stylesheets/drg_cms/select-multiple.css +1 -1
- data/app/controllers/cmsedit_controller.rb +29 -24
- data/app/controllers/dc_application_controller.rb +78 -166
- data/app/controllers/dc_common_controller.rb +56 -47
- data/app/controls/dc_help_control.rb +12 -0
- data/app/controls/dc_report.rb +7 -9
- data/app/controls/design_element_settings_control.rb +1 -1
- data/app/forms/all_options.yml +25 -6
- data/app/forms/dc_big_table.yml +0 -2
- data/app/forms/dc_big_table_value.yml +0 -2
- data/app/forms/dc_design.yml +1 -2
- data/app/forms/dc_folder_permission.yml +0 -2
- data/app/forms/dc_help_1.yml +2 -1
- data/app/forms/dc_json_ld.yml +0 -3
- data/app/forms/dc_menu.yml +6 -12
- data/app/forms/dc_menu_item.yml +1 -3
- data/app/forms/dc_page.yml +5 -2
- data/app/forms/dc_policy.yml +2 -5
- data/app/forms/dc_poll.yml +10 -16
- data/app/forms/dc_seo.yml +1 -2
- data/app/forms/dc_simple_menu.yml +1 -2
- data/app/forms/dc_site.yml +5 -7
- data/app/helpers/cms_common_helper.rb +2 -3
- data/app/helpers/cms_edit_helper.rb +41 -31
- data/app/helpers/cms_helper.rb +6 -6
- data/app/helpers/cms_index_helper.rb +79 -34
- data/app/helpers/dc_application_helper.rb +99 -85
- data/app/models/concerns/dc_page_concern.rb +3 -2
- data/app/models/concerns/dc_piece_concern.rb +1 -1
- data/app/models/concerns/dc_site_concern.rb +10 -4
- data/app/models/concerns/dc_user_concern.rb +3 -3
- data/app/models/dc_big_table.rb +2 -2
- data/app/models/dc_filter.rb +28 -22
- data/app/models/dc_site.rb +0 -1
- data/app/models/dc_temp.rb +7 -0
- data/app/models/drgcms_form_fields/comment.rb +11 -2
- data/app/models/drgcms_form_fields/date_picker.rb +2 -0
- data/app/models/drgcms_form_fields/drgcms_field.rb +2 -1
- data/app/models/drgcms_form_fields/embedded.rb +4 -2
- data/app/models/drgcms_form_fields/number_field.rb +4 -3
- data/app/models/drgcms_form_fields/readonly.rb +13 -17
- data/app/models/drgcms_form_fields/select.rb +16 -18
- data/app/models/drgcms_form_fields/text_autocomplete.rb +39 -23
- data/app/renderers/dc_page_renderer.rb +7 -6
- data/app/renderers/dc_poll_renderer.rb +16 -20
- data/app/views/cmsedit/_edit_stuff.html.erb +5 -2
- data/app/views/cmsedit/_form.html.erb +3 -2
- data/app/views/cmsedit/_result.html.erb +21 -18
- data/app/views/cmsedit/edit.html.erb +2 -1
- data/app/views/cmsedit/index.html.erb +1 -1
- data/app/views/cmsedit/new.html.erb +3 -2
- data/app/views/dc_common/_help.html.erb +12 -3
- data/app/views/layouts/cms.html.erb +3 -5
- data/config/locales/drgcms_en.yml +5 -2
- data/config/locales/drgcms_sl.yml +5 -2
- data/config/locales/models_en.yml +2 -0
- data/config/locales/models_sl.yml +5 -3
- data/drg_cms.gemspec +16 -16
- data/lib/drg_cms/version.rb +1 -1
- data/lib/drg_cms.rb +46 -12
- 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
|
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
|
-
|
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
|
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
|
-
# [
|
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(
|
448
|
-
|
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
|
472
|
-
|
473
|
-
doc.errors.
|
474
|
-
label = t("helpers.label.#{decamelize_type(doc.class)}.#{attribute}", attribute)
|
475
|
-
|
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
|
-
|
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
|
-
|
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 = %
|
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
|
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
|
-
|
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
|
-
|
683
|
-
|
684
|
-
|
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
|
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.
|
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
|
839
|
-
|
840
|
-
choices.
|
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
|
89
|
+
# Returns class object of page collection
|
91
90
|
########################################################################
|
92
91
|
def page_klass
|
93
|
-
|
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}".
|
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
|
data/app/models/dc_big_table.rb
CHANGED
@@ -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
|
data/app/models/dc_filter.rb
CHANGED
@@ -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?
|
119
|
-
|
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']
|
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
|
-
|
146
|
-
|
147
|
-
|
148
|
-
# return data from object and create html code to display field
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
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
|
-
|
156
|
-
|
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
|
######################################################################
|
data/app/models/dc_site.rb
CHANGED
@@ -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
|
data/app/models/dc_temp.rb
CHANGED
@@ -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
|