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.
- 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
|