From c987ce87c03f5517b77acb7140a3dc60eb1d039a Mon Sep 17 00:00:00 2001 From: Thomas Reitz Date: Sat, 14 Mar 2026 20:16:42 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20Timeline-Linie=20auf=20Fortsetzungsseite?= =?UTF-8?q?=20bei=20Seiten=C3=BCberlauf=20zeichnen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wenn ein Projekteintrag auf eine neue Seite überläuft (Tasks zu lang), wird jetzt trotzdem eine pendingLine vom Seitenanfang der neuen Seite bis zum Gap vor dem nächsten Eintrag vorgemerkt. Dadurch entsteht eine durchgehende Timeline-Linie auf der Fortsetzungsseite, die den überlaufenden Inhalt visuell mit dem nächsten Eintrag verbindet. Co-Authored-By: Claude Opus 4.6 --- .../expert-profile/profile-export.service.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/core-service/src/core/expert-profile/profile-export.service.ts b/packages/core-service/src/core/expert-profile/profile-export.service.ts index 97f807d..04925b8 100644 --- a/packages/core-service/src/core/expert-profile/profile-export.service.ts +++ b/packages/core-service/src/core/expert-profile/profile-export.service.ts @@ -517,7 +517,7 @@ export class ProfileExportService { // sind Quell-Dot und Ziel-Dot auf derselben Seite → Linie korrekt. if (pendingLineStartY !== null && pendingLineEndY !== null) { if (yRight + headerH <= pageBottom) { - doc.moveTo(timelineX, pendingLineStartY + 8) + doc.moveTo(timelineX, pendingLineStartY) .lineTo(timelineX, pendingLineEndY) .strokeColor(accentColor).lineWidth(1).stroke(); } @@ -533,6 +533,7 @@ export class ProfileExportService { } let pageBreakOccurred = false; + let overflowResumeY: number | undefined; const entryStartY = yRight; // Timeline-Punkt @@ -562,6 +563,9 @@ export class ProfileExportService { if (yRight > pageBottom) { doc.addPage(); yRight = 40; + if (!pageBreakOccurred) { + overflowResumeY = yRight; + } pageBreakOccurred = true; } const raw = task.trim(); @@ -585,9 +589,15 @@ export class ProfileExportService { yRight += 12; - // Linie für nächste Iteration vormerken — nur wenn kein Seitenumbruch innerhalb des Eintrags + // Linie für nächste Iteration vormerken if (!pageBreakOccurred) { - pendingLineStartY = entryStartY; + // Normaler Fall: Linie von unterhalb des Dots bis zum Gap + pendingLineStartY = entryStartY + 8; + pendingLineEndY = yRight - 4; + } else if (overflowResumeY !== undefined) { + // Überlauf-Fall: Inhalt geht auf neuer Seite weiter. + // Timeline-Linie auf der neuen Seite vormerken (vom Seitenanfang bis zum Gap) + pendingLineStartY = overflowResumeY; pendingLineEndY = yRight - 4; } }