moonleerecords/moonlee-website

View on GitHub
app/admin/release.rb

Summary

Maintainability
A
50 mins
Test Coverage
# rubocop:disable Metrics/BlockLength
ActiveAdmin.register Release do
  menu label: 'Releases', priority: 4
  config.sort_order = 'catalog_number_desc'
  permit_params :title,
                :cover,
                :catalog_number,
                :release_date,
                :description,
                :tracklist,
                :genre,
                :for_fans_of,
                :quote,
                :bandcamp_url,
                :bandcamp_id,
                :internal,
                artist_ids: [],
                release_types_attributes: [
                  :id,
                  :release,
                  :release_format,
                  :_destroy,
                  release_type_buy_links_attributes: [:id, :title, :source, :buy_url, :release_type, :_destroy]
                ],
                external_links_attributes: [
                    :id,
                    :url_type,
                    :url,
                    :_destroy
                ]

  form do |f|
    f.semantic_errors
    f.inputs do
      f.input :artists,
              as: :select,
              multiple: true,
              required: true,
              collection: Artist.reorder('name')
      f.input :title
      f.input :cover,
              as: :file,
              hint: (f.object.cover.present? ? image_tag(f.object.cover.url(:medium)) : content_tag(:span, ''))
      f.input :catalog_number
      f.input :release_date,
              as: :date_time_picker,
              picker_options: {
                timepicker: false,
                format: 'd.m.Y',
                value: (localize(f.object.release_date) if f.object.release_date)
              }
      f.input :description, as: :ckeditor
      f.input :tracklist, as: :ckeditor
      f.input :genre
      f.input :for_fans_of
      f.input :quote
      f.input :bandcamp_url
      f.input :bandcamp_id, label: 'Bandcamp ID'
      f.input :internal
      f.input :active
      f.has_many :external_links, heading: 'Links', allow_destroy: true do |external_link|
        external_link.input :url_type,
                            as: :select,
                            collection: ExternalLink.allowed_url_types.collect { |type| [translate(type), type] }
        external_link.input :url
      end
      f.has_many :release_types, heading: 'Formats', allow_destroy: true do |release_type|
        release_type.input :release_format,
                           as: :select,
                           collection: ReleaseType.allowed_formats.collect { |format| [translate(format), format] }
        release_type.has_many :release_type_buy_links,
                              heading: 'Buy links',
                              allow_destroy: true,
                              new_record: 'Add new buy link' do |buy_link|
          buy_link.input :title
          buy_link.input :source,
                         as: :select,
                         collection: ReleaseTypeBuyLink.allowed_sources.collect { |source| [translate(source), source] }
          buy_link.input :buy_url
        end
      end
    end
    f.actions
  end

  show do
    attributes_table do
      row :id
      row 'Artist(s)' do
        release.artists_names
      end
      row :title
      row :cover do
        image_tag(release.cover.url(:medium)) if release.cover.present?
      end
      row :catalog_number
      row :release_date
      row :description do
        # rubocop:disable Rails/OutputSafety
        release.description.html_safe
      end
      row :tracklist do
        release.tracklist.html_safe
      end
      row :genre
      row :for_fans_of
      row :quote
      row :bandcamp_url do
        link_to release.bandcamp_url, release.bandcamp_url, target: '_blank'
      end
      row :bandcamp_id
      row :internal
      if release.external_links.count > 0
        panel 'Links' do
          ul do
            release.external_links.each do |external_link|
              li link_to(t(external_link.url_type), external_link.url, target: '_blank') unless external_link.url_type == ''
            end
          end
        end
      end
      row 'Formats' do
        release.release_types.each do |release_type|
          div translate(release_type.release_format) do
            ul do
              release_type.release_type_buy_links.each do |buy_link|
                li link_to "#{buy_link.source} (#{buy_link.title})", buy_link.buy_url, target: '_blank'
              end
            end
          end
        end
        nil
      end
      row 'Reviews' do
        ul do
          release.release_reviews.each do |release_type|
            li render_review(release_type)
          end
        end
      end
    end
  end

  index do
    selectable_column
    column 'Catalog number', :catalog_number, sortable: :catalog_number
    column 'Artist', :artists_names, sortable: 'artists.name'
    column 'Title', :title, sortable: :title
    column 'Release date', :release_date, sortable: :release_date
    column 'Internal', :internal, sortable: :internal
    column 'Active', :active, sortable: :active
    actions
  end

  # TODO: configure proper CSV, XML and JSON export
end