agile_rails 0.0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +5 -0
- data/MIT-LICENSE +20 -0
- data/README.md +285 -0
- data/Rakefile +39 -0
- data/agile_rails.gemspec +36 -0
- data/app/assets/fonts/ibm-plex-sans-300.woff2 +0 -0
- data/app/assets/fonts/ibm-plex-sans-400.woff2 +0 -0
- data/app/assets/fonts/ibm-plex-sans-500.woff2 +0 -0
- data/app/assets/fonts/ibm-plex-sans-600.woff2 +0 -0
- data/app/assets/fonts/ibm-plex-sans-700.woff2 +0 -0
- data/app/assets/fonts/ibm-plex-sans-italic.woff2 +0 -0
- data/app/assets/images/32px.png +0 -0
- data/app/assets/images/throbber.gif +0 -0
- data/app/assets/javascripts/agile/agile.js +1489 -0
- data/app/assets/javascripts/agile/jquery-migrate.js +702 -0
- data/app/assets/javascripts/agile/jquery.bpopup.js +372 -0
- data/app/assets/javascripts/agile/jquery.datetimepicker.js +1353 -0
- data/app/assets/javascripts/agile/jstree.min.js +6 -0
- data/app/assets/javascripts/agile/select-multiple.js +459 -0
- data/app/assets/javascripts/agile/some_scripts.js +33 -0
- data/app/assets/javascripts/agile.js +22 -0
- data/app/assets/javascripts/agile_application.js +22 -0
- data/app/assets/javascripts/agile_editor.js +22 -0
- data/app/assets/stylesheets/agile/agile.css +1882 -0
- data/app/assets/stylesheets/agile/agile_apps.css +149 -0
- data/app/assets/stylesheets/agile/jquery.datetimepicker.css +304 -0
- data/app/assets/stylesheets/agile/jstree.css +1107 -0
- data/app/assets/stylesheets/agile/select-multiple.css +110 -0
- data/app/assets/stylesheets/agile/th-bg.png +0 -0
- data/app/assets/stylesheets/agile/theme.css +49 -0
- data/app/assets/stylesheets/agile.css +21 -0
- data/app/assets/stylesheets/agile_application.css +20 -0
- data/app/assets/stylesheets/agile_editor.css +19 -0
- data/app/controllers/agile_application_controller.rb +735 -0
- data/app/controllers/agile_common_controller.rb +345 -0
- data/app/controllers/agile_controller.rb +977 -0
- data/app/controllers/agile_main_controller.rb +36 -0
- data/app/controls/agile_control.rb +120 -0
- data/app/controls/agile_report.rb +364 -0
- data/app/controls/ar_category_control.rb +39 -0
- data/app/controls/ar_help_control.rb +139 -0
- data/app/controls/ar_image_control.rb +180 -0
- data/app/controls/ar_journal_control.rb +47 -0
- data/app/controls/ar_menu_item_control.rb +55 -0
- data/app/controls/ar_page_control.rb +64 -0
- data/app/controls/ar_poll_result_control.rb +84 -0
- data/app/controls/ar_setup_control.rb +62 -0
- data/app/controls/belongs_to_control.rb +61 -0
- data/app/controls/browse_models_control.rb +98 -0
- data/app/controls/settings_form_control.rb +137 -0
- data/app/forms/agile_help.yml +112 -0
- data/app/forms/agile_menu.yml +140 -0
- data/app/forms/agile_report_defaults.yml +39 -0
- data/app/forms/all_options.yml +810 -0
- data/app/forms/ar_ad.yml +121 -0
- data/app/forms/ar_big_table.yml +60 -0
- data/app/forms/ar_big_table_value.yml +52 -0
- data/app/forms/ar_browse_fields.yml +35 -0
- data/app/forms/ar_browse_models.yml +48 -0
- data/app/forms/ar_category.yml +73 -0
- data/app/forms/ar_category_as_tree.yml +31 -0
- data/app/forms/ar_design.yml +75 -0
- data/app/forms/ar_filter.yml +52 -0
- data/app/forms/ar_folder_permission.yml +56 -0
- data/app/forms/ar_folder_rule.yml +48 -0
- data/app/forms/ar_gallery.yml +55 -0
- data/app/forms/ar_image.yml +126 -0
- data/app/forms/ar_image_search.yml +83 -0
- data/app/forms/ar_journal.yml +76 -0
- data/app/forms/ar_json_ld.yml +56 -0
- data/app/forms/ar_key_value.yml +33 -0
- data/app/forms/ar_key_value_store.yml +33 -0
- data/app/forms/ar_link.yml +60 -0
- data/app/forms/ar_menu.yml +67 -0
- data/app/forms/ar_menu_item.yml +141 -0
- data/app/forms/ar_page.yml +187 -0
- data/app/forms/ar_part.yml +91 -0
- data/app/forms/ar_permission.yml +52 -0
- data/app/forms/ar_permission_rule.yml +40 -0
- data/app/forms/ar_piece.yml +106 -0
- data/app/forms/ar_policy.yml +64 -0
- data/app/forms/ar_policy_rule.yml +42 -0
- data/app/forms/ar_policy_rule_nocms.yml +40 -0
- data/app/forms/ar_poll.yml +118 -0
- data/app/forms/ar_poll_item.yml +78 -0
- data/app/forms/ar_poll_result.yml +88 -0
- data/app/forms/ar_poll_result_export.yml +35 -0
- data/app/forms/ar_removed_url.yml +41 -0
- data/app/forms/ar_role.yml +43 -0
- data/app/forms/ar_seo.yml +32 -0
- data/app/forms/ar_setup.yml +45 -0
- data/app/forms/ar_site.yml +149 -0
- data/app/forms/ar_steps_template.yml +51 -0
- data/app/forms/ar_user.yml +140 -0
- data/app/forms/ar_user_role.yml +57 -0
- data/app/forms/help/dc_category_as_tree.en +4 -0
- data/app/forms/help/dc_category_as_tree.sl +5 -0
- data/app/forms/json_ld_schema.yml +168 -0
- data/app/helpers/agile_application_helper.rb +1162 -0
- data/app/helpers/agile_category_helper.rb +128 -0
- data/app/helpers/agile_common_helper.rb +308 -0
- data/app/helpers/agile_edit_helper.rb +645 -0
- data/app/helpers/agile_helper.rb +509 -0
- data/app/helpers/agile_index_helper.rb +677 -0
- data/app/helpers/ar_image_helper.rb +128 -0
- data/app/models/agile_form_fields/action.rb +61 -0
- data/app/models/agile_form_fields/agile_form_field.rb +322 -0
- data/app/models/agile_form_fields/belongs_to.rb +112 -0
- data/app/models/agile_form_fields/check_box.rb +73 -0
- data/app/models/agile_form_fields/comment.rb +62 -0
- data/app/models/agile_form_fields/date_picker.rb +104 -0
- data/app/models/agile_form_fields/date_select.rb +68 -0
- data/app/models/agile_form_fields/datetime_picker.rb +88 -0
- data/app/models/agile_form_fields/datetime_select.rb +73 -0
- data/app/models/agile_form_fields/file_field.rb +52 -0
- data/app/models/agile_form_fields/file_select.rb +69 -0
- data/app/models/agile_form_fields/hidden_field.rb +51 -0
- data/app/models/agile_form_fields/html_field.rb +69 -0
- data/app/models/agile_form_fields/journal_diff.rb +62 -0
- data/app/models/agile_form_fields/link_to.rb +69 -0
- data/app/models/agile_form_fields/method.rb +66 -0
- data/app/models/agile_form_fields/multitext_autocomplete.rb +215 -0
- data/app/models/agile_form_fields/number_field.rb +92 -0
- data/app/models/agile_form_fields/password_field.rb +63 -0
- data/app/models/agile_form_fields/radio_button.rb +95 -0
- data/app/models/agile_form_fields/readonly.rb +77 -0
- data/app/models/agile_form_fields/select.rb +281 -0
- data/app/models/agile_form_fields/submit_tag.rb +58 -0
- data/app/models/agile_form_fields/text_area.rb +61 -0
- data/app/models/agile_form_fields/text_autocomplete.rb +171 -0
- data/app/models/agile_form_fields/text_field.rb +55 -0
- data/app/models/agile_form_fields/text_with_select.rb +94 -0
- data/app/models/agile_form_fields/tree_select.rb +170 -0
- data/app/models/ar_big_table.rb +82 -0
- data/app/models/ar_big_table_value.rb +53 -0
- data/app/models/ar_category.rb +109 -0
- data/app/models/ar_design.rb +116 -0
- data/app/models/ar_filter.rb +200 -0
- data/app/models/ar_folder_permission.rb +50 -0
- data/app/models/ar_folder_rule.rb +47 -0
- data/app/models/ar_gallery.rb +53 -0
- data/app/models/ar_image.rb +198 -0
- data/app/models/ar_internals.rb +60 -0
- data/app/models/ar_journal.rb +46 -0
- data/app/models/ar_json_ld.rb +131 -0
- data/app/models/ar_key_value_store.rb +128 -0
- data/app/models/ar_link.rb +48 -0
- data/app/models/ar_memory.rb +172 -0
- data/app/models/ar_menu.rb +144 -0
- data/app/models/ar_menu_item.rb +106 -0
- data/app/models/ar_page.rb +74 -0
- data/app/models/ar_part.rb +66 -0
- data/app/models/ar_permission.rb +180 -0
- data/app/models/ar_permission_rule.rb +65 -0
- data/app/models/ar_policy.rb +78 -0
- data/app/models/ar_policy_rule.rb +65 -0
- data/app/models/ar_poll.rb +74 -0
- data/app/models/ar_poll_item.rb +47 -0
- data/app/models/ar_poll_result.rb +38 -0
- data/app/models/ar_removed_url.rb +42 -0
- data/app/models/ar_role.rb +84 -0
- data/app/models/ar_setup.rb +115 -0
- data/app/models/ar_site.rb +68 -0
- data/app/models/ar_temp.rb +150 -0
- data/app/models/ar_user.rb +72 -0
- data/app/models/ar_user_group.rb +38 -0
- data/app/models/ar_user_role.rb +54 -0
- data/app/models/ar_visit.rb +41 -0
- data/app/models/concerns/ar_page_concern.rb +128 -0
- data/app/models/concerns/ar_part_concern.rb +48 -0
- data/app/models/concerns/ar_piece_concern.rb +48 -0
- data/app/models/concerns/ar_policy_rule_concern.rb +87 -0
- data/app/models/concerns/ar_seo_concern.rb +66 -0
- data/app/models/concerns/ar_site_concern.rb +103 -0
- data/app/models/concerns/ar_user_concern.rb +195 -0
- data/app/renderers/agile_common_renderer.rb +93 -0
- data/app/renderers/agile_renderer.rb +59 -0
- data/app/renderers/ar_ad_renderer.rb +219 -0
- data/app/renderers/ar_captcha_renderer.rb +113 -0
- data/app/renderers/ar_common_renderer.rb +90 -0
- data/app/renderers/ar_gallery_renderer.rb +107 -0
- data/app/renderers/ar_menu_renderer.rb +195 -0
- data/app/renderers/ar_page_renderer.rb +147 -0
- data/app/renderers/ar_part_renderer.rb +235 -0
- data/app/renderers/ar_piece_renderer.rb +119 -0
- data/app/renderers/ar_poll_renderer.rb +272 -0
- data/app/views/agile/_edit_stuff.html.erb +57 -0
- data/app/views/agile/_form.html.erb +24 -0
- data/app/views/agile/_result.html.erb +28 -0
- data/app/views/agile/edit.html.erb +13 -0
- data/app/views/agile/error.html.erb +2 -0
- data/app/views/agile/index.html.erb +14 -0
- data/app/views/agile/login.html.erb +19 -0
- data/app/views/agile/new.html.erb +12 -0
- data/app/views/agile_common/_help.html.erb +18 -0
- data/app/views/agile_common/_iframe_edit.html.erb +2 -0
- data/app/views/agile_common/paste_clipboard.html.erb +17 -0
- data/app/views/layouts/agile.html.erb +17 -0
- data/app/views/layouts/content.html.erb +20 -0
- data/app/views/models/dump_models.html.erb +47 -0
- data/config/initializers/kaminari_patch.rb +56 -0
- data/config/locales/agile_de.yml +138 -0
- data/config/locales/agile_en.yml +162 -0
- data/config/locales/agile_sl.yml +163 -0
- data/config/locales/datetimepicker.yml +19 -0
- data/config/locales/de.yml +231 -0
- data/config/locales/en.yml +13 -0
- data/config/locales/kaminari.yml +26 -0
- data/config/locales/models_en.yml +1032 -0
- data/config/locales/models_sl.yml +1065 -0
- data/config/locales/sl.yml +211 -0
- data/db/migrate/20240120160001_add_sessions_table.rb +12 -0
- data/db/migrate/20240120160002_ar_big_table.rb +17 -0
- data/db/migrate/20240120160003_ar_big_table_value.rb +18 -0
- data/db/migrate/20240120160004_ar_category.rb +22 -0
- data/db/migrate/20240120160005_ar_design.rb +20 -0
- data/db/migrate/20240120160006_ar_filter.rb +17 -0
- data/db/migrate/20240120160007_ar_gallery.rb +21 -0
- data/db/migrate/20240120160008_ar_journal.rb +19 -0
- data/db/migrate/20240120160009_ar_key_value_store.rb +11 -0
- data/db/migrate/20240120160010_ar_link.rb +19 -0
- data/db/migrate/20240120160011_ar_memory.rb +8 -0
- data/db/migrate/20240120160012_ar_menu.rb +21 -0
- data/db/migrate/20240120160013_ar_menu_item.rb +28 -0
- data/db/migrate/20240120160014_ar_page.rb +50 -0
- data/db/migrate/20240120160015_ar_part.rb +33 -0
- data/db/migrate/20240120160016_ar_permission.rb +16 -0
- data/db/migrate/20240120160017_ar_permission_rule.rb +17 -0
- data/db/migrate/20240120160018_ar_piece.rb +28 -0
- data/db/migrate/20240120160019_ar_policy.rb +21 -0
- data/db/migrate/20240120160020_ar_policy_rule.rb +18 -0
- data/db/migrate/20240120160021_ar_poll.rb +27 -0
- data/db/migrate/20240120160022_ar_poll_item.rb +23 -0
- data/db/migrate/20240120160023_ar_poll_result.rb +14 -0
- data/db/migrate/20240120160024_ar_removed_url.rb +16 -0
- data/db/migrate/20240120160025_ar_role.rb +17 -0
- data/db/migrate/20240120160026_ar_site.rb +37 -0
- data/db/migrate/20240120160027_ar_temp.rb +11 -0
- data/db/migrate/20240120160028_ar_user.rb +42 -0
- data/db/migrate/20240120160029_ar_user_group.rb +12 -0
- data/db/migrate/20240120160030_ar_user_role.rb +18 -0
- data/db/migrate/20240120160031_ar_visit.rb +15 -0
- data/db/migrate/20240703016001_ar_setup.rb +16 -0
- data/db/migrate/20240703016002_ar_folder_permission.rb +15 -0
- data/db/migrate/20240703016003_ar_folder_rule.rb +14 -0
- data/db/migrate/20250115000001_ar_image.rb +25 -0
- data/lib/agile/configuration.rb +43 -0
- data/lib/agile/engine.rb +29 -0
- data/lib/agile/version.rb +27 -0
- data/lib/agile.rb +282 -0
- data/lib/agile_rails.rb +1 -0
- data/lib/generators/agile/USAGE +11 -0
- data/lib/generators/agile/new_form_generator.rb +369 -0
- data/lib/generators/convert_to_ar/convert_to_ar_generator.rb +158 -0
- data/lib/tasks/agile_db_clone.rake +132 -0
- data/lib/tasks/agile_db_export_to_yaml.rake +37 -0
- data/lib/tasks/agile_db_migrate.rake +35 -0
- metadata +414 -0
@@ -0,0 +1,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
|