require "action_view"
require "money"
class AttachmentPresenter
attr_reader :attachment
include ActionView::Helpers::TagHelper
include ActionView::Helpers::NumberHelper
include ActionView::Helpers::AssetTagHelper
def initialize(attachment)
@attachment = attachment
end
def id
attachment.id
end
def order_url
attachment.order_url
end
def opendocument?
attachment.opendocument?
end
def url
attachment.url
end
def external?
attachment.external?
end
def price
return unless attachment.price
Money.from_amount(attachment.price, 'GBP').format
end
def accessible?
attachment.accessible?
end
def thumbnail_link
return if hide_thumbnail?
return if previewable?
link(attachment_thumbnail, url, "aria-hidden=true class=#{attachment_class}")
end
def help_block_toggle_id
"attachment-#{attachment.id}-accessibility-request"
end
def section_class
attachment.external? ? "hosted-externally" : "embedded"
end
def mail_to(email_address, name, options = {})
"#{name}"
end
def alternative_format_order_link
attachment_info = []
attachment_info << " Title: #{attachment.title}"
attachment_info << " Original format: #{attachment.file_extension}"
attachment_info << " ISBN: #{attachment.isbn}" if attachment.isbn.present?
attachment_info << " Unique reference: #{attachment.unique_reference}" if attachment.unique_reference.present?
attachment_info << " Command paper number: #{attachment.command_paper_number}" if attachment.command_paper_number.present?
if attachment.hoc_paper_number.present?
attachment_info << " House of Commons paper number: #{attachment.hoc_paper_number}"
attachment_info << " Parliamentary session: #{attachment.parliamentary_session}"
end
options = {
subject: "Request for '#{attachment.title}' in an alternative format",
body: body_for_mail(attachment_info)
}
mail_to(alternative_format_contact_email, alternative_format_contact_email, options)
end
def body_for_mail(attachment_info)
<<-END
Details of document required:
#{attachment_info.join("\n")}
Please tell us:
1. What makes this format unsuitable for you?
2. What format you would prefer?
END
end
def alternative_format_contact_email
"govuk-feedback@digital.cabinet-office.gov.uk"
end
def attachment_thumbnail
if attachment.pdf?
image_tag(attachment.file.thumbnail.url)
elsif attachment.html?
image_tag('pub-cover-html.png')
elsif %w{doc docx odt}.include? attachment.file_extension
image_tag('pub-cover-doc.png')
elsif %w{xls xlsx ods csv}.include? attachment.file_extension
image_tag('pub-cover-spreadsheet.png')
else
image_tag('pub-cover.png')
end
end
def references
references = []
references << "ISBN: #{attachment.isbn}" if attachment.isbn.present?
references << "Unique reference: #{attachment.unique_reference}" if attachment.unique_reference.present?
references << "Command paper number: #{attachment.command_paper_number}" if attachment.command_paper_number.present?
references << "HC: #{attachment.hoc_paper_number} #{attachment.parliamentary_session}" if attachment.hoc_paper_number.present?
prefix = references.size == 1 ? "and its reference" : "and its references"
references.any? ? ", #{prefix} (" + references.join(", ") + ")" : ""
end
def references?
!attachment.isbn.to_s.empty? || !attachment.unique_reference.to_s.empty? || !attachment.command_paper_number.to_s.empty? || !attachment.hoc_paper_number.to_s.empty?
end
def attachment_class
attachment.external? ? "hosted-externally" : "embedded"
end
def unnumbered_paper?
attachment.unnumbered_command_paper? || attachment.unnumbered_hoc_paper?
end
def unnumbered_command_paper?
attachment.unnumbered_command_paper?
end
def download_link
link(attachment.preview_url, "Download #{attachment.file_extension.upcase}", number_to_human_size(attachment.file_size))
end
def attachment_attributes
attributes = []
if attachment.html?
attributes << content_tag(:span, 'HTML', class: 'type')
elsif attachment.external?
attributes << content_tag(:span, url, class: 'url')
else
attributes << content_tag(:span, humanized_content_type(attachment.file_extension), class: 'type')
attributes << content_tag(:span, number_to_human_size(attachment.file_size), class: 'file-size')
attributes << content_tag(:span, pluralize(attachment.number_of_pages, "page") , class: 'page-length') if attachment.number_of_pages.present?
end
attributes.join(', ').html_safe
end
def preview_url
url << '/preview'
end
MS_WORD_DOCUMENT_HUMANIZED_CONTENT_TYPE = "MS Word Document"
MS_EXCEL_SPREADSHEET_HUMANIZED_CONTENT_TYPE = "MS Excel Spreadsheet"
MS_POWERPOINT_PRESENTATION_HUMANIZED_CONTENT_TYPE = "MS Powerpoint Presentation"
def file_abbr_tag(abbr, title)
content_tag(:abbr, abbr, title: title)
end
def humanized_content_type(file_extension)
file_extension_vs_humanized_content_type = {
"chm" => file_abbr_tag('CHM', 'Microsoft Compiled HTML Help'),
"csv" => file_abbr_tag('CSV', 'Comma-separated Values'),
"diff" => file_abbr_tag('DIFF', 'Plain text differences'),
"doc" => MS_WORD_DOCUMENT_HUMANIZED_CONTENT_TYPE,
"docx" => MS_WORD_DOCUMENT_HUMANIZED_CONTENT_TYPE,
"dot" => file_abbr_tag('DOT', 'MS Word Document Template'),
"dxf" => file_abbr_tag('DXF', 'AutoCAD Drawing Exchange Format'),
"eps" => file_abbr_tag('EPS', 'Encapsulated PostScript'),
"gif" => file_abbr_tag('GIF', 'Graphics Interchange Format'),
"gml" => file_abbr_tag('GML', 'Geography Markup Language'),
"html" => file_abbr_tag('HTML', 'Hypertext Markup Language'),
"ics" => file_abbr_tag('ICS', 'iCalendar file'),
"jpg" => "JPEG",
"odp" => file_abbr_tag('ODP', 'OpenDocument Presentation'),
"ods" => file_abbr_tag('ODS', 'OpenDocument Spreadsheet'),
"odt" => file_abbr_tag('ODT', 'OpenDocument Text document'),
"pdf" => file_abbr_tag('PDF', 'Portable Document Format'),
"png" => file_abbr_tag('PNG', 'Portable Network Graphic'),
"ppt" => MS_POWERPOINT_PRESENTATION_HUMANIZED_CONTENT_TYPE,
"pptx" => MS_POWERPOINT_PRESENTATION_HUMANIZED_CONTENT_TYPE,
"ps" => file_abbr_tag('PS', 'PostScript'),
"rdf" => file_abbr_tag('RDF', 'Resource Description Framework'),
"rtf" => file_abbr_tag('RTF', 'Rich Text Format'),
"sch" => file_abbr_tag('SCH', 'XML based Schematic'),
"txt" => "Plain text",
"wsdl" => file_abbr_tag('WSDL', 'Web Services Description Language'),
"xls" => MS_EXCEL_SPREADSHEET_HUMANIZED_CONTENT_TYPE,
"xlsm" => file_abbr_tag('XLSM', 'MS Excel Macro-Enabled Workbook'),
"xlsx" => MS_EXCEL_SPREADSHEET_HUMANIZED_CONTENT_TYPE,
"xlt" => file_abbr_tag('XLT', 'MS Excel Spreadsheet Template'),
"xsd" => file_abbr_tag('XSD', 'XML Schema'),
"xslt" => file_abbr_tag('XSLT', 'Extensible Stylesheet Language Transformation'),
"zip" => file_abbr_tag('ZIP', 'Zip archive'),
}
file_extension_vs_humanized_content_type.fetch(file_extension.to_s.downcase, '')
end
def previewable?
attachment.csv?
end
def title
attachment.title
end
def hide_thumbnail?
defined?(hide_thumbnail) && hide_thumbnail
end
def attachement_details
return if previewable?
link(attachment.title, url, title_link_options)
end
def title_link_options
title_link_options = ''
title_link_options << "rel=external" if attachment.external?
title_link_options << "aria-describedby=#{help_block_id}" unless attachment.accessible?
end
def help_block_id
"attachment-#{attachment.id}-accessibility-help"
end
def link(body, url, options={})
<<-END
#{body}
END
end
end