38 lines
1.3 KiB
TypeScript
38 lines
1.3 KiB
TypeScript
|
|
/**
|
|||
|
|
* Task G5 – Browser-Print-Service.
|
|||
|
|
*
|
|||
|
|
* Bereitet die App für window.print() vor: Der Body erhält die Klasse
|
|||
|
|
* `print-layout`, das @media print Stylesheet blendet das UI-Chrome aus
|
|||
|
|
* und zeigt nur den Druckbereich (Canvas/Layout). Nach dem Druck wird
|
|||
|
|
* die Klasse wieder entfernt (kein DOM-Mutation-Restzustand).
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
const PRINT_CLASS = 'print-layout';
|
|||
|
|
|
|||
|
|
/** Setzt den Print-Modus (Body-Klasse; @media print regelt das Rendering). */
|
|||
|
|
export function preparePrintLayout(): void {
|
|||
|
|
document.body.classList.add(PRINT_CLASS);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** Entfernt den Print-Modus (nach Druck oder bei Abbruch). */
|
|||
|
|
export function cleanupPrintLayout(): void {
|
|||
|
|
document.body.classList.remove(PRINT_CLASS);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Druck-Flow: Vorbereitung → Rendern der nächsten Frames (Styles müssen
|
|||
|
|
* greifen, bevor der Browser den Print-Dialog aufbaut) → window.print
|
|||
|
|
* → Aufräumen. await-fähig für Tests (window.print wird gemockt).
|
|||
|
|
*/
|
|||
|
|
export async function printLayout(): Promise<void> {
|
|||
|
|
preparePrintLayout();
|
|||
|
|
// Zwei Frames warten: Style-Anwendung + Layout der Print-Ansicht
|
|||
|
|
await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));
|
|||
|
|
await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));
|
|||
|
|
try {
|
|||
|
|
window.print();
|
|||
|
|
} finally {
|
|||
|
|
cleanupPrintLayout();
|
|||
|
|
}
|
|||
|
|
}
|