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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +39 -0
- data/app/assets/images/drg_cms/add.png +0 -0
- data/app/assets/images/drg_cms/arrow_in.png +0 -0
- data/app/assets/images/drg_cms/arrow_out.png +0 -0
- data/app/assets/images/drg_cms/checkbox-checked.png +0 -0
- data/app/assets/images/drg_cms/checkbox-unchecked.png +0 -0
- data/app/assets/images/drg_cms/cols.png +0 -0
- data/app/assets/images/drg_cms/copy.png +0 -0
- data/app/assets/images/drg_cms/edit.png +0 -0
- data/app/assets/images/drg_cms/edit_design.png +0 -0
- data/app/assets/images/drg_cms/edit_page.png +0 -0
- data/app/assets/images/drg_cms/edit_site.png +0 -0
- data/app/assets/images/drg_cms/html.png +0 -0
- data/app/assets/images/drg_cms/pin.png +0 -0
- data/app/assets/images/drg_cms/printer.png +0 -0
- data/app/assets/images/drg_cms/reload.png +0 -0
- data/app/assets/images/drg_cms/search_16.png +0 -0
- data/app/assets/images/drg_cms/spinner.gif +0 -0
- data/app/assets/images/drg_cms/view_tile.png +0 -0
- data/app/assets/images/drg_cms/x.png +0 -0
- data/app/assets/javascripts/drg_cms/drg_cms.js +449 -0
- data/app/assets/javascripts/drg_cms/jquery-migrate.js +511 -0
- data/app/assets/javascripts/drg_cms/jquery.datetimepicker.js +1353 -0
- data/app/assets/javascripts/drg_cms/some_scripts.js +33 -0
- data/app/assets/javascripts/drg_cms_application.js +11 -0
- data/app/assets/javascripts/drg_cms_cms.js +28 -0
- data/app/assets/stylesheets/drg_cms/drg_cms.css +632 -0
- data/app/assets/stylesheets/drg_cms/jquery-ui.css +339 -0
- data/app/assets/stylesheets/drg_cms/jquery.datetimepicker.css +304 -0
- data/app/assets/stylesheets/drg_cms/th-bg.png +0 -0
- data/app/assets/stylesheets/drg_cms/theme.css +49 -0
- data/app/assets/stylesheets/drg_cms_application.css +12 -0
- data/app/assets/stylesheets/drg_cms_cms.css +26 -0
- data/app/controllers/cmsedit_controller.rb +673 -0
- data/app/controllers/dc_application_controller.rb +385 -0
- data/app/controllers/dc_at_the_beginning_controller.rb +120 -0
- data/app/controllers/dc_common_controller.rb +314 -0
- data/app/controllers/dc_mail_controller.rb +89 -0
- data/app/controllers/dc_main_controller.rb +40 -0
- data/app/controllers/drgcms_controls/dc_page_controls.rb +40 -0
- data/app/forms/all_options.yml +176 -0
- data/app/forms/cms_forms.yml +93 -0
- data/app/forms/cms_menu.yml +142 -0
- data/app/forms/dc_ad.yml +130 -0
- data/app/forms/dc_big_table.yml +59 -0
- data/app/forms/dc_big_table_locale.yml +41 -0
- data/app/forms/dc_big_table_value.yml +47 -0
- data/app/forms/dc_category.yml +57 -0
- data/app/forms/dc_design.yml +68 -0
- data/app/forms/dc_folder_permission.yml +49 -0
- data/app/forms/dc_forum_cat.yml +54 -0
- data/app/forms/dc_forum_forum.yml +53 -0
- data/app/forms/dc_forum_msg.yml +124 -0
- data/app/forms/dc_forum_privmsg.yml +125 -0
- data/app/forms/dc_forum_topic.yml +131 -0
- data/app/forms/dc_journal.yml +85 -0
- data/app/forms/dc_link.yml +55 -0
- data/app/forms/dc_mail.yml +88 -0
- data/app/forms/dc_mail_address.yml +56 -0
- data/app/forms/dc_mail_list.yml +44 -0
- data/app/forms/dc_mail_list_member.yml +42 -0
- data/app/forms/dc_menu.yml +62 -0
- data/app/forms/dc_menu_item.yml +81 -0
- data/app/forms/dc_page.yml +145 -0
- data/app/forms/dc_part.yml +102 -0
- data/app/forms/dc_permission.yml +50 -0
- data/app/forms/dc_piece.yml +105 -0
- data/app/forms/dc_policy.yml +57 -0
- data/app/forms/dc_policy_role.yml +42 -0
- data/app/forms/dc_policy_rule.yml +38 -0
- data/app/forms/dc_policy_rule_nocms.yml +38 -0
- data/app/forms/dc_poll.yml +113 -0
- data/app/forms/dc_poll_item.yml +76 -0
- data/app/forms/dc_simple_menu.yml +64 -0
- data/app/forms/dc_simple_menu_item.yml +80 -0
- data/app/forms/dc_site.yml +149 -0
- data/app/forms/dc_user.yml +142 -0
- data/app/forms/dc_user_role.yml +54 -0
- data/app/forms/drgcms_cms.yml +28 -0
- data/app/helpers/cmsedit_helper.rb +698 -0
- data/app/helpers/dc_ad_renderer.rb +206 -0
- data/app/helpers/dc_application_helper.rb +704 -0
- data/app/helpers/dc_big_menu_renderer.rb +180 -0
- data/app/helpers/dc_captcha_renderer.rb +100 -0
- data/app/helpers/dc_common_renderer.rb +132 -0
- data/app/helpers/dc_mail_renderer.rb +76 -0
- data/app/helpers/dc_menu_renderer.rb +143 -0
- data/app/helpers/dc_page_renderer.rb +80 -0
- data/app/helpers/dc_part_renderer.rb +162 -0
- data/app/helpers/dc_piece_renderer.rb +124 -0
- data/app/helpers/dc_poll_renderer.rb +219 -0
- data/app/helpers/dc_renderer.rb +56 -0
- data/app/helpers/dc_simple_menu_renderer.rb +244 -0
- data/app/helpers/drgcms_form_field.rb +863 -0
- data/app/models/__dc_global_data.rb +44 -0
- data/app/models/dc_ad.rb +52 -0
- data/app/models/dc_ad_stat.rb +34 -0
- data/app/models/dc_big_menu.rb +89 -0
- data/app/models/dc_big_table.rb +63 -0
- data/app/models/dc_big_table_locale.rb +35 -0
- data/app/models/dc_big_table_value.rb +38 -0
- data/app/models/dc_category.rb +48 -0
- data/app/models/dc_design.rb +48 -0
- data/app/models/dc_dummy.rb +30 -0
- data/app/models/dc_folder_permission.rb +43 -0
- data/app/models/dc_global_data.rb +44 -0
- data/app/models/dc_journal.rb +39 -0
- data/app/models/dc_key_value_store.rb +90 -0
- data/app/models/dc_link.rb +39 -0
- data/app/models/dc_mail.rb +64 -0
- data/app/models/dc_mail_address.rb +69 -0
- data/app/models/dc_mail_list.rb +48 -0
- data/app/models/dc_mail_list_member.rb +34 -0
- data/app/models/dc_menu.rb +59 -0
- data/app/models/dc_menu_item.rb +40 -0
- data/app/models/dc_page.rb +123 -0
- data/app/models/dc_part.rb +28 -0
- data/app/models/dc_permission.rb +58 -0
- data/app/models/dc_piece.rb +57 -0
- data/app/models/dc_policy.rb +94 -0
- data/app/models/dc_policy_role.rb +47 -0
- data/app/models/dc_policy_rule.rb +65 -0
- data/app/models/dc_poll.rb +46 -0
- data/app/models/dc_poll_item.rb +40 -0
- data/app/models/dc_sendmail.rb +48 -0
- data/app/models/dc_simple_menu.rb +58 -0
- data/app/models/dc_simple_menu_item.rb +39 -0
- data/app/models/dc_site.rb +92 -0
- data/app/models/dc_stat.rb +36 -0
- data/app/models/dc_user.rb +91 -0
- data/app/models/dc_user_role.rb +36 -0
- data/app/models/dc_visit.rb +35 -0
- data/app/views/cmsedit/_edit_stuff.html.erb +59 -0
- data/app/views/cmsedit/_edit_stuff.js.erb +6 -0
- data/app/views/cmsedit/_form.html.erb +21 -0
- data/app/views/cmsedit/_result.html.erb +20 -0
- data/app/views/cmsedit/edit.html.erb +6 -0
- data/app/views/cmsedit/error.html.erb +2 -0
- data/app/views/cmsedit/index.html.erb +6 -0
- data/app/views/cmsedit/new.html.erb +5 -0
- data/app/views/cmsedit/show.html.erb +21 -0
- data/app/views/dc_at_the_beginning/create.html.erb +9 -0
- data/app/views/dc_at_the_beginning/index.html.erb +19 -0
- data/app/views/dc_common/paste_clipboard.html.erb +17 -0
- data/app/views/dc_mail/subscribe.html.erb +7 -0
- data/app/views/dc_mail/unsubscribe.html.erb +19 -0
- data/app/views/layouts/cms.html.erb +17 -0
- data/app/views/layouts/cmsedit.html.erb +16 -0
- data/app/views/layouts/content.html.erb +16 -0
- data/config/initializers/kaminari_patch.rb +36 -0
- data/config/locales/datetimepicker.yml +13 -0
- data/config/locales/drgcms_en.yml +96 -0
- data/config/locales/drgcms_sl.yml +97 -0
- data/config/locales/en.yml +7 -0
- data/config/locales/kaminari.yml +26 -0
- data/config/locales/models_en.yml +790 -0
- data/config/locales/models_sl.yml +805 -0
- data/config/locales/mongoid_sl.yml +60 -0
- data/config/locales/sl.yml +211 -0
- data/config/routes.rb +2 -0
- data/drg_cms.gemspec +28 -0
- data/lib/drg_cms.rb +45 -0
- data/lib/drg_cms/engine.rb +30 -0
- data/lib/drg_cms/version.rb +3 -0
- data/lib/tasks/at_the_beginning.yml +26 -0
- data/lib/tasks/dc_cleanup.rake +94 -0
- data/lib/tasks/drg_cms_tasks.rake +118 -0
- data/lib/tasks/send_mail.rake +253 -0
- data/lib/tasks/site_statistics.rake +80 -0
- data/test/drg_cms_test.rb +7 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +59 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +58 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/test_helper.rb +15 -0
- 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(' ',' ')) # 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
|