mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-01-31 03:59:51 +08:00
Print protocol fixes [SCI-6318] (#3717)
* Fix smart annotations [SCI-6318] * Fix asset rendering [SCI-6316, SCI-6417] * Copy fix [SCI-6315] * Fix print protocol name handling [SCI-6318] * CSS linter fixes * Add support for handson tables [SCI-6318] * Use partial for handsontable formulas [SCI-6318]
This commit is contained in:
parent
26b913f444
commit
3f7f576b29
4 changed files with 116 additions and 41 deletions
|
@ -6,6 +6,11 @@
|
||||||
margin: 8mm;
|
margin: 8mm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.page-break {
|
||||||
|
clear: both;
|
||||||
|
page-break-after: always;
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
font-family: Lato, "Open Sans", Arial, Helvetica, sans-serif;
|
font-family: Lato, "Open Sans", Arial, Helvetica, sans-serif;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
|
@ -89,7 +94,7 @@ hr {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.print-table {
|
table {
|
||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -122,8 +127,20 @@ hr {
|
||||||
}
|
}
|
||||||
|
|
||||||
&.thumbnail {
|
&.thumbnail {
|
||||||
float: left;
|
align-items: flex-end;
|
||||||
padding: 1em;
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 1em 1em 0;
|
||||||
|
text-align: center;
|
||||||
|
width: 15%;
|
||||||
|
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.print-asset-image {
|
||||||
|
flex-basis: .25;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.thumbnail,
|
&.thumbnail,
|
||||||
|
@ -146,8 +163,10 @@ hr {
|
||||||
}
|
}
|
||||||
|
|
||||||
.print-thumbnails {
|
.print-thumbnails {
|
||||||
clear: both;
|
align-items: stretch;
|
||||||
overflow: hidden;
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
.print-asset-icon {
|
.print-asset-icon {
|
||||||
|
@ -189,3 +208,18 @@ hr {
|
||||||
font-size: .8em;
|
font-size: .8em;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.global-avatar-container.smart-annotation {
|
||||||
|
img {
|
||||||
|
margin-right: .2em;
|
||||||
|
vertical-align: middle;
|
||||||
|
width: 1.2em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.ht_clone_top,
|
||||||
|
.ht_clone_bottom,
|
||||||
|
.ht_clone_left,
|
||||||
|
.ht_clone_top_left_corner {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
|
@ -3,10 +3,37 @@
|
||||||
<head>
|
<head>
|
||||||
<title><%= t("protocols.print.title") %></title>
|
<title><%= t("protocols.print.title") %></title>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||||
|
<%= javascript_include_tag 'application' %>
|
||||||
|
<%= javascript_include_tag "handsontable.full" %>
|
||||||
|
<%= render 'shared/formulas_libraries' %>
|
||||||
<%= stylesheet_link_tag 'print_protocol', media: 'print, screen' %>
|
<%= stylesheet_link_tag 'print_protocol', media: 'print, screen' %>
|
||||||
<body>
|
<body>
|
||||||
<%= yield %>
|
<%= yield %>
|
||||||
<script>
|
<script>
|
||||||
|
$("[data-role='hot-table']").each(function() {
|
||||||
|
var $container = $(this).find("[data-role='step-hot-table']");
|
||||||
|
var contents = $(this).find('.hot-contents');
|
||||||
|
|
||||||
|
$container.handsontable({
|
||||||
|
startRows: <%= Constants::HANDSONTABLE_INIT_ROWS_CNT %>,
|
||||||
|
startCols: <%= Constants::HANDSONTABLE_INIT_COLS_CNT %>,
|
||||||
|
rowHeaders: true,
|
||||||
|
colHeaders: true,
|
||||||
|
fillHandle: false,
|
||||||
|
formulas: true,
|
||||||
|
readOnly: true
|
||||||
|
});
|
||||||
|
var hot = $container.handsontable('getInstance');
|
||||||
|
|
||||||
|
if (contents.attr("value")) {
|
||||||
|
var data = JSON.parse(contents.attr("value"));
|
||||||
|
if (Array.isArray(data.data)) hot.loadData(data.data);
|
||||||
|
setTimeout(() => {
|
||||||
|
hot.render()
|
||||||
|
}, 0)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
window.print();
|
window.print();
|
||||||
window.onfocus=function(){ window.close(); }
|
window.onfocus=function(){ window.close(); }
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<div class="pull-right">
|
<div class="pull-right">
|
||||||
<button type="button" class="btn btn-secondary" data-dismiss="modal"><%=t "general.cancel" %></button>
|
<button type="button" class="btn btn-secondary" data-dismiss="modal"><%=t "general.cancel" %></button>
|
||||||
<input type="submit" value="<%= t("protocols.print.button") %>", class="btn btn-primary">
|
<input type="submit" value="<%= t("protocols.print.title") %>", class="btn btn-primary">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -6,8 +6,17 @@
|
||||||
<span><%= t('.header.print_info', datetime: l(DateTime.current, format: :full), full_name: current_user.full_name) %></span>
|
<span><%= t('.header.print_info', datetime: l(DateTime.current, format: :full), full_name: current_user.full_name) %></span>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h1><%= @protocol.name || @protocol.my_module.name %></h1>
|
<h1><%= @protocol.linked? ? protocol_name(@protocol.parent) : @protocol.name || @protocol.my_module.name %></h1>
|
||||||
<div><%= @protocol.description.html_safe %></div>
|
<div>
|
||||||
|
<% if @protocol.description.present? %>
|
||||||
|
<%= custom_auto_link(@protocol.tinymce_render(:description),
|
||||||
|
simple_format: false,
|
||||||
|
tags: %w(img),
|
||||||
|
team: current_team) %>
|
||||||
|
<% else %>
|
||||||
|
<em><%= t('my_modules.protocols.protocol_status_bar.no_description') %></em>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
<% @protocol.steps.order(position: :asc).each do |step| %>
|
<% @protocol.steps.order(position: :asc).each do |step| %>
|
||||||
<div class="print-step">
|
<div class="print-step">
|
||||||
<h2>
|
<h2>
|
||||||
|
@ -16,11 +25,22 @@
|
||||||
</div>
|
</div>
|
||||||
<%= step.position + 1 %>. <%= step.name %>
|
<%= step.position + 1 %>. <%= step.name %>
|
||||||
</h2>
|
</h2>
|
||||||
<div><%= step.description.html_safe %></div>
|
<div>
|
||||||
|
<% if step.description.blank? %>
|
||||||
|
<em><%= t('protocols.steps.no_description') %></em>
|
||||||
|
<% else %>
|
||||||
|
<div class="ql-editor">
|
||||||
|
<%= custom_auto_link(step.tinymce_render(:description),
|
||||||
|
simple_format: false,
|
||||||
|
tags: %w(img),
|
||||||
|
team: current_team) %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
|
||||||
<% step.checklists.each do |checklist| %>
|
<% step.checklists.each do |checklist| %>
|
||||||
<div class="print-checklist">
|
<div class="print-checklist">
|
||||||
<h3><%= checklist.name %></h3>
|
<h3><%= smart_annotation_parser(checklist.name, current_team).html_safe %></h3>
|
||||||
<% checklist.checklist_items.order(position: :asc).each do |checklist_item| %>
|
<% checklist.checklist_items.order(position: :asc).each do |checklist_item| %>
|
||||||
<div class="print-checklist-item">
|
<div class="print-checklist-item">
|
||||||
<span class="checklist-checkbox <%= 'checked' if checklist_item.checked %>">
|
<span class="checklist-checkbox <%= 'checked' if checklist_item.checked %>">
|
||||||
|
@ -28,58 +48,51 @@
|
||||||
✓
|
✓
|
||||||
<% end %>
|
<% end %>
|
||||||
</span>
|
</span>
|
||||||
<span><%= checklist_item.text %></span>
|
<span><%= smart_annotation_parser(checklist_item.text, current_team).html_safe %></span>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<% step.tables.each do |table| %>
|
<% step.tables.each do |table| %>
|
||||||
<% table_data = JSON.parse(table.contents)["data"] %>
|
<strong>
|
||||||
<h3><%= table.name %></h3>
|
<%= auto_link(simple_format(table.name),
|
||||||
<table class="print-table">
|
link: :urls,
|
||||||
<thead>
|
html: { target: '_blank' }) %>
|
||||||
<tr>
|
</strong>
|
||||||
<th></th>
|
<div class="print-table">
|
||||||
<% col = "A" %>
|
<div class="page-break"></div>
|
||||||
<% table_data[0].length.times do %>
|
<div data-role="hot-table" class="hot-table">
|
||||||
<th><%= col %></th>
|
<%= hidden_field(table, :contents, value: table.contents_utf_8, class: "hot-contents") %>
|
||||||
<% col.succ! %>
|
<div data-role="step-hot-table" class="step-result-hot-table"></div>
|
||||||
<% end %>
|
</div>
|
||||||
</tr>
|
</div>
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<% table_data.each_with_index do |tr, row| %>
|
|
||||||
<tr>
|
|
||||||
<td><%= row + 1 %></td>
|
|
||||||
<% tr.each do |td| %>
|
|
||||||
<td><%= td %></td>
|
|
||||||
<% end %>
|
|
||||||
</tr>
|
|
||||||
<% end %>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<% end %>
|
<% end %>
|
||||||
<% step.assets.where(view_mode: "inline").each do |asset| %>
|
<% step.assets.where(view_mode: "inline").each do |asset| %>
|
||||||
<div class="print-asset inline">
|
<div class="print-asset inline">
|
||||||
<div class="print-asset-image">
|
<div class="print-asset-image">
|
||||||
<%= image_tag asset.blob.url %>
|
<% if asset.previewable? %>
|
||||||
<p><%= asset.blob.filename %></p>
|
<%= image_tag asset.large_preview %>
|
||||||
|
<% end %>
|
||||||
|
<p><%= asset.render_file_name %></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="page-break"></div>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% step.assets.where(view_mode: "list").each do |asset| %>
|
<% step.assets.where(view_mode: "list").each do |asset| %>
|
||||||
<div class="print-asset list">
|
<div class="print-asset list">
|
||||||
<span class="print-asset-icon"><%= file_extension_icon_html(asset) %></span>
|
<span class="print-asset-icon"><%= file_extension_icon_html(asset) %></span>
|
||||||
<span><%= asset.blob.filename %></span>
|
<span><%= asset.render_file_name %></span>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
<div class="print-thumbnails">
|
<div class="print-thumbnails">
|
||||||
<% step.assets.where(view_mode: "thumbnail").each do |asset| %>
|
<% step.assets.where(view_mode: "thumbnail").each do |asset| %>
|
||||||
<div class="print-asset thumbnail">
|
<div class="print-asset thumbnail">
|
||||||
<div class="print-asset-image">
|
<div class="print-asset-image">
|
||||||
<%= image_tag asset.blob.representation(resize_to_limit: Constants::MEDIUM_PIC_FORMAT).processed %>
|
<% if asset.previewable? %>
|
||||||
<p><%= asset.blob.filename %></p>
|
<%= image_tag asset.blob.representation(resize_to_limit: Constants::MEDIUM_PIC_FORMAT).processed %>
|
||||||
|
<% end %>
|
||||||
|
<p><%= asset.render_file_name %></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
@ -99,7 +112,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="print-comment-body">
|
<div class="print-comment-body">
|
||||||
<div class="comment-message">
|
<div class="comment-message">
|
||||||
<%= comment.message %>
|
<%= smart_annotation_parser(comment.message, current_team).html_safe %>
|
||||||
</div>
|
</div>
|
||||||
<div class="print-comment-footer">
|
<div class="print-comment-footer">
|
||||||
<div class="print-comment-create-date">
|
<div class="print-comment-create-date">
|
||||||
|
@ -112,4 +125,5 @@
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
<hr>
|
<hr>
|
||||||
|
<div class="page-break"></div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
Loading…
Reference in a new issue