diff --git a/app/views/alchemy/admin/resources/_form.html.erb b/app/views/alchemy/admin/resources/_form.html.erb index 06a11a6105..c9dfd0302b 100644 --- a/app/views/alchemy/admin/resources/_form.html.erb +++ b/app/views/alchemy/admin/resources/_form.html.erb @@ -8,6 +8,11 @@ input_html: {class: 'alchemy_selectbox'} %> <% elsif attribute[:type].in? %i[date time datetime] %> <%= f.datepicker attribute[:name], resource_attribute_field_options(attribute) %> + <% elsif attribute[:enum].present? %> + <%= f.input attribute[:name], + collection: attribute[:enum], + include_blank: Alchemy.t(:blank, scope: 'resources.relation_select'), + input_html: {class: 'alchemy_selectbox'} %> <% else %> <%= f.input attribute[:name], resource_attribute_field_options(attribute) %> <% end %> diff --git a/lib/alchemy/resource.rb b/lib/alchemy/resource.rb index d67396562d..cd2740074f 100644 --- a/lib/alchemy/resource.rb +++ b/lib/alchemy/resource.rb @@ -169,10 +169,25 @@ def attributes name: col.name, type: resource_column_type(col), relation: resource_relation(col.name), - }.delete_if { |_k, v| v.nil? } + enum: enum_values_collection_for_select(col.name), + }.delete_if { |_k, v| v.blank? } end.compact end + def enum_values_collection_for_select(column_name) + enum = model.defined_enums[column_name] + return if enum.blank? + + enum.keys.map do |key| + [ + ::I18n.t(key, scope: [ + :activerecord, :attributes, model.model_name.i18n_key, "#{column_name}_values" + ], default: key.humanize), + key + ] + end + end + def sorted_attributes @_sorted_attributes ||= attributes. sort_by { |attr| attr[:name] == "name" ? 0 : 1 }. diff --git a/spec/dummy/app/models/event.rb b/spec/dummy/app/models/event.rb index 8d860fda8d..48ee7cc5bd 100644 --- a/spec/dummy/app/models/event.rb +++ b/spec/dummy/app/models/event.rb @@ -5,6 +5,12 @@ class Event < ActiveRecord::Base validates_presence_of :name belongs_to :location + + enum event_type: { + expo: 0, + workshop: 1, + } + before_destroy :abort_if_name_is_undestructible scope :starting_today, -> { where(starts_at: Time.current.at_midnight..Date.tomorrow.at_midnight) } diff --git a/spec/dummy/config/locales/en.yml b/spec/dummy/config/locales/en.yml index ae29415b67..8b7fe64b91 100644 --- a/spec/dummy/config/locales/en.yml +++ b/spec/dummy/config/locales/en.yml @@ -10,5 +10,9 @@ en: attributes: event: tag_names: Tags + event_type: Type + event_type_values: + expo: exposition + workshop: workshop location: tag_names: Tags diff --git a/spec/dummy/db/migrate/20211105175532_add_event_type_to_events.rb b/spec/dummy/db/migrate/20211105175532_add_event_type_to_events.rb new file mode 100644 index 0000000000..9d77ceab0a --- /dev/null +++ b/spec/dummy/db/migrate/20211105175532_add_event_type_to_events.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddEventTypeToEvents < ActiveRecord::Migration[5.2] + def change + add_column :events, :event_type, :integer, null: false, default: 0 + end +end diff --git a/spec/dummy/db/schema.rb b/spec/dummy/db/schema.rb index 9cfdd36eaf..e35b6f889a 100644 --- a/spec/dummy/db/schema.rb +++ b/spec/dummy/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2021_05_08_091432) do +ActiveRecord::Schema.define(version: 2021_11_05_175532) do create_table "alchemy_attachments", force: :cascade do |t| t.string "name" @@ -364,6 +364,7 @@ t.integer "location_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "event_type", default: 0, null: false end create_table "gutentag_taggings", force: :cascade do |t| diff --git a/spec/features/admin/resources_integration_spec.rb b/spec/features/admin/resources_integration_spec.rb index cc800e2d4e..cf13fc6c22 100644 --- a/spec/features/admin/resources_integration_spec.rb +++ b/spec/features/admin/resources_integration_spec.rb @@ -187,7 +187,15 @@ it "should have a select box for associated models" do visit "/admin/events/new" within("form") do - expect(page).to have_selector("select") + expect(page).to have_selector("select#event_location_id") + end + end + + it "should have a select box for enums values" do + visit "/admin/events/new" + + within("form") do + expect(page).to have_selector("select#event_event_type") end end