locomotivecms/engine

View on GitHub
app/inputs/locomotive/file_input.rb

Summary

Maintainability
A
25 mins
Test Coverage
module Locomotive
  class FileInput < ::SimpleForm::Inputs::FileInput

    extend Forwardable

    def_delegators :template, :link_to, :content_tag

    include Locomotive::SimpleForm::BootstrapHelpers

    def input(wrapper_options = nil)
      row_wrapping(data: { persisted: persisted_file?, persisted_file: persisted_file?, resize_format: options[:resize_format] }) do
        file_html + buttons_html
      end
    end

    def file_html
      col_wrapping :file, 8 do
        no_file_html +
        new_file_html +
        filename_or_image +
        @builder.file_field(attribute_name, input_html_options) +
        @builder.hidden_field(:"remove_#{attribute_name}", class: 'remove', value: '0') +
        @builder.hidden_field(:"remote_#{attribute_name}_url", class: 'remote-url', value: '') +
        hidden_fields
      end
    end

    def buttons_html
      col_wrapping :buttons, 4 do
        button_html(:choose, options[:select_content_asset]) +
        button_html(:change, options[:select_content_asset]) +
        button_html(:cancel, false) +
        template.link_to(trash_icon, '#', class: "delete #{hidden_css(:delete)}")
      end
    end

    def button_html(name, dropdown = true)
      if dropdown
        content_tag(:div,
          content_tag(:button,
            (text(name) + ' ' + content_tag(:span, '', class: 'caret')).html_safe,
            class: 'btn btn-primary btn-sm dropdown-toggle', data: { toggle: 'dropdown', aria_expanded: false }) +
          content_tag(:ul,
            content_tag(:li, content_tag(:a, text(:select_local_file), href: '#', class: "local-file #{name}")) +
            content_tag(:li, content_tag(:a, text(:select_content_asset), href: template.content_assets_path(template.current_site), class: 'content-assets')),
            class: 'dropdown-menu dropdown-menu-right', role: 'menu'),
          class: "btn-group #{name} #{hidden_css(name)}")
      else
        template.link_to(text(name), '#', class: "#{name} btn btn-primary btn-sm #{hidden_css(name)}")
      end
    end

    def trash_icon
      template.content_tag(:i, '', class: 'far fa-trash-alt')
    end

    def filename_or_image
      if object.persisted? && persisted_file?
        css = "current-file #{persisted_file.image? ? 'image' : ''}"
        template.content_tag :span, (image_html + filename_html).html_safe, class: css
      else
        ''
      end
    end

    def no_file_html
      template.content_tag :span, text(:none), class: "no-file #{hidden_css(:no_file)}"
    end

    def new_file_html
      template.content_tag :span, 'New file here', class: "new-file #{hidden_css(:new_file)}"
    end

    def image_html
      if object.persisted? && persisted_file.image?
        url = Locomotive::Dragonfly.resize_url persisted_file.url, '60x60#'
        template.image_tag(url)
      else
        ''
      end
    end

    def hidden_fields
      (options[:hidden_fields] || []).map do |name|
        @builder.hidden_field(name)
      end.join.html_safe
    end

    def filename_html
      template.link_to(File.basename(persisted_file.to_s), persisted_file.url)
    end

    def persisted_file?
      self.object.send(:"#{attribute_name}?")
    end

    def persisted_file
      self.object.send(attribute_name.to_sym)
    end

    def hidden_css(name)
      displayed = case name
      when :choose, :no_file then !object.persisted? || !persisted_file?
      when :change, :delete then object.persisted? && persisted_file?
      else false
      end

      displayed ? '' : 'hide'
    end

    def text(name)
      I18n.t(name, scope: 'locomotive.inputs.file')
    end

  end
end