diff --git a/apps/api/app/admin/softwares.rb b/apps/api/app/admin/softwares.rb index 5bc6b2f..5f1fb48 100644 --- a/apps/api/app/admin/softwares.rb +++ b/apps/api/app/admin/softwares.rb @@ -1,7 +1,7 @@ ActiveAdmin.register Software do permit_params :name, :title, :author, :desc, :story, :license, :platform, :status, :highlighted, - software_images_attributes: [ :id, :image_id, :is_default, :position, :_destroy ], + software_images_attributes: [ :id, :image_id, :is_default, :position, :file_upload, :_destroy ], external_links_attributes: [ :id, :label, :url, :_destroy ], releases_attributes: [ :id, :version, :html_folder_path, :cartridge_path, :source_path, :docs_folder_path, :web_playable, :_destroy ] @@ -52,8 +52,10 @@ ActiveAdmin.register Software do f.inputs "Images" do f.has_many :software_images, allow_destroy: true, new_record: true do |si| - si.input :image_id, as: :select, label: "Image", - collection: Image.order(:original_filename).map { |img| [img.original_filename, img.id] } + si.input :file_upload, as: :file, label: "Upload new image", hint: "Or select existing below" + si.input :image_id, as: :select, label: "Existing image", + collection: Image.order(:original_filename).map { |img| [img.original_filename, img.id] }, + include_blank: "— select —" si.input :is_default, as: :boolean si.input :position, as: :number, input_html: { min: 0 } end diff --git a/apps/api/app/models/software_image.rb b/apps/api/app/models/software_image.rb index d17a0de..9f07a07 100644 --- a/apps/api/app/models/software_image.rb +++ b/apps/api/app/models/software_image.rb @@ -1,7 +1,12 @@ class SoftwareImage < ApplicationRecord belongs_to :software - belongs_to :image + belongs_to :image, optional: true + attr_accessor :file_upload + + before_validation :create_image_from_upload, if: -> { file_upload.present? } + + validates :image_id, presence: true validates :image_id, uniqueness: { scope: :software_id } validates :position, numericality: { only_integer: true, greater_than_or_equal_to: 0 } @@ -19,6 +24,15 @@ class SoftwareImage < ApplicationRecord private + def create_image_from_upload + img = Image.new(file_upload: file_upload) + if img.save + self.image = img + else + errors.add(:file_upload, img.errors.full_messages.join(", ")) + end + end + def unset_other_defaults SoftwareImage.where(software_id: software_id, is_default: true) .where.not(id: id)