drg_cms 0.4.39 → 0.4.53
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +49 -0
- data/app/assets/images/drg_cms/file_manager.png +0 -0
- data/app/assets/javascripts/drg_cms/drg_cms.js +8 -8
- data/app/assets/stylesheets/drg_cms/drg_cms.css +22 -20
- data/app/controllers/cmsedit_controller.rb +170 -114
- data/app/controllers/dc_application_controller.rb +142 -56
- data/app/controllers/dc_common_controller.rb +56 -34
- data/app/controllers/dc_main_controller.rb +1 -4
- data/app/controllers/drgcms_controls/dc_page_controls.rb +3 -0
- data/app/forms/all_options.yml +3 -0
- data/app/forms/cms_menu.yml +100 -117
- data/app/forms/dc_design.yml +1 -1
- data/app/forms/dc_ident.yml +37 -0
- data/app/forms/dc_menu_item.yml +1 -1
- data/app/forms/dc_permission.yml +1 -1
- data/app/forms/dc_site.yml +4 -0
- data/app/helpers/cmsedit_helper.rb +44 -80
- data/app/helpers/dc_ad_renderer.rb +27 -15
- data/app/helpers/dc_application_helper.rb +433 -196
- data/app/helpers/dc_big_menu_renderer.rb +40 -40
- data/app/helpers/dc_captcha_renderer.rb +38 -25
- data/app/helpers/dc_common_renderer.rb +15 -48
- data/app/helpers/dc_menu_renderer.rb +30 -20
- data/app/helpers/dc_page_renderer.rb +14 -18
- data/app/helpers/dc_part_renderer.rb +45 -16
- data/app/helpers/dc_piece_renderer.rb +23 -29
- data/app/helpers/dc_poll_renderer.rb +31 -20
- data/app/helpers/dc_renderer.rb +5 -4
- data/app/helpers/dc_simple_menu_renderer.rb +90 -68
- data/app/models/{__dc_global_data.rb → __dc_stat.rb} +20 -21
- data/app/models/dc_ad.rb +13 -1
- data/app/models/dc_ad_stat.rb +6 -0
- data/app/models/dc_big_menu.rb +15 -2
- data/app/models/dc_big_table.rb +27 -4
- data/app/models/dc_big_table_locale.rb +7 -0
- data/app/models/dc_big_table_value.rb +7 -0
- data/app/models/dc_category.rb +9 -3
- data/app/models/dc_design.rb +50 -0
- data/app/models/dc_dummy.rb +41 -1
- data/app/models/dc_folder_permission.rb +9 -2
- data/app/models/{dc_global_data.rb → dc_ident.rb} +20 -22
- data/app/models/dc_journal.rb +9 -1
- data/app/models/dc_key_value_store.rb +41 -4
- data/app/models/dc_link.rb +7 -0
- data/app/models/dc_menu.rb +20 -3
- data/app/models/dc_menu_item.rb +7 -0
- data/app/models/dc_page.rb +31 -12
- data/app/models/dc_part.rb +34 -4
- data/app/models/dc_permission.rb +32 -12
- data/app/models/dc_piece.rb +32 -4
- data/app/models/dc_policy.rb +17 -11
- data/app/models/dc_policy_role.rb +12 -7
- data/app/models/dc_policy_rule.rb +32 -4
- data/app/models/dc_poll.rb +8 -0
- data/app/models/dc_poll_item.rb +6 -0
- data/app/models/dc_simple_menu.rb +18 -3
- data/app/models/dc_simple_menu_item.rb +20 -2
- data/app/models/dc_site.rb +13 -3
- data/app/models/dc_stat.rb +8 -1
- data/app/models/dc_user.rb +18 -2
- data/app/models/dc_user_role.rb +7 -0
- data/app/models/dc_visit.rb +5 -0
- data/app/{helpers → models}/drgcms_form_field.rb +171 -73
- data/app/views/__dc_at_the_beginning/create.html.erb +9 -0
- data/app/views/__dc_at_the_beginning/index.html.erb +19 -0
- data/app/views/cmsedit/_edit_stuff.html.erb +2 -0
- data/app/views/cmsedit/_form.html.erb +0 -1
- data/app/views/dc_mail/subscribe.html.erb +0 -0
- data/config/initializers/kaminari_patch.rb +5 -4
- data/config/locales/drgcms_en.yml +4 -0
- data/config/locales/drgcms_sl.yml +1 -0
- data/config/locales/models_en.yml +14 -3
- data/config/locales/models_sl.yml +13 -4
- data/drg_cms.gemspec +4 -4
- data/lib/drg_cms.rb +37 -8
- data/lib/drg_cms/engine.rb +2 -2
- data/lib/drg_cms/version.rb +3 -2
- data/lib/tasks/at_the_beginning.yml +0 -0
- data/lib/tasks/dc_at_the_beginning.rake +118 -0
- data/lib/tasks/dc_cleanup.rake +19 -7
- data/lib/tasks/log_statistics.rb +66 -0
- data/lib/tasks/site_statistics.rake +29 -12
- data/test/dummy/app/controllers/application_controller.rb +1 -1
- data/test/dummy/app/helpers/application_helper.rb +1 -1
- metadata +15 -26
- data/README.rdoc +0 -3
- data/app/controllers/dc_at_the_beginning_controller.rb +0 -120
- data/app/controllers/dc_mail_controller.rb +0 -89
- data/app/forms/dc_forum_cat.yml +0 -54
- data/app/forms/dc_forum_forum.yml +0 -53
- data/app/forms/dc_forum_msg.yml +0 -124
- data/app/forms/dc_forum_privmsg.yml +0 -125
- data/app/forms/dc_forum_topic.yml +0 -131
- data/app/forms/dc_mail.yml +0 -88
- data/app/forms/dc_mail_address.yml +0 -56
- data/app/forms/dc_mail_list.yml +0 -44
- data/app/forms/dc_mail_list_member.yml +0 -42
- data/app/helpers/dc_mail_renderer.rb +0 -76
- data/app/models/dc_mail.rb +0 -64
- data/app/models/dc_mail_address.rb +0 -69
- data/app/models/dc_mail_list.rb +0 -48
- data/app/models/dc_mail_list_member.rb +0 -34
- data/app/models/dc_sendmail.rb +0 -48
@@ -22,6 +22,15 @@
|
|
22
22
|
#++
|
23
23
|
|
24
24
|
########################################################################
|
25
|
+
# Page renderer renders data from dc_page collection documents. This renderer will
|
26
|
+
# almost certainly be replaced by your own renderer so example here shows just basic code
|
27
|
+
# which just checks if user is allowed to view data and if so returns document body content
|
28
|
+
# otherwise returns error message defined in site policy.
|
29
|
+
#
|
30
|
+
# Example:
|
31
|
+
# <div id="page">
|
32
|
+
# <%= dc_render(:dc_page) %>
|
33
|
+
# </div>
|
25
34
|
#
|
26
35
|
########################################################################
|
27
36
|
class DcPageRenderer
|
@@ -29,29 +38,16 @@ class DcPageRenderer
|
|
29
38
|
include DcApplicationHelper
|
30
39
|
|
31
40
|
########################################################################
|
32
|
-
#
|
41
|
+
# Object initialization.
|
33
42
|
########################################################################
|
34
|
-
def initialize( parent, opts={} )
|
43
|
+
def initialize( parent, opts={} ) #:nodoc:
|
35
44
|
@parent = parent
|
36
45
|
@opts = opts
|
37
46
|
@page = @parent.page
|
38
47
|
end
|
39
48
|
|
40
|
-
=begin
|
41
|
-
#########################################################################
|
42
|
-
# Return code for editing this piece.
|
43
|
-
########################################################################
|
44
|
-
def link_4edit()
|
45
|
-
html = ''
|
46
|
-
if @opts[:edit_mode] > 1
|
47
|
-
html << dc_page_edit_menu() # @opts[:editparams] )
|
48
|
-
end
|
49
|
-
html
|
50
|
-
end
|
51
|
-
=end
|
52
|
-
|
53
49
|
#########################################################################
|
54
|
-
#
|
50
|
+
# Default DcPage render method
|
55
51
|
#########################################################################
|
56
52
|
def default
|
57
53
|
can_view, msg = dc_user_can_view(@parent, @page)
|
@@ -63,7 +59,7 @@ def default
|
|
63
59
|
end
|
64
60
|
|
65
61
|
#########################################################################
|
66
|
-
#
|
62
|
+
# Renderer dispatcher. Method returns HTML part of code.
|
67
63
|
########################################################################
|
68
64
|
def render_html
|
69
65
|
method = @opts[:method] || 'default'
|
@@ -71,7 +67,7 @@ def render_html
|
|
71
67
|
end
|
72
68
|
|
73
69
|
########################################################################
|
74
|
-
#
|
70
|
+
# Return CSS part of code.
|
75
71
|
########################################################################
|
76
72
|
def render_css
|
77
73
|
@page.css
|
@@ -22,16 +22,31 @@
|
|
22
22
|
#++
|
23
23
|
|
24
24
|
########################################################################
|
25
|
-
#
|
25
|
+
# Renders one or multiple parts grouped by div_id field.
|
26
|
+
# Parts are scoped from design, page and dc_pieces documents.
|
27
|
+
#
|
28
|
+
# Example (as used in design):
|
29
|
+
# <div id='div-main'>
|
30
|
+
# <div id='div-left'> <%= dc_render(:dc_part, position: 'left') %></div>
|
31
|
+
# <div id='page'> <%= dc_render(:dc_page) %></div>
|
32
|
+
# <div id='div-right'>
|
33
|
+
# <%= dc_render(:dc_part, method: 'in_page', name: 'welcome')
|
34
|
+
# <%= dc_render(:dc_part, position: 'right')</div>
|
35
|
+
# </div>
|
36
|
+
# </div>
|
37
|
+
#
|
38
|
+
# Main page division in example is divided into 3 divisions. div-left, page and div-right.
|
39
|
+
# div-left and div-right are populated with parts containing 'left' and 'right' div_id value.
|
40
|
+
# In addition part with name 'welcome' is located above 'right' parts.
|
26
41
|
########################################################################
|
27
42
|
class DcPartRenderer
|
28
43
|
|
29
44
|
include DcApplicationHelper
|
30
45
|
|
31
46
|
########################################################################
|
32
|
-
#
|
47
|
+
# Object initialization.
|
33
48
|
########################################################################
|
34
|
-
def initialize( parent, opts={} )
|
49
|
+
def initialize( parent, opts={} ) #:nodoc:
|
35
50
|
@parent = parent
|
36
51
|
@opts = opts
|
37
52
|
@part_css = ''
|
@@ -39,7 +54,8 @@ def initialize( parent, opts={} )
|
|
39
54
|
end
|
40
55
|
|
41
56
|
########################################################################
|
42
|
-
#
|
57
|
+
# Method returns output from single part(icle). It checks if policy allows part to
|
58
|
+
# be viewed on page and ads links for editing when in edit mode.
|
43
59
|
########################################################################
|
44
60
|
def render_particle(particle, opts)
|
45
61
|
# Check if policy allows to view page
|
@@ -64,9 +80,10 @@ def render_particle(particle, opts)
|
|
64
80
|
end
|
65
81
|
|
66
82
|
########################################################################
|
67
|
-
# Load parts defined in design, page or
|
83
|
+
# Load all parts defined in design, page or piece collection into memory.
|
84
|
+
# Subroutine of default method.
|
68
85
|
########################################################################
|
69
|
-
def load_parts
|
86
|
+
def load_parts #:nodoc:
|
70
87
|
@parent.parts = []
|
71
88
|
# Start with parts in design. Collect to array and add values needed for editing
|
72
89
|
if @parent.design
|
@@ -87,15 +104,26 @@ def load_parts
|
|
87
104
|
end
|
88
105
|
|
89
106
|
########################################################################
|
90
|
-
# Default
|
91
|
-
#
|
107
|
+
# Default method collects all parts with the div_id field value defined by position option.
|
108
|
+
# If more then one parts have same div_id they will be sorted by order field. Method
|
109
|
+
# also loads all parts from design, page and pieces collections and cache them for
|
110
|
+
# consecutive calls.
|
111
|
+
#
|
112
|
+
# Options:
|
113
|
+
# [position] String. Position (value of div_id) where parts will be rendered.
|
114
|
+
#
|
115
|
+
# Example (as used in design):
|
116
|
+
# <div id='div-right'>
|
117
|
+
# <%= dc_render(:dc_part, position: 'right')
|
118
|
+
# </div>
|
92
119
|
########################################################################
|
93
120
|
def default
|
94
121
|
html = ''
|
95
122
|
# Load all parts only once per call
|
96
123
|
load_parts if @parent.parts.nil?
|
97
124
|
p 'DcPart: Parameter location will be deprecated! Please use position keyword.' if @opts['location']
|
98
|
-
|
125
|
+
|
126
|
+
@opts[:position] ||= @opts['position'] # symbols are not strings. Ensure that it works.
|
99
127
|
# Select parts
|
100
128
|
parts = []
|
101
129
|
@parent.parts.each { |v| parts << v if v[0].div_id == @opts[:position] }
|
@@ -113,13 +141,14 @@ def default
|
|
113
141
|
end
|
114
142
|
|
115
143
|
########################################################################
|
116
|
-
# This method will search and render single part defined in
|
117
|
-
# be defined in current page or in any page in
|
144
|
+
# This method will search and render single part defined in pages file. Part may
|
145
|
+
# be defined in current page document or in any page document in found in pages file. Parameters
|
146
|
+
# are send through options hash.
|
118
147
|
#
|
119
148
|
# Options:
|
120
|
-
#
|
121
|
-
#
|
122
|
-
#
|
149
|
+
# [name] String. dc_parts name.
|
150
|
+
# [page_id] String. Page document _id where part document is saved. Defaults to current page.
|
151
|
+
# [page_link] String. Page may alternatively be found by subject_link field.
|
123
152
|
########################################################################
|
124
153
|
def in_page
|
125
154
|
# Part is in page with id
|
@@ -145,7 +174,7 @@ def in_page
|
|
145
174
|
end
|
146
175
|
|
147
176
|
########################################################################
|
148
|
-
#
|
177
|
+
# Renderer dispatcher. Method returns HTML part of code.
|
149
178
|
########################################################################
|
150
179
|
def render_html
|
151
180
|
method = @opts[:method] || 'default'
|
@@ -153,7 +182,7 @@ def render_html
|
|
153
182
|
end
|
154
183
|
|
155
184
|
########################################################################
|
156
|
-
#
|
185
|
+
# Return CSS part of code.
|
157
186
|
########################################################################
|
158
187
|
def render_css
|
159
188
|
@part_css
|
@@ -22,6 +22,12 @@
|
|
22
22
|
#++
|
23
23
|
|
24
24
|
########################################################################
|
25
|
+
# Piece renderer renders data from dc_piece collection documents.
|
26
|
+
#
|
27
|
+
# Example:
|
28
|
+
# <div id="page">
|
29
|
+
# <%= dc_render(:dc_piece, :name => 'some_piece') %>
|
30
|
+
# </div>
|
25
31
|
#
|
26
32
|
########################################################################
|
27
33
|
class DcPieceRenderer
|
@@ -29,9 +35,9 @@ class DcPieceRenderer
|
|
29
35
|
include DcApplicationHelper
|
30
36
|
|
31
37
|
########################################################################
|
32
|
-
#
|
38
|
+
# Object initialization. It also loads requested dc_piece document.
|
33
39
|
########################################################################
|
34
|
-
def initialize( parent, opts={} )
|
40
|
+
def initialize( parent, opts={} ) #:nodoc:
|
35
41
|
@parent = parent
|
36
42
|
@opts = opts
|
37
43
|
@piece = DcPiece.find(opts[:id]) if opts[:id]
|
@@ -46,36 +52,24 @@ def initialize( parent, opts={} )
|
|
46
52
|
end
|
47
53
|
|
48
54
|
#########################################################################
|
49
|
-
# Return code for editing this piece.
|
55
|
+
# Return link code for editing this piece.
|
50
56
|
########################################################################
|
51
57
|
def link_4edit()
|
52
58
|
html = ''
|
53
|
-
if @opts[:edit_mode]
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
end
|
61
|
-
html
|
62
|
-
end
|
63
|
-
|
64
|
-
########################################################################
|
65
|
-
# script renderer expects rails erb code (view) in the script field.
|
66
|
-
#
|
67
|
-
# Usefull when you have many designs which have lots pieces of code in common.
|
68
|
-
########################################################################
|
69
|
-
def script
|
70
|
-
html = link_4edit()
|
71
|
-
html << @parent.render(inline: @piece.script, layout: @opts[:layout])
|
59
|
+
return html if @opts[:edit_mode] < 2
|
60
|
+
@opts[:editparams].merge!( { table: 'dc_piece',
|
61
|
+
controller: 'cmsedit',
|
62
|
+
action: 'edit',
|
63
|
+
id: @piece.id,
|
64
|
+
title: "#{t('drgcms.edit')}: #{@piece.name}" } )
|
65
|
+
html << dc_link_for_edit( @opts[:editparams] )
|
72
66
|
end
|
73
67
|
|
74
68
|
########################################################################
|
75
|
-
#
|
76
|
-
# Used for designs with common code and one part which is different.
|
77
|
-
# It
|
78
|
-
#
|
69
|
+
# Script renderer method expects rails erb code (view) in the script field.
|
70
|
+
# Used for designs with common code which can be shared and one part which is different.
|
71
|
+
# It's functionality can be replaced with dc_replace_in_design method with 'piece' option
|
72
|
+
# specified.
|
79
73
|
#
|
80
74
|
# Example: As used in design. Backslashing < and % is important \<\%
|
81
75
|
# <% part = "<div class='some-class'>\<\%= dc_render(:my_renderer, method: 'render_method') \%\></div>" %>
|
@@ -98,7 +92,7 @@ def script
|
|
98
92
|
end
|
99
93
|
|
100
94
|
#########################################################################
|
101
|
-
#
|
95
|
+
# Default DcPiece render method.
|
102
96
|
########################################################################
|
103
97
|
def default
|
104
98
|
html = link_4edit()
|
@@ -106,7 +100,7 @@ def default
|
|
106
100
|
end
|
107
101
|
|
108
102
|
#########################################################################
|
109
|
-
#
|
103
|
+
# Renderer dispatcher. Method returns HTML part of code.
|
110
104
|
########################################################################
|
111
105
|
def render_html
|
112
106
|
return "DcPiece #{@opts[:id]} #{@opts[:name]} not found!" unless @piece
|
@@ -115,7 +109,7 @@ def render_html
|
|
115
109
|
end
|
116
110
|
|
117
111
|
########################################################################
|
118
|
-
#
|
112
|
+
# Return CSS part of code.
|
119
113
|
########################################################################
|
120
114
|
def render_css
|
121
115
|
@piece ? "#{@piece.css}" : ''
|
@@ -22,7 +22,8 @@
|
|
22
22
|
#++
|
23
23
|
|
24
24
|
########################################################################
|
25
|
-
#
|
25
|
+
# Renders code for displaying a poll. Polls may replace forms when user interaction
|
26
|
+
# is required in browser.
|
26
27
|
########################################################################
|
27
28
|
class DcPollRenderer
|
28
29
|
|
@@ -32,9 +33,9 @@ include ActionView::Helpers::FormHelper # for form hepers
|
|
32
33
|
include ActionView::Helpers::FormOptionsHelper # for select helper
|
33
34
|
|
34
35
|
########################################################################
|
35
|
-
#
|
36
|
+
# Object initialization.
|
36
37
|
########################################################################
|
37
|
-
def initialize( parent, opts={} )
|
38
|
+
def initialize( parent, opts={} ) #:nodoc:
|
38
39
|
@parent = parent
|
39
40
|
@opts = opts
|
40
41
|
@part_css = ''
|
@@ -42,14 +43,14 @@ def initialize( parent, opts={} )
|
|
42
43
|
end
|
43
44
|
|
44
45
|
########################################################################
|
45
|
-
# Dummy params method
|
46
|
+
# Dummy params method for accesing session params object from form.
|
46
47
|
########################################################################
|
47
48
|
def params
|
48
49
|
@parent.params
|
49
50
|
end
|
50
51
|
|
51
52
|
########################################################################
|
52
|
-
#
|
53
|
+
# Outputs code required for poll item. Subroutine of default method.
|
53
54
|
########################################################################
|
54
55
|
def do_one_item(poll, yaml)
|
55
56
|
html = ''
|
@@ -118,9 +119,9 @@ def do_one_item(poll, yaml)
|
|
118
119
|
end
|
119
120
|
|
120
121
|
########################################################################
|
121
|
-
#
|
122
|
+
# Default poll renderer method. Renders data for specified pool.
|
122
123
|
########################################################################
|
123
|
-
def
|
124
|
+
def default
|
124
125
|
# poll_id may be defined in params or opts
|
125
126
|
poll_id = @parent.params[:poll_id] || @opts[:poll_id]
|
126
127
|
return '<br>Poll id is not defined?<br>' if poll_id.nil?
|
@@ -182,35 +183,45 @@ def render_html
|
|
182
183
|
items.each do |item|
|
183
184
|
next unless item.active # disabled items
|
184
185
|
# convert options to yaml
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
(
|
190
|
-
|
191
|
-
|
186
|
+
yaml = YAML.load(item.options) || {}
|
187
|
+
yaml['name'] = item.name
|
188
|
+
yaml['html'] ||= {}
|
189
|
+
yaml['html']['size'] = item.size
|
190
|
+
(yaml['html']['class'] ||= 'poll-submit') if item.type == 'submit_tag'
|
191
|
+
yaml['text'] = item.text
|
192
|
+
yaml['mandatory'] = item.mandatory
|
192
193
|
# y['options'] = item.options
|
193
|
-
|
194
|
-
html << do_one_item(poll,
|
194
|
+
yaml['type'] = item.type
|
195
|
+
html << do_one_item(poll, yaml)
|
195
196
|
end
|
196
197
|
# Form. Just call do_one_item for each form item
|
197
198
|
else
|
198
|
-
|
199
|
+
yaml = YAML.load(poll.form.gsub(' ',' ')) # very annoying. They come with copy&paste ;-)
|
199
200
|
# if entered without numbering yaml is returned as Hash otherwise as Array
|
200
|
-
|
201
|
+
yaml.each { |i| html << do_one_item(poll, (i.class == Hash ? i : i.last)) } #
|
201
202
|
end
|
202
203
|
# hide some fields usefull as parameters
|
203
|
-
|
204
|
+
# was html << @parent.hidden_field_tag('return_to', @opts[:return_to] || @parent.params[:return_to] || '/')
|
205
|
+
html << @parent.hidden_field_tag('return_to', @opts[:return_to] || @parent.params[:return_to] || @parent.request.url)
|
204
206
|
html << @parent.hidden_field_tag('return_to_error', @parent.request.url )
|
205
207
|
html << @parent.hidden_field_tag('poll_id', poll_id )
|
206
208
|
html << @parent.hidden_field_tag('page_id', @parent.page.id )
|
207
209
|
html << "</form><br /></div>"
|
210
|
+
|
208
211
|
@part_css = poll.css
|
209
212
|
html
|
210
213
|
end
|
211
214
|
|
212
215
|
########################################################################
|
213
|
-
#
|
216
|
+
# Renderer dispatcher. Method returns HTML part of code.
|
217
|
+
########################################################################
|
218
|
+
def render_html
|
219
|
+
method = @opts[:method] || 'default'
|
220
|
+
respond_to?(method) ? send(method) : "Error DcPoll: Method #{method} doesn't exist!"
|
221
|
+
end
|
222
|
+
|
223
|
+
########################################################################
|
224
|
+
# Return CSS part of code.
|
214
225
|
########################################################################
|
215
226
|
def render_css
|
216
227
|
@part_css
|
data/app/helpers/dc_renderer.rb
CHANGED
@@ -22,12 +22,13 @@
|
|
22
22
|
#++
|
23
23
|
|
24
24
|
########################################################################
|
25
|
-
#
|
25
|
+
# This is abstract renderer class definition which can be reused by other
|
26
|
+
# renders.
|
26
27
|
########################################################################
|
27
28
|
class DcRenderer
|
28
29
|
|
29
30
|
########################################################################
|
30
|
-
#
|
31
|
+
# Object initialization.
|
31
32
|
########################################################################
|
32
33
|
def initialize( parent, opts={} )
|
33
34
|
@parent = parent
|
@@ -37,7 +38,7 @@ def initialize( parent, opts={} )
|
|
37
38
|
end
|
38
39
|
|
39
40
|
########################################################################
|
40
|
-
#
|
41
|
+
# Renderer dispatcher. Method returns HTML part of code.
|
41
42
|
########################################################################
|
42
43
|
def render_html
|
43
44
|
can_view, msg = @parent.dc_user_can_view(@parent, @parent.page)
|
@@ -47,7 +48,7 @@ def render_html
|
|
47
48
|
end
|
48
49
|
|
49
50
|
########################################################################
|
50
|
-
#
|
51
|
+
# Return CSS part of code.
|
51
52
|
########################################################################
|
52
53
|
def render_css
|
53
54
|
@css
|
@@ -23,13 +23,19 @@
|
|
23
23
|
#++
|
24
24
|
|
25
25
|
########################################################################
|
26
|
-
#
|
26
|
+
# Before dc_menu dc_simple_menu was the way to provide menu system. Renderer
|
27
|
+
# provides 3 different renderer methods: default, as_dropdown, as_table.
|
28
|
+
#
|
29
|
+
# Example (as used in design):
|
30
|
+
# dc_render(:dc_simple_menu, name: 'my_menu', method: 'as_table')
|
31
|
+
#
|
32
|
+
# If name parameter is omitted it must be provided in site document menu_name field.
|
27
33
|
########################################################################
|
28
34
|
class DcSimpleMenuRenderer
|
29
35
|
|
30
36
|
include DcApplicationHelper
|
31
37
|
########################################################################
|
32
|
-
#
|
38
|
+
# Object initialization.
|
33
39
|
########################################################################
|
34
40
|
def initialize( parent, opts )
|
35
41
|
@parent = parent
|
@@ -40,35 +46,40 @@ def initialize( parent, opts )
|
|
40
46
|
end
|
41
47
|
|
42
48
|
########################################################################
|
43
|
-
# Return selected
|
49
|
+
# Return selected top level menu document. Subroutine of menu renders.
|
44
50
|
########################################################################
|
45
|
-
def find_selected
|
51
|
+
def find_selected #:nodoc:
|
46
52
|
ret = @menu.dc_simple_menu_items.find( @parent.page.menu_id ) if @parent.page.menu_id
|
47
53
|
# return first if not found (something is wrong)
|
48
54
|
ret ||= @menu.dc_simple_menu_items[0]
|
49
55
|
end
|
50
56
|
|
51
57
|
########################################################################
|
52
|
-
# Creates edit
|
58
|
+
# Creates edit icon for menu if in edit mode.
|
53
59
|
########################################################################
|
54
|
-
def link_4edit
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
+
def link_4edit() #:nodoc:
|
61
|
+
html = ''
|
62
|
+
return html unless @opts[:edit_mode] > 1
|
63
|
+
#
|
64
|
+
@opts[:editparams].merge!( { table: 'dc_simple_menu', controller: 'cmsedit', action: 'edit' } )
|
65
|
+
title = "#{t('drgcms.edit')}: "
|
66
|
+
if @menu # edit, when menu exists
|
67
|
+
@opts[:editparams].merge!( { id: @menu.id, title: "#{title}#{@menu.name}" } )
|
68
|
+
else # list available menus when menu does not yet exist
|
60
69
|
title << t('helpers.label.dc_simple_menu.tabletitle')
|
61
|
-
@opts[:editparams].merge!( { action: 'index', title: title })
|
62
|
-
c << dc_link_for_edit( @opts[:editparams] )
|
70
|
+
@opts[:editparams].merge!( { action: 'index', title: title })
|
63
71
|
end
|
64
|
-
|
72
|
+
html << dc_link_for_edit( @opts[:editparams] )
|
65
73
|
end
|
66
74
|
|
67
75
|
########################################################################
|
68
|
-
# Returns html code required for link in a menu.
|
76
|
+
# Returns html code required for creating one link in a menu.
|
77
|
+
#
|
78
|
+
# Parameters:
|
79
|
+
# [item] SimpleMenuItem.
|
69
80
|
########################################################################
|
70
81
|
def link_4menu(item)
|
71
|
-
#
|
82
|
+
# Link should start with /
|
72
83
|
item.link = ((item.link[0,1] == '/' ? '' : '/') + item.link) unless item.link.match('http:')
|
73
84
|
target = item.target.blank? ? nil : item.target
|
74
85
|
if item.caption.match('pic:')
|
@@ -84,54 +95,59 @@ def link_4menu(item)
|
|
84
95
|
end
|
85
96
|
|
86
97
|
########################################################################
|
87
|
-
# Renders menu as table.
|
98
|
+
# Renders menu as table. This is single level menu only and uses table elements to
|
99
|
+
# display menu options evenly justified.
|
88
100
|
########################################################################
|
89
101
|
def as_table
|
90
|
-
|
91
|
-
return "#{
|
102
|
+
html = link_4edit
|
103
|
+
return "#{html}#{@opts[:name]}<br>Menu not found!" if @menu.nil?
|
92
104
|
#
|
93
105
|
@selected = find_selected
|
94
|
-
|
106
|
+
# use div_name if specified otherwise menu.name
|
107
|
+
div_name = (@menu.div_name.to_s.size > 2 ? @menu.div_name : @menu.name).downcase
|
108
|
+
html << "<table class=\"#{div_name}\"><tr>"
|
95
109
|
# sort items acording to :order
|
96
|
-
items = @menu.dc_simple_menu_items.sort {|a,b| a.order <=> b.order}
|
110
|
+
# items = @menu.dc_simple_menu_items.sort {|a,b| a.order <=> b.order}
|
111
|
+
items = @menu.dc_simple_menu_items.where(active: true).order(order: 1)
|
97
112
|
items.each do |item|
|
98
|
-
next unless item.active
|
99
113
|
# menu can be hidden from user
|
100
114
|
can_view, msg = dc_user_can_view(@parent, item)
|
101
115
|
next unless can_view
|
102
116
|
|
103
|
-
klas = item.id == @selected.id ? "#{
|
104
|
-
|
117
|
+
klas = item.id == @selected.id ? "#{div_name}-selected" : "#{div_name}-item"
|
118
|
+
html << "<td class=\"td-#{klas}\">#{ link_4menu(item) }</td>" #
|
105
119
|
end
|
106
|
-
|
120
|
+
html << "</table>"
|
107
121
|
end
|
108
122
|
|
109
123
|
########################################################################
|
110
|
-
# Creates menu with single level dropdown menu
|
124
|
+
# Creates menu with single level dropdown menu. This is older version of method which
|
125
|
+
# also provided select field for selecting menu if mobile device is beeing detected.
|
111
126
|
########################################################################
|
112
127
|
def as_dropdown_old
|
113
|
-
|
114
|
-
return "#{
|
128
|
+
html = link_4edit
|
129
|
+
return "#{html}#{@opts[:name]}<br>Menu not found!" if @menu.nil?
|
115
130
|
#
|
116
131
|
items = @menu.dc_simple_menu_items.sort {|a,b| a.order <=> b.order}
|
117
132
|
# CSS dropdown-s don't work very well on mobiles. Create simple select menu instead
|
118
133
|
if @parent.session[:is_mobile] == 1
|
119
|
-
|
120
|
-
|
121
|
-
|
134
|
+
html << "<div class=\"#{@menu.name.downcase}-mobile\">\n"
|
135
|
+
html << '<select onchange="window.location.href=this.options[this.selectedIndex].value">'
|
136
|
+
html << "<option value=\"\">#{t('drgcms.simple_menu_mobile_menu_text',' M E N U ')}</option>"
|
137
|
+
#
|
122
138
|
items.each do |item|
|
123
139
|
next unless item.active
|
124
140
|
# menu can be hidden from user
|
125
141
|
can_view, msg = dc_user_can_view(@parent, item)
|
126
142
|
next unless can_view
|
127
|
-
|
143
|
+
html << "<option value=\"#{item.link}\">#{item.caption}</option>"
|
128
144
|
y = YAML.load(item.submenu) || {}
|
129
|
-
y.each { |k,v|
|
145
|
+
y.each { |k,v| html << "<option value=\"#{v['link']}\">--#{v['title']}</option>" }
|
130
146
|
end
|
131
|
-
|
147
|
+
html << "</select>\n</div>\n"
|
132
148
|
else
|
133
149
|
@selected = find_selected
|
134
|
-
|
150
|
+
html << "<table class=\"#{@menu.name.downcase}\"><tr>"
|
135
151
|
# sort items acording to :order
|
136
152
|
items.each do |item|
|
137
153
|
next unless item.active
|
@@ -141,33 +157,33 @@ def as_dropdown_old
|
|
141
157
|
|
142
158
|
klas = item.id == @selected.id ? 'menu-selected' : 'menu-item'
|
143
159
|
# caption = item.caption.match('pic:') ? @parent.image_tag(item.caption.sub('pic:','')) : item.caption
|
144
|
-
|
160
|
+
html << "<td class=\"td-#{klas}\">#{ link_4menu(item) }"
|
145
161
|
y = YAML.load(item.submenu) || {}
|
146
162
|
if y.size > 0
|
147
|
-
|
163
|
+
html << '<ul>'
|
148
164
|
y.each do |k,v|
|
149
|
-
|
165
|
+
html << "<li>#{@parent.link_to(v['title'], v['link'], {target: v['target']})}</li>"
|
150
166
|
end
|
151
|
-
|
167
|
+
html << '</ul>'
|
152
168
|
end
|
153
|
-
|
169
|
+
html << '</td>'
|
154
170
|
end
|
155
|
-
|
171
|
+
html << '</tr></table>'
|
156
172
|
end
|
157
173
|
end
|
158
174
|
|
159
175
|
########################################################################
|
160
|
-
# Creates menu with single level dropdown menu
|
176
|
+
# Creates menu with single level dropdown menu.
|
161
177
|
########################################################################
|
162
178
|
def as_dropdown
|
163
|
-
|
164
|
-
return "#{
|
179
|
+
html = link_4edit
|
180
|
+
return "#{html}#{@opts[:name]}<br>Menu not found!" if @menu.nil?
|
165
181
|
#
|
166
182
|
items = @menu.dc_simple_menu_items.sort {|a,b| a.order <=> b.order}
|
167
183
|
@selected = find_selected
|
168
184
|
|
169
|
-
|
170
|
-
|
185
|
+
html << "<div id='#{@menu.div_name}'>" unless @menu.div_name.blank?
|
186
|
+
html << '<table><tr>'
|
171
187
|
# sort items acording to :order
|
172
188
|
items.each do |item|
|
173
189
|
next unless item.active
|
@@ -176,33 +192,39 @@ def as_dropdown
|
|
176
192
|
next unless can_view
|
177
193
|
#
|
178
194
|
selector = item.id == @selected.id ? 'th' : 'td'
|
179
|
-
|
195
|
+
html << "<#{selector}>#{ link_4menu(item) }"
|
180
196
|
y = YAML.load(item.submenu) || {}
|
181
197
|
if y.size > 0
|
182
|
-
|
198
|
+
html << '<ul>'
|
183
199
|
y.each do |k,v|
|
184
|
-
|
200
|
+
html << "<li>#{@parent.link_to(v['title'], v['link'], {target: v['target']})}</li>"
|
185
201
|
end
|
186
|
-
|
202
|
+
html << '</ul>'
|
187
203
|
end
|
188
|
-
|
204
|
+
html << "</#{selector}>"
|
189
205
|
|
190
206
|
end
|
191
|
-
|
192
|
-
|
193
|
-
|
207
|
+
html << '</tr></table>'
|
208
|
+
html << '</div>' unless @menu.div_name.blank?
|
209
|
+
html
|
194
210
|
end
|
195
211
|
|
196
212
|
########################################################################
|
197
|
-
#
|
213
|
+
# Default renderer provides top menu menu with submenu items displayed in a line (div) below.
|
214
|
+
#
|
215
|
+
# Top menu and submenu items are styled separately. If div_name is specified in
|
216
|
+
# menu document it will be used in div, ul and li CSS names of generated HTML code.
|
217
|
+
# If div_name is not defined then document name will be used.
|
198
218
|
########################################################################
|
199
219
|
def default
|
200
|
-
|
201
|
-
return "#{
|
220
|
+
html = link_4edit
|
221
|
+
return "#{html}#{@opts[:name]}<br>Menu not found!" if @menu.nil?
|
202
222
|
#
|
203
223
|
@selected = find_selected
|
204
|
-
|
205
|
-
|
224
|
+
# use div_name if specified otherwise menu.name
|
225
|
+
div_name = (@menu.div_name.to_s.size > 2 ? @menu.div_name : @menu.name).downcase
|
226
|
+
html << "<div class=\"#{div_name}\">"
|
227
|
+
html << "<ul class=\"ul-#{div_name}\">"
|
206
228
|
# sort items acording to :order
|
207
229
|
items = @menu.dc_simple_menu_items.sort {|a,b| a.order <=> b.order}
|
208
230
|
items.each do |item|
|
@@ -211,23 +233,23 @@ def default
|
|
211
233
|
can_view, msg = dc_user_can_view(@parent, item)
|
212
234
|
next unless can_view
|
213
235
|
|
214
|
-
klas = item.id == @selected.id ? "#{
|
215
|
-
|
236
|
+
klas = item.id == @selected.id ? "#{div_name}-selected" : "#{div_name}-item"
|
237
|
+
html << "<li class=\"li-#{klas}\">#{ link_4menu(item) }</li>"
|
216
238
|
end
|
217
|
-
|
239
|
+
html << "</ul></div>"
|
218
240
|
# submenu
|
219
|
-
|
220
|
-
<ul class=\"ul-sub-#{
|
241
|
+
html << "<div class=\"sub-#{div_name}\">
|
242
|
+
<ul class=\"ul-sub-#{div_name}\">"
|
221
243
|
y = YAML.load(@selected.submenu) || {}
|
222
244
|
y.each do |k,v|
|
223
|
-
|
245
|
+
html << "<li class=\"li-sub-#{div_name}\">#{@parent.link_to(v['title'], v['link'])}</li>"
|
224
246
|
end
|
225
|
-
|
247
|
+
html << '</ul></div>'
|
226
248
|
end
|
227
249
|
|
228
250
|
|
229
251
|
########################################################################
|
230
|
-
#
|
252
|
+
# Renderer dispatcher. Method returns HTML part of code.
|
231
253
|
########################################################################
|
232
254
|
def render_html
|
233
255
|
method = @opts[:method] || 'default'
|
@@ -235,7 +257,7 @@ def render_html
|
|
235
257
|
end
|
236
258
|
|
237
259
|
########################################################################
|
238
|
-
#
|
260
|
+
# Return CSS part of code.
|
239
261
|
########################################################################
|
240
262
|
def render_css
|
241
263
|
@menu ? "#{@menu.css}\n #{@selected ? @selected.css : ''}\n" : ''
|