drg_cms 0.4.39

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 (204) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +3 -0
  4. data/Rakefile +39 -0
  5. data/app/assets/images/drg_cms/add.png +0 -0
  6. data/app/assets/images/drg_cms/arrow_in.png +0 -0
  7. data/app/assets/images/drg_cms/arrow_out.png +0 -0
  8. data/app/assets/images/drg_cms/checkbox-checked.png +0 -0
  9. data/app/assets/images/drg_cms/checkbox-unchecked.png +0 -0
  10. data/app/assets/images/drg_cms/cols.png +0 -0
  11. data/app/assets/images/drg_cms/copy.png +0 -0
  12. data/app/assets/images/drg_cms/edit.png +0 -0
  13. data/app/assets/images/drg_cms/edit_design.png +0 -0
  14. data/app/assets/images/drg_cms/edit_page.png +0 -0
  15. data/app/assets/images/drg_cms/edit_site.png +0 -0
  16. data/app/assets/images/drg_cms/html.png +0 -0
  17. data/app/assets/images/drg_cms/pin.png +0 -0
  18. data/app/assets/images/drg_cms/printer.png +0 -0
  19. data/app/assets/images/drg_cms/reload.png +0 -0
  20. data/app/assets/images/drg_cms/search_16.png +0 -0
  21. data/app/assets/images/drg_cms/spinner.gif +0 -0
  22. data/app/assets/images/drg_cms/view_tile.png +0 -0
  23. data/app/assets/images/drg_cms/x.png +0 -0
  24. data/app/assets/javascripts/drg_cms/drg_cms.js +449 -0
  25. data/app/assets/javascripts/drg_cms/jquery-migrate.js +511 -0
  26. data/app/assets/javascripts/drg_cms/jquery.datetimepicker.js +1353 -0
  27. data/app/assets/javascripts/drg_cms/some_scripts.js +33 -0
  28. data/app/assets/javascripts/drg_cms_application.js +11 -0
  29. data/app/assets/javascripts/drg_cms_cms.js +28 -0
  30. data/app/assets/stylesheets/drg_cms/drg_cms.css +632 -0
  31. data/app/assets/stylesheets/drg_cms/jquery-ui.css +339 -0
  32. data/app/assets/stylesheets/drg_cms/jquery.datetimepicker.css +304 -0
  33. data/app/assets/stylesheets/drg_cms/th-bg.png +0 -0
  34. data/app/assets/stylesheets/drg_cms/theme.css +49 -0
  35. data/app/assets/stylesheets/drg_cms_application.css +12 -0
  36. data/app/assets/stylesheets/drg_cms_cms.css +26 -0
  37. data/app/controllers/cmsedit_controller.rb +673 -0
  38. data/app/controllers/dc_application_controller.rb +385 -0
  39. data/app/controllers/dc_at_the_beginning_controller.rb +120 -0
  40. data/app/controllers/dc_common_controller.rb +314 -0
  41. data/app/controllers/dc_mail_controller.rb +89 -0
  42. data/app/controllers/dc_main_controller.rb +40 -0
  43. data/app/controllers/drgcms_controls/dc_page_controls.rb +40 -0
  44. data/app/forms/all_options.yml +176 -0
  45. data/app/forms/cms_forms.yml +93 -0
  46. data/app/forms/cms_menu.yml +142 -0
  47. data/app/forms/dc_ad.yml +130 -0
  48. data/app/forms/dc_big_table.yml +59 -0
  49. data/app/forms/dc_big_table_locale.yml +41 -0
  50. data/app/forms/dc_big_table_value.yml +47 -0
  51. data/app/forms/dc_category.yml +57 -0
  52. data/app/forms/dc_design.yml +68 -0
  53. data/app/forms/dc_folder_permission.yml +49 -0
  54. data/app/forms/dc_forum_cat.yml +54 -0
  55. data/app/forms/dc_forum_forum.yml +53 -0
  56. data/app/forms/dc_forum_msg.yml +124 -0
  57. data/app/forms/dc_forum_privmsg.yml +125 -0
  58. data/app/forms/dc_forum_topic.yml +131 -0
  59. data/app/forms/dc_journal.yml +85 -0
  60. data/app/forms/dc_link.yml +55 -0
  61. data/app/forms/dc_mail.yml +88 -0
  62. data/app/forms/dc_mail_address.yml +56 -0
  63. data/app/forms/dc_mail_list.yml +44 -0
  64. data/app/forms/dc_mail_list_member.yml +42 -0
  65. data/app/forms/dc_menu.yml +62 -0
  66. data/app/forms/dc_menu_item.yml +81 -0
  67. data/app/forms/dc_page.yml +145 -0
  68. data/app/forms/dc_part.yml +102 -0
  69. data/app/forms/dc_permission.yml +50 -0
  70. data/app/forms/dc_piece.yml +105 -0
  71. data/app/forms/dc_policy.yml +57 -0
  72. data/app/forms/dc_policy_role.yml +42 -0
  73. data/app/forms/dc_policy_rule.yml +38 -0
  74. data/app/forms/dc_policy_rule_nocms.yml +38 -0
  75. data/app/forms/dc_poll.yml +113 -0
  76. data/app/forms/dc_poll_item.yml +76 -0
  77. data/app/forms/dc_simple_menu.yml +64 -0
  78. data/app/forms/dc_simple_menu_item.yml +80 -0
  79. data/app/forms/dc_site.yml +149 -0
  80. data/app/forms/dc_user.yml +142 -0
  81. data/app/forms/dc_user_role.yml +54 -0
  82. data/app/forms/drgcms_cms.yml +28 -0
  83. data/app/helpers/cmsedit_helper.rb +698 -0
  84. data/app/helpers/dc_ad_renderer.rb +206 -0
  85. data/app/helpers/dc_application_helper.rb +704 -0
  86. data/app/helpers/dc_big_menu_renderer.rb +180 -0
  87. data/app/helpers/dc_captcha_renderer.rb +100 -0
  88. data/app/helpers/dc_common_renderer.rb +132 -0
  89. data/app/helpers/dc_mail_renderer.rb +76 -0
  90. data/app/helpers/dc_menu_renderer.rb +143 -0
  91. data/app/helpers/dc_page_renderer.rb +80 -0
  92. data/app/helpers/dc_part_renderer.rb +162 -0
  93. data/app/helpers/dc_piece_renderer.rb +124 -0
  94. data/app/helpers/dc_poll_renderer.rb +219 -0
  95. data/app/helpers/dc_renderer.rb +56 -0
  96. data/app/helpers/dc_simple_menu_renderer.rb +244 -0
  97. data/app/helpers/drgcms_form_field.rb +863 -0
  98. data/app/models/__dc_global_data.rb +44 -0
  99. data/app/models/dc_ad.rb +52 -0
  100. data/app/models/dc_ad_stat.rb +34 -0
  101. data/app/models/dc_big_menu.rb +89 -0
  102. data/app/models/dc_big_table.rb +63 -0
  103. data/app/models/dc_big_table_locale.rb +35 -0
  104. data/app/models/dc_big_table_value.rb +38 -0
  105. data/app/models/dc_category.rb +48 -0
  106. data/app/models/dc_design.rb +48 -0
  107. data/app/models/dc_dummy.rb +30 -0
  108. data/app/models/dc_folder_permission.rb +43 -0
  109. data/app/models/dc_global_data.rb +44 -0
  110. data/app/models/dc_journal.rb +39 -0
  111. data/app/models/dc_key_value_store.rb +90 -0
  112. data/app/models/dc_link.rb +39 -0
  113. data/app/models/dc_mail.rb +64 -0
  114. data/app/models/dc_mail_address.rb +69 -0
  115. data/app/models/dc_mail_list.rb +48 -0
  116. data/app/models/dc_mail_list_member.rb +34 -0
  117. data/app/models/dc_menu.rb +59 -0
  118. data/app/models/dc_menu_item.rb +40 -0
  119. data/app/models/dc_page.rb +123 -0
  120. data/app/models/dc_part.rb +28 -0
  121. data/app/models/dc_permission.rb +58 -0
  122. data/app/models/dc_piece.rb +57 -0
  123. data/app/models/dc_policy.rb +94 -0
  124. data/app/models/dc_policy_role.rb +47 -0
  125. data/app/models/dc_policy_rule.rb +65 -0
  126. data/app/models/dc_poll.rb +46 -0
  127. data/app/models/dc_poll_item.rb +40 -0
  128. data/app/models/dc_sendmail.rb +48 -0
  129. data/app/models/dc_simple_menu.rb +58 -0
  130. data/app/models/dc_simple_menu_item.rb +39 -0
  131. data/app/models/dc_site.rb +92 -0
  132. data/app/models/dc_stat.rb +36 -0
  133. data/app/models/dc_user.rb +91 -0
  134. data/app/models/dc_user_role.rb +36 -0
  135. data/app/models/dc_visit.rb +35 -0
  136. data/app/views/cmsedit/_edit_stuff.html.erb +59 -0
  137. data/app/views/cmsedit/_edit_stuff.js.erb +6 -0
  138. data/app/views/cmsedit/_form.html.erb +21 -0
  139. data/app/views/cmsedit/_result.html.erb +20 -0
  140. data/app/views/cmsedit/edit.html.erb +6 -0
  141. data/app/views/cmsedit/error.html.erb +2 -0
  142. data/app/views/cmsedit/index.html.erb +6 -0
  143. data/app/views/cmsedit/new.html.erb +5 -0
  144. data/app/views/cmsedit/show.html.erb +21 -0
  145. data/app/views/dc_at_the_beginning/create.html.erb +9 -0
  146. data/app/views/dc_at_the_beginning/index.html.erb +19 -0
  147. data/app/views/dc_common/paste_clipboard.html.erb +17 -0
  148. data/app/views/dc_mail/subscribe.html.erb +7 -0
  149. data/app/views/dc_mail/unsubscribe.html.erb +19 -0
  150. data/app/views/layouts/cms.html.erb +17 -0
  151. data/app/views/layouts/cmsedit.html.erb +16 -0
  152. data/app/views/layouts/content.html.erb +16 -0
  153. data/config/initializers/kaminari_patch.rb +36 -0
  154. data/config/locales/datetimepicker.yml +13 -0
  155. data/config/locales/drgcms_en.yml +96 -0
  156. data/config/locales/drgcms_sl.yml +97 -0
  157. data/config/locales/en.yml +7 -0
  158. data/config/locales/kaminari.yml +26 -0
  159. data/config/locales/models_en.yml +790 -0
  160. data/config/locales/models_sl.yml +805 -0
  161. data/config/locales/mongoid_sl.yml +60 -0
  162. data/config/locales/sl.yml +211 -0
  163. data/config/routes.rb +2 -0
  164. data/drg_cms.gemspec +28 -0
  165. data/lib/drg_cms.rb +45 -0
  166. data/lib/drg_cms/engine.rb +30 -0
  167. data/lib/drg_cms/version.rb +3 -0
  168. data/lib/tasks/at_the_beginning.yml +26 -0
  169. data/lib/tasks/dc_cleanup.rake +94 -0
  170. data/lib/tasks/drg_cms_tasks.rake +118 -0
  171. data/lib/tasks/send_mail.rake +253 -0
  172. data/lib/tasks/site_statistics.rake +80 -0
  173. data/test/drg_cms_test.rb +7 -0
  174. data/test/dummy/README.rdoc +261 -0
  175. data/test/dummy/Rakefile +7 -0
  176. data/test/dummy/app/assets/javascripts/application.js +15 -0
  177. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  178. data/test/dummy/app/controllers/application_controller.rb +3 -0
  179. data/test/dummy/app/helpers/application_helper.rb +2 -0
  180. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  181. data/test/dummy/config.ru +4 -0
  182. data/test/dummy/config/application.rb +59 -0
  183. data/test/dummy/config/boot.rb +10 -0
  184. data/test/dummy/config/database.yml +25 -0
  185. data/test/dummy/config/environment.rb +5 -0
  186. data/test/dummy/config/environments/development.rb +37 -0
  187. data/test/dummy/config/environments/production.rb +67 -0
  188. data/test/dummy/config/environments/test.rb +37 -0
  189. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  190. data/test/dummy/config/initializers/inflections.rb +15 -0
  191. data/test/dummy/config/initializers/mime_types.rb +5 -0
  192. data/test/dummy/config/initializers/secret_token.rb +7 -0
  193. data/test/dummy/config/initializers/session_store.rb +8 -0
  194. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  195. data/test/dummy/config/locales/en.yml +5 -0
  196. data/test/dummy/config/routes.rb +58 -0
  197. data/test/dummy/public/404.html +26 -0
  198. data/test/dummy/public/422.html +26 -0
  199. data/test/dummy/public/500.html +25 -0
  200. data/test/dummy/public/favicon.ico +0 -0
  201. data/test/dummy/script/rails +6 -0
  202. data/test/integration/navigation_test.rb +10 -0
  203. data/test/test_helper.rb +15 -0
  204. metadata +375 -0
@@ -0,0 +1,219 @@
1
+ #--
2
+ # Copyright (c) 2012+ Damjan Rems
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ ########################################################################
25
+ #
26
+ ########################################################################
27
+ class DcPollRenderer
28
+
29
+ include CmseditHelper
30
+ include DcApplicationHelper
31
+ include ActionView::Helpers::FormHelper # for form hepers
32
+ include ActionView::Helpers::FormOptionsHelper # for select helper
33
+
34
+ ########################################################################
35
+ #
36
+ ########################################################################
37
+ def initialize( parent, opts={} )
38
+ @parent = parent
39
+ @opts = opts
40
+ @part_css = ''
41
+ self
42
+ end
43
+
44
+ ########################################################################
45
+ # Dummy params method to return params object
46
+ ########################################################################
47
+ def params
48
+ @parent.params
49
+ end
50
+
51
+ ########################################################################
52
+ #
53
+ ########################################################################
54
+ def do_one_item(poll, yaml)
55
+ html = ''
56
+ yaml['separator'] ||= ''
57
+ yaml['text'] ||= ''
58
+ #
59
+ text = yaml['text'].match(/\./) ? t(yaml['text']) : yaml['text']
60
+ text << '<font color="red"> *</font>' if yaml['mandatory']
61
+ # Just add text if comment and go to next one
62
+ if yaml['type'] == 'comment'
63
+ html << if poll.display == 'lr'
64
+ "<tr><td colspan='2' class='poll-data-text'>#{text}</td></tr>"
65
+ else
66
+ "<div class='poll-data-text'>#{text}</div>"
67
+ end
68
+ return html
69
+ end
70
+ # Set default value, if not already set
71
+ if yaml['default']
72
+ if yaml['default'].match('eval')
73
+ e = yaml['default'].match(/\((.*?)\)/)[1]
74
+ yaml['default'] = eval e
75
+ end
76
+ key = "p_#{yaml['name']}"
77
+ params[key] = yaml['default'] unless params[key]
78
+ end
79
+ # create form_field object and retrieve html code
80
+ clas_string = yaml['type'].camelize
81
+ field_html = if DrgcmsFormField.const_defined?(clas_string)
82
+ clas = DrgcmsFormField.const_get(clas_string)
83
+ o = clas.new(@parent, @record, yaml).render
84
+ #TODO collect all javascript and add it at the end
85
+ o.html + (o.js.size > 0 ? @parent.javascript_tag(o.js) : '')
86
+ else # litle error string
87
+ "Error: Code for field type #{yaml['type']} not defined!"
88
+ end
89
+
90
+ # field = send('dc_' + yaml['type'], yaml) # call dc_xxx method to get field html code
91
+ if yaml['type'].match(/submit_tag|link_to/)
92
+ # There can be more than one links on form. End the data at first link or submit.
93
+ if !@end_of_data
94
+ html << if poll.display == 'lr'
95
+ "</table><br>\n"
96
+ else
97
+ "</div><br>\n"
98
+ end
99
+ # captcha
100
+ if poll.captcha_type.to_s.size > 1
101
+ @opts.merge!(:captcha_type => poll.captcha_type)
102
+ captcha = DcCaptchaRenderer.new(@parent, @opts)
103
+ html << captcha.render_html
104
+ @part_css = captcha.render_css
105
+ end
106
+ @end_od_data = true
107
+ end
108
+ # submit and link tag
109
+ html << "<span class='poll-data-submit'>#{field_html}#{yaml['separator']}</span>"
110
+ # other elements
111
+ else
112
+ html << if poll.display == 'lr'
113
+ "<tr><td class='poll-data-text'>#{text}</td><td class='poll-data-field'>#{field_html}</td></tr>\n"
114
+ else
115
+ "<div class='poll-data-text'>#{text}</div><div class='poll-data-field'>#{field_html}#{yaml['separator']}</div>\n"
116
+ end
117
+ end
118
+ end
119
+
120
+ ########################################################################
121
+ #
122
+ ########################################################################
123
+ def render_html
124
+ # poll_id may be defined in params or opts
125
+ poll_id = @parent.params[:poll_id] || @opts[:poll_id]
126
+ return '<br>Poll id is not defined?<br>' if poll_id.nil?
127
+ #
128
+ poll = DcPoll.find(poll_id)
129
+ poll = DcPoll.find_by(name: poll_id) if poll.nil? # name instead of id
130
+ return "<div class=\"dc-form-error\">Invalid Poll id #{poll_id}</div>" if poll.nil?
131
+ html = '<a name="poll-top"></a>'
132
+
133
+ # Operation called before poll is displayed. Usefull for filling predefined values into flash[:record][value]
134
+ # Called method must return at least one result if process can continue.
135
+ if poll.pre_display.to_s.size > 1
136
+ begin
137
+ continue, message = eval(poll.pre_display.strip + '(@parent)')
138
+ rescue Exception => e
139
+ return "<div class=\"dc-form-error\">Error! Poll pre display. Error: #{e.message}</div>"
140
+ end
141
+ return message unless continue
142
+ html << message if message
143
+ end
144
+
145
+ # there might be more than one poll displayed on page. Check if messages and values are for me
146
+ if @parent.flash[:poll_id].nil? or @parent.flash[:poll_id] == poll_id
147
+ # If flash[:record] is present copy content to params record hash
148
+ @parent.flash[:record].each {|k,v| @parent.params["p_#{k}"] = v } if @parent.flash[:record]
149
+ # Error during procesing request
150
+ html << "<div class=\"dc-form-error\">#{@parent.flash[:error]}</div>\n" if @parent.flash[:error].to_s.size > 0
151
+ html << "<div class=\"dc-form-info\">#{@parent.flash[:info]}</div>\n" if @parent.flash[:info]
152
+ end
153
+ # div and form tag
154
+ html << "<div class=\"poll-div\">\n"
155
+ # edit link
156
+ if @opts[:edit_mode] > 1
157
+ @opts[:editparams].merge!( controller: 'cmsedit', action: 'edit', id: poll._id, table: 'dc_poll' )
158
+ @opts[:editparams].merge!(title: "#{t('drgcms.edit')}: #{poll.name}")
159
+ @opts[:editparams].delete(:ids) # this is from page, but it gets in a way
160
+ html << dc_link_for_edit( @opts[:editparams] )
161
+ end
162
+ #
163
+ html << case
164
+ when poll.operation == 'poll_submit' then
165
+ @parent.form_tag(action: poll.operation, method: :put)
166
+ when poll.operation == 'link' then
167
+ @parent.form_tag( poll.parameters, method: :put)
168
+ end
169
+ # header
170
+ html << "<div class='poll-title'>#{poll.title}</div>" unless poll.title[0] == '-' # - on first position will not display title
171
+ html << poll.sub_text.to_s # if poll.sub_text.to_s.size > 5
172
+ html << if poll.display == 'lr'
173
+ "\n" + '<table class="poll-data-table">'
174
+ else
175
+ '<div class="poll-data-div">' + "\n"
176
+ end
177
+ # items. Convert each item to yaml
178
+ @end_od_data = false
179
+ if poll.form.to_s.size < 10
180
+ items = poll.dc_poll_items
181
+ items.sort! {|a,b| a.order <=> b.order }
182
+ items.each do |item|
183
+ next unless item.active # disabled items
184
+ # 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
192
+ # y['options'] = item.options
193
+ y['type'] = item.type
194
+ html << do_one_item(poll, y)
195
+ end
196
+ # Form. Just call do_one_item for each form item
197
+ else
198
+ y = YAML.load(poll.form.gsub('&nbsp;',' ')) # very annoying. They come with copy&paste ;-)
199
+ # 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
+ end
202
+ # hide some fields usefull as parameters
203
+ html << @parent.hidden_field_tag('return_to', @opts[:return_to] || @parent.params[:return_to] || '/')
204
+ html << @parent.hidden_field_tag('return_to_error', @parent.request.url )
205
+ html << @parent.hidden_field_tag('poll_id', poll_id )
206
+ html << @parent.hidden_field_tag('page_id', @parent.page.id )
207
+ html << "</form><br /></div>"
208
+ @part_css = poll.css
209
+ html
210
+ end
211
+
212
+ ########################################################################
213
+ #
214
+ ########################################################################
215
+ def render_css
216
+ @part_css
217
+ end
218
+
219
+ end
@@ -0,0 +1,56 @@
1
+ #--
2
+ # Copyright (c) 2012+ Damjan Rems
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ ########################################################################
25
+ #
26
+ ########################################################################
27
+ class DcRenderer
28
+
29
+ ########################################################################
30
+ #
31
+ ########################################################################
32
+ def initialize( parent, opts={} )
33
+ @parent = parent
34
+ @opts = opts
35
+ @css = ''
36
+ self
37
+ end
38
+
39
+ ########################################################################
40
+ #
41
+ ########################################################################
42
+ def render_html
43
+ can_view, msg = @parent.dc_user_can_view(@parent, @parent.page)
44
+ return msg unless can_view
45
+ method = @opts[:method] || 'default'
46
+ respond_to?(method) ? send(method) : "#{self.class}: Method (#{method}) not defined!"
47
+ end
48
+
49
+ ########################################################################
50
+ #
51
+ ########################################################################
52
+ def render_css
53
+ @css
54
+ end
55
+
56
+ end
@@ -0,0 +1,244 @@
1
+ #coding: utf-8
2
+ #--
3
+ # Copyright (c) 2012+ Damjan Rems
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining
6
+ # a copy of this software and associated documentation files (the
7
+ # "Software"), to deal in the Software without restriction, including
8
+ # without limitation the rights to use, copy, modify, merge, publish,
9
+ # distribute, sublicense, and/or sell copies of the Software, and to
10
+ # permit persons to whom the Software is furnished to do so, subject to
11
+ # the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be
14
+ # included in all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+ #++
24
+
25
+ ########################################################################
26
+ #
27
+ ########################################################################
28
+ class DcSimpleMenuRenderer
29
+
30
+ include DcApplicationHelper
31
+ ########################################################################
32
+ #
33
+ ########################################################################
34
+ def initialize( parent, opts )
35
+ @parent = parent
36
+ opts[:name] = parent.site.menu_name if opts[:name].nil? # default in site
37
+ @menu = DcSimpleMenu.find_by(name: opts[:name].to_s)
38
+ @opts = opts
39
+ self
40
+ end
41
+
42
+ ########################################################################
43
+ # Return selected topmenu level
44
+ ########################################################################
45
+ def find_selected
46
+ ret = @menu.dc_simple_menu_items.find( @parent.page.menu_id ) if @parent.page.menu_id
47
+ # return first if not found (something is wrong)
48
+ ret ||= @menu.dc_simple_menu_items[0]
49
+ end
50
+
51
+ ########################################################################
52
+ # Creates edit link if in edit mode.
53
+ ########################################################################
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
+ 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] )
63
+ end
64
+ c
65
+ end
66
+
67
+ ########################################################################
68
+ # Returns html code required for link in a menu.
69
+ ########################################################################
70
+ def link_4menu(item)
71
+ # Error in early development. Throw out
72
+ item.link = ((item.link[0,1] == '/' ? '' : '/') + item.link) unless item.link.match('http:')
73
+ target = item.target.blank? ? nil : item.target
74
+ if item.caption.match('pic:')
75
+ p 'pic: value in caption will be deprecated. Use picture field instead.'
76
+ @parent.link_to( @parent.image_tag(item.caption.sub('pic:','')), item.link, {target: target} )
77
+ else
78
+ # - in first place won't write caption text
79
+ caption = item.caption[0] == '-' ? '' : item.caption.to_s
80
+ img_title = item.caption.to_s.sub('-','')
81
+ (item.picture.blank? ? '' : @parent.link_to( @parent.image_tag(item.picture), item.link, {title: img_title, target: target} )) +
82
+ ( caption.blank? ? '' : @parent.link_to(caption, item.link, {target: target}))
83
+ end
84
+ end
85
+
86
+ ########################################################################
87
+ # Renders menu as table. Thus menu is rendered evenly justified in the width defined by CSS.
88
+ ########################################################################
89
+ def as_table
90
+ c = link_4edit
91
+ return "#{c}#{@opts[:name]}<br>Menu not found!" if @menu.nil?
92
+ #
93
+ @selected = find_selected
94
+ c << "<table class=\"#{@menu.name.downcase}\"><tr>"
95
+ # sort items acording to :order
96
+ items = @menu.dc_simple_menu_items.sort {|a,b| a.order <=> b.order}
97
+ items.each do |item|
98
+ next unless item.active
99
+ # menu can be hidden from user
100
+ can_view, msg = dc_user_can_view(@parent, item)
101
+ next unless can_view
102
+
103
+ klas = item.id == @selected.id ? "#{@menu.name.downcase}-selected" : "#{@menu.name.downcase}-item"
104
+ c << "<td class=\"td-#{klas}\">#{ link_4menu(item) }</td>" #
105
+ end
106
+ c << "</table>"
107
+ end
108
+
109
+ ########################################################################
110
+ # Creates menu with single level dropdown menu
111
+ ########################################################################
112
+ def as_dropdown_old
113
+ c = link_4edit
114
+ return "#{c}#{@opts[:name]}<br>Menu not found!" if @menu.nil?
115
+ #
116
+ items = @menu.dc_simple_menu_items.sort {|a,b| a.order <=> b.order}
117
+ # CSS dropdown-s don't work very well on mobiles. Create simple select menu instead
118
+ 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>"
122
+ items.each do |item|
123
+ next unless item.active
124
+ # menu can be hidden from user
125
+ can_view, msg = dc_user_can_view(@parent, item)
126
+ next unless can_view
127
+ c << "<option value=\"#{item.link}\">#{item.caption}</option>"
128
+ y = YAML.load(item.submenu) || {}
129
+ y.each { |k,v| c << "<option value=\"#{v['link']}\">--#{v['title']}</option>" }
130
+ end
131
+ c << "</select>\n</div>\n"
132
+ else
133
+ @selected = find_selected
134
+ c << "<table class=\"#{@menu.name.downcase}\"><tr>"
135
+ # sort items acording to :order
136
+ items.each do |item|
137
+ next unless item.active
138
+ # menu can be hidden from user
139
+ can_view, msg = dc_user_can_view(@parent, item)
140
+ next unless can_view
141
+
142
+ klas = item.id == @selected.id ? 'menu-selected' : 'menu-item'
143
+ # caption = item.caption.match('pic:') ? @parent.image_tag(item.caption.sub('pic:','')) : item.caption
144
+ c << "<td class=\"td-#{klas}\">#{ link_4menu(item) }"
145
+ y = YAML.load(item.submenu) || {}
146
+ if y.size > 0
147
+ c << '<ul>'
148
+ y.each do |k,v|
149
+ c << "<li>#{@parent.link_to(v['title'], v['link'], {target: v['target']})}</li>"
150
+ end
151
+ c << '</ul>'
152
+ end
153
+ c << '</td>'
154
+ end
155
+ c << '</tr></table>'
156
+ end
157
+ end
158
+
159
+ ########################################################################
160
+ # Creates menu with single level dropdown menu
161
+ ########################################################################
162
+ def as_dropdown
163
+ c = link_4edit
164
+ return "#{c}#{@opts[:name]}<br>Menu not found!" if @menu.nil?
165
+ #
166
+ items = @menu.dc_simple_menu_items.sort {|a,b| a.order <=> b.order}
167
+ @selected = find_selected
168
+
169
+ c << "<div id='#{@menu.div_name}'>" unless @menu.div_name.blank?
170
+ c << '<table><tr>'
171
+ # sort items acording to :order
172
+ items.each do |item|
173
+ next unless item.active
174
+ # menu can be hidden from user
175
+ can_view, msg = dc_user_can_view(@parent, item)
176
+ next unless can_view
177
+ #
178
+ selector = item.id == @selected.id ? 'th' : 'td'
179
+ c << "<#{selector}>#{ link_4menu(item) }"
180
+ y = YAML.load(item.submenu) || {}
181
+ if y.size > 0
182
+ c << '<ul>'
183
+ y.each do |k,v|
184
+ c << "<li>#{@parent.link_to(v['title'], v['link'], {target: v['target']})}</li>"
185
+ end
186
+ c << '</ul>'
187
+ end
188
+ c << "</#{selector}>"
189
+
190
+ end
191
+ c << '</tr></table>'
192
+ c << '</div>' unless @menu.div_name.blank?
193
+ c
194
+ end
195
+
196
+ ########################################################################
197
+ #
198
+ ########################################################################
199
+ def default
200
+ c = link_4edit
201
+ return "#{c}#{@opts[:name]}<br>Menu not found!" if @menu.nil?
202
+ #
203
+ @selected = find_selected
204
+ c << "<div class=\"#{@menu.name.downcase}\">"
205
+ c << "<ul class=\"ul-#{@menu.name.downcase}\">"
206
+ # sort items acording to :order
207
+ items = @menu.dc_simple_menu_items.sort {|a,b| a.order <=> b.order}
208
+ items.each do |item|
209
+ next unless item.active
210
+ # menu can be hidden from user
211
+ can_view, msg = dc_user_can_view(@parent, item)
212
+ next unless can_view
213
+
214
+ klas = item.id == @selected.id ? "#{@menu.name.downcase}-selected" : "#{@menu.name.downcase}-item"
215
+ c << "<li class=\"li-#{klas}\">#{ link_4menu(item) }</li>"
216
+ end
217
+ c << "</ul></div>"
218
+ # submenu
219
+ c << "<div class=\"sub-#{@menu.name.downcase}\">
220
+ <ul class=\"ul-sub-#{@menu.name.downcase}\">"
221
+ y = YAML.load(@selected.submenu) || {}
222
+ y.each do |k,v|
223
+ c << "<li class=\"li-sub-#{@menu.name.downcase}\">#{@parent.link_to(v['title'], v['link'])}</li>"
224
+ end
225
+ c << '</ul></div>'
226
+ end
227
+
228
+
229
+ ########################################################################
230
+ #
231
+ ########################################################################
232
+ def render_html
233
+ method = @opts[:method] || 'default'
234
+ respond_to?(method) ? send(method) : "Error DcSimpleMenu: Method #{method} doesn't exist!"
235
+ end
236
+
237
+ ########################################################################
238
+ #
239
+ ########################################################################
240
+ def render_css
241
+ @menu ? "#{@menu.css}\n #{@selected ? @selected.css : ''}\n" : ''
242
+ end
243
+
244
+ end