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.
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" : ''