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,69 @@
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
+ module AgileFormFields
24
+
25
+ ###########################################################################
26
+ # Implementation of html_field AgileRails form field.
27
+ #
28
+ # HtmlField class only implements code for calling actual html edit field code.
29
+ # This is by default agile_rails_html_editor gem which uses CK editor javascript plugin
30
+ # or any other plugin. Which plugin will be used as html editor is defined by
31
+ # ar_site.settings html_editor setting.
32
+ #
33
+ # Example of ar_site.setting used for agile_rails_html_editor gem.
34
+ # html_editor: ckeditor
35
+ # ck_editor:
36
+ # config_file: /files/ck_config.js
37
+ # css_file: /files/ck_css.css
38
+ # file_select: elfinder
39
+ #
40
+ # Form example:
41
+ # 10:
42
+ # name: body
43
+ # type: html_field
44
+ # options: "height: 500, width: 550, toolbar: 'basic'"
45
+ ###########################################################################
46
+ class HtmlField < AgileFormField
47
+
48
+ ###########################################################################
49
+ # Render html_field AgileRails form field code
50
+ ###########################################################################
51
+ def render
52
+ # html editor is defined on site params
53
+ editor_string = @env.agile_get_site.params['html_editor'] if @env.agile_get_site
54
+ editor_string ||= 'ckeditor'
55
+
56
+ klas_string = editor_string.camelize
57
+ if AgileFormFields.const_defined?(klas_string)
58
+ klas = AgileFormFields::const_get(klas_string)
59
+ o = klas.new(@env, @record, @yaml).render
60
+ @js += o.js
61
+ @html += o.html
62
+ else
63
+ @html += 'HTML editor not defined. Check site.settings or include agile_rails_html_editor gem.'
64
+ end
65
+ self
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,62 @@
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
+ module AgileFormFields
24
+
25
+ ###########################################################################
26
+ # Implementation of journal_diff AgileRails form field. journal_diff field is used to
27
+ # show differences between two fields in ArJournal collection.
28
+ #
29
+ # Internal use.
30
+ #
31
+ # ===Form options:
32
+ # * +name:+ field name (required)
33
+ # * +type:+ journal_diff (required)
34
+ #
35
+ # Form example:
36
+ # 10:
37
+ # name: diff
38
+ # type: journal_diff
39
+ # html:
40
+ # size: 100x25
41
+ ###########################################################################
42
+ class JournalDiff < AgileFormField
43
+
44
+ ###########################################################################
45
+ # Render journal_diff AgileRails form field code
46
+ ###########################################################################
47
+ def render
48
+ @yaml['name'] = 'old' if @record[@yaml['name']].nil?
49
+ @html += '<div class="ar-journal">'
50
+ JSON.parse(@record[@yaml['name']]).each do |k, v|
51
+ old_value = v.class == Array ? v[0] : v
52
+ new_value = v.class == Array ? v[1] : v
53
+ @html += %(<div class="field">#{@env.check_box('select', k)} #{k}</div>
54
+ <div class="diff-m">#{@env.mi_icon('remove red')}<div>#{old_value}</div></div>
55
+ <div class="diff-p">#{@env.mi_icon('add green')}<div>#{new_value}</div></div>)
56
+ end
57
+ @html += '</div>'
58
+ self
59
+ end
60
+ end
61
+
62
+ end
@@ -0,0 +1,69 @@
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
+ module AgileFormFields
24
+
25
+ ###########################################################################
26
+ # Implementation of link_to AgileRails form field. link_to form field is mostly used by polls but can
27
+ # be also incorporated anywhere on the form.
28
+ #
29
+ # ===Form options:
30
+ # * +type:+ link_to (required)
31
+ # * +caption:+ Link caption
32
+ # * +icon:+ Link icon
33
+ # * +url:+ direct url link
34
+ # * +controller:+ controller name
35
+ # * +action:+ action name
36
+ # * +html:+ html options which apply to link_to (optional)
37
+ #
38
+ # Form example:
39
+ # 30:
40
+ # type: link_to
41
+ # caption: Some action
42
+ # icon: cogs
43
+ # controller: my_controller
44
+ # action: my_action
45
+ # id: id # will be replaced by record.id
46
+ ###########################################################################
47
+ class LinkTo < AgileFormField
48
+
49
+ ###########################################################################
50
+ # Render link_to AgileRails form field code
51
+ ###########################################################################
52
+ def render
53
+ @yaml['html'] ||= {}
54
+ @yaml['html']['class'] ||= 'ar-link'
55
+ @yaml['html'].symbolize_keys!
56
+
57
+ @yaml[:id] = record.id if @yaml[:id] == 'id'
58
+ url = @yaml['url'] || "#{@yaml[:controller]}/#{@yaml[:action]}/#{@yaml[:id]}"
59
+ url.gsub!('//','/') # no action and id
60
+ url = '/' + @yaml['url'] unless url[0,1] == '/' # no leading /
61
+ url.chop if url[0,-1] == '/' # remove trailing /
62
+
63
+ caption = @yaml['caption'] || @yaml['text']
64
+ @html += @env.agile_link_to(caption, @yaml['icon'], url, @yaml['html'])
65
+ self
66
+ end
67
+ end
68
+
69
+ end
@@ -0,0 +1,66 @@
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
+ module AgileFormFields
24
+
25
+ ###########################################################################
26
+ # Implementation of custom AgileRails form field. Method field will call method or class method
27
+ # defined in eval option and add returned code to HTML output code.
28
+ #
29
+ # It can be used in case when form contains complex data structure. For example set of pictures which can not
30
+ # be simply displayed by any other AgileRails Forms field.
31
+ #
32
+ # Form example:
33
+ # 50:
34
+ # name: galery
35
+ # type: method
36
+ # eval: show_gallery
37
+ # or
38
+ # eval: MyClass.show_gallery
39
+ #
40
+ ###########################################################################
41
+ class Method < AgileFormField
42
+
43
+ ###########################################################################
44
+ # Render file_select AgileRails form field code
45
+ ###########################################################################
46
+ def render
47
+ # might be defined as my_method or MyClass.my_method
48
+ clas, method = @yaml['eval'].split(/\.|\,/).map(&:strip)
49
+ if method.nil?
50
+ if @env.respond_to?(clas)
51
+ @html += @env.send(clas, @record, @yaml, @readonly)
52
+ return self
53
+ end
54
+ else
55
+ klass = clas.camelize.constantize
56
+ if klass.respond_to?(method)
57
+ @html += klass.send(method, @record, @yaml, @readonly)
58
+ return self
59
+ end
60
+ end
61
+ @html += "Error: #{@yaml['name']} : #{@yaml['eval']} not defined!"
62
+ self
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,215 @@
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
+ module AgileFormFields
24
+
25
+ ###########################################################################
26
+ # Implementation of multitext_autocomplete AgileRails Form field.
27
+ #
28
+ # multitext_autocomplete field is complex data entry field which uses autocomplete
29
+ # function when selecting multiple values for MongoDB Array field. Array typically holds
30
+ # id's of selected documents and control typically displays value of the field name
31
+ # defined by search options.
32
+ #
33
+ # ===Form options:
34
+ # * +name:+ field name (required)
35
+ # * +type:+ multitext_autocomplete (required)
36
+ # * +table+ Model (table) name which must contain searched field name.
37
+ # * +search:+ Search may consist of three parameters from which are separated either by dot (.) or comma(,)
38
+ # * search_field_name; when table option is defined search must define field name which will be used for search query
39
+ # * collection_name.search_field_name; Same as above except that table options must be ommited.
40
+ # * collection_name.search_field_name.method_name; When searching is more complex custom search
41
+ # method may be defined in CollectionName model which will provide dataset for search.
42
+ # * +with_new+ Will add an icon for shortcut to add new document to collection
43
+ #
44
+ # Form example:
45
+ # 90:
46
+ # name: kats
47
+ # type: multitext_autocomplete
48
+ # search: ar_category.name
49
+ # with_new: model_name
50
+ # size: 30
51
+ ###########################################################################
52
+ class MultitextAutocomplete < AgileFormField
53
+
54
+ ###########################################################################
55
+ # Returns value for readonly field
56
+ ###########################################################################
57
+ def ro_standard(table, search)
58
+ current_values = @record.send(@yaml['name'])
59
+ return self if current_values.blank?
60
+
61
+ table = table.classify.constantize
62
+ search = search.split(/\.|\,/).first if search.match(/\.|\,/)
63
+ html = current_values.map { |element| table.find(element)[search] + '<br>' }.join
64
+ super(html)
65
+ end
66
+
67
+ ###########################################################################
68
+ # Render multitext_autocomplete AgileRails form field code
69
+ ###########################################################################
70
+ def render
71
+ # get field name
72
+ if @yaml['search'].class.to_s == 'Hash'
73
+ #if @yaml['search'].kind_of?(Hash)
74
+ table = @yaml['search']['table']
75
+ field_name = @yaml['search']['field']
76
+ method = @yaml['search']['method']
77
+ search = method.nil? ? field_name : "#{field_name}.#{method}"
78
+ elsif @yaml['search'].to_s.match(/[.,]/)
79
+ table, field_name, method = @yaml['search'].split(/[.,]/).map(&:strip)
80
+ search = method.nil? ? field_name : "#{field_name}.#{method}"
81
+ else # search and table name are separated
82
+ search = field_name = @yaml['search']
83
+ end
84
+ # get table name
85
+ if @yaml['table']
86
+ table = if @yaml['table'].class == String
87
+ @yaml['table']
88
+ # eval(how_to_get_my_table_name)
89
+ elsif @yaml['table']['eval']
90
+ eval @yaml['table']['eval']
91
+ else
92
+ Rails.logger.error "Field #{@yaml['name']}: Invalid table parameter!"
93
+ nil
94
+ end
95
+ end
96
+
97
+ if table.blank? || search.blank?
98
+ @html += 'Table or search field not defined!'
99
+ return self
100
+ end
101
+
102
+ # does collection exists
103
+ collection = table.classify.constantize rescue nil
104
+ if collection.nil?
105
+ @html += "Invalid table name: #{table}"
106
+ return self
107
+ end
108
+
109
+ # does field exists
110
+ unless @record.respond_to?(@yaml['name'])
111
+ @html += "Invalid field name: #{@yaml['name']}"
112
+ return self
113
+ end
114
+
115
+ # search data entry
116
+ @yaml['html'] ||= {}
117
+ @yaml['html']['value'] = '' # must be. Otherwise it will look into record and return error
118
+ @yaml['html']['placeholder'] = t('agile.search_placeholder')
119
+ _name = '_' + @yaml['name']
120
+ @html += '<div class="ui-autocomplete-border">'
121
+ @html += @env.link_to(@env.mi_icon('plus-square-o green'), '#', onclick: 'return false;') # dummy add. But it is useful.
122
+
123
+ # text_field for autocomplete
124
+ record = record_text_for(@yaml['name'])
125
+ @html += '<span class="ar-text-autocomplete">' + @env.text_field(record, _name, @yaml['html']) + '<span></span></span>'
126
+
127
+ # link for adding new documents to searched collection
128
+ if @yaml['with_new'] && !@readonly
129
+ @html += ' ' +
130
+ @env.mi_icon('plus-square-o', class: 'in-edit-add', title: t('agile.new'),
131
+ style: "vertical-align: top;", 'data-table' => @yaml['with_new'] )
132
+ end
133
+
134
+ # div to list active selections
135
+ @html += %(<div id ="#{record}#{@yaml['name']}">)
136
+ # fill with current values
137
+ current_values = @record.send(@yaml['name'])
138
+ unless current_values.nil?
139
+ current_values.each do |element|
140
+ # this is quick and dirty trick. We have model ar_big_table which can be used for retrive
141
+ # more complicated options
142
+ # TODO retrieve choices from big_table
143
+ rec = if table == 'ar_big_table'
144
+ collection.find(@yaml['name'], @env.session)
145
+ else
146
+ collection.find(element)
147
+ end
148
+
149
+ @html += if rec
150
+ link = @env.link_to(@env.mi_icon('remove_circle red'), '#',
151
+ onclick: %($('##{rec.id}').hide(); let v = $('##{record}_#{@yaml['name']}_#{rec.id}'); v.val("-" + v.val());return false;))
152
+ link = @env.mi_icon('check green') if @readonly
153
+ field = @env.hidden_field(record, "#{@yaml['name']}_#{rec.id}", value: element)
154
+ %(<div id="#{rec.id}" style="padding:4px;">#{link} #{rec.send(field_name)}<br>#{field}</div>)
155
+ else
156
+ '** error **' # Related data is missing. It happends.
157
+ end
158
+ end
159
+ end
160
+ @html += "</div></div>"
161
+
162
+ # Create text for new div when new category is added
163
+ link = @env.link_to(@env.mi_icon('remove_circle red'), '#',
164
+ onclick: %($('#rec_id').hide(); let v = $('##{record}_#{@yaml['name']}_rec_id'); v.val("-" + v.val());return false;"))
165
+ field = @env.hidden_field(record, "#{@yaml['name']}_rec_id", value: 'rec_id')
166
+ one_div = %(<div id="rec_id" style="padding:4px;">#{link} rec_search<br>#{field}</div>)
167
+
168
+ # JS stuff
169
+ @js += <<EOJS
170
+ $(document).ready(function() {
171
+ $("##{record}_#{_name}").autocomplete( {
172
+ source: function(request, response) {
173
+ $.ajax({
174
+ url: "#{ @env.url_for( controller: 'agile_common', action: 'autocomplete' )}",
175
+ type: "POST",
176
+ dataType: "json",
177
+ data: { input: request.term, table: "#{table}", search: "#{search}" #{(',id: "' + @yaml['id'] + '"') if @yaml['id']} },
178
+ success: function(data) {
179
+ response( $.map( data, function(key) {
180
+ return key;
181
+ }));
182
+ }
183
+ });
184
+ },
185
+ change: function (event, ui) {
186
+ let div = '#{one_div}';
187
+ div = div.replace(/rec_id/g, ui.item.id)
188
+ div = div.replace('rec_search', ui.item.value)
189
+ $("##{record}#{@yaml['name']}").append(div);
190
+ $("##{record}_#{_name}").val('');
191
+ $("##{record}_#{_name}").focus();
192
+ },
193
+ minLength: 2
194
+ });
195
+ });
196
+ EOJS
197
+
198
+ self
199
+ end
200
+
201
+ ###########################################################################
202
+ # Class method for retrieving data from multitext_autocomplete form field.
203
+ ###########################################################################
204
+ def self.get_data(params, name)
205
+ r = []
206
+ params['record'].each do |k, v|
207
+ # if it starts with - then it was removed
208
+ r << v if k.match("#{name}_") && v[0] != '-'
209
+ r
210
+ end
211
+ r.uniq
212
+ end
213
+
214
+ end
215
+ end
@@ -0,0 +1,92 @@
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
+ module AgileFormFields
24
+
25
+ ###########################################################################
26
+ # Implementation of number_field AgileRails form field. Number fields can be
27
+ # formated for display with thousands delimiters and decimal separators and
28
+ # can have currency symbol.
29
+ #
30
+ # ===Form options:
31
+ # * +type:+ number_field (required)
32
+ # * +name:+ Field name (required)
33
+ # * +format:+ Format options
34
+ # * +decimals:+ No of decimal places
35
+ # * +separator:+ decimal separator (yes no , .) Default yes if decimals > 0
36
+ # * +delimiter:+ Thousands delimiter (yes no , .) Default defind by locals
37
+ # * +currency:+ Currency sign (yes no sign) Default no. If yes defined by locals
38
+ # * +html:+ html options which apply to text_field field (optional)
39
+ #
40
+ # Form example:
41
+ # 10:
42
+ # name: title
43
+ # type: number_field
44
+ # size: 10
45
+ # format:
46
+ # decimals: 2
47
+ # delimiter: false
48
+ ###########################################################################
49
+ class NumberField < AgileFormField
50
+
51
+ ###########################################################################
52
+ # Render text_field AgileRails form field
53
+ ###########################################################################
54
+ def render
55
+ set_initial_value
56
+
57
+ record = record_text_for(@yaml['name'])
58
+ @yaml['html'] ||= {}
59
+ @yaml['html']['class'] = 'ar-number'
60
+ if @yaml['format'].class == String
61
+ format = @yaml['format']
62
+ @yaml['format'] = {}
63
+ @yaml['format']['decimal'] = format[1].blank? ? 2 : format[1].to_i
64
+ @yaml['format']['separator'] = format[2].blank? ? I18n.t('number.currency.format.separator') : format[2]
65
+ @yaml['format']['delimiter'] = format[3].blank? ? I18n.t('number.currency.format.delimiter') : format[3]
66
+ end
67
+ @yaml['html']['data-decimal'] = @yaml.dig('format', 'decimal') || 2
68
+ @yaml['html']['data-delimiter'] = @yaml.dig('format', 'delimiter') || I18n.t('number.currency.format.delimiter')
69
+ @yaml['html']['data-separator'] = @yaml.dig('format', 'separator') || I18n.t('number.currency.format.separator')
70
+
71
+ value = @yaml['html']['value'] || @record.send(@yaml['name']) || 0
72
+ @yaml['html']['value'] = AgileHelper.format_number(value, @yaml['html']['data-decimal'], @yaml['html']['data-separator'], @yaml['html']['data-delimiter'] )
73
+
74
+ return ro_standard(@yaml['html']['value']) if @readonly
75
+
76
+ @yaml['html']['autocomplete'] ||= 'off'
77
+ @html += @env.hidden_field( record, @yaml['name'], value: value )
78
+ @html += @env.text_field( nil, "record_#{@yaml['name']}_", @yaml['html'])
79
+ self
80
+ end
81
+
82
+ ###########################################################################
83
+ # Return value. Return nil if input field is empty
84
+ ###########################################################################
85
+ def self.get_data(params, name)
86
+ return 0 if params['record'][name].blank?
87
+
88
+ params['record'][name].match('.') ? params['record'][name].to_f : params['record'][name].to_i
89
+ end
90
+
91
+ end
92
+ end
@@ -0,0 +1,63 @@
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
+ module AgileFormFields
24
+
25
+ ###########################################################################
26
+ # Implementation of password AgileRails form field.
27
+ #
28
+ # ===Form options:
29
+ # * +type:+ password_field (required)
30
+ # * +name:+ Field name (required)
31
+ # * +html:+ html options which apply to password field (optional)
32
+ #
33
+ # Form example:
34
+ # 20:
35
+ # name: password
36
+ # type: pasword_field
37
+ # html:
38
+ # size: 20
39
+ #
40
+ # 30:
41
+ # name: password_confirmation
42
+ # type: pasword_field
43
+ # html:
44
+ # size: 20
45
+ #
46
+ ###########################################################################
47
+ class PasswordField < AgileFormField
48
+
49
+ ###########################################################################
50
+ # Render password AgileRails form field code
51
+ ###########################################################################
52
+ def render
53
+ return self if @readonly
54
+
55
+ @yaml['html'] ||= {}
56
+ @yaml['html']['size'] ||= @yaml['size']
57
+ record = record_text_for(@yaml['name'])
58
+ @html += @env.password_field(record, @yaml['name'], @yaml['html'])
59
+ self
60
+ end
61
+ end
62
+
63
+ end