diff --git a/app/helpers/maintenance_tasks/tasks_helper.rb b/app/helpers/maintenance_tasks/tasks_helper.rb index 3d250d542..e9ed5fcc6 100644 --- a/app/helpers/maintenance_tasks/tasks_helper.rb +++ b/app/helpers/maintenance_tasks/tasks_helper.rb @@ -101,8 +101,17 @@ 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) + inclusion_validator = form_builder.object.class.validators_on(parameter_name).find do |validator| + validator.kind == :inclusion + 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) 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