@@ -359,6 +355,7 @@
Mietvertrages. Sinngemäß gilt dies auch für Einzelsatellitenempfangsanlagen.
+
Datum: {{ currentDate }}
;
@ViewChild('measureContainer') measureContainer!: ElementRef;
- @ViewChild('signatureCanvas') signatureCanvas!: ElementRef;
pages: string[] = [];
private currentPageHeight = 0;
@@ -28,153 +28,83 @@ export class RentalAgreementComponent implements AfterViewInit {
currentDate: string = new Date().toISOString().substr(0, 10); // YYYY-MM-DD
signatureImage: string | null = null;
- private ctx!: CanvasRenderingContext2D;
- private isDrawing = false;
-
constructor(private renderer: Renderer2, private el: ElementRef) {}
ngAfterViewInit() {
- // Initialisieren des Canvas
- const canvas = this.signatureCanvas.nativeElement;
- this.ctx = canvas.getContext('2d')!;
- this.resizeCanvas();
- this.setupCanvasEvents();
- //setTimeout(() => this.renderContent(), 0);
- }
- /**
- * Passt die Canvas-Größe an.
- */
- resizeCanvas() {
- const canvas = this.signatureCanvas.nativeElement;
- canvas.width = 300; // Anpassen nach Bedarf
- canvas.height = 100; // Anpassen nach Bedarf
- this.ctx.lineWidth = 2;
- this.ctx.strokeStyle = '#000';
- this.ctx.lineCap = 'round';
- this.ctx.lineJoin = 'round';
+ // Initiales Rendern der Inhalte
+ setTimeout(() => this.renderContent(), 0);
}
/**
- * Setzt die Ereignislistener für das Canvas.
+ * Handler für die Speicherung der Unterschrift.
+ * @param signatureData Das Bild der Unterschrift als Data URL.
*/
- setupCanvasEvents() {
- const canvas = this.signatureCanvas.nativeElement;
-
- // Maus-Ereignisse
- canvas.addEventListener('mousedown', this.startDrawing.bind(this));
- canvas.addEventListener('mousemove', this.draw.bind(this));
- canvas.addEventListener('mouseup', this.stopDrawing.bind(this));
- canvas.addEventListener('mouseleave', this.stopDrawing.bind(this));
-
- // Touch-Ereignisse
- canvas.addEventListener('touchstart', this.startDrawing.bind(this));
- canvas.addEventListener('touchmove', this.draw.bind(this));
- canvas.addEventListener('touchend', this.stopDrawing.bind(this));
+ onSignatureSaved(signatureData: string) {
+ this.signatureImage = signatureData;
+ this.renderContent();
}
/**
- * Startet das Zeichnen auf dem Canvas.
+ * Handler für die Änderung des Datums.
+ * @param date Das neue Datum im Format YYYY-MM-DD.
*/
- startDrawing(event: MouseEvent | TouchEvent) {
- event.preventDefault();
- this.isDrawing = true;
- const { x, y } = this.getXY(event);
- this.ctx.beginPath();
- this.ctx.moveTo(x, y);
+ onDateChanged(date: any) {
+ this.currentDate = date;
+ this.renderContent();
}
/**
- * Zeichnet auf dem Canvas.
+ * Rendert den Inhalt und teilt ihn in Seiten auf.
*/
- draw(event: MouseEvent | TouchEvent) {
- if (!this.isDrawing) return;
- event.preventDefault();
- const { x, y } = this.getXY(event);
- this.ctx.lineTo(x, y);
- this.ctx.stroke();
- }
+ renderContent() {
+ this.pages = [];
+ this.currentPageHeight = 0;
- /**
- * Beendet das Zeichnen auf dem Canvas.
- */
- stopDrawing(event: MouseEvent | TouchEvent) {
- if (!this.isDrawing) return;
- event.preventDefault();
- this.isDrawing = false;
- }
+ // Klonen des formContent-Elements
+ const currentContent = this.formContent.nativeElement.cloneNode(
+ true
+ ) as HTMLElement;
- /**
- * Ermittelt die X- und Y-Koordinaten auf dem Canvas.
- */
- getXY(event: MouseEvent | TouchEvent): { x: number; y: number } {
- const canvas = this.signatureCanvas.nativeElement;
- let clientX: number;
- let clientY: number;
-
- if (event instanceof MouseEvent) {
- clientX = event.clientX;
- clientY = event.clientY;
- } else {
- clientX = event.touches[0].clientX;
- clientY = event.touches[0].clientY;
+ // Aktualisieren von Datum und Unterschrift im geklonten Inhalt
+ const signatureContainer = currentContent.querySelector(
+ '.signature-container'
+ ) as HTMLElement;
+ if (signatureContainer) {
+ signatureContainer.querySelector(
+ '.date'
+ )!.textContent = `Datum: ${this.currentDate}`;
+ const img = signatureContainer.querySelector(
+ '.signature-image'
+ ) as HTMLImageElement;
+ if (img && this.signatureImage) {
+ img.src = this.signatureImage;
+ } else if (img) {
+ img.remove(); // Entfernen des img-Tags, falls keine Unterschrift vorhanden ist
+ }
}
- const rect = canvas.getBoundingClientRect();
- const x = clientX - rect.left;
- const y = clientY - rect.top;
- return { x, y };
- }
-
- /**
- * Löscht die Unterschrift vom Canvas.
- */
- clearSignature() {
- this.ctx.clearRect(
- 0,
- 0,
- this.signatureCanvas.nativeElement.width,
- this.signatureCanvas.nativeElement.height
- );
- this.signatureImage = null;
- this.renderContent(); // Neu rendern, um die Unterschrift aus den Seiten zu entfernen
- }
-
- /**
- * Speichert die Unterschrift als Bild.
- */
- saveSignature() {
- const canvas = this.signatureCanvas.nativeElement;
- this.signatureImage = canvas.toDataURL('image/png');
- this.pages = [];
- setTimeout(() => {
- this.renderContent(); // Neu rendern, um die Unterschrift in den Seiten einzufügen
- }, 1000);
- }
-
- renderContent() {
- let currentPage = '';
- const children = Array.from(this.formContent.nativeElement.children);
+ const children = Array.from(currentContent.children);
const totalElements = children.length;
+ let currentPage = '';
+
for (let i = 0; i < totalElements; i++) {
const element = children[i] as HTMLElement;
- // Überprüfen, ob das aktuelle Element ein
ist
+ // Spezielle Behandlung für
-Elemente
if (element.tagName.toLowerCase() === 'h2') {
- // Clone das
Element
+ // Klonen und Messen des
-Elements
const h2Clone = element.cloneNode(true) as HTMLElement;
this.renderer.appendChild(this.measureContainer.nativeElement, h2Clone);
- // Berechnung der Höhe inklusive Margins für
Elements aus dem Messcontainer
this.renderer.removeChild(this.measureContainer.nativeElement, h2Clone);
- // Prüfen, ob es ein nachfolgendes
Element gibt
+ // Prüfen, ob ein nachfolgendes
-Element vorhanden ist
let pHeight = 0;
if (i + 1 < totalElements) {
const nextElement = children[i + 1] as HTMLElement;
@@ -185,13 +115,11 @@ export class RentalAgreementComponent implements AfterViewInit {
pClone
);
- // Berechnung der Höhe inklusive Margins für
Elements aus dem Messcontainer
this.renderer.removeChild(
this.measureContainer.nativeElement,
pClone
@@ -199,7 +127,6 @@ export class RentalAgreementComponent implements AfterViewInit {
//}
}
- // Gesamthöhe von
auf die aktuelle Seite passen
@@ -216,10 +143,10 @@ export class RentalAgreementComponent implements AfterViewInit {
this.currentPageHeight += h2Height;
}
- // Nun das nachfolgende
Element hinzufügen, falls vorhanden
+ //
-Element hinzufügen, falls vorhanden
if (pHeight > 0) {
if (this.currentPageHeight + pHeight > this.maxPageHeight) {
- // Neue Seite beginnen für
+ // Neue Seite für
beginnen
this.pages.push(currentPage);
currentPage = children[i + 1].outerHTML;
this.currentPageHeight = pHeight;
@@ -228,21 +155,18 @@ export class RentalAgreementComponent implements AfterViewInit {
currentPage += children[i + 1].outerHTML;
this.currentPageHeight += pHeight;
}
- // Überspringen des nächsten Elements, da es bereits verarbeitet wurde
- i += 1;
+ i += 1; // Überspringen des bereits verarbeiteten
-Elements
}
} else {
- // Für alle anderen Elemente wie
,
usw.
+ // Behandlung aller anderen Elemente
const clone = element.cloneNode(true) as HTMLElement;
this.renderer.appendChild(this.measureContainer.nativeElement, clone);
- // Berechnung der Höhe inklusive Margins
const computedStyle = window.getComputedStyle(clone);
const marginTop = parseFloat(computedStyle.marginTop) || 0;
const marginBottom = parseFloat(computedStyle.marginBottom) || 0;
const height = clone.offsetHeight + marginTop + marginBottom;
- // Entfernen des geklonten Elements aus dem Messcontainer
this.renderer.removeChild(this.measureContainer.nativeElement, clone);
if (this.currentPageHeight + height > this.maxPageHeight) {
@@ -264,6 +188,9 @@ export class RentalAgreementComponent implements AfterViewInit {
}
}
+ /**
+ * Druckt das Dokument.
+ */
print() {
window.print();
}
diff --git a/src/app/signature/signature.component.html b/src/app/signature/signature.component.html
new file mode 100644
index 0000000..bf09004
--- /dev/null
+++ b/src/app/signature/signature.component.html
@@ -0,0 +1,14 @@
+