Improve PDF schedule layout for better readability and alignment

Adjust PDF rendering to ensure all meeting details (number, title, attendees, time) are contained within a single row, improve vertical alignment to the top, and set correct text alignment for RTL content.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 5cba573f-cf8f-4641-b2db-92b5b87be569
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/Zh9QhRk
Replit-Helium-Checkpoint-Created: true
This commit is contained in:
riyadhafraa
2026-05-04 09:59:03 +00:00
parent 0114ad86d0
commit 328d867975
2 changed files with 108 additions and 6 deletions
+4 -6
View File
@@ -815,7 +815,7 @@ export async function renderSchedulePdf(input: RenderPdfInput): Promise<Buffer>
const headerWidths = isRtl ? [...colWidths].reverse() : colWidths;
const cellPadX = 4;
const cellPadY = 0;
const cellPadY = 2;
const lineHeight = input.font.fontSize * 1.05;
function drawHeader(): number {
@@ -862,7 +862,7 @@ export async function renderSchedulePdf(input: RenderPdfInput): Promise<Buffer>
{
text: htmlToPlain(isRtl ? meeting.titleAr : meeting.titleEn || meeting.titleAr) +
(meeting.location ? `\n${meeting.location}` : ""),
align: "center",
align: isRtl ? "right" : "left",
},
{
text:
@@ -896,7 +896,7 @@ export async function renderSchedulePdf(input: RenderPdfInput): Promise<Buffer>
flushGroup();
return parts.join("\n");
})(),
align: "center",
align: isRtl ? "right" : "left",
},
{
text: formatTimeRange(meeting.startTime, meeting.endTime, input.lang),
@@ -992,9 +992,7 @@ export async function renderSchedulePdf(input: RenderPdfInput): Promise<Buffer>
const c = cells[i];
const cellW = widths[i] - cellPadX * 2;
const textLines = c.text.split("\n");
const contentH = cellHeights[i] - cellPadY * 2;
const vOffset = Math.max(0, (rowHeight - cellPadY * 2 - contentH) / 2);
let y = rowTop + cellPadY + vOffset;
let y = rowTop + cellPadY;
for (const tl of textLines) {
if (y >= rowBottom) break;
if (!tl) { y += lineHeight; continue; }
@@ -0,0 +1,104 @@
الإخراج الحالي غير مقبول. المطلوب إصلاح جدول PDF بحيث يكون كل اجتماع داخل صف واحد فقط.
المشكلة الحالية:
- الوقت يظهر أحياناً في سطر مستقل فوق أو تحت الاجتماع.
- بعض الحضور يخرجون من صف الاجتماع.
- الصف لا يحافظ على نفس المحاذاة بين رقم الاجتماع، اسم الاجتماع، الحضور، والوقت.
- المطلوب أن يكون كل اجتماع عبارة عن <tr> واحد فقط يحتوي 4 خلايا:
رقم الاجتماع | اسم الاجتماع | الحضور | الوقت
مهم جداً:
لا تجعل الوقت أو الحضور عناصر منفصلة خارج صف الجدول.
كل بيانات الاجتماع يجب أن تكون داخل نفس tr.
الشكل المطلوب داخل HTML:
<tr>
<td class="num-cell">6</td>
<td class="meeting-cell">اجتماع خاص</td>
<td class="attendees-cell">
<div class="attendees-inline">
<span class="attendee-item">-1 محمد خالد</span>
<span class="attendee-item">-2 سعيد عبدالله</span>
<span class="attendee-item">-3 طارق علي سعيد</span>
</div>
</td>
<td class="time-cell">10:30-10:40</td>
</tr>
ممنوع:
- ممنوع طباعة الوقت قبل tr أو بعد tr.
- ممنوع جعل الحضور div خارج td.
- ممنوع استخدام position:absolute داخل الجدول.
- ممنوع استخدام display:flex على tr أو table.
- ممنوع تقسيم الاجتماع الواحد إلى أكثر من tr.
CSS المطلوب:
@media print {
table {
width: 100%;
border-collapse: collapse;
table-layout: fixed;
}
tr {
page-break-inside: avoid;
break-inside: avoid;
}
th, td {
vertical-align: top;
padding: 6px 8px;
text-align: right;
white-space: normal;
overflow-wrap: break-word;
}
.num-cell {
width: 8%;
text-align: center;
}
.meeting-cell {
width: 30%;
direction: rtl;
text-align: right;
}
.attendees-cell {
width: 42%;
direction: rtl;
text-align: right;
}
.time-cell {
width: 20%;
direction: ltr;
unicode-bidi: isolate;
text-align: center;
white-space: nowrap;
}
.attendees-inline {
display: flex;
flex-wrap: wrap;
gap: 2px 14px;
direction: rtl;
text-align: right;
line-height: 1.6;
}
.attendee-item {
display: inline-block;
white-space: nowrap;
direction: rtl;
unicode-bidi: isolate;
}
}
المطلوب النهائي:
كل صف اجتماع يظهر مثل النموذج المرجعي:
رقم الاجتماع واسم الاجتماع والحضور والوقت على نفس السطر الأساسي.
الحضور يكون inline داخل خانة الحضور، 3 إلى 4 أسماء تقريباً في السطر.
الوقت يبقى دائماً داخل عمود الوقت في نفس صف الاجتماع.