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:
@@ -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 أسماء تقريباً في السطر.
|
||||
الوقت يبقى دائماً داخل عمود الوقت في نفس صف الاجتماع.
|
||||
Reference in New Issue
Block a user