Use mPDF-safe mm spacer blocks for OPD section gaps

This commit is contained in:
DevSoftTech Server 2026-06-05 04:26:23 +05:30
parent dbda578d68
commit dc2a0da1ee

View File

@ -3594,7 +3594,11 @@ class Opd extends BaseController
} }
} }
$formatBlock = static function (string $label, string $value, bool $lineBreakAfterLabel = false): string { // mPDF-safe vertical spacer. Using a fixed-height block in mm is more reliable
// than margins inside absolute-positioned containers.
$blockGapHtml = '<div style="display:block;height:2.8mm;line-height:0;font-size:0;">&nbsp;</div>';
$formatBlock = static function (string $label, string $value, bool $lineBreakAfterLabel = false) use ($blockGapHtml): string {
$value = trim($value); $value = trim($value);
if ($value === '') { if ($value === '') {
return ''; return '';
@ -3607,21 +3611,23 @@ class Opd extends BaseController
if ($lineBreakAfterLabel) { if ($lineBreakAfterLabel) {
// List-style sections (Complaint, Diagnosis …): // List-style sections (Complaint, Diagnosis …):
// heading on its own line, content block below with a small left indent. // heading on its own line, content block below with a small left indent.
// margin-bottom:18px gives clear visual separation between consecutive sections. // explicit spacer block is appended for consistent separation in mPDF.
return '<div style="display:block;margin-top:0 !important;margin-bottom:18px !important;padding-bottom:10px !important;line-height:1.6;">' return '<div style="display:block;line-height:1.6;">'
. $headingHtml . $headingHtml
. '<div style="margin-top:3px;padding-left:6px;font-weight:400;color:#111;line-height:1.6;">' . '<div style="margin-top:3px;padding-left:6px;font-weight:400;color:#111;line-height:1.6;">'
. $value . $value
. '</div></div>'; . '</div></div>'
. $blockGapHtml;
} }
// Inline sections (Vitals, Investigation, Next Visit): // Inline sections (Vitals, Investigation, Next Visit):
// heading + value on the same line; same 18px gap after block. // heading + value on the same line; explicit spacer appended after block.
return '<div style="display:block;margin-top:0 !important;margin-bottom:18px !important;padding-bottom:10px !important;line-height:1.6;">' return '<div style="display:block;line-height:1.6;">'
. $headingHtml . $headingHtml
. ' <span style="font-weight:400;color:#111;">' . ' <span style="font-weight:400;color:#111;">'
. $value . $value
. '</span></div>'; . '</span></div>'
. $blockGapHtml;
}; };
$escape = static fn (string $value): string => htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); $escape = static fn (string $value): string => htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
@ -3854,12 +3860,12 @@ class Opd extends BaseController
$medicalHtml = trim((string) ($tokens['medical'] ?? '')); $medicalHtml = trim((string) ($tokens['medical'] ?? ''));
$tokens['Rx'] = $medicalHtml !== '' $tokens['Rx'] = $medicalHtml !== ''
? '<div style="display:block;margin-top:18px !important;margin-bottom:18px !important;padding-top:10px !important;padding-bottom:10px !important;"><div style="font-weight:700;font-size:24px;line-height:1.2;margin-bottom:8px;">Rx :</div>' . $medicalHtml . '</div>' ? $blockGapHtml . '<div style="display:block;"><div style="font-weight:700;font-size:24px;line-height:1.2;margin-bottom:8px;">Rx :</div>' . $medicalHtml . '</div>' . $blockGapHtml
: ''; : '';
$tokens['rx'] = $tokens['Rx']; $tokens['rx'] = $tokens['Rx'];
// {{medical}} used directly in templates: wrap with the same top/bottom margin. // {{medical}} used directly in templates: wrap with the same top/bottom margin.
$tokens['medical'] = $medicalHtml !== '' $tokens['medical'] = $medicalHtml !== ''
? '<div style="display:block;margin-top:18px !important;margin-bottom:18px !important;padding-top:10px !important;padding-bottom:10px !important;">' . $medicalHtml . '</div>' ? $blockGapHtml . '<div style="display:block;">' . $medicalHtml . '</div>' . $blockGapHtml
: ''; : '';
$tokens['VitalsBlock'] = (string) ($tokens['vital_content'] ?? ''); $tokens['VitalsBlock'] = (string) ($tokens['vital_content'] ?? '');