scinote-web/app/helpers/reports_helper.rb
aignatov-bio 9653f16196
Convert image to base64 in PDF reports [SCI-3557] (#1835)
* Convert image to base64 in PDF reports

* Fix typo error
2019-06-19 13:57:04 +02:00

161 lines
5.2 KiB
Ruby

module ReportsHelper
include StringUtility
def render_new_element(hide)
render partial: 'reports/elements/new_element.html.erb',
locals: { hide: hide }
end
def render_report_element(element, provided_locals = nil)
# Determine partial
file_name = element.type_of
if element.type_of.in? ReportExtends::MY_MODULE_CHILDREN_ELEMENTS
file_name = "my_module_#{element.type_of.singularize}"
end
view = "reports/elements/#{file_name}_element.html.erb"
# Set locals
locals = provided_locals.nil? ? {} : provided_locals.clone
children_html = ''.html_safe
# First, recursively render element's children
if element.comments? || element.project_header?
# Render no children
elsif element.result?
# Special handling for result comments
if element.has_children?
children_html.safe_concat render_new_element(true)
element.children.each do |child|
children_html
.safe_concat render_report_element(child, provided_locals)
end
else
children_html.safe_concat render_new_element(false)
end
else
if element.has_children?
element.children.each do |child|
children_html.safe_concat render_new_element(false)
children_html
.safe_concat render_report_element(child, provided_locals)
end
end
children_html.safe_concat render_new_element(false)
end
locals[:children] = children_html
if provided_locals[:export_all]
# Set path and filename locals for files and tables in export all ZIP
if element['type_of'] == 'my_module_repository'
obj_id = element[:repository_id]
elsif element['type_of'].in? %w(step_asset step_table result_asset
result_table)
parent_el = ReportElement.find(element['parent_id'])
parent_type = parent_el[:type_of]
parent = parent_type.singularize.classify.constantize
.find(parent_el["#{parent_type}_id"])
if parent.class == Step
obj_id = if element['type_of'] == 'step_asset'
element[:asset_id]
elsif element['type_of'] == 'step_table'
element[:table_id]
end
elsif parent.class == MyModule
result = Result.find(element[:result_id])
obj_id = if element['type_of'] == 'result_asset'
result.asset.id
elsif element['type_of'] == 'result_table'
result.table.id
end
end
end
if obj_id
locals[:path] =
provided_locals[:obj_filenames][element['type_of'].to_sym][obj_id]
.sub(%r{/usr/src/app/tmp/temp-zip-\d+/}, '')
locals[:filename] = locals[:path].split('/').last
end
end
# ReportExtends is located in config/initializers/extends/report_extends.rb
ReportElement.type_ofs.keys.each do |type|
next unless element.public_send("#{type}?")
element.element_references.each do |el_ref|
locals[el_ref.class.name.underscore.to_sym] = el_ref
end
if type.in? ReportExtends::SORTED_ELEMENTS
locals[:order] = element.sort_order
end
end
(render partial: view, locals: locals).html_safe
end
# "Hack" to omit file preview URL because of WKHTML issues
def report_image_asset_url(asset, _type = :asset, klass = nil)
image_tag(asset.generate_base64(:medium), class: klass)
end
# "Hack" to load Glyphicons css directly from the CDN
# site so they work in report
def bootstrap_cdn_link_tag
specs = Gem.loaded_specs['bootstrap-sass']
return '' unless specs.present?
stylesheet_link_tag("http://netdna.bootstrapcdn.com/bootstrap/" \
"#{specs.version.version}/css/bootstrap.min.css",
media: 'all')
end
def font_awesome_cdn_link_tag
stylesheet_link_tag(
'https://maxcdn.bootstrapcdn.com/font-awesome' \
'/4.6.3/css/font-awesome.min.css'
)
end
def step_status_label(step)
if step.completed
style = 'success'
text = t('protocols.steps.completed')
else
style = 'default'
text = t('protocols.steps.uncompleted')
end
"<span class=\"label label-#{style}\">#{text}</span>".html_safe
end
# Fixes issues with avatar images in reports
def fix_smart_annotation_image(html)
html_doc = Nokogiri::HTML(html)
html_doc.search('.atwho-user-popover').each do |el|
text = el.content
el.replace("<a href='#' style='margin-left: 5px'>#{text}</a>")
end
html_doc.search('[ref="missing-img"]').each do |el|
tag = wicked_pdf_image_tag('icon_small/missing.png')
el.replace(tag)
end
html_doc.to_s
end
private
def obj_name_to_filename(obj, filename_suffix = '')
obj_name = if obj.class == Asset
obj_name, extension = obj.file_file_name.split('.')
extension&.prepend('.')
obj_name
elsif obj.class.in? [Table, Result, Repository]
extension = '.csv'
obj.name.present? ? obj.name : obj.class.name
end
obj_name = to_filesystem_name(obj_name)
obj_name + "#{filename_suffix}#{extension}"
end
end