drg_cms 0.4.39 → 0.4.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +49 -0
  3. data/app/assets/images/drg_cms/file_manager.png +0 -0
  4. data/app/assets/javascripts/drg_cms/drg_cms.js +8 -8
  5. data/app/assets/stylesheets/drg_cms/drg_cms.css +22 -20
  6. data/app/controllers/cmsedit_controller.rb +170 -114
  7. data/app/controllers/dc_application_controller.rb +142 -56
  8. data/app/controllers/dc_common_controller.rb +56 -34
  9. data/app/controllers/dc_main_controller.rb +1 -4
  10. data/app/controllers/drgcms_controls/dc_page_controls.rb +3 -0
  11. data/app/forms/all_options.yml +3 -0
  12. data/app/forms/cms_menu.yml +100 -117
  13. data/app/forms/dc_design.yml +1 -1
  14. data/app/forms/dc_ident.yml +37 -0
  15. data/app/forms/dc_menu_item.yml +1 -1
  16. data/app/forms/dc_permission.yml +1 -1
  17. data/app/forms/dc_site.yml +4 -0
  18. data/app/helpers/cmsedit_helper.rb +44 -80
  19. data/app/helpers/dc_ad_renderer.rb +27 -15
  20. data/app/helpers/dc_application_helper.rb +433 -196
  21. data/app/helpers/dc_big_menu_renderer.rb +40 -40
  22. data/app/helpers/dc_captcha_renderer.rb +38 -25
  23. data/app/helpers/dc_common_renderer.rb +15 -48
  24. data/app/helpers/dc_menu_renderer.rb +30 -20
  25. data/app/helpers/dc_page_renderer.rb +14 -18
  26. data/app/helpers/dc_part_renderer.rb +45 -16
  27. data/app/helpers/dc_piece_renderer.rb +23 -29
  28. data/app/helpers/dc_poll_renderer.rb +31 -20
  29. data/app/helpers/dc_renderer.rb +5 -4
  30. data/app/helpers/dc_simple_menu_renderer.rb +90 -68
  31. data/app/models/{__dc_global_data.rb → __dc_stat.rb} +20 -21
  32. data/app/models/dc_ad.rb +13 -1
  33. data/app/models/dc_ad_stat.rb +6 -0
  34. data/app/models/dc_big_menu.rb +15 -2
  35. data/app/models/dc_big_table.rb +27 -4
  36. data/app/models/dc_big_table_locale.rb +7 -0
  37. data/app/models/dc_big_table_value.rb +7 -0
  38. data/app/models/dc_category.rb +9 -3
  39. data/app/models/dc_design.rb +50 -0
  40. data/app/models/dc_dummy.rb +41 -1
  41. data/app/models/dc_folder_permission.rb +9 -2
  42. data/app/models/{dc_global_data.rb → dc_ident.rb} +20 -22
  43. data/app/models/dc_journal.rb +9 -1
  44. data/app/models/dc_key_value_store.rb +41 -4
  45. data/app/models/dc_link.rb +7 -0
  46. data/app/models/dc_menu.rb +20 -3
  47. data/app/models/dc_menu_item.rb +7 -0
  48. data/app/models/dc_page.rb +31 -12
  49. data/app/models/dc_part.rb +34 -4
  50. data/app/models/dc_permission.rb +32 -12
  51. data/app/models/dc_piece.rb +32 -4
  52. data/app/models/dc_policy.rb +17 -11
  53. data/app/models/dc_policy_role.rb +12 -7
  54. data/app/models/dc_policy_rule.rb +32 -4
  55. data/app/models/dc_poll.rb +8 -0
  56. data/app/models/dc_poll_item.rb +6 -0
  57. data/app/models/dc_simple_menu.rb +18 -3
  58. data/app/models/dc_simple_menu_item.rb +20 -2
  59. data/app/models/dc_site.rb +13 -3
  60. data/app/models/dc_stat.rb +8 -1
  61. data/app/models/dc_user.rb +18 -2
  62. data/app/models/dc_user_role.rb +7 -0
  63. data/app/models/dc_visit.rb +5 -0
  64. data/app/{helpers → models}/drgcms_form_field.rb +171 -73
  65. data/app/views/__dc_at_the_beginning/create.html.erb +9 -0
  66. data/app/views/__dc_at_the_beginning/index.html.erb +19 -0
  67. data/app/views/cmsedit/_edit_stuff.html.erb +2 -0
  68. data/app/views/cmsedit/_form.html.erb +0 -1
  69. data/app/views/dc_mail/subscribe.html.erb +0 -0
  70. data/config/initializers/kaminari_patch.rb +5 -4
  71. data/config/locales/drgcms_en.yml +4 -0
  72. data/config/locales/drgcms_sl.yml +1 -0
  73. data/config/locales/models_en.yml +14 -3
  74. data/config/locales/models_sl.yml +13 -4
  75. data/drg_cms.gemspec +4 -4
  76. data/lib/drg_cms.rb +37 -8
  77. data/lib/drg_cms/engine.rb +2 -2
  78. data/lib/drg_cms/version.rb +3 -2
  79. data/lib/tasks/at_the_beginning.yml +0 -0
  80. data/lib/tasks/dc_at_the_beginning.rake +118 -0
  81. data/lib/tasks/dc_cleanup.rake +19 -7
  82. data/lib/tasks/log_statistics.rb +66 -0
  83. data/lib/tasks/site_statistics.rake +29 -12
  84. data/test/dummy/app/controllers/application_controller.rb +1 -1
  85. data/test/dummy/app/helpers/application_helper.rb +1 -1
  86. metadata +15 -26
  87. data/README.rdoc +0 -3
  88. data/app/controllers/dc_at_the_beginning_controller.rb +0 -120
  89. data/app/controllers/dc_mail_controller.rb +0 -89
  90. data/app/forms/dc_forum_cat.yml +0 -54
  91. data/app/forms/dc_forum_forum.yml +0 -53
  92. data/app/forms/dc_forum_msg.yml +0 -124
  93. data/app/forms/dc_forum_privmsg.yml +0 -125
  94. data/app/forms/dc_forum_topic.yml +0 -131
  95. data/app/forms/dc_mail.yml +0 -88
  96. data/app/forms/dc_mail_address.yml +0 -56
  97. data/app/forms/dc_mail_list.yml +0 -44
  98. data/app/forms/dc_mail_list_member.yml +0 -42
  99. data/app/helpers/dc_mail_renderer.rb +0 -76
  100. data/app/models/dc_mail.rb +0 -64
  101. data/app/models/dc_mail_address.rb +0 -69
  102. data/app/models/dc_mail_list.rb +0 -48
  103. data/app/models/dc_mail_list_member.rb +0 -34
  104. 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
- # default DcPage render method
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
- # render html
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
- # render css
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
- # Render single particle
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 dc_piece
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 part_renderer method will collect all parts with the div_id defined
91
- # by position and create html output defined by order.
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
- @opts[:position] ||= @opts['position'] || @opts[:location] || @opts['location'] # symbols are not strings. Ensure that it works.
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 page. Part may
117
- # be defined in current page or in any page in current pages file.
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
- # required :name : Name of part.
121
- # optional :page_id : Id of page where part is saved if not current page.
122
- # optional :page_link : Subject link of page where part is saved if not current page.
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] > 1
54
- @opts[:editparams].merge!( { table: 'dc_piece',
55
- controller: 'cmsedit',
56
- action: 'edit',
57
- id: @piece.id,
58
- title: "#{t('drgcms.edit')}: #{@piece.name}" } )
59
- html << dc_link_for_edit( @opts[:editparams] )
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
- # script renderer expects rails erb code (view) in the script field.
76
- # Used for designs with common code and one part which is different.
77
- # It function is similar to dc_replace_in_design method except that design
78
- # is defined in dc_piece document and not in site document.
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
- # default DcPiece render method
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
- # render html
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
- # render css
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 to return params object
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 render_html
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
- y = YAML.load(item.options) || {}
186
- y['name'] = item.name
187
- y['html'] ||= {}
188
- y['html']['size'] = item.size
189
- (y['html']['class'] ||= 'poll-submit') if item.type == 'submit_tag'
190
- y['text'] = item.text
191
- y['mandatory'] = item.mandatory
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
- y['type'] = item.type
194
- html << do_one_item(poll, y)
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
- y = YAML.load(poll.form.gsub('&nbsp;',' ')) # very annoying. They come with copy&paste ;-)
199
+ yaml = YAML.load(poll.form.gsub('&nbsp;',' ')) # very annoying. They come with copy&paste ;-)
199
200
  # if entered without numbering yaml is returned as Hash otherwise as Array
200
- y.each { |i| html << do_one_item(poll, (i.class == Hash ? i : i.last)) } #
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
- html << @parent.hidden_field_tag('return_to', @opts[:return_to] || @parent.params[:return_to] || '/')
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
@@ -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 topmenu level
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 link if in edit mode.
58
+ # Creates edit icon for menu if in edit mode.
53
59
  ########################################################################
54
- def link_4edit
55
- c = ''
56
- if @opts[:edit_mode] > 1
57
- @opts[:editparams].merge!( { table: 'dc_simple_menu', controller: 'cmsedit', action: 'edit' } )
58
- title = "#{t('drgcms.edit')}: "
59
- @opts[:editparams].merge!( { id: @menu.id, title: "#{title}#{@menu.name}" } ) if @menu
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 }) if @menu.nil?
62
- c << dc_link_for_edit( @opts[:editparams] )
70
+ @opts[:editparams].merge!( { action: 'index', title: title })
63
71
  end
64
- c
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
- # Error in early development. Throw out
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. Thus menu is rendered evenly justified in the width defined by CSS.
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
- c = link_4edit
91
- return "#{c}#{@opts[:name]}<br>Menu not found!" if @menu.nil?
102
+ html = link_4edit
103
+ return "#{html}#{@opts[:name]}<br>Menu not found!" if @menu.nil?
92
104
  #
93
105
  @selected = find_selected
94
- c << "<table class=\"#{@menu.name.downcase}\"><tr>"
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 ? "#{@menu.name.downcase}-selected" : "#{@menu.name.downcase}-item"
104
- c << "<td class=\"td-#{klas}\">#{ link_4menu(item) }</td>" #
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
- c << "</table>"
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
- c = link_4edit
114
- return "#{c}#{@opts[:name]}<br>Menu not found!" if @menu.nil?
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
- c << "<div class=\"#{@menu.name.downcase}-mobile\">\n"
120
- c << '<select onchange="window.location.href=this.options[this.selectedIndex].value">'
121
- c << "<option value=\"\">#{t('drgcms.simple_menu_mobile_menu_text',' M E N U ')}</option>"
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
- c << "<option value=\"#{item.link}\">#{item.caption}</option>"
143
+ html << "<option value=\"#{item.link}\">#{item.caption}</option>"
128
144
  y = YAML.load(item.submenu) || {}
129
- y.each { |k,v| c << "<option value=\"#{v['link']}\">--#{v['title']}</option>" }
145
+ y.each { |k,v| html << "<option value=\"#{v['link']}\">--#{v['title']}</option>" }
130
146
  end
131
- c << "</select>\n</div>\n"
147
+ html << "</select>\n</div>\n"
132
148
  else
133
149
  @selected = find_selected
134
- c << "<table class=\"#{@menu.name.downcase}\"><tr>"
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
- c << "<td class=\"td-#{klas}\">#{ link_4menu(item) }"
160
+ html << "<td class=\"td-#{klas}\">#{ link_4menu(item) }"
145
161
  y = YAML.load(item.submenu) || {}
146
162
  if y.size > 0
147
- c << '<ul>'
163
+ html << '<ul>'
148
164
  y.each do |k,v|
149
- c << "<li>#{@parent.link_to(v['title'], v['link'], {target: v['target']})}</li>"
165
+ html << "<li>#{@parent.link_to(v['title'], v['link'], {target: v['target']})}</li>"
150
166
  end
151
- c << '</ul>'
167
+ html << '</ul>'
152
168
  end
153
- c << '</td>'
169
+ html << '</td>'
154
170
  end
155
- c << '</tr></table>'
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
- c = link_4edit
164
- return "#{c}#{@opts[:name]}<br>Menu not found!" if @menu.nil?
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
- c << "<div id='#{@menu.div_name}'>" unless @menu.div_name.blank?
170
- c << '<table><tr>'
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
- c << "<#{selector}>#{ link_4menu(item) }"
195
+ html << "<#{selector}>#{ link_4menu(item) }"
180
196
  y = YAML.load(item.submenu) || {}
181
197
  if y.size > 0
182
- c << '<ul>'
198
+ html << '<ul>'
183
199
  y.each do |k,v|
184
- c << "<li>#{@parent.link_to(v['title'], v['link'], {target: v['target']})}</li>"
200
+ html << "<li>#{@parent.link_to(v['title'], v['link'], {target: v['target']})}</li>"
185
201
  end
186
- c << '</ul>'
202
+ html << '</ul>'
187
203
  end
188
- c << "</#{selector}>"
204
+ html << "</#{selector}>"
189
205
 
190
206
  end
191
- c << '</tr></table>'
192
- c << '</div>' unless @menu.div_name.blank?
193
- c
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
- c = link_4edit
201
- return "#{c}#{@opts[:name]}<br>Menu not found!" if @menu.nil?
220
+ html = link_4edit
221
+ return "#{html}#{@opts[:name]}<br>Menu not found!" if @menu.nil?
202
222
  #
203
223
  @selected = find_selected
204
- c << "<div class=\"#{@menu.name.downcase}\">"
205
- c << "<ul class=\"ul-#{@menu.name.downcase}\">"
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 ? "#{@menu.name.downcase}-selected" : "#{@menu.name.downcase}-item"
215
- c << "<li class=\"li-#{klas}\">#{ link_4menu(item) }</li>"
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
- c << "</ul></div>"
239
+ html << "</ul></div>"
218
240
  # submenu
219
- c << "<div class=\"sub-#{@menu.name.downcase}\">
220
- <ul class=\"ul-sub-#{@menu.name.downcase}\">"
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
- c << "<li class=\"li-sub-#{@menu.name.downcase}\">#{@parent.link_to(v['title'], v['link'])}</li>"
245
+ html << "<li class=\"li-sub-#{div_name}\">#{@parent.link_to(v['title'], v['link'])}</li>"
224
246
  end
225
- c << '</ul></div>'
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" : ''