194 lines
5.1 KiB
TypeScript
194 lines
5.1 KiB
TypeScript
import {
|
|
DeesElement,
|
|
property,
|
|
html,
|
|
customElement,
|
|
type TemplateResult,
|
|
css,
|
|
unsafeCSS,
|
|
domtools,
|
|
} from "@design.estate/dees-element";
|
|
|
|
import * as plugins from "../plugins.js";
|
|
import { dedocumentSharedStyle } from "../style.js";
|
|
|
|
declare global {
|
|
interface HTMLElementTagNameMap {
|
|
"dedocument-letterheader": DeLetterHeader;
|
|
}
|
|
}
|
|
|
|
@customElement("dedocument-letterheader")
|
|
export class DeLetterHeader extends DeesElement {
|
|
public static demo = () => html`
|
|
<dedocument-letterheader
|
|
.format="${"a4"}"
|
|
.letterData=${plugins.shared.demoLetter}
|
|
></dedocument-letterheader>
|
|
`;
|
|
|
|
@property({
|
|
type: Object,
|
|
reflect: true,
|
|
})
|
|
public letterData: plugins.tsclass.finance.TInvoice;
|
|
|
|
@property({
|
|
type: Number,
|
|
reflect: true,
|
|
})
|
|
public pageNumber: number = 1;
|
|
|
|
@property({
|
|
type: Number,
|
|
reflect: true,
|
|
})
|
|
public pageTotalNumber: number = 1;
|
|
|
|
@property({
|
|
type: Object,
|
|
reflect: true,
|
|
})
|
|
public documentSettings: plugins.shared.interfaces.IDocumentSettings;
|
|
|
|
constructor() {
|
|
super();
|
|
domtools.DomTools.setupDomTools();
|
|
}
|
|
|
|
public static styles = [
|
|
domtools.elementBasic.staticStyles,
|
|
dedocumentSharedStyle,
|
|
css`
|
|
.address {
|
|
position: absolute;
|
|
top: calc(var(--DPI-FACTOR) * 4.5);
|
|
left: var(--LEFT-MARGIN);
|
|
}
|
|
|
|
.date {
|
|
position: absolute;
|
|
top: calc(var(--DPI-FACTOR) * 4.5);
|
|
right: var(--RIGHT-MARGIN);
|
|
text-align: right;
|
|
}
|
|
|
|
.recepientInfo {
|
|
position: absolute;
|
|
display: block;
|
|
overflow: hidden;
|
|
top: calc(var(--DPI-FACTOR) * 5.5);
|
|
right: var(--RIGHT-MARGIN);
|
|
width: 200px;
|
|
text-align: right;
|
|
}
|
|
|
|
.recepientInfo .label {
|
|
margin-top: 10px;
|
|
margin-bottom: 3px;
|
|
font-size: 10px;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.address .from {
|
|
font-size: 10px;
|
|
}
|
|
|
|
.address .to {
|
|
margin-top: 10px;
|
|
}
|
|
`,
|
|
];
|
|
|
|
private renderDeliveryDate(from: Date, to: Date): TemplateResult {
|
|
if (this.letterData.type !== "invoice") return null;
|
|
const dateFormat = new Intl.DateTimeFormat(
|
|
this.documentSettings.languageCode,
|
|
{ dateStyle: this.documentSettings.dateStyle }
|
|
);
|
|
|
|
let formattedFrom = from ? dateFormat.format(from) : null;
|
|
let formattedTo = to ? dateFormat.format(to) : null;
|
|
|
|
const isSameDay = formattedFrom === formattedTo;
|
|
|
|
if (isSameDay) {
|
|
return html`<div class="label">
|
|
${plugins.shared.translation.translate(
|
|
this.documentSettings.languageCode,
|
|
"letterhead@@periodOfPerformance.day"
|
|
)}
|
|
</div>
|
|
<span> ${formattedFrom} </span>`;
|
|
} else {
|
|
return html`<div class="label">
|
|
${plugins.shared.translation.translate(
|
|
this.documentSettings.languageCode,
|
|
"letterhead@@periodOfPerformance.range"
|
|
)}
|
|
</div>
|
|
<span> ${formattedFrom} - ${formattedTo}</span>`;
|
|
}
|
|
}
|
|
|
|
public render(): TemplateResult {
|
|
return html`
|
|
<div class="date">
|
|
${new Intl.DateTimeFormat(this.documentSettings.languageCode, {
|
|
dateStyle: "long",
|
|
}).format(new Date(this.letterData.date))}
|
|
</div>
|
|
<div class="address">
|
|
<div class="from">
|
|
${this.letterData.from.name},
|
|
${this.letterData.from.address.streetName}
|
|
${this.letterData.from.address.houseNumber},
|
|
${this.letterData.from.address.postalCode}
|
|
${this.letterData.from.address.city},
|
|
${this.letterData.from.address.country}
|
|
</div>
|
|
<div class="to">
|
|
${this.letterData.to.name}<br />
|
|
${this.letterData.to.address.streetName}
|
|
${this.letterData.to.address.houseNumber}<br />
|
|
${this.letterData.to.address.postalCode}
|
|
${this.letterData.to.address.city}<br />
|
|
${this.letterData.from.address.country}
|
|
</div>
|
|
</div>
|
|
<div class="recepientInfo">
|
|
<div class="label">
|
|
${plugins.shared.translation.translate(
|
|
this.documentSettings.languageCode,
|
|
"letterhead@@customer.number"
|
|
)}
|
|
</div>
|
|
${this.letterData.to.customerNumber || "not registered"}
|
|
|
|
<div class="label">
|
|
${plugins.shared.translation.translate(
|
|
this.documentSettings.languageCode,
|
|
"letterhead@@vat.yourId"
|
|
)}
|
|
</div>
|
|
${this.letterData.to.registrationDetails.vatId || "not provided"}
|
|
|
|
<!-- TODO: Make use of components -->
|
|
${this.letterData.type === "invoice"
|
|
? html` <div class="label">
|
|
${plugins.shared.translation.translate(
|
|
this.documentSettings.languageCode,
|
|
"letterhead@@invoice.number"
|
|
)}
|
|
</div>
|
|
${this.letterData.id || "not registered"}`
|
|
: null}
|
|
${this.renderDeliveryDate(
|
|
new Date(this.letterData.periodOfPerformance?.from),
|
|
new Date(this.letterData.periodOfPerformance?.to)
|
|
)}
|
|
</div>
|
|
`;
|
|
}
|
|
}
|