mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-02-28 17:54:16 +08:00
Apply layout for Grover PDF library [SCI-9566] (#6547)
This commit is contained in:
parent
b8f5ca90f8
commit
e6e7805c29
9 changed files with 254 additions and 138 deletions
|
@ -233,6 +233,7 @@ label {
|
||||||
/* GLOBAL REPORT ELEMENT STYLE */
|
/* GLOBAL REPORT ELEMENT STYLE */
|
||||||
.report-element {
|
.report-element {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
max-width: 270mm;
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
.print-report {
|
.print-report {
|
||||||
overflow-y: hidden !important;
|
overflow-y: hidden !important;
|
||||||
overflow-x: hidden !important;
|
overflow-x: hidden !important;
|
||||||
|
padding-top: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,7 @@ class ReportsController < ApplicationController
|
||||||
report = current_team.reports.new(project: @project)
|
report = current_team.reports.new(project: @project)
|
||||||
end
|
end
|
||||||
|
|
||||||
if lookup_context.template_exists?("reports/templates/#{template}/edit")
|
if Rails.root.join('app', 'views', 'reports', 'templates', template, 'edit.html.erb').exist?
|
||||||
render json: {
|
render json: {
|
||||||
html: render_to_string(
|
html: render_to_string(
|
||||||
template: "reports/templates/#{template}/edit",
|
template: "reports/templates/#{template}/edit",
|
||||||
|
|
|
@ -64,12 +64,10 @@ module ReportsHelper
|
||||||
"<span class=\"label step-label-#{style}\">[#{text}]</span>".html_safe
|
"<span class=\"label step-label-#{style}\">[#{text}]</span>".html_safe
|
||||||
end
|
end
|
||||||
|
|
||||||
def font_awesome_cdn_link_tag
|
def font_awesome_links
|
||||||
stylesheet_link_tag(
|
[{ url: 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.9.0/css/fontawesome.min.css' },
|
||||||
'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.9.0/css/fontawesome.min.css',
|
{ url: 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.9.0/css/regular.min.css' },
|
||||||
'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.9.0/css/regular.min.css',
|
{ url: 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.9.0/css/solid.min.css' }]
|
||||||
'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.9.0/css/solid.min.css'
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def filter_steps_for_report(steps, settings)
|
def filter_steps_for_report(steps, settings)
|
||||||
|
|
|
@ -15,97 +15,171 @@ module Reports
|
||||||
PREVIEW_EXTENSIONS = %w(docx pdf).freeze
|
PREVIEW_EXTENSIONS = %w(docx pdf).freeze
|
||||||
|
|
||||||
def perform(report_id, user_id:)
|
def perform(report_id, user_id:)
|
||||||
report = Report.find(report_id)
|
@report = Report.find(report_id)
|
||||||
user = User.find(user_id)
|
@user = User.find(user_id)
|
||||||
file = Tempfile.new(['report', '.pdf'], binmode: true)
|
@file = Tempfile.new(['report', '.pdf'], binmode: true)
|
||||||
begin
|
initialize_template
|
||||||
template =
|
set_renderer_context
|
||||||
if Extends::REPORT_TEMPLATES.key?(report.settings[:template]&.to_sym)
|
generate_pdf_content
|
||||||
report.settings[:template]
|
process_attach_pdf_report_and_notify
|
||||||
else
|
|
||||||
Extends::REPORT_TEMPLATES.keys.first.to_s
|
|
||||||
end
|
|
||||||
|
|
||||||
raise StandardError, 'Report template not found!' if template.blank?
|
|
||||||
|
|
||||||
I18n.backend.date_format = user.settings[:date_format]
|
|
||||||
ActionController::Renderer::RACK_KEY_TRANSLATION['warden'] ||= 'warden'
|
|
||||||
proxy = Warden::Proxy.new({}, Warden::Manager.new({}))
|
|
||||||
proxy.set_user(user, scope: :user, store: false)
|
|
||||||
ApplicationController.renderer.defaults[:http_host] = Rails.application.routes.default_url_options[:host]
|
|
||||||
renderer = ApplicationController.renderer.new(warden: proxy)
|
|
||||||
Rails.application.config.x.custom_sanitizer_config = build_custom_sanitizer_config
|
|
||||||
|
|
||||||
header_html = renderer.render_to_string(
|
|
||||||
template: "reports/templates/#{template}/header",
|
|
||||||
layout: false,
|
|
||||||
locals: { report: report, user: user, logo: report_logo }
|
|
||||||
)
|
|
||||||
footer_html = renderer.render_to_string(
|
|
||||||
template: "reports/templates/#{template}/footer",
|
|
||||||
layout: false,
|
|
||||||
locals: { report: report, user: user, logo: report_logo }
|
|
||||||
)
|
|
||||||
report_html = renderer.render_to_string(
|
|
||||||
template: 'reports/report',
|
|
||||||
layout: false,
|
|
||||||
assigns: { settings: report.settings },
|
|
||||||
locals: { report: report, user: user }
|
|
||||||
)
|
|
||||||
|
|
||||||
Grover.new(
|
|
||||||
report_html,
|
|
||||||
format: 'A4',
|
|
||||||
print_background: true,
|
|
||||||
margin: { top: '2cm', bottom: '5cm', left: '1cm', right: '2cm' },
|
|
||||||
display_header_footer: true,
|
|
||||||
header_template: header_html,
|
|
||||||
footer_template: footer_html
|
|
||||||
).to_pdf(file.path)
|
|
||||||
|
|
||||||
file.rewind
|
|
||||||
|
|
||||||
file = prepend_title_page(file, template, report, renderer)
|
|
||||||
|
|
||||||
file = append_result_asset_previews(report, file, user) if report.settings.dig(:task, :file_results_previews)
|
|
||||||
|
|
||||||
report.pdf_file.attach(io: file, filename: 'report.pdf')
|
|
||||||
report.pdf_ready!
|
|
||||||
|
|
||||||
report_path = Rails.application.routes.url_helpers
|
|
||||||
.reports_path(team: report.team.id, preview_report_id: report.id, preview_type: :pdf)
|
|
||||||
notification = Notification.create(
|
|
||||||
type_of: :deliver,
|
|
||||||
title: I18n.t('projects.reports.index.generation.completed_pdf_notification_title'),
|
|
||||||
message: I18n.t('projects.reports.index.generation.completed_notification_message',
|
|
||||||
report_link: "<a href='#{report_path}'>#{escape_input(report.name)}</a>",
|
|
||||||
team_name: escape_input(report.team.name))
|
|
||||||
)
|
|
||||||
notification.create_user_notification(user)
|
|
||||||
ensure
|
|
||||||
Rails.application.config.x.custom_sanitizer_config = nil
|
|
||||||
I18n.backend.date_format = nil
|
|
||||||
file.close(true)
|
|
||||||
end
|
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
raise e if report.blank?
|
raise e if @report.blank?
|
||||||
|
|
||||||
ActiveRecord::Base.no_touching do
|
ActiveRecord::Base.no_touching do
|
||||||
report.pdf_error!
|
@report.pdf_error!
|
||||||
end
|
end
|
||||||
Rails.logger.error("Couldn't generate PDF for Report with id: #{report.id}. Error:\n #{e.message}")
|
Rails.logger.error("Couldn't generate PDF for Report with id: #{@report.id}. Error:\n #{e.message}")
|
||||||
raise e
|
raise e
|
||||||
|
ensure
|
||||||
|
Rails.application.config.x.custom_sanitizer_config = nil
|
||||||
|
I18n.backend.date_format = nil
|
||||||
|
@file.close(true)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def append_result_asset_previews(report, report_file, user)
|
def initialize_template
|
||||||
|
@template = if Extends::REPORT_TEMPLATES.key?(@report.settings[:template]&.to_sym)
|
||||||
|
@report.settings[:template]
|
||||||
|
else
|
||||||
|
Extends::REPORT_TEMPLATES.keys.first.to_s
|
||||||
|
end
|
||||||
|
|
||||||
|
raise StandardError, 'Report template not found!' if @template.blank?
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_renderer_context
|
||||||
|
I18n.backend.date_format = @user.settings[:date_format]
|
||||||
|
ActionController::Renderer::RACK_KEY_TRANSLATION['warden'] ||= 'warden'
|
||||||
|
proxy = Warden::Proxy.new({}, Warden::Manager.new({}))
|
||||||
|
proxy.set_user(@user, scope: :user, store: false)
|
||||||
|
ApplicationController.renderer.defaults[:http_host] = Rails.application.routes.default_url_options[:host]
|
||||||
|
@renderer = ApplicationController.renderer.new(warden: proxy)
|
||||||
|
Rails.application.config.x.custom_sanitizer_config = build_custom_sanitizer_config
|
||||||
|
end
|
||||||
|
|
||||||
|
def generate_pdf_content
|
||||||
|
@has_cover = Rails.root.join('app', 'views', 'reports', 'templates', @template, 'cover.html.erb').exist?
|
||||||
|
|
||||||
|
render_header_footer_and_report
|
||||||
|
|
||||||
|
gather_styles_and_scripts
|
||||||
|
|
||||||
|
generate_pdf_file
|
||||||
|
end
|
||||||
|
|
||||||
|
def render_header_footer_and_report
|
||||||
|
@header_html = @renderer.render_to_string(
|
||||||
|
template: "reports/templates/#{@template}/header",
|
||||||
|
layout: false,
|
||||||
|
locals: { report: @report, user: @user, logo: report_logo }
|
||||||
|
)
|
||||||
|
@footer_html = @renderer.render_to_string(
|
||||||
|
template: "reports/templates/#{@template}/footer",
|
||||||
|
layout: false,
|
||||||
|
locals: { report: @report, user: @user, logo: report_logo }
|
||||||
|
)
|
||||||
|
@report_html = @renderer.render_to_string(
|
||||||
|
template: 'reports/report',
|
||||||
|
layout: false,
|
||||||
|
assigns: { settings: @report.settings },
|
||||||
|
locals: { report: @report, user: @user, has_cover: @has_cover }
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def gather_styles_and_scripts
|
||||||
|
css_files = [
|
||||||
|
'application',
|
||||||
|
'reports_pdf',
|
||||||
|
'bootstrap_pack',
|
||||||
|
'handsontable.formula'
|
||||||
|
]
|
||||||
|
|
||||||
|
javascript_files = [
|
||||||
|
'jquery_bundle',
|
||||||
|
'handsontable.full',
|
||||||
|
'lodash',
|
||||||
|
'numeral',
|
||||||
|
'numeric',
|
||||||
|
'md5',
|
||||||
|
'jstat',
|
||||||
|
'formula',
|
||||||
|
'parser',
|
||||||
|
'ruleJS',
|
||||||
|
'big.min',
|
||||||
|
'handsontable.formula',
|
||||||
|
'reports/content',
|
||||||
|
'reports/template_helpers'
|
||||||
|
]
|
||||||
|
|
||||||
|
@style_tag_options = []
|
||||||
|
@script_tag_options = []
|
||||||
|
|
||||||
|
@style_tag_options = css_files.map do |file_name|
|
||||||
|
{ content: fetch_asset_content("#{file_name}.css") }
|
||||||
|
end
|
||||||
|
|
||||||
|
@style_tag_options.concat(font_awesome_links)
|
||||||
|
|
||||||
|
@script_tag_options = javascript_files.map do |file_name|
|
||||||
|
{ content: fetch_asset_content("#{file_name}.js") }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def generate_pdf_file
|
||||||
|
current_margin = extract_margins_from_header ||
|
||||||
|
{ top: '2cm', bottom: '2cm', left: '1cm', right: '1.5cm' }
|
||||||
|
|
||||||
|
cover_pages_shift = cover_page_shift_from_template
|
||||||
|
|
||||||
|
Grover.new(
|
||||||
|
@report_html,
|
||||||
|
format: 'A4',
|
||||||
|
print_background: true,
|
||||||
|
margin: current_margin,
|
||||||
|
display_header_footer: true,
|
||||||
|
header_template: @header_html,
|
||||||
|
footer_template: @footer_html,
|
||||||
|
style_tag_options: @style_tag_options,
|
||||||
|
script_tag_options: @script_tag_options,
|
||||||
|
page_ranges: "#{cover_pages_shift}-999999",
|
||||||
|
emulate_media: 'screen',
|
||||||
|
display_url: "#{Rails.application.config.force_ssl ? 'https' : 'http'}://" \
|
||||||
|
"#{Rails.application.routes.default_url_options[:host]}"
|
||||||
|
).to_pdf(@file.path)
|
||||||
|
end
|
||||||
|
|
||||||
|
def process_attach_pdf_report_and_notify
|
||||||
|
@file.rewind
|
||||||
|
@file = prepend_title_page if @has_cover
|
||||||
|
@file = append_result_asset_previews if @report.settings.dig(:task, :file_results_previews)
|
||||||
|
|
||||||
|
@report.pdf_file.attach(io: @file, filename: 'report.pdf')
|
||||||
|
@report.pdf_ready!
|
||||||
|
|
||||||
|
create_notification_for_user
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_notification_for_user
|
||||||
|
report_path = Rails.application.routes.url_helpers
|
||||||
|
.reports_path(team: @report.team.id, preview_report_id: @report.id, preview_type: :pdf)
|
||||||
|
notification = Notification.create(
|
||||||
|
type_of: :deliver,
|
||||||
|
title: I18n.t('projects.reports.index.generation.completed_pdf_notification_title'),
|
||||||
|
message: I18n.t('projects.reports.index.generation.completed_notification_message',
|
||||||
|
report_link: "<a href='#{report_path}'>#{escape_input(@report.name)}</a>",
|
||||||
|
team_name: escape_input(@report.team.name))
|
||||||
|
)
|
||||||
|
notification.create_user_notification(@user)
|
||||||
|
end
|
||||||
|
|
||||||
|
def append_result_asset_previews
|
||||||
Dir.mktmpdir do |tmp_dir|
|
Dir.mktmpdir do |tmp_dir|
|
||||||
report.report_elements.my_module.each do |my_module_element|
|
@report.report_elements.my_module.each do |my_module_element|
|
||||||
next unless can_read_my_module?(user, my_module_element.my_module)
|
next unless can_read_my_module?(@user, my_module_element.my_module)
|
||||||
|
|
||||||
results = my_module_element.my_module.results
|
results = my_module_element.my_module.results
|
||||||
order_results_for_report(results, report.settings.dig(:task, :result_order)).each do |result|
|
order_results_for_report(results, @report.settings.dig(:task, :result_order)).each do |result|
|
||||||
result.assets.each do |asset|
|
result.assets.each do |asset|
|
||||||
next unless PREVIEW_EXTENSIONS.include?(asset.file.blob.filename.extension)
|
next unless PREVIEW_EXTENSIONS.include?(asset.file.blob.filename.extension)
|
||||||
|
|
||||||
|
@ -114,13 +188,13 @@ module Reports
|
||||||
asset.reload
|
asset.reload
|
||||||
end
|
end
|
||||||
asset.file_pdf_preview.open(tmpdir: tmp_dir) do |file|
|
asset.file_pdf_preview.open(tmpdir: tmp_dir) do |file|
|
||||||
report_file = merge_pdf_files(file, report_file)
|
@file = merge_pdf_files(file, @file)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
report_file
|
@file
|
||||||
end
|
end
|
||||||
|
|
||||||
def merge_pdf_files(file, report_file)
|
def merge_pdf_files(file, report_file)
|
||||||
|
@ -149,14 +223,10 @@ module Reports
|
||||||
merged_file
|
merged_file
|
||||||
end
|
end
|
||||||
|
|
||||||
def prepend_title_page(file, template, report, renderer)
|
def prepend_title_page
|
||||||
unless File.exist?(Rails.root.join('app', 'views', 'reports', 'templates', template, 'cover'))
|
|
||||||
return file
|
|
||||||
end
|
|
||||||
|
|
||||||
total_pages = 0
|
total_pages = 0
|
||||||
|
|
||||||
IO.popen(['pdfinfo', file.path], 'r+') do |f|
|
IO.popen(['pdfinfo', @file.path], 'r+') do |f|
|
||||||
total_pages = f.read.split("\n")
|
total_pages = f.read.split("\n")
|
||||||
.find { |i| i.split(':')[0] == 'Pages' }
|
.find { |i| i.split(':')[0] == 'Pages' }
|
||||||
.gsub(/[^0-9]/, '')
|
.gsub(/[^0-9]/, '')
|
||||||
|
@ -165,27 +235,33 @@ module Reports
|
||||||
title_page = Tempfile.new(['title_page', '.pdf'], binmode: true)
|
title_page = Tempfile.new(['title_page', '.pdf'], binmode: true)
|
||||||
merged_file = Tempfile.new(['report', '.pdf'], binmode: true)
|
merged_file = Tempfile.new(['report', '.pdf'], binmode: true)
|
||||||
|
|
||||||
title_page_html = renderer.render_to_string(
|
title_page_html = @renderer.render_to_string(
|
||||||
template: "reports/templates/#{template}/cover",
|
template: "reports/templates/#{@template}/cover",
|
||||||
layout: false,
|
layout: false,
|
||||||
formats: :html,
|
formats: :html,
|
||||||
locals: { report: report, total_pages: total_pages.to_i, logo: report_logo }
|
locals: { report: @report, total_pages: total_pages.to_i, logo: report_logo }
|
||||||
)
|
)
|
||||||
|
|
||||||
Grover.new(
|
Grover.new(
|
||||||
title_page_html,
|
title_page_html,
|
||||||
format: 'A4'
|
format: 'A4',
|
||||||
|
style_tag_options: @style_tag_options,
|
||||||
|
script_tag_options: @script_tag_options,
|
||||||
|
emulate_media: 'screen',
|
||||||
|
print_background: true,
|
||||||
|
display_url: "#{Rails.application.config.force_ssl ? 'https' : 'http'}://" \
|
||||||
|
"#{Rails.application.routes.default_url_options[:host]}"
|
||||||
).to_pdf(title_page.path)
|
).to_pdf(title_page.path)
|
||||||
|
|
||||||
title_page.rewind
|
title_page.rewind
|
||||||
|
|
||||||
success = system(
|
success = system(
|
||||||
'pdfunite', title_page.path, file.path, merged_file.path
|
'pdfunite', title_page.path, @file.path, merged_file.path
|
||||||
)
|
)
|
||||||
|
|
||||||
raise StandardError, 'There was an error merging report and title page' unless success && File.file?(merged_file)
|
raise StandardError, 'There was an error merging report and title page' unless success && File.file?(merged_file)
|
||||||
|
|
||||||
file.close(true)
|
@file.close(true)
|
||||||
title_page.close(true)
|
title_page.close(true)
|
||||||
|
|
||||||
merged_file
|
merged_file
|
||||||
|
@ -226,5 +302,44 @@ module Reports
|
||||||
report_link: "<a href='#{report_path}'>#{escape_input(report.name)}</a>",
|
report_link: "<a href='#{report_path}'>#{escape_input(report.name)}</a>",
|
||||||
team_name: escape_input(report.team.name))
|
team_name: escape_input(report.team.name))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def fetch_asset_content(asset_name)
|
||||||
|
Rails.application
|
||||||
|
.assets_manifest
|
||||||
|
.find_sources(asset_name)
|
||||||
|
.first
|
||||||
|
.to_s
|
||||||
|
.force_encoding(Encoding::UTF_8)
|
||||||
|
end
|
||||||
|
|
||||||
|
def extract_margins_from_header
|
||||||
|
header_file_path = Rails.root.join('app', 'views', 'reports', 'templates', @template, 'header.html.erb')
|
||||||
|
return nil unless header_file_path.exist?
|
||||||
|
|
||||||
|
content = File.read(header_file_path)
|
||||||
|
|
||||||
|
margin_comment = content.match(/<!--\s*margins:(.*)\s*-->/)
|
||||||
|
return nil unless margin_comment
|
||||||
|
|
||||||
|
margins = {}
|
||||||
|
margin_comment[1].split(',').each do |margin_pair|
|
||||||
|
key, value = margin_pair.split(':').map(&:strip)
|
||||||
|
margins[key.to_sym] = value
|
||||||
|
end
|
||||||
|
|
||||||
|
margins
|
||||||
|
end
|
||||||
|
|
||||||
|
def cover_page_shift_from_template
|
||||||
|
cover_file_path = Rails.root.join('app', 'views', 'reports', 'templates', @template, 'cover.html.erb')
|
||||||
|
return 1 unless cover_file_path.exist?
|
||||||
|
|
||||||
|
content = File.read(cover_file_path)
|
||||||
|
|
||||||
|
cover_pages_comment = content.match(/<!--\s*cover_pages_count:(\d+)\s*-->/)
|
||||||
|
return 2 unless cover_pages_comment
|
||||||
|
|
||||||
|
cover_pages_comment[1].to_i + 1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,6 +5,5 @@
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<%= yield %>
|
<%= yield %>
|
||||||
<%= javascript_include_tag wicked_pdf_asset_base64("reports/template_helpers") %>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -1,32 +1,16 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<%= wicked_pdf_stylesheet_link_tag "application" %>
|
<meta charset="UTF-8">
|
||||||
<%= wicked_pdf_stylesheet_link_tag "reports_pdf" %>
|
|
||||||
<%= wicked_pdf_stylesheet_link_tag "bootstrap_pack" %>
|
|
||||||
<%= font_awesome_cdn_link_tag %>
|
|
||||||
<%= wicked_pdf_javascript_include_tag "jquery_bundle" %>
|
|
||||||
<%= wicked_pdf_javascript_include_tag "handsontable.full" %>
|
|
||||||
<!-- Libraries for formulas -->
|
|
||||||
<%= wicked_pdf_javascript_include_tag "lodash" %>
|
|
||||||
<%= wicked_pdf_javascript_include_tag "numeral" %>
|
|
||||||
<%= wicked_pdf_javascript_include_tag "numeric" %>
|
|
||||||
<%= wicked_pdf_javascript_include_tag "md5" %>
|
|
||||||
<%= wicked_pdf_javascript_include_tag "jstat" %>
|
|
||||||
<%= wicked_pdf_javascript_include_tag "formula" %>
|
|
||||||
<%= wicked_pdf_javascript_include_tag "parser" %>
|
|
||||||
<%= wicked_pdf_javascript_include_tag "ruleJS" %>
|
|
||||||
<%= wicked_pdf_javascript_include_tag "big.min" %>
|
|
||||||
<%= wicked_pdf_javascript_include_tag "handsontable.formula" %>
|
|
||||||
<%= wicked_pdf_stylesheet_link_tag "handsontable.formula" %>
|
|
||||||
</head>
|
</head>
|
||||||
<body class="print-report-body">
|
<body class="print-report-body">
|
||||||
|
<% if has_cover %>
|
||||||
|
<div style="break-after: page;"></div>
|
||||||
|
<% end %>
|
||||||
<div class="print-report">
|
<div class="print-report">
|
||||||
<% report.root_elements.each do |el| %>
|
<% report.root_elements.each do |el| %>
|
||||||
<%= render_report_element(el, local_assigns) %>
|
<%= render_report_element(el, local_assigns) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<%= wicked_pdf_javascript_include_tag "reports/content" %>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
<style>
|
<style>
|
||||||
.print-footer {
|
.print-footer {
|
||||||
line-height: 50px;
|
line-height: 50px;
|
||||||
margin-right: 30px;
|
font-size: 13px;
|
||||||
|
padding-right: 30px;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
|
width: 100%;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|
|
@ -1,24 +1,40 @@
|
||||||
|
<!-- margins: top:2cm,bottom:2cm,left:1cm,right:1.5cm -->
|
||||||
|
<!-- First line represents margins for pdf generation by Grover -->
|
||||||
<style>
|
<style>
|
||||||
.print-header {
|
.print-header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
line-height: 40px;
|
||||||
|
font-size: 13px;
|
||||||
|
width: 100%;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.print-header::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
left: 40px;
|
||||||
|
right: 40px;
|
||||||
|
bottom: 0;
|
||||||
border-bottom: 2px solid #a0a0a8;
|
border-bottom: 2px solid #a0a0a8;
|
||||||
line-height: 50px;
|
z-index: -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.logo-img {
|
.logo-img {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin: 0 0 0 30px;
|
margin: 0 0 0 70px;
|
||||||
}
|
}
|
||||||
|
|
||||||
img {
|
img {
|
||||||
width: 100px;
|
width: 80px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.page-numbers {
|
.page-numbers {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
float: right;
|
padding-right: 60px;
|
||||||
margin: 0 30px 0 0;
|
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<div class="print-header">
|
<div class="print-header">
|
||||||
<div class="logo-img">
|
<div class="logo-img">
|
||||||
|
@ -28,8 +44,8 @@
|
||||||
<%= image_tag logo %>
|
<%= image_tag logo %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<h1><span class='pageNumber'></span>/<span class='totalPages'></h1>
|
|
||||||
<div class="page-numbers pagination" data-page-offset="0">
|
<div class="page-numbers">
|
||||||
Page <span class="page"></span> of <span class="topage"></span>
|
Page <span class="pageNumber"></span> of <span class="totalPages"></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in a new issue