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> `; } }