The `use_helpers` method was added in ViewComponent 3.8.0, and it's included by default in all components since version 3.11.0. Note we sometimes delegated the `can?` method to the controller instead of the helpers, for no particularly reason. We're unifying that code as well.
71 lines
2.0 KiB
Ruby
71 lines
2.0 KiB
Ruby
class Attachable::FieldsComponent < ApplicationComponent
|
|
attr_reader :f, :resource_type, :resource_id, :relation_name
|
|
use_helpers :current_user, :render_image
|
|
|
|
def initialize(f, resource_type:, resource_id:, relation_name:)
|
|
@f = f
|
|
@resource_type = resource_type
|
|
@resource_id = resource_id
|
|
@relation_name = relation_name
|
|
end
|
|
|
|
private
|
|
|
|
def attachable
|
|
f.object
|
|
end
|
|
|
|
def singular_name
|
|
attachable.model_name.singular
|
|
end
|
|
|
|
def plural_name
|
|
attachable.model_name.plural
|
|
end
|
|
|
|
def file_name
|
|
attachable.attachment_file_name
|
|
end
|
|
|
|
def destroy_link
|
|
if !attachable.persisted? && attachable.cached_attachment.present?
|
|
link_to t("#{plural_name}.form.delete_button"), "#", class: "delete remove-cached-attachment"
|
|
else
|
|
link_to_remove_association remove_association_text, f, class: "delete remove-#{singular_name}"
|
|
end
|
|
end
|
|
|
|
def remove_association_text
|
|
if attachable.new_record?
|
|
t("documents.form.cancel_button")
|
|
else
|
|
t("#{plural_name}.form.delete_button")
|
|
end
|
|
end
|
|
|
|
def file_field
|
|
klass = attachable.persisted? || attachable.cached_attachment.present? ? " hide" : ""
|
|
f.file_field :attachment,
|
|
label_options: { class: "button hollow #{klass}" },
|
|
accept: accepted_content_types_extensions,
|
|
class: "js-#{singular_name}-attachment",
|
|
data: { url: direct_upload_path }
|
|
end
|
|
|
|
def direct_upload_path
|
|
direct_uploads_path("direct_upload[resource_type]": resource_type,
|
|
"direct_upload[resource_id]": resource_id,
|
|
"direct_upload[resource_relation]": relation_name)
|
|
end
|
|
|
|
def accepted_content_types_extensions
|
|
Setting.accepted_content_types_for(plural_name).map do |content_type|
|
|
if content_type == "jpg"
|
|
".jpg,.jpeg"
|
|
else
|
|
".#{content_type}"
|
|
end
|
|
end.join(",")
|
|
end
|
|
end
|