lib/presenters/attachment_presenter.rb in govspeak-4.0.0 vs lib/presenters/attachment_presenter.rb in govspeak-5.0.0
- old
+ new
@@ -1,88 +1,91 @@
require "action_view"
require "money"
+require "htmlentities"
class AttachmentPresenter
attr_reader :attachment
include ActionView::Helpers::TagHelper
include ActionView::Helpers::NumberHelper
include ActionView::Helpers::AssetTagHelper
+ include ActionView::Helpers::TextHelper
def initialize(attachment)
@attachment = attachment
end
def id
- attachment.id
+ attachment[:id]
end
def order_url
- attachment.order_url
+ attachment[:order_url]
end
def opendocument?
- attachment.opendocument?
+ attachment[:opendocument?]
end
def url
- attachment.url
+ attachment[:url]
end
def external?
- attachment.external?
+ attachment[:external?]
end
def price
- return unless attachment.price
- Money.from_amount(attachment.price, 'GBP').format
+ return unless attachment[:price]
+ Money.from_amount(attachment[:price], 'GBP').format
end
def accessible?
- attachment.accessible?
+ attachment[:accessible?]
end
def thumbnail_link
return if hide_thumbnail?
return if previewable?
- link(attachment_thumbnail, url, "aria-hidden=true class=#{attachment_class}")
+ link(attachment_thumbnail, url, "aria-hidden" => "true", "class" => attachment_class)
end
def help_block_toggle_id
- "attachment-#{attachment.id}-accessibility-request"
+ "attachment-#{id}-accessibility-request"
end
def section_class
- attachment.external? ? "hosted-externally" : "embedded"
+ attachment[:external?] ? "hosted-externally" : "embedded"
end
def mail_to(email_address, name, options = {})
- "<a href='mailto:#{email_address}?Subject=#{options[:subject]}&body=#{options[:body]}'>#{name}</a>"
+ query_string = options.slice(:subject, :body).map { |k, v| "#{urlencode(k)}=#{urlencode(v)}" }.join("&")
+ "<a href='mailto:#{encode(email_address)}?#{encode(query_string)}'>#{name}</a>"
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}"
+ attachment_info << " Title: #{title}"
+ attachment_info << " Original format: #{file_extension}" if file_extension.present?
+ 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",
+ subject: "Request for '#{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:
+Details of document required:
#{attachment_info.join("\n")}
Please tell us:
@@ -93,70 +96,97 @@
def alternative_format_contact_email
"govuk-feedback@digital.cabinet-office.gov.uk"
end
+ # FIXME: usage of image_tag will cause these to render at /images/ which seems
+ # very host dependent. I assume this will need links to static urls.
def attachment_thumbnail
- if attachment.pdf?
- image_tag(attachment.file.thumbnail.url)
- elsif attachment.html?
+ if file_extension == "pdf" && attachment[:thumbnail_url]
+ image_tag(attachment[:thumbnail_url])
+ elsif file_extension == "html"
image_tag('pub-cover-html.png')
- elsif %w{doc docx odt}.include? attachment.file_extension
+ elsif %w{doc docx odt}.include?(file_extension)
image_tag('pub-cover-doc.png')
- elsif %w{xls xlsx ods csv}.include? attachment.file_extension
+ elsif %w{xls xlsx ods csv}.include?(file_extension)
image_tag('pub-cover-spreadsheet.png')
else
image_tag('pub-cover.png')
end
end
- def references
+ def reference
+ ref = []
+ if attachment[:isbn].present?
+ ref << "ISBN " + content_tag(:span, attachment[:isbn], class: "isbn")
+ end
+
+ if attachment[:unique_reference].present?
+ ref << content_tag(:span, attachment[:unique_reference], class: "unique_reference")
+ end
+
+ if attachment[:command_paper_number].present?
+ ref << content_tag(:span, attachment[:command_paper_number], class: "command_paper_number")
+ end
+
+ if attachment[:hoc_paper_number].present?
+ ref << content_tag(:span, "HC #{attachment[:hoc_paper_number]}", class: 'house_of_commons_paper_number') + ' ' +
+ content_tag(:span, attachment[:parliamentary_session], class: 'parliamentary_session')
+ end
+
+ ref.join(', ').html_safe
+ end
+
+ # FIXME this has english in it so will cause problems if the locale is not en
+ def references_for_title
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?
+ 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?
+ !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"
+ attachment[:external?] ? "hosted-externally" : "embedded"
end
def unnumbered_paper?
- attachment.unnumbered_command_paper? || attachment.unnumbered_hoc_paper?
+ attachment[:unnumbered_command_paper?] || attachment[:unnumbered_hoc_paper?]
end
def unnumbered_command_paper?
- attachment.unnumbered_command_paper?
+ attachment[:unnumbered_command_paper?]
end
def download_link
- link(attachment.preview_url, "<strong>Download #{attachment.file_extension.upcase}</strong>", number_to_human_size(attachment.file_size))
+ options = {}
+ options[:title] = number_to_human_size(attachment[:file_size]) if attachment[:file_size].present?
+ link("<strong>Download #{file_extension.upcase}</strong>", attachment[:url], options)
end
def attachment_attributes
attributes = []
- if attachment.html?
+ if file_extension == "html"
attributes << content_tag(:span, 'HTML', class: 'type')
- elsif attachment.external?
+ 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?
+ attributes << content_tag(:span, humanized_content_type(file_extension), class: 'type') if file_extension
+ attributes << content_tag(:span, number_to_human_size(attachment[:file_size]), class: 'file-size') if attachment[:file_size]
+ attributes << content_tag(:span, pluralize(attachment[:number_of_pages], "page"), class: 'page-length') if attachment[:number_of_pages]
end
attributes.join(', ').html_safe
end
def preview_url
- url << '/preview'
+ 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"
@@ -203,39 +233,54 @@
}
file_extension_vs_humanized_content_type.fetch(file_extension.to_s.downcase, '')
end
def previewable?
- attachment.csv?
+ file_extension == "csv"
end
def title
- attachment.title
+ attachment[:title]
end
+ def file_extension
+ # Note: this is a separate parameter rather than being calculated from the
+ # filename because at the time of writing not all apps were using the effects
+ # of this field.
+ attachment[:file_extension]
+ end
+
def hide_thumbnail?
defined?(hide_thumbnail) && hide_thumbnail
end
- def attachement_details
+ def attachment_details
return if previewable?
- link(attachment.title, url, title_link_options)
+ link(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?
+ title_link_options = {}
+ title_link_options["rel"] = "external" if attachment[:external?]
+ title_link_options["aria-describedby"] = help_block_id unless attachment[:accessible?]
+ title_link_options
end
def help_block_id
- "attachment-#{attachment.id}-accessibility-help"
+ "attachment-#{id}-accessibility-help"
end
- def link(body, url, options={})
- <<-END
- <a href="#{url} #{options}">
- #{body}
- </a>
- END
+ def link(body, url, options = {})
+ options_str = options.map { |k, v| %{#{encode(k)}="#{encode(v)}"} }.join(" ")
+ %{<a href="#{encode(url)}" #{options_str}>#{body}</a>}
+ end
+
+private
+
+ def encode(text)
+ HTMLEntities.new.encode(text)
+ end
+
+ def urlencode(text)
+ ERB::Util.url_encode(text)
end
end