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,128 @@
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
+ ####################################################################
26
+ # Helper for editing categories as tree view.
27
+ ####################################################################
28
+ module AgileCategoryHelper
29
+
30
+ ####################################################################
31
+ # Returns code for editing categories in a treeview
32
+ ####################################################################
33
+ def categories_as_tree
34
+ head = '<div id="catagories-as-tree"><ul><li data-id="nil"><span class="mi-o mi-home"></span>'
35
+ data = ArCategory.where(parent: nil).order(order: :asc).to_a
36
+ (head + html_for_category_tree(data) + '</li></ul></div>' + js_for_category_tree).html_safe
37
+ end
38
+
39
+ private
40
+
41
+ ####################################################################
42
+ #
43
+ ####################################################################
44
+ def html_for_category_tree(data)
45
+ html = '<ul>'
46
+ data.each do |category|
47
+ icon = category.active ? 'check_box' : 'check_box_outline_blank'
48
+ html += %(<li id="#{category.id}" data-parent="#{category.parent}"><span class="mi-o mi-#{icon} mi-18"></span>#{category.name}\n)
49
+ children = ArCategory.where(parent: category.id).order(order: :asc).to_a
50
+
51
+ html += html_for_category_tree(children) if children.size > 0
52
+ html += '</li>'
53
+ end
54
+ html + '</ul>'
55
+ end
56
+
57
+ ####################################################################
58
+ # Required javascript code
59
+ ####################################################################
60
+ def js_for_category_tree
61
+ %(<script>
62
+ $(function() {
63
+ $("#catagories-as-tree").jstree( {
64
+ core: { themes: { icons: false },
65
+ multiple: false
66
+ },
67
+ plugins: ["types", "contextmenu"],
68
+ contextmenu: {
69
+ items: function ($node) {
70
+ return {
71
+ edit: {
72
+ label: "<span class='ar-result-submenu'>#{t('agile.edit')}</span>",
73
+ icon: "mi-o mi-edit",
74
+ action: function (obj) {
75
+ let id = $('#catagories-as-tree').jstree('get_selected', true)[0].id;
76
+ let params = "&ids=" + id;
77
+ location.href = "/agile/" + id + "/edit?t=ar_category&f=ar_category_as_tree" + params;
78
+ }
79
+ },
80
+
81
+ new_child: {
82
+ label: "<span class='ar-result-submenu'>#{t('agile.new')}</span>",
83
+ icon: "mi-o mi-plus",
84
+ action: function (obj) {
85
+ let id = $('#catagories-as-tree').jstree('get_selected', true)[0].id;
86
+ let params = "&ids=" + id + "&p_parent=" + id;
87
+ location.href = "/agile/new?t=ar_category&f=ar_category_as_tree" + params
88
+ }
89
+ },
90
+
91
+ delete: {
92
+ label: "<span class='ar-result-submenu'>#{t('agile.delete')}</span>",
93
+ icon: "mi-o mi-delete",
94
+ action: function (obj) {
95
+ if (confirmation_is_cancelled("#{t('agile.confirm_delete')}") === true) return false;
96
+
97
+ let id = $('#catagories-as-tree').jstree('get_selected', true)[0].id;
98
+ let id_return = $('#catagories-as-tree').jstree('get_selected', true)[0].data["parent"];
99
+
100
+ $.ajax({
101
+ url: "/agile/" + id + "?t=ar_category",
102
+ type: 'DELETE',
103
+ success: function(data) {
104
+ let error = data.match("#{I18n.t('agile.category_has_subs')}");
105
+ if (error !== null) {
106
+ alert(error[0]);
107
+ params = "?t=ar_category&f=ar_category_as_tree&ids=" + id;
108
+ location.href = "/agile" + params;
109
+ return true;
110
+ }
111
+ }
112
+ });
113
+
114
+ let params = "?t=ar_category&f=ar_category_as_tree&ids=" + id_return;
115
+ location.href = "/agile" + params;
116
+ }
117
+ },
118
+ }
119
+ },
120
+ },
121
+ });
122
+ $("#catagories-as-tree").jstree(true).select_node("#{params[:ids]}");
123
+ });
124
+
125
+ </script>)
126
+ end
127
+
128
+ end
@@ -0,0 +1,308 @@
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
+ ####################################################################
26
+ # Common methods which may also come handy in controllers or models or any
27
+ # other module of program.
28
+ #
29
+ # Usage: include AgileCommonHelper
30
+ ####################################################################
31
+ module AgileCommonHelper
32
+
33
+ ####################################################################
34
+ def t(key, default = nil) #:nodoc
35
+ AgileHelper.t(key, default)
36
+ end
37
+
38
+ ####################################################################
39
+ # Returns table (table) name translation for usage in dialog title. Tablename
40
+ # title is provided by helpers.label.table_name.table_title locale.
41
+ #
42
+ # Parameters:
43
+ # [tablename] String. Table (table) name to be translated.
44
+ # [default] String. Value returned if translation is not found.
45
+ #
46
+ # Returns:
47
+ # String. Translated text.
48
+ ####################################################################
49
+ def t_table_name(table_name, default = nil)
50
+ t('helpers.label.' + table_name + '.table_title', default || table_name)
51
+ end
52
+
53
+ ############################################################################
54
+ # Returns label for field translated to current locale for usage on data entry form.
55
+ # Translation is provided by lang.helpers.label.table_name.field_name locale. If
56
+ # translation is not found method will capitalize field_name and replace '_' with ' '.
57
+ ############################################################################
58
+ def t_label_for_field(field_name, default = '')
59
+ c = (@form['i18n_prefix'] || "helpers.label.#{@form['table']}") + ".#{field_name}"
60
+ c = field_name if field_name.match(/helpers\./)
61
+
62
+ label = t(c, default)
63
+ label = field_name.capitalize.gsub('_', ' ') if c.match( /translation missing/i )
64
+ label
65
+ end
66
+
67
+ ############################################################################
68
+ # Returns label for field translated to current locale for usage in browser header.
69
+ # Translation is provided by lang.helpers.label.table_name.field_name locale. If
70
+ # not found method will look in standard agile translations.
71
+ ############################################################################
72
+ def t_label_for_column(options)
73
+ label = options['caption'] || options['label']
74
+ return ' ' if label == false
75
+
76
+ if label.blank?
77
+ label = if options['name']
78
+ prefix = @form['i18n_prefix'] || "helpers.label.#{@form['table']}"
79
+ "#{prefix}.#{options['name']}"
80
+ end
81
+ label = label.to_s
82
+ end
83
+ label = t(label) if label.match(/\./)
84
+ label = t("agile.#{options['name']}") if label.match('helpers.') # standard field names like created_by, updated_at
85
+ label = options['name'].capitalize if label.match('agile.') # still no translation. Just capitalize
86
+ label
87
+ end
88
+
89
+ ############################################################################
90
+ def agile_text_for_value(model, field, value)
91
+ AgileHelper.name_for_value(model, field, value)
92
+ end
93
+
94
+ ############################################################################
95
+ # Return choices for field in model if choices are defined in localization text.
96
+ #
97
+ # Parameters:
98
+ # [model] String. Table (table) model name (lowercase).
99
+ # [field] String. Field name used.
100
+ #
101
+ # Example:
102
+ # agile_choices_for_field('ar_user', 'state' )
103
+ #
104
+ # Returns:
105
+ # Array. Choices for select input field
106
+ ############################################################################
107
+ def self.agile_choices_for_field(model, field)
108
+ c = AgileCommonHelper.t("helpers.label.#{model}.choices_for_#{field}")
109
+ return ['error'] if c.match(/translation missing/i)
110
+
111
+ c.chomp.split(',').map{ _1.split(':') }
112
+ end
113
+
114
+ ############################################################################
115
+ # Will return descriptive text for id key when field in one table (table) has belongs_to
116
+ # relation to other table.
117
+ #
118
+ # Parameters:
119
+ # [model] String. Table (table) model name (lowercase).
120
+ # [field] String. Field name holding the value of descriptive text.
121
+ # [field_name] String. ID field name. This is by default id, but can be any other
122
+ # (preferred unique) field.
123
+ # [value] Value of id_field. Usually an id key but can be any other data type.
124
+ #
125
+ # Example:
126
+ # # usage in program.
127
+ # agile_name_for_id('ar_user', 'name', nil, ar_page.created_by)
128
+ #
129
+ # # usage in form
130
+ # columns:
131
+ # 2:
132
+ # name: site_id
133
+ # eval: agile_name_for_id,site,name
134
+ # # username is saved to document instead of user.id field
135
+ # 5:
136
+ # name: user
137
+ # eval: agile_name_for_id,ar_user,name,username
138
+ #
139
+ # Returns:
140
+ # String. Name (descriptive value) for specified key in table.
141
+ ############################################################################
142
+ def agile_name_for_id(model, field, field_name, id = nil)
143
+ return '' if id.nil?
144
+
145
+ field_name = (field_name || 'id').strip.to_sym
146
+ field = field.strip.to_sym
147
+ model = model.strip.classify.constantize if model.class == String
148
+ record = model.find_by(field_name => id)
149
+ record.nil? ? '' : (record.send(field) rescue '?? not defined')
150
+ end
151
+
152
+ ############################################################################
153
+ # Return html code for icon presenting boolean value. Icon is a picture of checked or unchecked box.
154
+ # If second parameter (fiel_name) is ommited value is supplied as first parameter.
155
+ #
156
+ # Parameters:
157
+ # [value] Boolean.
158
+ #
159
+ # Example:
160
+ # # usage from program
161
+ # agile_icon_for_boolean(document, field_name)
162
+ #
163
+ # # usage from form description
164
+ # columns:
165
+ # 10:
166
+ # name: active
167
+ # eval:agile_icon_for_boolean
168
+ ############################################################################
169
+ def agile_icon_for_boolean(document = false, field_name = nil)
170
+ value = field_name.nil? ? document : document[field_name]
171
+ agile_dont?(value, true) ? mi_icon('check_box_outline_blank md-18') : mi_icon('check_box-o md-18')
172
+ end
173
+
174
+ ############################################################################
175
+ # Returns html code for displaying date/time formatted by strftime. Will return '' if value is nil.
176
+ #
177
+ # Parameters:
178
+ # [value] Date/DateTime/Time.
179
+ # [format] String. strftime format mask. Defaults to locale's default format.
180
+ ############################################################################
181
+ def agile_format_date_time(value, format=nil) #:nodoc:
182
+ AgileHelper.format_date_time(value, format)
183
+ end
184
+
185
+ ############################################################################
186
+ # Returns html code for displaying formatted number.
187
+ #
188
+ # Parameters:
189
+ # [value] Numeric number.
190
+ # [decimals] Integer. Number of decimals
191
+ # [separator] String. Decimals separator
192
+ # [delimiter] String. Thousands delimiter.
193
+ # [currency] String. Currency symbol if applied to result string.
194
+ ############################################################################
195
+ def agile_format_number(value=0, decimals=nil, separator=nil, delimiter=nil, currency=nil) #:nodoc:
196
+ AgileHelper.format_number(value, decimals, separator, delimiter, currency)
197
+ end
198
+
199
+ ############################################################################
200
+ # Create help text for fields on single tab
201
+ ############################################################################
202
+ def agile_help_for_tab(tab)
203
+ return '' if tab.nil?
204
+
205
+ html = ''
206
+ if tab.class == Array
207
+ tab_name = tab.last['caption'] || tab.first
208
+ tab_label, tab_help = agile_tab_label_help(tab_name)
209
+ html += %(<div class="help-tab">#{tab_label}</div><div class="help-tab-help">#{tab_help}</div>)
210
+
211
+ tab = tab.last
212
+ end
213
+
214
+ tab.each do |field|
215
+ label, help = agile_label_help(field.last)
216
+ next if help.blank?
217
+
218
+ html += %(<div class="help-field"><div class="help-label">#{label}</div><div class="help-text">#{help.gsub("\n",'<br>')}</div></div>)
219
+ end
220
+ html
221
+ end
222
+
223
+ ############################################################################
224
+ # Will scoop fields and help text associated with them to create basic help text.
225
+ ############################################################################
226
+ def agile_help_fields
227
+ return '' if @form['form'].nil?
228
+
229
+ html = '<a id="fields"></a>'
230
+ if @form['form']['tabs']
231
+ @form['form']['tabs'].each { |tab| html += agile_help_for_tab(tab) }
232
+ else
233
+ html += agile_help_for_tab(@form['form']['fields'])
234
+ end
235
+ html.html_safe
236
+ end
237
+
238
+ ############################################################################
239
+ # Will return text from help files
240
+ ############################################################################
241
+ def agile_help_body
242
+ (params[:type] == 'index' ? @help['index'] : @help['form']).html_safe
243
+ end
244
+
245
+ ############################################################################
246
+ # Will return code for help button if there is any help text available for the form.
247
+ ############################################################################
248
+ def agile_help_button(data_set)
249
+ type = data_set.nil? ? 'form' : 'index'
250
+ form_name = AgileHelper.form_param(params) || AgileHelper.table_param(params)
251
+ url = url_for(controller: :agile_common, action: :help, type: type, f: form_name)
252
+ html = %(<div class="ar-help-icon ar-link-ajax" data-url=#{url}>#{mi_icon('question-circle')}</div>)
253
+ return html if type == 'form'
254
+
255
+ # check if index has any help available
256
+ help_file_name = @form['help'] || @form['extend'] || form_name
257
+ help_file_name = AgileApplicationController.find_help_file(help_file_name)
258
+ if help_file_name
259
+ help = YAML.load_file(help_file_name)
260
+ return html if help['index']
261
+ end
262
+ ''
263
+ end
264
+
265
+ ############################################################################
266
+ # Will return html code for steps menu when form with steps is processed.
267
+ ############################################################################
268
+ def agile_steps_menu_get(parent)
269
+ yaml = @form['form']['steps']
270
+ return '' unless yaml
271
+
272
+ html = %(<ul id="ar-steps-menu"><h2>#{t('agile.steps')}</h2>)
273
+ control = @form['control'] ? @form['control'] : @form['table']
274
+ parms = { controller: :agile, action: 'run', control: "#{control}.steps",
275
+ table: AgileHelper.table_param(params),
276
+ form_name: AgileHelper.form_param(params),
277
+ id: @record.id }
278
+
279
+ yaml.sort.each_with_index do |data, i|
280
+ n = i + 1
281
+ step = data.last # it's an array
282
+ url = case params[:step].to_i
283
+ when n + 1 then url_for(parms.merge({ step: n + 1, next_step: n}))
284
+ when n then url_for(parms.merge({ step: n, next_step: n}))
285
+ when n - 1 then url_for(parms.merge({ step: n - 1, next_step: n}))
286
+ else
287
+ ''
288
+ end
289
+ _class = url.present? ? 'ar-link-ajax' : ''
290
+ _class += (params[:step].to_i == n ? ' active' : '')
291
+ html += %(<li class="#{_class}" data-url="#{url}">#{step['title']}</li>)
292
+ end
293
+ html += '</ul>'
294
+ end
295
+
296
+ ############################################################################
297
+ # Adds additional parameters to url parameters hash. If url is nil then
298
+ # additional parameters are the return value of method.
299
+ #
300
+ # @param [Array] url : URL parameters as array. Values will be added to array.
301
+ ############################################################################
302
+ def url_forward_params(parms)
303
+ if params[:belongs_to]
304
+ parms[:belongs_to] = params[:belongs_to]
305
+ parms[:belongs_to_id] = params[:belongs_to_id]
306
+ end
307
+ end
308
+ end