From 86a2934caf9ca9aa93c2b257d58ae0930a9c1b2d Mon Sep 17 00:00:00 2001 From: shalvah-gs Date: Mon, 4 Dec 2023 00:00:38 +0100 Subject: [PATCH 1/4] Render a dropdown list when an inclusion validator is used --- app/helpers/maintenance_tasks/tasks_helper.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/helpers/maintenance_tasks/tasks_helper.rb b/app/helpers/maintenance_tasks/tasks_helper.rb index 3d250d542..9c573a9ea 100644 --- a/app/helpers/maintenance_tasks/tasks_helper.rb +++ b/app/helpers/maintenance_tasks/tasks_helper.rb @@ -103,6 +103,16 @@ def csv_file_download_path(run) # Return the appropriate field tag for the parameter def parameter_field(form_builder, parameter_name) + # If the parameter has a `validates_inclusion_in` parameter, + # generate a dropdown list of options + inclusion_validator = form_builder.object.class.validators_on(parameter_name).find do |validator| + validator.instance_of?(ActiveModel::Validations::InclusionValidator) + end + + return form_builder.select( + parameter_name, inclusion_validator.options[:in], prompt: 'Select a value' + ) if inclusion_validator + case form_builder.object.class.attribute_types[parameter_name] when ActiveModel::Type::Integer form_builder.number_field(parameter_name) From 53fb245c57e5c208dd0e99d88567e3d651c7aee8 Mon Sep 17 00:00:00 2001 From: shalvah-gs Date: Wed, 13 Dec 2023 18:20:55 +0100 Subject: [PATCH 2/4] Use Validator#kind --- app/helpers/maintenance_tasks/tasks_helper.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/helpers/maintenance_tasks/tasks_helper.rb b/app/helpers/maintenance_tasks/tasks_helper.rb index 9c573a9ea..36fe7e884 100644 --- a/app/helpers/maintenance_tasks/tasks_helper.rb +++ b/app/helpers/maintenance_tasks/tasks_helper.rb @@ -106,11 +106,11 @@ def parameter_field(form_builder, parameter_name) # If the parameter has a `validates_inclusion_in` parameter, # generate a dropdown list of options inclusion_validator = form_builder.object.class.validators_on(parameter_name).find do |validator| - validator.instance_of?(ActiveModel::Validations::InclusionValidator) + validator.kind == :inclusion end return form_builder.select( - parameter_name, inclusion_validator.options[:in], prompt: 'Select a value' + parameter_name, inclusion_validator.options[:in], prompt: "Select a value" ) if inclusion_validator case form_builder.object.class.attribute_types[parameter_name] From e1ea266b09aa8537e7796855d694f6d3169de78c Mon Sep 17 00:00:00 2001 From: shalvah-gs Date: Sun, 17 Dec 2023 11:07:14 +0100 Subject: [PATCH 3/4] Move comment to method docs --- app/helpers/maintenance_tasks/tasks_helper.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/helpers/maintenance_tasks/tasks_helper.rb b/app/helpers/maintenance_tasks/tasks_helper.rb index 36fe7e884..e9ed5fcc6 100644 --- a/app/helpers/maintenance_tasks/tasks_helper.rb +++ b/app/helpers/maintenance_tasks/tasks_helper.rb @@ -101,10 +101,9 @@ def csv_file_download_path(run) ) end - # Return the appropriate field tag for the parameter + # Return the appropriate field tag for the parameter, based on its type. + # If the parameter has a `validates_inclusion_of` validator, return a dropdown list of options instead. def parameter_field(form_builder, parameter_name) - # If the parameter has a `validates_inclusion_in` parameter, - # generate a dropdown list of options inclusion_validator = form_builder.object.class.validators_on(parameter_name).find do |validator| validator.kind == :inclusion end From 7f77709e49cb293abcd984a1643d77cca648dea4 Mon Sep 17 00:00:00 2001 From: shalvah-gs Date: Thu, 21 Dec 2023 18:00:07 +0100 Subject: [PATCH 4/4] Add test --- test/dummy/app/tasks/maintenance/params_task.rb | 3 +++ test/models/maintenance_tasks/task_data_show_test.rb | 1 + test/system/maintenance_tasks/tasks_test.rb | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/test/dummy/app/tasks/maintenance/params_task.rb b/test/dummy/app/tasks/maintenance/params_task.rb index 6cfdb43e0..34787400c 100644 --- a/test/dummy/app/tasks/maintenance/params_task.rb +++ b/test/dummy/app/tasks/maintenance/params_task.rb @@ -17,6 +17,9 @@ class ParamsTask < MaintenanceTasks::Task attribute :date_attr, :date attribute :time_attr, :time attribute :boolean_attr, :boolean + attribute :enum_attr, :integer + + validates_inclusion_of :enum_attr, in: [100, 200, 300], allow_nil: true class << self attr_accessor :fast_task diff --git a/test/models/maintenance_tasks/task_data_show_test.rb b/test/models/maintenance_tasks/task_data_show_test.rb index c181d4a22..6931e6d7d 100644 --- a/test/models/maintenance_tasks/task_data_show_test.rb +++ b/test/models/maintenance_tasks/task_data_show_test.rb @@ -87,6 +87,7 @@ class TaskDataShowTest < ActiveSupport::TestCase "date_attr", "time_attr", "boolean_attr", + "enum_attr", ], TaskDataShow.new("Maintenance::ParamsTask").parameter_names, ) diff --git a/test/system/maintenance_tasks/tasks_test.rb b/test/system/maintenance_tasks/tasks_test.rb index 0aca06ca6..f28a628c8 100644 --- a/test/system/maintenance_tasks/tasks_test.rb +++ b/test/system/maintenance_tasks/tasks_test.rb @@ -114,6 +114,10 @@ class TasksTest < ApplicationSystemTestCase boolean_field = page.find_field("task[boolean_attr]") assert_equal("input", boolean_field.tag_name) assert_equal("checkbox", boolean_field[:type]) + enum_field = page.find_field("task[enum_attr]") + assert_equal("select", enum_field.tag_name) + enum_field_options = enum_field.find_all("option").map { |option| option[:value] } + assert_equal(["", "100", "200", "300"], enum_field_options) end test "view a Task with multiple pages of Runs" do