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,95 @@
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 radio_button AgileRails form field. Field provides radio_button input field.
27
+ # structure.
28
+ # Form options are mostly same as in select field.
29
+ #
30
+ # ===Form options:
31
+ # * +name:+ field name (required)
32
+ # * +type:+ radio_button (required)
33
+ # * +choices:+ Values for choices separated by comma. Values can also be specified like description:value.
34
+ # In this case description will be shown to user, but value will be saved to document.
35
+ # choices: 'OK:0,Ready:1,Error:2'
36
+ # choices: Ruby,Pyton,PHP
37
+ # * +eval:+ Choices will be provided by evaluating expression
38
+ # eval: agile_choices_for('model_name','description_field_name','_id'); agile_choices_for helper will provide data for select field.
39
+ # eval: ModelName.choices_for_field; ModelName class will define method choices_for_field which
40
+ # will provide data for select field. Since expression is evaluated in the context of Form Field object
41
+ # Even session session variables can be accessed.
42
+ # eval: 'MyClass.method(@env.session[:user_id])'
43
+ # When searching is more complex custom search method may be defined in CollectionName
44
+ # model which will provide dataset for search.
45
+ # eval: collection_name.search_field_name.method_name;
46
+ # If choices or eval is not defined choices will be provided from translation helpers. For example:
47
+ # Collection has field status. Choices for field will be provided by en.helpers.model_name.choices_for_status
48
+ # entry of english translation. English is of course default translation. If you provide translations in
49
+ # your local language then select choices will be localized.
50
+ # en.helpers.model_name.choices_for_status: 'OK:0,Ready:1,Error:2'
51
+ # sl.helpers.model_name.choices_for_status: 'V redu:0,Pripravljen:1,Napaka:2'
52
+ # * +inline:+ radio buttons will be presented inline instead of stacked on each other.
53
+ #
54
+ # Form example:
55
+ # 10:
56
+ # name: hifi
57
+ # type: radio_button
58
+ # choices: 'Marantz:1,Sony:2,Bose:3,Pioneer:4'
59
+ # inline: true
60
+ ###########################################################################
61
+ class RadioButton < Select
62
+
63
+ ###########################################################################
64
+ # Render radio_button AgileRails Form field
65
+ ###########################################################################
66
+ def render
67
+ return ro_standard if @readonly
68
+
69
+ set_initial_value('html','value')
70
+ record = record_text_for(@yaml['name'])
71
+ @yaml['html'].symbolize_keys!
72
+ clas = 'ar-radio' + ( @yaml['in_line'] ? ' ar-in-line' : '')
73
+ @html += %(<div class="#{clas}">)
74
+ choices = get_choices
75
+ value = @record.send(@yaml['name'])
76
+ if value.blank?
77
+ # Should select first button if no value provided
78
+ value = choices.first.is_a?(String) ? choices.first : choices.first.last
79
+ end
80
+ choices.each do |choice|
81
+ choice = [choice, choice] if choice.is_a?(String)
82
+ @html += <<~EOT
83
+ <div>
84
+ #{@env.radio_button_tag("#{record}[#{@yaml['name']}]", choice.last, choice.last.to_s == value.to_s)}
85
+ #{choice.first}
86
+ </div>
87
+ EOT
88
+ end
89
+ @html += "</div>\n"
90
+
91
+ self
92
+ end
93
+
94
+ end
95
+ end
@@ -0,0 +1,77 @@
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 readonly AgileRails form field.
27
+ #
28
+ # Readonly field value is just painted on form.
29
+ #
30
+ # ===Form options:
31
+ # * +name:+ field name
32
+ # * +type:+ readonly
33
+ # * +eval:+ value will be provided by evaluating expression. Usually agile_name_for_id helper
34
+ # can be used to get value. Example: agile_name_for_id,model_name_in_lower_case,field_name
35
+ #
36
+ # * +readonly:+ yes (can be applied to any field type)
37
+ #
38
+ # Form example:
39
+ # 10:
40
+ # name: user
41
+ # type: readonly
42
+ # size: 50
43
+ # 20:
44
+ # name: created_by
45
+ # type: readonly
46
+ # eval: agile_name_for_id,ar_user,name
47
+ ###########################################################################
48
+ class Readonly < AgileFormField
49
+
50
+ ###########################################################################
51
+ # Render readonly AgileRails form field code
52
+ ###########################################################################
53
+ def render
54
+ set_initial_value
55
+ @record[@yaml['name']] = @yaml['html']['value'] if @yaml['html']['value']
56
+
57
+ @html += @env.hidden_field('record', @yaml['name']) # retain field as hidden field
58
+ @html += %(<div class="ar-readonly" id="record_#{@yaml['name']}_">)
59
+
60
+ @html += if @yaml['eval']
61
+ if @yaml['eval'].match(/agile_name_for_id/)
62
+ parms = @env.agile_eval_to_array(@yaml['eval'])
63
+ parms << nil if parms.size == 3
64
+ @env.agile_name_for_id(parms[1], parms[2], parms[3], @record[@yaml['name']])
65
+ else
66
+ eval("#{@yaml['eval']}('#{@record.send(@yaml['name'])}')")
67
+ end
68
+ else
69
+ @env.agile_format_value(@record.send(@yaml['name']), @yaml['format'])
70
+ end
71
+ @html += '</div>'
72
+ self
73
+ end
74
+
75
+ end
76
+
77
+ end
@@ -0,0 +1,281 @@
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 select AgileRails form field.
27
+ #
28
+ # ===Form options:
29
+ # * +name:+ field name (required)
30
+ # * +type:+ select (required)
31
+ # * +choices:+ Values for choices separated by comma. Values can also be specified like description:value.
32
+ # In the example description will be shown to user, but value will be saved to document.
33
+ # choices: 'OK:0,Ready:1,Error:2'
34
+ # choices: Ruby,Pyton,PHP
35
+ # * +eval:+ Choices will be provided by evaluating expression
36
+ # * eval: agile_choices_for('model_name','description_field_name','_id'); agile_choices_for helper will provide data for select field.
37
+ # * eval: ModelName.choices_for_field; ModelName class will define method choices_for_field which
38
+ # will provide data for select field.
39
+ # * collection_name.search_field_name.method_name; When searching is more complex custom search
40
+ # method may be defined in CollectionName model which will provide dataset for search.
41
+ # * If choices or eval is not defined choices will be provided from translation helpers. For example:
42
+ # Collection has field status choices for field may be provided by en.helpers.model_name.choices_for_status
43
+ # entry of english translation. English is of course default translation. If you provide translations in
44
+ # your local language then select choices will be localized.
45
+ # en.helpers.model_name.choices_for_status: 'OK:0,Ready:1,Error:2'
46
+ # sl.helpers.model_name.choices_for_status: 'V redu:0,Pripravljen:1,Napaka:2'
47
+ # * +depend:+ Select options may depend on a value in some other field. If depend option is specified
48
+ # then chices must be provided by class method and defined in eval option.
49
+ # * +html:+ html options which apply to select field (optional)
50
+ #
51
+ # Form example:
52
+ # 30:
53
+ # name: type
54
+ # type: select
55
+ # 40:
56
+ # name: env
57
+ # type: select
58
+ # choices: eval ArCategory.values_for_env
59
+ # include_blank: true
60
+ # 50:
61
+ # name: company
62
+ # type: select
63
+ # choices: Audi,BMW,Mercedes
64
+ # or
65
+ # choices: helpers.label.model.choices_for_field
66
+ # 60:
67
+ # name: type
68
+ # type: select
69
+ # choices:
70
+ # eval: Cars.choices_for_type
71
+ # depend: company
72
+ ###########################################################################
73
+ class Select < AgileFormField
74
+
75
+ ###########################################################################
76
+ # Choices are defined in locales as:
77
+ # lang.choices_for_tablename_fieldname: One,Two,Three
78
+ # or by default as
79
+ # lang:
80
+ # helpers:
81
+ # label:
82
+ # table_name:
83
+ # choices_for_fieldname: One:1, two:2
84
+ ###########################################################################
85
+ def choices_in_locales(locales = nil)
86
+ locales ||= "helpers.label.#{@form['table']}.choices_for_#{@yaml['name']}"
87
+ c = t(locales)
88
+ if c.match(/translation missing/i)
89
+ locales = "choices_for_#{@form['table']}_#{@yaml['name']}"
90
+ return "Error. Locale #{locales} not defined" if c.match(/translation missing/i)
91
+ end
92
+ c
93
+ end
94
+
95
+ ###########################################################################
96
+ # Choices are defined by evaluating an expression. This is most common class
97
+ # method defined in a class. eg. SomeClass.get_choices_for
98
+ ###########################################################################
99
+ def choices_in_eval(e)
100
+ e = e.sub('eval ', '').strip
101
+ method = e.split(/\ |\(/).first
102
+ if @yaml['depend'].present?
103
+ # add event listener to depend field(s)
104
+ depend_value = ''
105
+ @js += "\n$(document).ready(function() {\n"
106
+ @yaml['depend'].split(',') do |depend|
107
+ depend.strip!
108
+ depend_value += ',' if depend_value.present?
109
+ # depend field might be virtual field. It's value should be set in params
110
+ depend_value += (depend[0] == '_' ? @env.params["p_#{depend}"] : @record[depend]).to_s
111
+ next if depend == @yaml['name'] # self may be sent, but don't listen to change event
112
+
113
+ @js += %(
114
+ $('#record_#{depend}').change( function(e) { update_select_depend('record_#{@yaml['name']}', '#{@yaml['depend']}', '#{e}');});
115
+ $('#_record_#{depend}').change( function(e) { update_select_depend('record_#{@yaml['name']}', '#{@yaml['depend']}', '#{e}');});
116
+ )
117
+ end
118
+ @js += + "});\n"
119
+ e += " '#{depend_value}'"
120
+ end
121
+
122
+ return eval(e) if respond_to?(method) # is method defined here
123
+ return eval("@env.#{e}") if @env.respond_to?(method) # is method defined in helper methods
124
+
125
+ # eval whatever is there
126
+ eval e
127
+ end
128
+
129
+ def choices_in_eval(e)
130
+
131
+ e = e.sub('eval ', '').strip
132
+ if @yaml['depend'].nil?
133
+ method = e.split(/\ |\(/).first
134
+ return eval(e) if respond_to?(method) # is method defined here
135
+ return eval("@env.#{e}") if @env.respond_to?(method) # is method defined in helper methods
136
+ # eval whatever it is there
137
+ return eval e
138
+ end
139
+
140
+ # add event listener to depend field(s)
141
+ depend_value = ''
142
+ @js += "\n$(document).ready(function() {\n"
143
+ @yaml['depend'].split(',') do |depend|
144
+ depend.strip!
145
+ depend_value += ',' if depend_value.present?
146
+ # depend field might be virtual field. It's value should be set in params
147
+ if depend[0] == '_'
148
+ depend_value += @env.params["p_#{depend}"].to_s
149
+ else
150
+ next if @record.nil? # used as filter field
151
+
152
+ depend_value += @record[depend].to_s
153
+ end
154
+ next if depend == @yaml['name'] # self may be sent, but don't listen to change event
155
+
156
+ @js += %(
157
+ $('#record_#{depend}').change( function(e) { update_select_depend('record_#{@yaml['name']}', '#{@yaml['depend']}', '#{e}');});
158
+ $('#_record_#{depend}').change( function(e) { update_select_depend('record_#{@yaml['name']}', '#{@yaml['depend']}', '#{e}');});
159
+ )
160
+ end
161
+ @js += "});\n"
162
+ e += " '#{depend_value}'"
163
+ eval e
164
+ end
165
+
166
+ ###########################################################################
167
+ # Get choices for select field.
168
+ ###########################################################################
169
+ def get_choices
170
+ begin
171
+ choices = case @yaml['choices']
172
+ when nil
173
+ @yaml['eval'] ? choices_in_eval(@yaml['eval']) : choices_in_locales()
174
+ when /^eval /i
175
+ choices_in_eval(@yaml['choices'])
176
+ when /^helpers/
177
+ choices_in_locales(@yaml['choices'])
178
+ else
179
+ if @yaml['choices'].is_a?(String)
180
+ @yaml['choices']
181
+ else
182
+ choices_in_eval(@yaml['choices']['eval'])
183
+ end
184
+ end
185
+ return choices unless choices.is_a?(String)
186
+
187
+ choices.chomp.split(',').map{ |e| e.match(':') ? e.split(':') : e }
188
+ rescue Exception => e
189
+ Rails.logger.debug "\nError in select eval. #{e.message}\n"
190
+ Rails.logger.debug(e.backtrace.join($/)) if Rails.env.development?
191
+ ['error'] # return empty array when error occures
192
+ end
193
+ end
194
+
195
+ ###########################################################################
196
+ # Will add code to view data record behind selected option in a popup window
197
+ ###########################################################################
198
+ def add_view_code
199
+ return '' if (data = @record.send(@yaml['name'])).blank?
200
+
201
+ table, form_name = @yaml['view'].split(/[ ,]/).delete_if(&:blank?)
202
+ url = @env.url_for(controller: :agile, id: data, action: :edit, table: table, form_name: form_name, readonly: true, window_close: 1 )
203
+ icon = @env.mi_icon('eye-o md-18')
204
+ %(<span class="ar-window-open" data-url="#{url}"> #{icon}</span>)
205
+ end
206
+
207
+ ###########################################################################
208
+ # Return value when readonly is required
209
+ ###########################################################################
210
+ def ro_standard
211
+ value = @record.respond_to?(@yaml['name']) ? @record.send(@yaml['name']) : nil
212
+ return self if value.blank?
213
+
214
+ html = ''
215
+ choices = get_choices()
216
+ if value.class == Array # multiple choices
217
+ value.each do |element|
218
+ choices.each do |choice|
219
+ if choice.to_s == element.to_s
220
+ html += '<br>' if html.size > 0
221
+ html += "#{element.to_s}"
222
+ end
223
+ end
224
+ end
225
+ else
226
+ choices.each do |choice|
227
+ if choice.class == Array
228
+ (html = choice.first; break) if choice.last.to_s == value.to_s
229
+ else
230
+ (html = choice; break) if choice.to_s == value.to_s
231
+ end
232
+ end
233
+ html += add_view_code if @yaml['view']
234
+ end
235
+ super(html)
236
+ end
237
+
238
+ ###########################################################################
239
+ # Render select field html code
240
+ ###########################################################################
241
+ def render
242
+ return ro_standard if @readonly
243
+
244
+ set_initial_value('html','selected')
245
+ # options can be all around
246
+ options = {}
247
+ %w[selected include_blank].each do |key|
248
+ options[key.to_sym] = (@yaml['html'].delete(key) if @yaml.dig('html', key)) ||
249
+ (@yaml['options'].delete(key) if @yaml.dig('options', key)) ||
250
+ (@yaml[key] if @yaml[key])
251
+ end
252
+ options.compact!
253
+ @yaml['html']['multiple'] = true if @yaml['multiple']
254
+
255
+ record = record_text_for(@yaml['name'])
256
+ if @yaml['html']['multiple']
257
+ @yaml['html']['class'] = "#{@yaml['html']['class']} select-multiple"
258
+ @html += @env.select(record, @yaml['name'], get_choices, options, @yaml['html'])
259
+ @js += "$('##{record}_#{@yaml['name']}').selectMultiple();"
260
+ else
261
+ @html += @env.select(record, @yaml['name'], get_choices, options, @yaml['html'])
262
+ # add code for view more data
263
+ @html += view_code_add() if @yaml['with_view']
264
+ @html += edit_code_add() if @yaml['with_edit'] && !@readonly
265
+ end
266
+ self
267
+ end
268
+
269
+ ###########################################################################
270
+ # Return value.
271
+ ###########################################################################
272
+ def self.get_data(params, name)
273
+ if params['record'][name].class == Array # remove blanks if array
274
+ return params['record'][name].select(&:present?)
275
+ end
276
+
277
+ params['record'][name]
278
+ end
279
+ end
280
+
281
+ end
@@ -0,0 +1,58 @@
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
+ # Create submit_tag form field. submit_tag form field is mostly used by polls but can
27
+ # be also incorporated in the middle of form.
28
+ #
29
+ # ===Form options:
30
+ # * +type:+ submit_tag (required)
31
+ # * +caption:+ Submit field caption
32
+ # * +icon:+ Icon
33
+ # * +html:+ html options which apply to link_to (optional)
34
+ #
35
+ # Form example:
36
+ # 40:
37
+ # type: submit_tag
38
+ # caption: translate.this
39
+ # icon: check
40
+ ###########################################################################
41
+ class SubmitTag < AgileFormField
42
+
43
+ ###########################################################################
44
+ # Render submit_tag AgileRails form field code
45
+ ###########################################################################
46
+ def render
47
+ @yaml['html'] ||= {}
48
+ @yaml['html']['class'] ||= 'ar-submit'
49
+ @yaml['html'].symbolize_keys!
50
+ text = @yaml['caption'] || @yaml['text']
51
+ text = t(@yaml['text']) if text.match(/\./)
52
+
53
+ @html += @env.submit_tag(text, @yaml['html'])
54
+ self
55
+ end
56
+ end
57
+
58
+ end
@@ -0,0 +1,61 @@
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 text_area AgileRails form field.
27
+ #
28
+ # ===Form options:
29
+ # * +type:+ text_area (required)
30
+ # * +name:+ Field name (required)
31
+ # * +html:+ html options which apply to text_area field (optional)
32
+ #
33
+ # Form example:
34
+ # 10:
35
+ # name: css
36
+ # type: text_area
37
+ # size: 100x30
38
+ ###########################################################################
39
+ class TextArea < AgileFormField
40
+
41
+ ###########################################################################
42
+ # Return value for readonly field
43
+ ###########################################################################
44
+ def ro_standard
45
+ value = @record[@yaml['name']]
46
+ @html += "<div class='ar-readonly'>#{value.gsub("\n",'<br>')}</div>" unless value.blank?
47
+ self
48
+ end
49
+
50
+ ###########################################################################
51
+ # Render text_area AgileRails form field code
52
+ ###########################################################################
53
+ def render
54
+ set_initial_value
55
+ record = record_text_for(@yaml['name'])
56
+ @html += @env.text_area(record, @yaml['name'], @yaml['html'])
57
+ self
58
+ end
59
+
60
+ end
61
+ end