Загрузить файлы 'src/elements/ts-print'

This commit is contained in:
Samuel Kim 2021-01-07 20:54:11 +00:00
parent 6279831a6d
commit 2965e66f10
1 changed files with 293 additions and 1 deletions

View File

@ -1 +1,293 @@
<link rel="import" href="../../components/neon-animation/neon-animation.html">
<link rel="import" href="../../components/marked-element/marked-element.html">
<link rel="import" href="../../components/paper-button/paper-button.html">
<dom-module id="ts-print">
<style>
:host {
display: flex;
flex-direction: column;
}
#header {
background-color: var(--primary-color);
min-height: 50px;
}
#header iron-icon {
margin: 0 15px;
}
#heading {
font-size: 125%;
color: var(--reverse-text-color);
display: flex;
justify-content: flex-start;
align-items: center;
min-height: 45px;
}
.click {
cursor: pointer;
}
#content {
margin: 25px auto;
padding: 0 50px;
max-width: 730px;
overflow-y: auto;
background-color: var(--card-background-color);
}
.button {
background: var(--accent-color);
color: var(--reverse-text-color);
text-transform: uppercase;
padding: 6px;
margin-left: 50px;
font-size: 80%;
}
h1, h2 {
text-align: center;
}
.hide {
display: none;
}
.break {
margin-bottom: 50px;
padding-bottom: 50px;
border-bottom: 1px dashed var(--secondary-text-color);
}
.obs #notices- {
margin-top: 50px;
padding-top: 50px;
border-top: 1px dashed var(--secondary-text-color);
}
.titles {
margin-top: 50px;
}
.justify, .justify * {
text-align: justify;
}
.double, .double * {
line-height: 190%;
}
.nobreak p {
margin: 0 0 30px;
}
#license a {
text-decoration: none;
color: black;
}
#attrib {
font-size: 80%;
margin: 0 20px;
}
#attrib a {
color: var(--reverse-text-color);
}
.rtl {
direction: rtl;
}
</style>
<template>
<div id="header">
<div id="heading">
<iron-icon class="click" icon="arrow-back" on-tap="goback"></iron-icon>
<span class="click" on-tap="goback">[[createtitle(backto)]]</span>
<iron-icon icon="chevron-right"></iron-icon>
<span>Print Preview</span>
<paper-button raised class="button" on-tap="print">Save to PDF</paper-button>
<span id="attrib">(PDF's generated by <a href="https://www.princexml.com/">Prince</a>)</span>
</div>
</div>
<div id="content">
<h1 id="title" class="break titles targetfont"></h1>
<div id="license" class="break">
<marked-element id="licenseholder">
<div class="markdown-html"></div>
</marked-element>
</div>
<div id="textholder" class$="[[textclass(currentproject.projectmeta.target_language.direction)]]"></div>
</div>
</template>
</dom-module>
<script>
Polymer({
is: 'ts-print',
behaviors: [
Polymer.NeonAnimatableBehavior
],
properties: {
route: {
type: String,
notify: true,
observer: 'load'
},
backto: {
type: String,
value: ''
},
options: {
type: Object,
value: {},
notify: true
},
currentproject: {
type: Object,
value: {}
},
animationConfig: {
value: function () {
return {
'entry': {
name: 'slide-from-right-animation',
node: this
},
'exit': {
name: 'slide-right-animation',
node: this
}
}
}
}
},
textclass: function (direction) {
return direction === "rtl" ? 'targetfont targetsize rtl' : 'targetfont targetsize';
},
rendertext: function () {
var path = require('path');
var imagePath = path.join(App.configurator.getValue('rootdir'), 'images', 'obs');
var chunks = this.currentproject.chunks;
var options = this.currentproject.printoptions;
var filename = this.currentproject.projectmeta.project.id === "obs" ? "OBS_LICENSE.md" : "LICENSE.md";
this.$.licenseholder.markdown = App.printManager.getLicense(filename);
this.$.title.innerHTML = chunks[0].transcontent || chunks[0].srccontent;
if (this.currentproject.projectmeta.project.id === "obs") {
this.$.licenseholder.classList.add('obs');
this.$.textholder.innerHTML = App.renderer.renderObsPrintPreview(chunks, options, imagePath);
} else {
this.$.textholder.innerHTML = App.renderer.renderPrintPreview(chunks, options);
}
},
createtitle: function (backto) {
if (backto === "translate") {
return "Project";
} else if (backto === "review") {
return "Review";
} else {
return "Home";
}
},
load: function () {
if (this.route === "preview") {
var links = this.getElementsByTagName('a');
for (var i = 0; i < links.length; i++) {
links[i].addEventListener('click', this.externalClick);
}
this.set('backto', App.configurator.getValue("backto"));
}
},
externalClick: function (event) {
var shell = require('electron').shell;
event.preventDefault();
shell.openExternal(this.href);
},
goback: function () {
var mythis = this;
var backto = this.backto;
mythis.$.content.scrollTop = 0;
mythis.set('route', backto);
setTimeout(function() {
if (backto === "translate") {
mythis.fire('iron-signal', {name: 'translateright'});
}
if (backto === "review") {
mythis.fire('iron-signal', {name: 'reviewright'});
}
}, 500);
},
print: function () {
var mythis = this;
var name = this.currentproject.projectmeta.unique_id;
var defaultPath = App.configurator.getUserPath('datalocation', name);
var direction = this.currentproject.projectmeta.target_language.direction;
var filePath = App.ipc.sendSync('save-as', {options: {defaultPath: defaultPath, filters: [{name: 'PDF Files', extensions: ['pdf']}]}});
if (!filePath) {
return;
}
mythis.set('options', {});
mythis.set('options.body', "Creating PDF. Please wait...");
mythis.set('options.loading', true);
mythis.fire('iron-signal', {name: 'openloading'});
var title = mythis.$.title.innerHTML;
var license = mythis.$.license.innerHTML;
var body = mythis.$.textholder.innerHTML;
setTimeout(function() {
return App.printManager.savePdf(title, license, body, filePath, direction)
.then(function () {
mythis.set('options.title', "PDF Created");
mythis.set('options.body', "Your project has been successfully saved to a PDF.");
mythis.set('options.loading', false);
mythis.goback();
})
.catch(function (err) {
var errmessage = "An error occurred saving your project";
if(err !== null) {
errmessage = err;
}
mythis.set('options.title', "Print Failed");
mythis.set('options.body', errmessage);
mythis.set('options.loading', false);
});
}, 500);
},
ready: function () {
}
});
</script>