agile_rails 0.0.0.1
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/CHANGELOG.md +5 -0
- data/MIT-LICENSE +20 -0
- data/README.md +285 -0
- data/Rakefile +39 -0
- data/agile_rails.gemspec +36 -0
- data/app/assets/fonts/ibm-plex-sans-300.woff2 +0 -0
- data/app/assets/fonts/ibm-plex-sans-400.woff2 +0 -0
- data/app/assets/fonts/ibm-plex-sans-500.woff2 +0 -0
- data/app/assets/fonts/ibm-plex-sans-600.woff2 +0 -0
- data/app/assets/fonts/ibm-plex-sans-700.woff2 +0 -0
- data/app/assets/fonts/ibm-plex-sans-italic.woff2 +0 -0
- data/app/assets/images/32px.png +0 -0
- data/app/assets/images/throbber.gif +0 -0
- data/app/assets/javascripts/agile/agile.js +1489 -0
- data/app/assets/javascripts/agile/jquery-migrate.js +702 -0
- data/app/assets/javascripts/agile/jquery.bpopup.js +372 -0
- data/app/assets/javascripts/agile/jquery.datetimepicker.js +1353 -0
- data/app/assets/javascripts/agile/jstree.min.js +6 -0
- data/app/assets/javascripts/agile/select-multiple.js +459 -0
- data/app/assets/javascripts/agile/some_scripts.js +33 -0
- data/app/assets/javascripts/agile.js +22 -0
- data/app/assets/javascripts/agile_application.js +22 -0
- data/app/assets/javascripts/agile_editor.js +22 -0
- data/app/assets/stylesheets/agile/agile.css +1882 -0
- data/app/assets/stylesheets/agile/agile_apps.css +149 -0
- data/app/assets/stylesheets/agile/jquery.datetimepicker.css +304 -0
- data/app/assets/stylesheets/agile/jstree.css +1107 -0
- data/app/assets/stylesheets/agile/select-multiple.css +110 -0
- data/app/assets/stylesheets/agile/th-bg.png +0 -0
- data/app/assets/stylesheets/agile/theme.css +49 -0
- data/app/assets/stylesheets/agile.css +21 -0
- data/app/assets/stylesheets/agile_application.css +20 -0
- data/app/assets/stylesheets/agile_editor.css +19 -0
- data/app/controllers/agile_application_controller.rb +735 -0
- data/app/controllers/agile_common_controller.rb +345 -0
- data/app/controllers/agile_controller.rb +977 -0
- data/app/controllers/agile_main_controller.rb +36 -0
- data/app/controls/agile_control.rb +120 -0
- data/app/controls/agile_report.rb +364 -0
- data/app/controls/ar_category_control.rb +39 -0
- data/app/controls/ar_help_control.rb +139 -0
- data/app/controls/ar_image_control.rb +180 -0
- data/app/controls/ar_journal_control.rb +47 -0
- data/app/controls/ar_menu_item_control.rb +55 -0
- data/app/controls/ar_page_control.rb +64 -0
- data/app/controls/ar_poll_result_control.rb +84 -0
- data/app/controls/ar_setup_control.rb +62 -0
- data/app/controls/belongs_to_control.rb +61 -0
- data/app/controls/browse_models_control.rb +98 -0
- data/app/controls/settings_form_control.rb +137 -0
- data/app/forms/agile_help.yml +112 -0
- data/app/forms/agile_menu.yml +140 -0
- data/app/forms/agile_report_defaults.yml +39 -0
- data/app/forms/all_options.yml +810 -0
- data/app/forms/ar_ad.yml +121 -0
- data/app/forms/ar_big_table.yml +60 -0
- data/app/forms/ar_big_table_value.yml +52 -0
- data/app/forms/ar_browse_fields.yml +35 -0
- data/app/forms/ar_browse_models.yml +48 -0
- data/app/forms/ar_category.yml +73 -0
- data/app/forms/ar_category_as_tree.yml +31 -0
- data/app/forms/ar_design.yml +75 -0
- data/app/forms/ar_filter.yml +52 -0
- data/app/forms/ar_folder_permission.yml +56 -0
- data/app/forms/ar_folder_rule.yml +48 -0
- data/app/forms/ar_gallery.yml +55 -0
- data/app/forms/ar_image.yml +126 -0
- data/app/forms/ar_image_search.yml +83 -0
- data/app/forms/ar_journal.yml +76 -0
- data/app/forms/ar_json_ld.yml +56 -0
- data/app/forms/ar_key_value.yml +33 -0
- data/app/forms/ar_key_value_store.yml +33 -0
- data/app/forms/ar_link.yml +60 -0
- data/app/forms/ar_menu.yml +67 -0
- data/app/forms/ar_menu_item.yml +141 -0
- data/app/forms/ar_page.yml +187 -0
- data/app/forms/ar_part.yml +91 -0
- data/app/forms/ar_permission.yml +52 -0
- data/app/forms/ar_permission_rule.yml +40 -0
- data/app/forms/ar_piece.yml +106 -0
- data/app/forms/ar_policy.yml +64 -0
- data/app/forms/ar_policy_rule.yml +42 -0
- data/app/forms/ar_policy_rule_nocms.yml +40 -0
- data/app/forms/ar_poll.yml +118 -0
- data/app/forms/ar_poll_item.yml +78 -0
- data/app/forms/ar_poll_result.yml +88 -0
- data/app/forms/ar_poll_result_export.yml +35 -0
- data/app/forms/ar_removed_url.yml +41 -0
- data/app/forms/ar_role.yml +43 -0
- data/app/forms/ar_seo.yml +32 -0
- data/app/forms/ar_setup.yml +45 -0
- data/app/forms/ar_site.yml +149 -0
- data/app/forms/ar_steps_template.yml +51 -0
- data/app/forms/ar_user.yml +140 -0
- data/app/forms/ar_user_role.yml +57 -0
- data/app/forms/help/dc_category_as_tree.en +4 -0
- data/app/forms/help/dc_category_as_tree.sl +5 -0
- data/app/forms/json_ld_schema.yml +168 -0
- data/app/helpers/agile_application_helper.rb +1162 -0
- data/app/helpers/agile_category_helper.rb +128 -0
- data/app/helpers/agile_common_helper.rb +308 -0
- data/app/helpers/agile_edit_helper.rb +645 -0
- data/app/helpers/agile_helper.rb +509 -0
- data/app/helpers/agile_index_helper.rb +677 -0
- data/app/helpers/ar_image_helper.rb +128 -0
- data/app/models/agile_form_fields/action.rb +61 -0
- data/app/models/agile_form_fields/agile_form_field.rb +322 -0
- data/app/models/agile_form_fields/belongs_to.rb +112 -0
- data/app/models/agile_form_fields/check_box.rb +73 -0
- data/app/models/agile_form_fields/comment.rb +62 -0
- data/app/models/agile_form_fields/date_picker.rb +104 -0
- data/app/models/agile_form_fields/date_select.rb +68 -0
- data/app/models/agile_form_fields/datetime_picker.rb +88 -0
- data/app/models/agile_form_fields/datetime_select.rb +73 -0
- data/app/models/agile_form_fields/file_field.rb +52 -0
- data/app/models/agile_form_fields/file_select.rb +69 -0
- data/app/models/agile_form_fields/hidden_field.rb +51 -0
- data/app/models/agile_form_fields/html_field.rb +69 -0
- data/app/models/agile_form_fields/journal_diff.rb +62 -0
- data/app/models/agile_form_fields/link_to.rb +69 -0
- data/app/models/agile_form_fields/method.rb +66 -0
- data/app/models/agile_form_fields/multitext_autocomplete.rb +215 -0
- data/app/models/agile_form_fields/number_field.rb +92 -0
- data/app/models/agile_form_fields/password_field.rb +63 -0
- data/app/models/agile_form_fields/radio_button.rb +95 -0
- data/app/models/agile_form_fields/readonly.rb +77 -0
- data/app/models/agile_form_fields/select.rb +281 -0
- data/app/models/agile_form_fields/submit_tag.rb +58 -0
- data/app/models/agile_form_fields/text_area.rb +61 -0
- data/app/models/agile_form_fields/text_autocomplete.rb +171 -0
- data/app/models/agile_form_fields/text_field.rb +55 -0
- data/app/models/agile_form_fields/text_with_select.rb +94 -0
- data/app/models/agile_form_fields/tree_select.rb +170 -0
- data/app/models/ar_big_table.rb +82 -0
- data/app/models/ar_big_table_value.rb +53 -0
- data/app/models/ar_category.rb +109 -0
- data/app/models/ar_design.rb +116 -0
- data/app/models/ar_filter.rb +200 -0
- data/app/models/ar_folder_permission.rb +50 -0
- data/app/models/ar_folder_rule.rb +47 -0
- data/app/models/ar_gallery.rb +53 -0
- data/app/models/ar_image.rb +198 -0
- data/app/models/ar_internals.rb +60 -0
- data/app/models/ar_journal.rb +46 -0
- data/app/models/ar_json_ld.rb +131 -0
- data/app/models/ar_key_value_store.rb +128 -0
- data/app/models/ar_link.rb +48 -0
- data/app/models/ar_memory.rb +172 -0
- data/app/models/ar_menu.rb +144 -0
- data/app/models/ar_menu_item.rb +106 -0
- data/app/models/ar_page.rb +74 -0
- data/app/models/ar_part.rb +66 -0
- data/app/models/ar_permission.rb +180 -0
- data/app/models/ar_permission_rule.rb +65 -0
- data/app/models/ar_policy.rb +78 -0
- data/app/models/ar_policy_rule.rb +65 -0
- data/app/models/ar_poll.rb +74 -0
- data/app/models/ar_poll_item.rb +47 -0
- data/app/models/ar_poll_result.rb +38 -0
- data/app/models/ar_removed_url.rb +42 -0
- data/app/models/ar_role.rb +84 -0
- data/app/models/ar_setup.rb +115 -0
- data/app/models/ar_site.rb +68 -0
- data/app/models/ar_temp.rb +150 -0
- data/app/models/ar_user.rb +72 -0
- data/app/models/ar_user_group.rb +38 -0
- data/app/models/ar_user_role.rb +54 -0
- data/app/models/ar_visit.rb +41 -0
- data/app/models/concerns/ar_page_concern.rb +128 -0
- data/app/models/concerns/ar_part_concern.rb +48 -0
- data/app/models/concerns/ar_piece_concern.rb +48 -0
- data/app/models/concerns/ar_policy_rule_concern.rb +87 -0
- data/app/models/concerns/ar_seo_concern.rb +66 -0
- data/app/models/concerns/ar_site_concern.rb +103 -0
- data/app/models/concerns/ar_user_concern.rb +195 -0
- data/app/renderers/agile_common_renderer.rb +93 -0
- data/app/renderers/agile_renderer.rb +59 -0
- data/app/renderers/ar_ad_renderer.rb +219 -0
- data/app/renderers/ar_captcha_renderer.rb +113 -0
- data/app/renderers/ar_common_renderer.rb +90 -0
- data/app/renderers/ar_gallery_renderer.rb +107 -0
- data/app/renderers/ar_menu_renderer.rb +195 -0
- data/app/renderers/ar_page_renderer.rb +147 -0
- data/app/renderers/ar_part_renderer.rb +235 -0
- data/app/renderers/ar_piece_renderer.rb +119 -0
- data/app/renderers/ar_poll_renderer.rb +272 -0
- data/app/views/agile/_edit_stuff.html.erb +57 -0
- data/app/views/agile/_form.html.erb +24 -0
- data/app/views/agile/_result.html.erb +28 -0
- data/app/views/agile/edit.html.erb +13 -0
- data/app/views/agile/error.html.erb +2 -0
- data/app/views/agile/index.html.erb +14 -0
- data/app/views/agile/login.html.erb +19 -0
- data/app/views/agile/new.html.erb +12 -0
- data/app/views/agile_common/_help.html.erb +18 -0
- data/app/views/agile_common/_iframe_edit.html.erb +2 -0
- data/app/views/agile_common/paste_clipboard.html.erb +17 -0
- data/app/views/layouts/agile.html.erb +17 -0
- data/app/views/layouts/content.html.erb +20 -0
- data/app/views/models/dump_models.html.erb +47 -0
- data/config/initializers/kaminari_patch.rb +56 -0
- data/config/locales/agile_de.yml +138 -0
- data/config/locales/agile_en.yml +162 -0
- data/config/locales/agile_sl.yml +163 -0
- data/config/locales/datetimepicker.yml +19 -0
- data/config/locales/de.yml +231 -0
- data/config/locales/en.yml +13 -0
- data/config/locales/kaminari.yml +26 -0
- data/config/locales/models_en.yml +1032 -0
- data/config/locales/models_sl.yml +1065 -0
- data/config/locales/sl.yml +211 -0
- data/db/migrate/20240120160001_add_sessions_table.rb +12 -0
- data/db/migrate/20240120160002_ar_big_table.rb +17 -0
- data/db/migrate/20240120160003_ar_big_table_value.rb +18 -0
- data/db/migrate/20240120160004_ar_category.rb +22 -0
- data/db/migrate/20240120160005_ar_design.rb +20 -0
- data/db/migrate/20240120160006_ar_filter.rb +17 -0
- data/db/migrate/20240120160007_ar_gallery.rb +21 -0
- data/db/migrate/20240120160008_ar_journal.rb +19 -0
- data/db/migrate/20240120160009_ar_key_value_store.rb +11 -0
- data/db/migrate/20240120160010_ar_link.rb +19 -0
- data/db/migrate/20240120160011_ar_memory.rb +8 -0
- data/db/migrate/20240120160012_ar_menu.rb +21 -0
- data/db/migrate/20240120160013_ar_menu_item.rb +28 -0
- data/db/migrate/20240120160014_ar_page.rb +50 -0
- data/db/migrate/20240120160015_ar_part.rb +33 -0
- data/db/migrate/20240120160016_ar_permission.rb +16 -0
- data/db/migrate/20240120160017_ar_permission_rule.rb +17 -0
- data/db/migrate/20240120160018_ar_piece.rb +28 -0
- data/db/migrate/20240120160019_ar_policy.rb +21 -0
- data/db/migrate/20240120160020_ar_policy_rule.rb +18 -0
- data/db/migrate/20240120160021_ar_poll.rb +27 -0
- data/db/migrate/20240120160022_ar_poll_item.rb +23 -0
- data/db/migrate/20240120160023_ar_poll_result.rb +14 -0
- data/db/migrate/20240120160024_ar_removed_url.rb +16 -0
- data/db/migrate/20240120160025_ar_role.rb +17 -0
- data/db/migrate/20240120160026_ar_site.rb +37 -0
- data/db/migrate/20240120160027_ar_temp.rb +11 -0
- data/db/migrate/20240120160028_ar_user.rb +42 -0
- data/db/migrate/20240120160029_ar_user_group.rb +12 -0
- data/db/migrate/20240120160030_ar_user_role.rb +18 -0
- data/db/migrate/20240120160031_ar_visit.rb +15 -0
- data/db/migrate/20240703016001_ar_setup.rb +16 -0
- data/db/migrate/20240703016002_ar_folder_permission.rb +15 -0
- data/db/migrate/20240703016003_ar_folder_rule.rb +14 -0
- data/db/migrate/20250115000001_ar_image.rb +25 -0
- data/lib/agile/configuration.rb +43 -0
- data/lib/agile/engine.rb +29 -0
- data/lib/agile/version.rb +27 -0
- data/lib/agile.rb +282 -0
- data/lib/agile_rails.rb +1 -0
- data/lib/generators/agile/USAGE +11 -0
- data/lib/generators/agile/new_form_generator.rb +369 -0
- data/lib/generators/convert_to_ar/convert_to_ar_generator.rb +158 -0
- data/lib/tasks/agile_db_clone.rake +132 -0
- data/lib/tasks/agile_db_export_to_yaml.rake +37 -0
- data/lib/tasks/agile_db_migrate.rake +35 -0
- metadata +414 -0
@@ -0,0 +1,272 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2024+ 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
|
+
# Renders code for displaying a poll. Polls may replace forms when user interaction
|
26
|
+
# is required in browser.
|
27
|
+
########################################################################
|
28
|
+
class ArPollRenderer
|
29
|
+
|
30
|
+
include AgileCommonHelper
|
31
|
+
include AgileApplicationHelper
|
32
|
+
include ActionView::Helpers::FormHelper # for form helpers
|
33
|
+
include ActionView::Helpers::FormOptionsHelper # for select helper
|
34
|
+
|
35
|
+
########################################################################
|
36
|
+
# Object initialization.
|
37
|
+
########################################################################
|
38
|
+
def initialize( env, opts = {} ) #:nodoc:
|
39
|
+
@env = env
|
40
|
+
@opts = opts
|
41
|
+
@part_css = ''
|
42
|
+
@part_js = ''
|
43
|
+
self
|
44
|
+
end
|
45
|
+
|
46
|
+
########################################################################
|
47
|
+
# Dummy params method for accesing environment params object from form.
|
48
|
+
########################################################################
|
49
|
+
def params
|
50
|
+
@env.params
|
51
|
+
end
|
52
|
+
|
53
|
+
########################################################################
|
54
|
+
# Outputs code required for poll item. Subroutine of default method.
|
55
|
+
########################################################################
|
56
|
+
def do_one_item(poll, yaml)
|
57
|
+
html = ''
|
58
|
+
yaml['separator'] ||= ''
|
59
|
+
yaml['text'] ||= ''
|
60
|
+
# label
|
61
|
+
text = yaml['text'].match(/\./) ? t(yaml['text']) : yaml['text']
|
62
|
+
if yaml['mandatory']
|
63
|
+
text += ( poll.display == 'in' ? ' *' : '<span class="required"> *</span>' )
|
64
|
+
yaml['html'] ||= {}
|
65
|
+
yaml['html']['required'] = true
|
66
|
+
else
|
67
|
+
text += " " if poll.display == 'lr' and !yaml['type'].match(/submit_tag|link_to/)
|
68
|
+
end
|
69
|
+
|
70
|
+
# Just add text if comment and go to next one
|
71
|
+
if yaml['type'] == 'comment'
|
72
|
+
html += if poll.display == 'lr'
|
73
|
+
"<div class='row-div'><div class='ar-form-label poll-data-text comment'>#{text}</div></div>"
|
74
|
+
else
|
75
|
+
"<div class='poll-data-text comment'>#{text}</div>"
|
76
|
+
end
|
77
|
+
return html
|
78
|
+
end
|
79
|
+
|
80
|
+
# Set default value, if not already set
|
81
|
+
if yaml['default']
|
82
|
+
if yaml['default'].match('eval')
|
83
|
+
e = yaml['default'].match(/\((.*?)\)/)[1]
|
84
|
+
yaml['default'] = eval e
|
85
|
+
elsif yaml['default'].match('params')
|
86
|
+
param_name = yaml['default'].split(/\.|\ |\,/)[1]
|
87
|
+
yaml['default'] = @env.params[param_name]
|
88
|
+
end
|
89
|
+
key = "p_#{yaml['name']}"
|
90
|
+
params[key] = yaml['default'] unless params[key]
|
91
|
+
end
|
92
|
+
# Label as placeholder
|
93
|
+
if poll.display == 'in'
|
94
|
+
yaml['html'] ||= {}
|
95
|
+
yaml['html']['placeholder'] = text
|
96
|
+
end
|
97
|
+
# create form_field object and retrieve html code
|
98
|
+
clas_string = yaml['type'].camelize
|
99
|
+
field_html = if AgileFormFields.const_defined?(clas_string)
|
100
|
+
clas = AgileFormFields.const_get(clas_string)
|
101
|
+
field = clas.new(@env, @record, yaml).render
|
102
|
+
@part_js += field.js
|
103
|
+
field.html
|
104
|
+
else # error string
|
105
|
+
"Error: Code for field type #{yaml['type']} not defined!"
|
106
|
+
end
|
107
|
+
|
108
|
+
if yaml['type'].match(/submit_tag|link_to/)
|
109
|
+
# There can be more than one links on form. End the data at first link or submit.
|
110
|
+
if !@end_of_data
|
111
|
+
html += (poll.display == 'lr' ? "</div><br>\n" : "</div>\n")
|
112
|
+
# captcha
|
113
|
+
if poll.captcha_type.to_s.size > 1
|
114
|
+
@opts.merge!(:captcha_type => poll.captcha_type)
|
115
|
+
captcha = ArCaptchaRenderer.new(@env, @opts)
|
116
|
+
html += captcha.render_html
|
117
|
+
@part_css = captcha.render_css
|
118
|
+
end
|
119
|
+
@end_of_data = true
|
120
|
+
end
|
121
|
+
# submit and link tag
|
122
|
+
clas = yaml['type'].match(/submit_tag/) ? '' : 'ar-link-submit'
|
123
|
+
html += "<span class='#{clas}'>#{field_html}#{yaml['separator']}</span>"
|
124
|
+
# other fields
|
125
|
+
else
|
126
|
+
html += case
|
127
|
+
when poll.display == 'lr' then
|
128
|
+
"<div class='row-div'><div class='ar-form-label poll-data-text lr #{yaml['class']}'>#{text}</div><div class='poll-data-field td #{yaml['class']}'>#{field_html}</div></div>\n"
|
129
|
+
when poll.display == 'td' then
|
130
|
+
"<div class='poll-data-text td #{yaml['class']}'>#{text}</div><div class='poll-data-field td #{yaml['class']}'>#{field_html}#{yaml['separator']}</div>\n"
|
131
|
+
else
|
132
|
+
"<div class='poll-data-field in #{yaml['class']}'>#{field_html}#{yaml['separator']}</div>\n"
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
########################################################################
|
138
|
+
# Call method before poll is displayed. Usefull for filling predefined values into flash[:record][value]
|
139
|
+
# Method cane be defined as ClassName.method or only method.
|
140
|
+
# If only method is defined then method name must exist in helpers.
|
141
|
+
#
|
142
|
+
# Called method must return at least one result if process can continue.
|
143
|
+
########################################################################
|
144
|
+
def eval_pre_display(code)
|
145
|
+
a = code.strip.split('.')
|
146
|
+
if a.size == 1
|
147
|
+
continue, message = @env.send(a.first)
|
148
|
+
else
|
149
|
+
klass = a.first.classify.constantize
|
150
|
+
continue, message = klass.send(a.last,@env)
|
151
|
+
end
|
152
|
+
[continue, message]
|
153
|
+
end
|
154
|
+
|
155
|
+
########################################################################
|
156
|
+
# Default poll renderer method. Renders data for specified pool.
|
157
|
+
########################################################################
|
158
|
+
def default
|
159
|
+
# poll_id may be defined in params or opts
|
160
|
+
poll_id = @opts[:poll_id] || @env.params[:poll_id]
|
161
|
+
return '<br>Poll id is not defined?<br>' if poll_id.nil?
|
162
|
+
|
163
|
+
poll = ArPoll.find_by(id: poll_id) || ArPoll.find_by(name: poll_id)
|
164
|
+
return %(<div class="ar-form-error">Invalid Poll id #{poll_id}</div>) if poll.nil?
|
165
|
+
|
166
|
+
# If env cant be seen. so cant be polls
|
167
|
+
can_view, message = agile_user_can_view(@env, @env.page)
|
168
|
+
return %(<div class="ar-form-error">#{message}</div>) unless can_view
|
169
|
+
|
170
|
+
html = @opts[:div] ? %(<div id="#{@opts[:div]}"'>) : ''
|
171
|
+
html += '<a name="poll-top"></a>'
|
172
|
+
if poll.pre_display.present?
|
173
|
+
begin
|
174
|
+
continue, message = eval_pre_display(poll.pre_display)
|
175
|
+
rescue Exception => e
|
176
|
+
return %(<div class="ar-form-error">Error! Poll pre display. Error: #{e.message}</div>)
|
177
|
+
end
|
178
|
+
return message unless continue
|
179
|
+
|
180
|
+
html += message if message
|
181
|
+
end
|
182
|
+
# there might be more than one poll displayed on page. Check if messages and values are for me
|
183
|
+
if @env.flash[:poll_id].nil? || @env.flash[:poll_id].to_s == poll_id.to_s
|
184
|
+
# If flash[:record] is present copy content to params record hash
|
185
|
+
@env.flash[:record].each {|k,v| @env.params["p_#{k}"] = v } if @env.flash[:record]
|
186
|
+
# Error during procesing request
|
187
|
+
html += %(<div class="ar-form-error">#{@env.flash[:error]}</div>\n) if @env.flash[:error].to_s.size > 0
|
188
|
+
html += %(<div class="ar-form-info">#{@env.flash[:info]}</div>\n) if @env.flash[:info]
|
189
|
+
end
|
190
|
+
# div and form tag
|
191
|
+
html += %(<div class="poll-div">\n)
|
192
|
+
# edit link
|
193
|
+
if @opts[:edit_mode] > 1
|
194
|
+
@opts[:edit_params].merge!( controller: :agile, action: :edit, id: poll.id, table: 'ar_poll', form_name: 'ar_poll' )
|
195
|
+
@opts[:edit_params].merge!(title: "#{t('agile.edit')}: #{poll.name}")
|
196
|
+
@opts[:edit_params].delete(:ids) # this is from page, but it gets in a way
|
197
|
+
html += agile_link_for_edit( @opts[:edit_params] )
|
198
|
+
end
|
199
|
+
|
200
|
+
html += case
|
201
|
+
when poll.operation == 'poll_submit' then
|
202
|
+
@env.form_tag(action: poll.operation, method: :put)
|
203
|
+
when poll.operation == 'link' then
|
204
|
+
@env.form_tag( poll.parameters, method: :put)
|
205
|
+
end
|
206
|
+
# header, - on first position will not display title
|
207
|
+
html += %(<div class="poll-title">#{poll.title}</div>) unless poll.title[0] == '-'
|
208
|
+
html += %(<div class="poll-text">#{poll.sub_text}</div>)
|
209
|
+
html += if poll.display == 'lr'
|
210
|
+
%(\n<div class="poll-data-table">)
|
211
|
+
else
|
212
|
+
%(<div class="poll-data-div">\n)
|
213
|
+
end
|
214
|
+
# items. Convert each item to yaml
|
215
|
+
@end_od_data = false
|
216
|
+
if poll.form.to_s.size < 10
|
217
|
+
poll.ar_poll_items.order(order: 'asc').each do |item|
|
218
|
+
next unless item.active # disabled items
|
219
|
+
# convert options to yaml
|
220
|
+
begin
|
221
|
+
yaml = YAML.load(item.options) || {}
|
222
|
+
yaml = {} if yaml.class == String
|
223
|
+
rescue Exception => e
|
224
|
+
html += %(<div class="ar-form-error">Item #{item.name}! Error: #{e.message}</div>)
|
225
|
+
next
|
226
|
+
end
|
227
|
+
|
228
|
+
yaml['name'] = item.name
|
229
|
+
yaml['html'] ||= {}
|
230
|
+
yaml['html']['size'] = item.size
|
231
|
+
(yaml['html']['class'] ||= 'ra-submit') if item.field_type == 'submit_tag'
|
232
|
+
yaml['text'] = item.text
|
233
|
+
yaml['mandatory'] = item.mandatory
|
234
|
+
yaml['type'] = item.field_type
|
235
|
+
|
236
|
+
html += do_one_item(poll, yaml)
|
237
|
+
end
|
238
|
+
else
|
239
|
+
yaml = YAML.load(poll.form.gsub(' ', ' ')) # very annoying. They come with copy&paste ;-)
|
240
|
+
# if entered without numbering yaml is returned as Hash otherwise as Array
|
241
|
+
yaml.each { |i| html += do_one_item(poll, (i.class == Hash ? i : i.last)) }
|
242
|
+
end
|
243
|
+
# hide some fields usefull as parameters
|
244
|
+
html += @env.hidden_field_tag('return_to', @opts[:return_to] || @env.params[:return_to] || @env.request.url)
|
245
|
+
html += @env.hidden_field_tag('return_to_error', @env.request.url )
|
246
|
+
html += @env.hidden_field_tag('poll_id', poll_id )
|
247
|
+
html += @env.hidden_field_tag('page_id', @env.page.id )
|
248
|
+
# Add javascript code
|
249
|
+
html += @env.javascript_tag(@part_js + poll.js.to_s)
|
250
|
+
html += "</form></div>"
|
251
|
+
html += '</div>' if @opts[:div]
|
252
|
+
|
253
|
+
@part_css = poll.css
|
254
|
+
html
|
255
|
+
end
|
256
|
+
|
257
|
+
########################################################################
|
258
|
+
# Renderer dispatcher. Method returns HTML part of code.
|
259
|
+
########################################################################
|
260
|
+
def render_html
|
261
|
+
method = @opts[:method] || 'default'
|
262
|
+
respond_to?(method) ? send(method) : "Error ArPoll: Method #{method} doesn't exist!"
|
263
|
+
end
|
264
|
+
|
265
|
+
########################################################################
|
266
|
+
# Return CSS part of code.
|
267
|
+
########################################################################
|
268
|
+
def render_css
|
269
|
+
@part_css
|
270
|
+
end
|
271
|
+
|
272
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
<div id="agile-div">
|
2
|
+
<button class="cms-toggle mode-<%= session[:edit_mode] %>" title="<%= t('agile.toggle_cms')%>"></button>
|
3
|
+
|
4
|
+
<% if session[:edit_mode] > 1 %>
|
5
|
+
<div class="agile-top">
|
6
|
+
<div id="cms-top-menu">
|
7
|
+
|
8
|
+
<% if @page %>
|
9
|
+
<%= link_to( mi_icon('description-o', title: "#{t('agile.edit_page')}"),
|
10
|
+
{ controller: :agile, action: :edit, table: @site.page_class, id: @page.id }, target: :iframe_cms) %>
|
11
|
+
<% end %>
|
12
|
+
|
13
|
+
<% if @design %>
|
14
|
+
<%= link_to( mi_icon('web', title: "#{t('agile.edit_design')}"),
|
15
|
+
{ controller: :agile, action: :edit, table: :ar_design, id: @design.id }, target: :iframe_cms) %>
|
16
|
+
<% end %>
|
17
|
+
|
18
|
+
<% if @site %>
|
19
|
+
<%= link_to( mi_icon('public', title: "#{t('agile.edit_site')}"),
|
20
|
+
{ controller: :agile, action: :edit, table: :ar_site, id: @site.id }, target: :iframe_cms) %>
|
21
|
+
<% end %>
|
22
|
+
<span>|</span>
|
23
|
+
|
24
|
+
<%= link_to( mi_icon('compress', title: t('agile.minimize')), '#',
|
25
|
+
onclick: "$('#iframe_cms').height(1); return false;" ) %>
|
26
|
+
|
27
|
+
<%= link_to( mi_icon('expand', title: t('agile.maximize')), '#',
|
28
|
+
onclick: "$('#iframe_cms').height( $('#iframe_cms').height() + 500); return false;") %>
|
29
|
+
|
30
|
+
<%= link_to( mi_icon('refresh', title: t('agile.reload')), '#',
|
31
|
+
onclick: "document.location.reload(true); return false;") %>
|
32
|
+
<span>|</span>
|
33
|
+
|
34
|
+
<%= link_to( mi_icon('content_paste-o', title: t('agile.rpaste_title')),
|
35
|
+
{ controller: :agile_common, action: :paste_clipboard }, target: :iframe_cms) %>
|
36
|
+
|
37
|
+
<%#= AgileFormFields::Elfinder.file_manager_url(self) %>
|
38
|
+
|
39
|
+
</div>
|
40
|
+
</div>
|
41
|
+
<% if false %>
|
42
|
+
<div id="menu-hamburger"><%= mi_icon('bars') %></div>
|
43
|
+
<% end %>
|
44
|
+
<div class="agile-container">
|
45
|
+
<div id="cms-menu">
|
46
|
+
<%= agile_application_menu %>
|
47
|
+
</div>
|
48
|
+
|
49
|
+
<div class="agile-iframe" style="width: 99%;">
|
50
|
+
<iframe id="iframe_cms" name="iframe_cms"></iframe>
|
51
|
+
</div>
|
52
|
+
<div style="clear: both;"></div>
|
53
|
+
|
54
|
+
</div>
|
55
|
+
|
56
|
+
<% end %>
|
57
|
+
</div>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<div id="ar-form-container">
|
2
|
+
<div id="ar-form-left">
|
3
|
+
<%= agile_form_left %>
|
4
|
+
</div>
|
5
|
+
|
6
|
+
<div id="ar-form-right">
|
7
|
+
<%= agile_flash_messages %>
|
8
|
+
<%= agile_error_messages_for @record %>
|
9
|
+
<%= agile_warning_messages_for @record %>
|
10
|
+
|
11
|
+
<div class="ar-form-frame">
|
12
|
+
<% fields = agile_fields_for_form %>
|
13
|
+
<%= agile_actions_for_form 'top' %>
|
14
|
+
|
15
|
+
<%= fields %>
|
16
|
+
<%= agile_document_statistics %>
|
17
|
+
|
18
|
+
<%= agile_actions_for_form 'bottom' %>
|
19
|
+
</div>
|
20
|
+
|
21
|
+
<%= javascript_tag(@js) unless @js.blank? %>
|
22
|
+
<% if @css.present? %><style><%= @css %></style><% end %>
|
23
|
+
</div>
|
24
|
+
</div>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
|
2
|
+
<div class="ar-table-frame">
|
3
|
+
|
4
|
+
<% if @form['index']['data_set']['type'] == 'method' %>
|
5
|
+
<%= agile_process_data_set_method %>
|
6
|
+
<% elsif @records %>
|
7
|
+
<%= agile_background_for_dataset(:start) %>
|
8
|
+
<%= agile_header_for_dataset %>
|
9
|
+
|
10
|
+
<% @records.each do |record| %>
|
11
|
+
<%= agile_row_for_dataset(record) %>
|
12
|
+
<%= agile_actions_for_dataset(record) %>
|
13
|
+
<%= agile_columns_for_dataset(record) %>
|
14
|
+
</div>
|
15
|
+
<% end %>
|
16
|
+
|
17
|
+
<% if @footer_record %>
|
18
|
+
<div class="ar-result-data footer">
|
19
|
+
<%= agile_dataset_actions_for_footer() %>
|
20
|
+
<%= agile_columns_for_dataset(@footer_record) %>
|
21
|
+
</div>
|
22
|
+
<% end %>
|
23
|
+
|
24
|
+
<%= agile_background_for_dataset(:end) %>
|
25
|
+
<% end %>
|
26
|
+
<%= agile_filter_popup() %>
|
27
|
+
|
28
|
+
</div>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<% agile_update_form %>
|
2
|
+
|
3
|
+
<div <%= agile_form_id %>>
|
4
|
+
<%= agile_head_for_form %>
|
5
|
+
<%= agile_dialog_title agile_edit_title() %>
|
6
|
+
|
7
|
+
<%= form_tag( @form_params, method: :put, id: AgileHelper.form_param(params) || AgileHelper.table_param(params),
|
8
|
+
class: 'agile_form', multipart: @form['form']['multipart'], window_close: params[:window_close] ) do %>
|
9
|
+
<%= render partial: 'form' %>
|
10
|
+
<% end %>
|
11
|
+
</div>
|
12
|
+
|
13
|
+
<div id="popup" style="display: none;"></div>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<% agile_update_form %>
|
2
|
+
|
3
|
+
<div <%= agile_form_id %> class="ar-form-frame">
|
4
|
+
<%= agile_title_for_index @records %>
|
5
|
+
|
6
|
+
<%= agile_actions_for_index %>
|
7
|
+
<%= agile_div_filter %>
|
8
|
+
<%= agile_flash_messages %>
|
9
|
+
<div id="result"> <%= render partial: 'result' %></div>
|
10
|
+
</div>
|
11
|
+
|
12
|
+
<%= javascript_tag(@js) unless @js.blank? %>
|
13
|
+
<% unless @css.blank? %><style><%= @css %></style><% end %>
|
14
|
+
<div id="popup" style="display: none;"></div>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<% if session[:edit_mode]&.to_i > 0 %>
|
2
|
+
<%= render partial: 'edit_stuff' %>
|
3
|
+
<% else %>
|
4
|
+
<div id="ar-login">
|
5
|
+
<h2><%= t('agile.login') %></h2>
|
6
|
+
<%= agile_flash_messages %>
|
7
|
+
<%= form_tag controller: 'agile_common', action: 'process_login', return_to: '/', method: :put do %>
|
8
|
+
<div class="label"><%= t('agile.username') %></div>
|
9
|
+
<div class="input"><%= text_field('record', 'username') %></div>
|
10
|
+
|
11
|
+
<div class="label"><%= t('agile.password') %></div>
|
12
|
+
<div class="input"><%= password_field('record', 'password') %></div>
|
13
|
+
|
14
|
+
<div class="label"></div>
|
15
|
+
<div class="input"><%= submit_tag t('agile.login'), class: 'ar-submit' %></div>
|
16
|
+
<%= hidden_field_tag('return_to_error', request.url ) %>
|
17
|
+
<% end %>
|
18
|
+
</div>
|
19
|
+
<% end %>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<% agile_update_form %>
|
2
|
+
|
3
|
+
<div <%= agile_form_id %>>
|
4
|
+
<%= agile_dialog_title agile_new_title %>
|
5
|
+
|
6
|
+
<%= form_tag(@form_params, method: :post, id: AgileHelper.form_param(params) || AgileHelper.table_param(params),
|
7
|
+
class: 'agile_form', multipart: @form['form']['multipart']) do %>
|
8
|
+
<%= render partial: 'form' %>
|
9
|
+
<% end %>
|
10
|
+
</div>
|
11
|
+
|
12
|
+
<div id="popup" style="display: none;"></div>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
|
2
|
+
<div class="ar-help"><a id="help-top"></a>
|
3
|
+
<h1><%= t('agile.ar_help.help') %>: <%= agile_form_title %></h1>
|
4
|
+
<div class="help-buttons">
|
5
|
+
<% if params[:type] == 'form' %>
|
6
|
+
<button onclick="location.href='#fields'; return false;"><%= t('agile.ar_help.fields_button') %></button>
|
7
|
+
<% end %>
|
8
|
+
<% if @commnets %>
|
9
|
+
<button onclick="location.href='#comments'; return false;"><%= t('agile.ar_help.comments_button') %></button>
|
10
|
+
<% end %>
|
11
|
+
<div class="close"><%= mi_icon('close', class: 'ar-link') %></div>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<div class="help-body"><%= agile_help_body if @help %></div>
|
15
|
+
<div class="help-fields"><%= agile_help_fields if params[:type] == 'form' %></div>
|
16
|
+
|
17
|
+
<div class="help-top" onclick="location.href='#help-top'; return false;"><%= mi_icon('arrow-up') %></div>
|
18
|
+
</div>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
|
2
|
+
<%= agile_dialog_title t('agile.paste_title') %>
|
3
|
+
|
4
|
+
<div class="ar-form-frame"><br>
|
5
|
+
<span class="ar-link-ajax" data-request="post" title="<%= t('agile.paste_clipboard') %>"
|
6
|
+
data-url="<%= url_for(controller: 'agile', action: 'paste_clipboard') %>"><%= t('agile.paste_clipboard') %>
|
7
|
+
</span>
|
8
|
+
|
9
|
+
<hr><br>
|
10
|
+
<div id="result"></div>
|
11
|
+
<%= form_tag do %>
|
12
|
+
<label><b><%= t('agile.paste_update') %>:</b></label><%= check_box('', 'do_update') %><br><br>
|
13
|
+
|
14
|
+
<label><b>Data:</b></label><br>
|
15
|
+
<%= text_area('', 'data',{size: '150x40'}) %><br>
|
16
|
+
<% end %>
|
17
|
+
</div>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title><%= @page_title %></title>
|
5
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
7
|
+
|
8
|
+
<%= stylesheet_link_tag "application", media: 'all' %>
|
9
|
+
<%= javascript_include_tag "application" %>
|
10
|
+
<%= csrf_meta_tags %>
|
11
|
+
</head>
|
12
|
+
|
13
|
+
<body id="body-cms">
|
14
|
+
<%= yield %>
|
15
|
+
</body>
|
16
|
+
|
17
|
+
</html>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title><%= @page_title %></title>
|
5
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
7
|
+
<%= @site&.header&.html_safe %>
|
8
|
+
|
9
|
+
<%= stylesheet_link_tag "application", media: 'all' %>
|
10
|
+
<style media="all"><%= "#{@site&.css}#{@design&.css}\n#{@page&.css}".html_safe %></style>
|
11
|
+
|
12
|
+
<%= javascript_include_tag "application" %>
|
13
|
+
<%= csrf_meta_tags %>
|
14
|
+
</head>
|
15
|
+
|
16
|
+
<body>
|
17
|
+
<%= yield %>
|
18
|
+
</body>
|
19
|
+
|
20
|
+
</html>
|
@@ -0,0 +1,47 @@
|
|
1
|
+
<style>
|
2
|
+
.hidden {display: none;}
|
3
|
+
.model { font-size: 1.2em; width: 952px;}
|
4
|
+
.model .col1 {padding: 3px; width: 150px; background-color: #ddd; float: left;}
|
5
|
+
.model .col2 {padding: 3px; width: 790px; background-color: #eee; float: left;}
|
6
|
+
.fields {
|
7
|
+
font-size: 1.1em; width: 952px; color: #669;
|
8
|
+
background-color: #f8f8f8; border: 1px solid #ddd;margin: 2px;
|
9
|
+
}
|
10
|
+
/*.fields {background-color: #f8f8f8;}*/
|
11
|
+
.fields .col1 {background-color: #ddd; float: left; font-weight: bold; width: 150px;padding:2px;}
|
12
|
+
.fields .col2 {padding: 4px; width: 150px; float: left;}
|
13
|
+
.fields .col3 {width: 150px; float: left;}
|
14
|
+
.fields .col4 {width: 600px; float: left;}
|
15
|
+
</style>
|
16
|
+
|
17
|
+
<% for description in descriptions; collection = description.first; fields = description.last %>
|
18
|
+
<div class="model">
|
19
|
+
<div class="col1" data-model="<%= collection['id'] %>" > <%= collection['id'] %></div>
|
20
|
+
<div class="col2" data-model="<%= collection['id'] %>" > <%= collection['description'] %></div>
|
21
|
+
<div style="clear:both;"></div>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<div id="<%= collection['id'] %>" class="fields hidden">
|
25
|
+
<div class="col1">Field name</div>
|
26
|
+
<div class="col1">Field type</div>
|
27
|
+
<div class="col1">Description</div>
|
28
|
+
<div style="clear:both;"></div>
|
29
|
+
<div style="clear:both;"></div>
|
30
|
+
<% for field in fields %>
|
31
|
+
<div class="col2"><%= field['field'] %></div>
|
32
|
+
<div class="col3"><%= field['type'] %></div>
|
33
|
+
<div class="col4"><%= field['description'] %></div>
|
34
|
+
<div style="clear:both;"></div>
|
35
|
+
<% end %>
|
36
|
+
</div>
|
37
|
+
|
38
|
+
<% end %>
|
39
|
+
|
40
|
+
<%= javascript_tag do %>
|
41
|
+
$(document).ready( function() {
|
42
|
+
$('.model').on('click',function(e) {
|
43
|
+
div_id = e.target.getAttribute("data-model");
|
44
|
+
$('#'+div_id).toggleClass('hidden');
|
45
|
+
});
|
46
|
+
});
|
47
|
+
<% end %>
|
@@ -0,0 +1,56 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2023+ 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
|
+
# This patch adds page param to url when page one is choosed. This is needed
|
26
|
+
# for paging to work as expected.
|
27
|
+
#
|
28
|
+
# Since Kaminari 1.0 functionality can be set by Kaminari.configure.
|
29
|
+
###########################################################################
|
30
|
+
|
31
|
+
begin
|
32
|
+
# Kaminari >= 1.0
|
33
|
+
Kaminari.configure do |config|
|
34
|
+
# config.default_per_page = 25
|
35
|
+
# config.max_per_page = nil
|
36
|
+
# config.window = 4
|
37
|
+
# config.outer_window = 0
|
38
|
+
# config.left = 0
|
39
|
+
# config.right = 0
|
40
|
+
# config.page_method_name = :page
|
41
|
+
# config.param_name = :page
|
42
|
+
config.params_on_first_page = true
|
43
|
+
end
|
44
|
+
# Kaminari = 0.17
|
45
|
+
rescue Exception => e
|
46
|
+
module Kaminari #:nodoc:
|
47
|
+
module Helpers #:nodoc:
|
48
|
+
class Tag #:nodoc:
|
49
|
+
def page_url_for(page)
|
50
|
+
@template.url_for @params.merge(@param_name => (page < 1 ? 1 : page))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|