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.
Files changed (259) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +5 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.md +285 -0
  5. data/Rakefile +39 -0
  6. data/agile_rails.gemspec +36 -0
  7. data/app/assets/fonts/ibm-plex-sans-300.woff2 +0 -0
  8. data/app/assets/fonts/ibm-plex-sans-400.woff2 +0 -0
  9. data/app/assets/fonts/ibm-plex-sans-500.woff2 +0 -0
  10. data/app/assets/fonts/ibm-plex-sans-600.woff2 +0 -0
  11. data/app/assets/fonts/ibm-plex-sans-700.woff2 +0 -0
  12. data/app/assets/fonts/ibm-plex-sans-italic.woff2 +0 -0
  13. data/app/assets/images/32px.png +0 -0
  14. data/app/assets/images/throbber.gif +0 -0
  15. data/app/assets/javascripts/agile/agile.js +1489 -0
  16. data/app/assets/javascripts/agile/jquery-migrate.js +702 -0
  17. data/app/assets/javascripts/agile/jquery.bpopup.js +372 -0
  18. data/app/assets/javascripts/agile/jquery.datetimepicker.js +1353 -0
  19. data/app/assets/javascripts/agile/jstree.min.js +6 -0
  20. data/app/assets/javascripts/agile/select-multiple.js +459 -0
  21. data/app/assets/javascripts/agile/some_scripts.js +33 -0
  22. data/app/assets/javascripts/agile.js +22 -0
  23. data/app/assets/javascripts/agile_application.js +22 -0
  24. data/app/assets/javascripts/agile_editor.js +22 -0
  25. data/app/assets/stylesheets/agile/agile.css +1882 -0
  26. data/app/assets/stylesheets/agile/agile_apps.css +149 -0
  27. data/app/assets/stylesheets/agile/jquery.datetimepicker.css +304 -0
  28. data/app/assets/stylesheets/agile/jstree.css +1107 -0
  29. data/app/assets/stylesheets/agile/select-multiple.css +110 -0
  30. data/app/assets/stylesheets/agile/th-bg.png +0 -0
  31. data/app/assets/stylesheets/agile/theme.css +49 -0
  32. data/app/assets/stylesheets/agile.css +21 -0
  33. data/app/assets/stylesheets/agile_application.css +20 -0
  34. data/app/assets/stylesheets/agile_editor.css +19 -0
  35. data/app/controllers/agile_application_controller.rb +735 -0
  36. data/app/controllers/agile_common_controller.rb +345 -0
  37. data/app/controllers/agile_controller.rb +977 -0
  38. data/app/controllers/agile_main_controller.rb +36 -0
  39. data/app/controls/agile_control.rb +120 -0
  40. data/app/controls/agile_report.rb +364 -0
  41. data/app/controls/ar_category_control.rb +39 -0
  42. data/app/controls/ar_help_control.rb +139 -0
  43. data/app/controls/ar_image_control.rb +180 -0
  44. data/app/controls/ar_journal_control.rb +47 -0
  45. data/app/controls/ar_menu_item_control.rb +55 -0
  46. data/app/controls/ar_page_control.rb +64 -0
  47. data/app/controls/ar_poll_result_control.rb +84 -0
  48. data/app/controls/ar_setup_control.rb +62 -0
  49. data/app/controls/belongs_to_control.rb +61 -0
  50. data/app/controls/browse_models_control.rb +98 -0
  51. data/app/controls/settings_form_control.rb +137 -0
  52. data/app/forms/agile_help.yml +112 -0
  53. data/app/forms/agile_menu.yml +140 -0
  54. data/app/forms/agile_report_defaults.yml +39 -0
  55. data/app/forms/all_options.yml +810 -0
  56. data/app/forms/ar_ad.yml +121 -0
  57. data/app/forms/ar_big_table.yml +60 -0
  58. data/app/forms/ar_big_table_value.yml +52 -0
  59. data/app/forms/ar_browse_fields.yml +35 -0
  60. data/app/forms/ar_browse_models.yml +48 -0
  61. data/app/forms/ar_category.yml +73 -0
  62. data/app/forms/ar_category_as_tree.yml +31 -0
  63. data/app/forms/ar_design.yml +75 -0
  64. data/app/forms/ar_filter.yml +52 -0
  65. data/app/forms/ar_folder_permission.yml +56 -0
  66. data/app/forms/ar_folder_rule.yml +48 -0
  67. data/app/forms/ar_gallery.yml +55 -0
  68. data/app/forms/ar_image.yml +126 -0
  69. data/app/forms/ar_image_search.yml +83 -0
  70. data/app/forms/ar_journal.yml +76 -0
  71. data/app/forms/ar_json_ld.yml +56 -0
  72. data/app/forms/ar_key_value.yml +33 -0
  73. data/app/forms/ar_key_value_store.yml +33 -0
  74. data/app/forms/ar_link.yml +60 -0
  75. data/app/forms/ar_menu.yml +67 -0
  76. data/app/forms/ar_menu_item.yml +141 -0
  77. data/app/forms/ar_page.yml +187 -0
  78. data/app/forms/ar_part.yml +91 -0
  79. data/app/forms/ar_permission.yml +52 -0
  80. data/app/forms/ar_permission_rule.yml +40 -0
  81. data/app/forms/ar_piece.yml +106 -0
  82. data/app/forms/ar_policy.yml +64 -0
  83. data/app/forms/ar_policy_rule.yml +42 -0
  84. data/app/forms/ar_policy_rule_nocms.yml +40 -0
  85. data/app/forms/ar_poll.yml +118 -0
  86. data/app/forms/ar_poll_item.yml +78 -0
  87. data/app/forms/ar_poll_result.yml +88 -0
  88. data/app/forms/ar_poll_result_export.yml +35 -0
  89. data/app/forms/ar_removed_url.yml +41 -0
  90. data/app/forms/ar_role.yml +43 -0
  91. data/app/forms/ar_seo.yml +32 -0
  92. data/app/forms/ar_setup.yml +45 -0
  93. data/app/forms/ar_site.yml +149 -0
  94. data/app/forms/ar_steps_template.yml +51 -0
  95. data/app/forms/ar_user.yml +140 -0
  96. data/app/forms/ar_user_role.yml +57 -0
  97. data/app/forms/help/dc_category_as_tree.en +4 -0
  98. data/app/forms/help/dc_category_as_tree.sl +5 -0
  99. data/app/forms/json_ld_schema.yml +168 -0
  100. data/app/helpers/agile_application_helper.rb +1162 -0
  101. data/app/helpers/agile_category_helper.rb +128 -0
  102. data/app/helpers/agile_common_helper.rb +308 -0
  103. data/app/helpers/agile_edit_helper.rb +645 -0
  104. data/app/helpers/agile_helper.rb +509 -0
  105. data/app/helpers/agile_index_helper.rb +677 -0
  106. data/app/helpers/ar_image_helper.rb +128 -0
  107. data/app/models/agile_form_fields/action.rb +61 -0
  108. data/app/models/agile_form_fields/agile_form_field.rb +322 -0
  109. data/app/models/agile_form_fields/belongs_to.rb +112 -0
  110. data/app/models/agile_form_fields/check_box.rb +73 -0
  111. data/app/models/agile_form_fields/comment.rb +62 -0
  112. data/app/models/agile_form_fields/date_picker.rb +104 -0
  113. data/app/models/agile_form_fields/date_select.rb +68 -0
  114. data/app/models/agile_form_fields/datetime_picker.rb +88 -0
  115. data/app/models/agile_form_fields/datetime_select.rb +73 -0
  116. data/app/models/agile_form_fields/file_field.rb +52 -0
  117. data/app/models/agile_form_fields/file_select.rb +69 -0
  118. data/app/models/agile_form_fields/hidden_field.rb +51 -0
  119. data/app/models/agile_form_fields/html_field.rb +69 -0
  120. data/app/models/agile_form_fields/journal_diff.rb +62 -0
  121. data/app/models/agile_form_fields/link_to.rb +69 -0
  122. data/app/models/agile_form_fields/method.rb +66 -0
  123. data/app/models/agile_form_fields/multitext_autocomplete.rb +215 -0
  124. data/app/models/agile_form_fields/number_field.rb +92 -0
  125. data/app/models/agile_form_fields/password_field.rb +63 -0
  126. data/app/models/agile_form_fields/radio_button.rb +95 -0
  127. data/app/models/agile_form_fields/readonly.rb +77 -0
  128. data/app/models/agile_form_fields/select.rb +281 -0
  129. data/app/models/agile_form_fields/submit_tag.rb +58 -0
  130. data/app/models/agile_form_fields/text_area.rb +61 -0
  131. data/app/models/agile_form_fields/text_autocomplete.rb +171 -0
  132. data/app/models/agile_form_fields/text_field.rb +55 -0
  133. data/app/models/agile_form_fields/text_with_select.rb +94 -0
  134. data/app/models/agile_form_fields/tree_select.rb +170 -0
  135. data/app/models/ar_big_table.rb +82 -0
  136. data/app/models/ar_big_table_value.rb +53 -0
  137. data/app/models/ar_category.rb +109 -0
  138. data/app/models/ar_design.rb +116 -0
  139. data/app/models/ar_filter.rb +200 -0
  140. data/app/models/ar_folder_permission.rb +50 -0
  141. data/app/models/ar_folder_rule.rb +47 -0
  142. data/app/models/ar_gallery.rb +53 -0
  143. data/app/models/ar_image.rb +198 -0
  144. data/app/models/ar_internals.rb +60 -0
  145. data/app/models/ar_journal.rb +46 -0
  146. data/app/models/ar_json_ld.rb +131 -0
  147. data/app/models/ar_key_value_store.rb +128 -0
  148. data/app/models/ar_link.rb +48 -0
  149. data/app/models/ar_memory.rb +172 -0
  150. data/app/models/ar_menu.rb +144 -0
  151. data/app/models/ar_menu_item.rb +106 -0
  152. data/app/models/ar_page.rb +74 -0
  153. data/app/models/ar_part.rb +66 -0
  154. data/app/models/ar_permission.rb +180 -0
  155. data/app/models/ar_permission_rule.rb +65 -0
  156. data/app/models/ar_policy.rb +78 -0
  157. data/app/models/ar_policy_rule.rb +65 -0
  158. data/app/models/ar_poll.rb +74 -0
  159. data/app/models/ar_poll_item.rb +47 -0
  160. data/app/models/ar_poll_result.rb +38 -0
  161. data/app/models/ar_removed_url.rb +42 -0
  162. data/app/models/ar_role.rb +84 -0
  163. data/app/models/ar_setup.rb +115 -0
  164. data/app/models/ar_site.rb +68 -0
  165. data/app/models/ar_temp.rb +150 -0
  166. data/app/models/ar_user.rb +72 -0
  167. data/app/models/ar_user_group.rb +38 -0
  168. data/app/models/ar_user_role.rb +54 -0
  169. data/app/models/ar_visit.rb +41 -0
  170. data/app/models/concerns/ar_page_concern.rb +128 -0
  171. data/app/models/concerns/ar_part_concern.rb +48 -0
  172. data/app/models/concerns/ar_piece_concern.rb +48 -0
  173. data/app/models/concerns/ar_policy_rule_concern.rb +87 -0
  174. data/app/models/concerns/ar_seo_concern.rb +66 -0
  175. data/app/models/concerns/ar_site_concern.rb +103 -0
  176. data/app/models/concerns/ar_user_concern.rb +195 -0
  177. data/app/renderers/agile_common_renderer.rb +93 -0
  178. data/app/renderers/agile_renderer.rb +59 -0
  179. data/app/renderers/ar_ad_renderer.rb +219 -0
  180. data/app/renderers/ar_captcha_renderer.rb +113 -0
  181. data/app/renderers/ar_common_renderer.rb +90 -0
  182. data/app/renderers/ar_gallery_renderer.rb +107 -0
  183. data/app/renderers/ar_menu_renderer.rb +195 -0
  184. data/app/renderers/ar_page_renderer.rb +147 -0
  185. data/app/renderers/ar_part_renderer.rb +235 -0
  186. data/app/renderers/ar_piece_renderer.rb +119 -0
  187. data/app/renderers/ar_poll_renderer.rb +272 -0
  188. data/app/views/agile/_edit_stuff.html.erb +57 -0
  189. data/app/views/agile/_form.html.erb +24 -0
  190. data/app/views/agile/_result.html.erb +28 -0
  191. data/app/views/agile/edit.html.erb +13 -0
  192. data/app/views/agile/error.html.erb +2 -0
  193. data/app/views/agile/index.html.erb +14 -0
  194. data/app/views/agile/login.html.erb +19 -0
  195. data/app/views/agile/new.html.erb +12 -0
  196. data/app/views/agile_common/_help.html.erb +18 -0
  197. data/app/views/agile_common/_iframe_edit.html.erb +2 -0
  198. data/app/views/agile_common/paste_clipboard.html.erb +17 -0
  199. data/app/views/layouts/agile.html.erb +17 -0
  200. data/app/views/layouts/content.html.erb +20 -0
  201. data/app/views/models/dump_models.html.erb +47 -0
  202. data/config/initializers/kaminari_patch.rb +56 -0
  203. data/config/locales/agile_de.yml +138 -0
  204. data/config/locales/agile_en.yml +162 -0
  205. data/config/locales/agile_sl.yml +163 -0
  206. data/config/locales/datetimepicker.yml +19 -0
  207. data/config/locales/de.yml +231 -0
  208. data/config/locales/en.yml +13 -0
  209. data/config/locales/kaminari.yml +26 -0
  210. data/config/locales/models_en.yml +1032 -0
  211. data/config/locales/models_sl.yml +1065 -0
  212. data/config/locales/sl.yml +211 -0
  213. data/db/migrate/20240120160001_add_sessions_table.rb +12 -0
  214. data/db/migrate/20240120160002_ar_big_table.rb +17 -0
  215. data/db/migrate/20240120160003_ar_big_table_value.rb +18 -0
  216. data/db/migrate/20240120160004_ar_category.rb +22 -0
  217. data/db/migrate/20240120160005_ar_design.rb +20 -0
  218. data/db/migrate/20240120160006_ar_filter.rb +17 -0
  219. data/db/migrate/20240120160007_ar_gallery.rb +21 -0
  220. data/db/migrate/20240120160008_ar_journal.rb +19 -0
  221. data/db/migrate/20240120160009_ar_key_value_store.rb +11 -0
  222. data/db/migrate/20240120160010_ar_link.rb +19 -0
  223. data/db/migrate/20240120160011_ar_memory.rb +8 -0
  224. data/db/migrate/20240120160012_ar_menu.rb +21 -0
  225. data/db/migrate/20240120160013_ar_menu_item.rb +28 -0
  226. data/db/migrate/20240120160014_ar_page.rb +50 -0
  227. data/db/migrate/20240120160015_ar_part.rb +33 -0
  228. data/db/migrate/20240120160016_ar_permission.rb +16 -0
  229. data/db/migrate/20240120160017_ar_permission_rule.rb +17 -0
  230. data/db/migrate/20240120160018_ar_piece.rb +28 -0
  231. data/db/migrate/20240120160019_ar_policy.rb +21 -0
  232. data/db/migrate/20240120160020_ar_policy_rule.rb +18 -0
  233. data/db/migrate/20240120160021_ar_poll.rb +27 -0
  234. data/db/migrate/20240120160022_ar_poll_item.rb +23 -0
  235. data/db/migrate/20240120160023_ar_poll_result.rb +14 -0
  236. data/db/migrate/20240120160024_ar_removed_url.rb +16 -0
  237. data/db/migrate/20240120160025_ar_role.rb +17 -0
  238. data/db/migrate/20240120160026_ar_site.rb +37 -0
  239. data/db/migrate/20240120160027_ar_temp.rb +11 -0
  240. data/db/migrate/20240120160028_ar_user.rb +42 -0
  241. data/db/migrate/20240120160029_ar_user_group.rb +12 -0
  242. data/db/migrate/20240120160030_ar_user_role.rb +18 -0
  243. data/db/migrate/20240120160031_ar_visit.rb +15 -0
  244. data/db/migrate/20240703016001_ar_setup.rb +16 -0
  245. data/db/migrate/20240703016002_ar_folder_permission.rb +15 -0
  246. data/db/migrate/20240703016003_ar_folder_rule.rb +14 -0
  247. data/db/migrate/20250115000001_ar_image.rb +25 -0
  248. data/lib/agile/configuration.rb +43 -0
  249. data/lib/agile/engine.rb +29 -0
  250. data/lib/agile/version.rb +27 -0
  251. data/lib/agile.rb +282 -0
  252. data/lib/agile_rails.rb +1 -0
  253. data/lib/generators/agile/USAGE +11 -0
  254. data/lib/generators/agile/new_form_generator.rb +369 -0
  255. data/lib/generators/convert_to_ar/convert_to_ar_generator.rb +158 -0
  256. data/lib/tasks/agile_db_clone.rake +132 -0
  257. data/lib/tasks/agile_db_export_to_yaml.rake +37 -0
  258. data/lib/tasks/agile_db_migrate.rake +35 -0
  259. 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 += " &nbsp;" 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('&nbsp;', ' ')) # 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,2 @@
1
+
2
+ <div class="ar-form-error"><%= error %></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,2 @@
1
+
2
+ <%= iframe_edit1() %>
@@ -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