@medicus.ai/medicus-report-pdf-generator 1.3.10 → 1.3.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/maisonsante.json +40 -0
- package/lib/big_integral_questionnaire.js +298 -0
- package/lib/template.js +31 -10
- package/lib/wellbeing_report_generator.js +36 -4
- package/locales/en.json +64 -0
- package/locales/wellbeing/en.json +422 -408
- package/package.json +3 -3
- package/preview-big-integral.js +75 -0
- package/templates/maisonsante/blocks/first-section.html +208 -0
- package/templates/maisonsante/blocks/footer.html +8 -0
- package/templates/maisonsante/blocks/header-template.html +6 -0
- package/templates/maisonsante/blocks/header.html +20 -0
- package/templates/maisonsante/blocks/patient-table.html +38 -0
- package/templates/maisonsante/blocks/pdf-header.html +8 -0
- package/templates/maisonsante/blocks/tips.html +9 -0
- package/templates/maisonsante/ltr_no_pages.html +38 -0
- package/templates/maisonsante/rtl_no_pages.html +43 -0
- package/templates/maisonsante/wellbeing_template.html +42 -0
- package/test.js +8 -10
- package/testing-reports/mediclinic/arabic-data.js +402 -506
- package/testing-reports/mediclinic/doctor-data.js +483 -620
- package/testing-reports/mediclinic/with-wellbeing.js +382 -8110
- package/testing-reports/pha/notes-example.js +397 -0
- package/testing-reports/pha/ex1.js +0 -485
- package/testing-reports/pha/ex2.js +0 -116
- package/testing-reports/pha/prod-patient.js +0 -510
- package/testing-reports/pha/with-wellbeing-full-data.js +0 -813
- package/testing-reports/pha/with-wellbeing.js +0 -529
- package/testing-reports/pha/without-wellbeing.js +0 -448
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "HealthRiskAssessment",
|
|
3
|
+
"logo": "data:image/png;base64,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",
|
|
4
|
+
"body_icon": "https://i.ibb.co/2hfhHM3/body-section.png",
|
|
5
|
+
"lifestyle_icon": "https://i.ibb.co/ZNkkF12/lifestyle-section.png",
|
|
6
|
+
"mind_icon": "https://i.ibb.co/gVjxNZ7/mind-section.png",
|
|
7
|
+
"bulb_icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACUAAAAoCAYAAAB5ADPdAAABYWlDQ1BrQ0dDb2xvclNwYWNlRGlzcGxheVAzAAAokWNgYFJJLCjIYWFgYMjNKykKcndSiIiMUmB/yMAOhLwMYgwKicnFBY4BAT5AJQwwGhV8u8bACKIv64LMOiU1tUm1XsDXYqbw1YuvRJsw1aMArpTU4mQg/QeIU5MLikoYGBhTgGzl8pICELsDyBYpAjoKyJ4DYqdD2BtA7CQI+whYTUiQM5B9A8hWSM5IBJrB+API1klCEk9HYkPtBQFul8zigpzESoUAYwKuJQOUpFaUgGjn/ILKosz0jBIFR2AopSp45iXr6SgYGRiaMzCAwhyi+nMgOCwZxc4gxJrvMzDY7v",
|
|
8
|
+
"first-level-color": "#A43B2F",
|
|
9
|
+
"second-level-color": "#ED6D59",
|
|
10
|
+
"third-level-color": "#F4A837",
|
|
11
|
+
"forth-level-color": "#F8E242",
|
|
12
|
+
"fifth-level-color": "#02D9D1",
|
|
13
|
+
"score-header-color": "#0F2062",
|
|
14
|
+
"score-description-color": "#0F2062",
|
|
15
|
+
"svg-icon-color": "#2D4A8C",
|
|
16
|
+
"low-score-text-color": "#2D4A8C",
|
|
17
|
+
"section-title-border-color": "#0F2062",
|
|
18
|
+
"first-section-scores-border-color": "#0F2062",
|
|
19
|
+
"general-font-color": "#A43B2F",
|
|
20
|
+
"disclaimer-text-color": "rgba(15, 32, 98, 0.3)",
|
|
21
|
+
"top-box-background": "#f0f4ff",
|
|
22
|
+
"footer-background": "rgba(15, 32, 98, 0.14)",
|
|
23
|
+
"footer-border-color": "#0F2062",
|
|
24
|
+
"body_font_color": "#0F2062",
|
|
25
|
+
"list_icons_font_color": "#0F2062",
|
|
26
|
+
"insights_font_color": "#1A3A7A",
|
|
27
|
+
"signature": "Team Medicus",
|
|
28
|
+
"big_integral_questionnaire": {
|
|
29
|
+
"title": "Key to the Big Integral Questionnaire",
|
|
30
|
+
"showHormonalFemale": true,
|
|
31
|
+
"showHormonalMale": true,
|
|
32
|
+
"colors": {
|
|
33
|
+
"headerBg": "#0F2062",
|
|
34
|
+
"subheaderBg": "#1B4080",
|
|
35
|
+
"headerText": "#FFFFFF",
|
|
36
|
+
"rowBorder": "rgba(15, 32, 98, 0.12)",
|
|
37
|
+
"elevatedText": "#A43B2F"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Dummy data — structure mirrors the Excel RESULTS KEY sheet.
|
|
5
|
+
// result = 0 for all rows (questionnaire not yet filled in).
|
|
6
|
+
// Hormonal Health rows have no High/Questions/Maximum — rendered as "—".
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
function getDummyData() {
|
|
9
|
+
return {
|
|
10
|
+
rows: [
|
|
11
|
+
{
|
|
12
|
+
system: "STOMACH and GI (Gastrointestinal) Tract",
|
|
13
|
+
high: ">8",
|
|
14
|
+
questions: 9,
|
|
15
|
+
result: 0,
|
|
16
|
+
maximum: 27,
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
system: "Small Intestine",
|
|
20
|
+
high: ">7",
|
|
21
|
+
questions: 8,
|
|
22
|
+
result: 0,
|
|
23
|
+
maximum: 24,
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
system: "Infections/Invasions of the GI (Gastrointestinal Tract)",
|
|
27
|
+
high: ">3",
|
|
28
|
+
questions: 4,
|
|
29
|
+
result: 0,
|
|
30
|
+
maximum: 12,
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
system: "Large Intestine",
|
|
34
|
+
high: ">2",
|
|
35
|
+
questions: 3,
|
|
36
|
+
result: 0,
|
|
37
|
+
maximum: 9,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
system: "Liver and Gallbladder",
|
|
41
|
+
high: ">7",
|
|
42
|
+
questions: 8,
|
|
43
|
+
result: 0,
|
|
44
|
+
maximum: 22,
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
system: "Essential Nutrients",
|
|
48
|
+
high: ">25",
|
|
49
|
+
questions: 26,
|
|
50
|
+
result: 0,
|
|
51
|
+
maximum: 68,
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
system: "Carbohydrate Metabolism",
|
|
55
|
+
high: ">4",
|
|
56
|
+
questions: 4,
|
|
57
|
+
result: 0,
|
|
58
|
+
maximum: 12,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
system: "Immune System",
|
|
62
|
+
high: ">3",
|
|
63
|
+
questions: 4,
|
|
64
|
+
result: 0,
|
|
65
|
+
maximum: 10,
|
|
66
|
+
},
|
|
67
|
+
{ system: "Lifestyle", high: ">7", questions: 7, result: 0, maximum: 7 },
|
|
68
|
+
{
|
|
69
|
+
system: "Hormonal Health Female",
|
|
70
|
+
high: null,
|
|
71
|
+
questions: null,
|
|
72
|
+
result: 0,
|
|
73
|
+
maximum: null,
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
system: "Hormonal Health Male",
|
|
77
|
+
high: null,
|
|
78
|
+
questions: null,
|
|
79
|
+
result: 0,
|
|
80
|
+
maximum: null,
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
meta: {
|
|
84
|
+
patientName: "Final Test 3",
|
|
85
|
+
age: "37",
|
|
86
|
+
bmi: "23.67",
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
// Helpers
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
function fmt(val, decimals) {
|
|
95
|
+
if (val === null || val === undefined) return "\u2014"; // em dash
|
|
96
|
+
if (typeof val === "number") {
|
|
97
|
+
const rounded =
|
|
98
|
+
Math.round(val * Math.pow(10, decimals)) / Math.pow(10, decimals);
|
|
99
|
+
return String(rounded);
|
|
100
|
+
}
|
|
101
|
+
return String(val);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
// Single render — faithful to the reference image, Maison Sante colours.
|
|
106
|
+
//
|
|
107
|
+
// Structure:
|
|
108
|
+
// ┌──────────────────────────────────────────────────────┐
|
|
109
|
+
// │ Key to the Big Integral Questionnaire [title bar] │
|
|
110
|
+
// ├──────────────────────────────────────────────────────┤
|
|
111
|
+
// │ Client/Patient Full Name … Age … BMI … │
|
|
112
|
+
// ├──────────────────────────────────────────────────────┤
|
|
113
|
+
// │ SYSTEM SCORES [subheader band] │
|
|
114
|
+
// ├────────────┬──────┬─────────┬────────┬───────┬──┬───┤
|
|
115
|
+
// │ SYSTEM │ High │Questions│ Result │Maximum│/3 │Cmt│
|
|
116
|
+
// ├────────────┼──────┼─────────┼────────┼───────┼──┼───┤
|
|
117
|
+
// │ ...rows... │
|
|
118
|
+
// └──────────────────────────────────────────────────────┘
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
function renderTable(rows, meta, cfg) {
|
|
121
|
+
const c = cfg.colors;
|
|
122
|
+
const title = cfg.title || "Key to the Big Integral Questionnaire";
|
|
123
|
+
|
|
124
|
+
// ── patient info bar ──────────────────────────────────────────────────
|
|
125
|
+
const infoBar = `
|
|
126
|
+
<div style="background:#ffffff;border-bottom:1px solid ${c.rowBorder};">
|
|
127
|
+
<table style="border-collapse:collapse;">
|
|
128
|
+
<tr>
|
|
129
|
+
<td style="padding:7px 40px 7px 14px;font-size:9px;color:#1a1a1a;white-space:nowrap;vertical-align:middle;">
|
|
130
|
+
<span style="color:${c.headerBg};font-weight:700;">Client/Patient Full Name</span>
|
|
131
|
+
${meta.patientName}
|
|
132
|
+
</td>
|
|
133
|
+
<td style="padding:7px 40px 7px 0;font-size:9px;color:#1a1a1a;white-space:nowrap;vertical-align:middle;">
|
|
134
|
+
<span style="color:${c.headerBg};font-weight:700;">Age</span>
|
|
135
|
+
${meta.age}
|
|
136
|
+
</td>
|
|
137
|
+
<td style="padding:7px 0 7px 0;font-size:9px;color:#1a1a1a;white-space:nowrap;vertical-align:middle;">
|
|
138
|
+
<span style="color:${c.headerBg};font-weight:700;">BMI</span>
|
|
139
|
+
${meta.bmi}
|
|
140
|
+
</td>
|
|
141
|
+
</tr>
|
|
142
|
+
</table>
|
|
143
|
+
</div>`;
|
|
144
|
+
|
|
145
|
+
// ── "SYSTEM SCORES" subheader band ───────────────────────────────────
|
|
146
|
+
const subheaderBg = c.subheaderBg || "#1B4080";
|
|
147
|
+
const subheaderBand = `
|
|
148
|
+
<div style="
|
|
149
|
+
padding: 5px 14px;
|
|
150
|
+
background: ${subheaderBg};
|
|
151
|
+
color: #ffffff;
|
|
152
|
+
font-size: 8.5px;
|
|
153
|
+
font-weight: 700;
|
|
154
|
+
letter-spacing: 0.8px;
|
|
155
|
+
text-transform: uppercase;
|
|
156
|
+
">SYSTEM SCORES</div>`;
|
|
157
|
+
|
|
158
|
+
// ── column widths ──────────────────────────────────────────────────────
|
|
159
|
+
const COL = {
|
|
160
|
+
system: "width:34%;text-align:left;",
|
|
161
|
+
high: "width:8%; text-align:center;",
|
|
162
|
+
questions: "width:9%; text-align:center;",
|
|
163
|
+
result: "width:8%; text-align:center;",
|
|
164
|
+
maximum: "width:9%; text-align:center;",
|
|
165
|
+
perThree: "width:8%; text-align:center;",
|
|
166
|
+
comments: "width:24%;text-align:left;",
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
const TH_BASE = `padding:6px 14px;font-size:8px;font-weight:700;color:#ffffff;
|
|
170
|
+
background:${c.headerBg};border-bottom:2px solid rgba(255,255,255,0.2);`;
|
|
171
|
+
|
|
172
|
+
const th = (label, colKey) =>
|
|
173
|
+
`<th style="${TH_BASE}${COL[colKey]}">${label}</th>`;
|
|
174
|
+
|
|
175
|
+
const tableHeader = `
|
|
176
|
+
<tr>
|
|
177
|
+
${th("SYSTEM", "system")}
|
|
178
|
+
${th("High", "high")}
|
|
179
|
+
${th("Questions", "questions")}
|
|
180
|
+
${th("Result", "result")}
|
|
181
|
+
${th("Maximum", "maximum")}
|
|
182
|
+
${th("/3", "perThree")}
|
|
183
|
+
${th("Comments", "comments")}
|
|
184
|
+
</tr>`;
|
|
185
|
+
|
|
186
|
+
// ── data rows ─────────────────────────────────────────────────────────
|
|
187
|
+
const TD = (content, colKey, extra = "") =>
|
|
188
|
+
`<td style="padding:5px 14px;font-size:8.5px;${COL[colKey]}border-bottom:1px solid ${c.rowBorder};${extra}">${content}</td>`;
|
|
189
|
+
|
|
190
|
+
const dataRows = rows
|
|
191
|
+
.map((row, i) => {
|
|
192
|
+
const hasThreshold = row.high !== null && row.high !== undefined;
|
|
193
|
+
const hasQuantity = row.questions !== null && row.questions !== undefined;
|
|
194
|
+
const hasMaximum = row.maximum !== null && row.maximum !== undefined;
|
|
195
|
+
|
|
196
|
+
const highDisplay = hasThreshold
|
|
197
|
+
? `<span style="color:${c.elevatedText};font-weight:600;">${row.high}</span>`
|
|
198
|
+
: "\u2014";
|
|
199
|
+
|
|
200
|
+
const questionsDisplay = hasQuantity ? String(row.questions) : "\u2014";
|
|
201
|
+
const resultDisplay = String(row.result);
|
|
202
|
+
const maximumDisplay = hasMaximum ? fmt(row.maximum, 0) : "\u2014";
|
|
203
|
+
const perThreeDisplay = hasMaximum ? fmt(row.maximum / 3, 2) : "\u2014";
|
|
204
|
+
|
|
205
|
+
const rowBg = i % 2 === 0 ? "#ffffff" : "rgba(15, 32, 98, 0.03)";
|
|
206
|
+
|
|
207
|
+
return `
|
|
208
|
+
<tr style="background:${rowBg};">
|
|
209
|
+
${TD(`<span style="color:#1a1a1a;">${row.system}</span>`, "system")}
|
|
210
|
+
${TD(highDisplay, "high")}
|
|
211
|
+
${TD(questionsDisplay, "questions")}
|
|
212
|
+
${TD(resultDisplay, "result", `font-weight:600;color:#444;`)}
|
|
213
|
+
${TD(maximumDisplay, "maximum")}
|
|
214
|
+
${TD(perThreeDisplay, "perThree")}
|
|
215
|
+
${TD("", "comments")}
|
|
216
|
+
</tr>`;
|
|
217
|
+
})
|
|
218
|
+
.join("");
|
|
219
|
+
|
|
220
|
+
// ── assemble ──────────────────────────────────────────────────────────
|
|
221
|
+
// Outer wrapper uses padding-top instead of an empty spacer div, because
|
|
222
|
+
// empty divs with only `height` get collapsed by wkhtmltopdf. Padding
|
|
223
|
+
// always renders.
|
|
224
|
+
return `
|
|
225
|
+
<div style="padding-top:25px;font-family:'Open Sans',sans-serif;">
|
|
226
|
+
<div class="biq-wrapper" style="
|
|
227
|
+
font-family: 'Open Sans', sans-serif;
|
|
228
|
+
page-break-inside: avoid;
|
|
229
|
+
border-radius: 4px;
|
|
230
|
+
overflow: hidden;
|
|
231
|
+
border: 1px solid ${c.rowBorder};
|
|
232
|
+
">
|
|
233
|
+
<!-- title bar -->
|
|
234
|
+
<div style="
|
|
235
|
+
background: ${c.headerBg};
|
|
236
|
+
border-radius: 4px 4px 0 0;
|
|
237
|
+
color: #ffffff;
|
|
238
|
+
padding: 9px 14px;
|
|
239
|
+
font-size: 11px;
|
|
240
|
+
font-weight: 700;
|
|
241
|
+
letter-spacing: 0.3px;
|
|
242
|
+
">${title}</div>
|
|
243
|
+
|
|
244
|
+
${infoBar}
|
|
245
|
+
${subheaderBand}
|
|
246
|
+
|
|
247
|
+
<table style="width:100%;border-collapse:collapse;table-layout:fixed;">
|
|
248
|
+
<thead>${tableHeader}</thead>
|
|
249
|
+
<tbody>${dataRows}</tbody>
|
|
250
|
+
</table>
|
|
251
|
+
</div>
|
|
252
|
+
</div>`;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// ---------------------------------------------------------------------------
|
|
256
|
+
// Public entry
|
|
257
|
+
// ---------------------------------------------------------------------------
|
|
258
|
+
/**
|
|
259
|
+
* Render the Big Integral Questionnaire section for Maison Sante doctor PDFs.
|
|
260
|
+
*
|
|
261
|
+
* @param {object} opts
|
|
262
|
+
* @param {object} opts.clientConfig - The full maisonsante.json config object
|
|
263
|
+
* @param {object} opts.localeService - localeService with .t(key) method (unused for now; strings are hardcoded to match the reference design)
|
|
264
|
+
* @returns {string} HTML string to inject into #big-integral-section
|
|
265
|
+
*/
|
|
266
|
+
function renderBigIntegralQuestionnaire({ clientConfig }) {
|
|
267
|
+
const cfg = (clientConfig && clientConfig.big_integral_questionnaire) || {};
|
|
268
|
+
|
|
269
|
+
const colors = Object.assign(
|
|
270
|
+
{
|
|
271
|
+
headerBg: "#0F2062",
|
|
272
|
+
subheaderBg: "#1B4080",
|
|
273
|
+
headerText: "#FFFFFF",
|
|
274
|
+
rowBorder: "rgba(15, 32, 98, 0.12)",
|
|
275
|
+
elevatedText: "#A43B2F",
|
|
276
|
+
},
|
|
277
|
+
cfg.colors || {},
|
|
278
|
+
);
|
|
279
|
+
|
|
280
|
+
const resolvedCfg = Object.assign({}, cfg, { colors });
|
|
281
|
+
|
|
282
|
+
const { rows: allRows, meta } = getDummyData();
|
|
283
|
+
|
|
284
|
+
const rows = allRows.filter((row) => {
|
|
285
|
+
if (
|
|
286
|
+
row.system === "Hormonal Health Female" &&
|
|
287
|
+
cfg.showHormonalFemale === false
|
|
288
|
+
)
|
|
289
|
+
return false;
|
|
290
|
+
if (row.system === "Hormonal Health Male" && cfg.showHormonalMale === false)
|
|
291
|
+
return false;
|
|
292
|
+
return true;
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
return renderTable(rows, meta, resolvedCfg);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
module.exports = { renderBigIntegralQuestionnaire };
|
package/lib/template.js
CHANGED
|
@@ -3,6 +3,9 @@ const i18n = require('../app/i18n_wellbeing.config.js');
|
|
|
3
3
|
fetchFileContents
|
|
4
4
|
const fs = require("fs");
|
|
5
5
|
const path = require('path');
|
|
6
|
+
|
|
7
|
+
let useMonospace = false;
|
|
8
|
+
function setUseMonospace(val) { useMonospace = val; }
|
|
6
9
|
const INDENTATION = {
|
|
7
10
|
PANEL_TITLE: 12,
|
|
8
11
|
BIOMARKER_DETAILS: 12,
|
|
@@ -1165,7 +1168,12 @@ function renderBiomarkerV3(biomarker, nestingLevel, isChildBiomarker, isCompactV
|
|
|
1165
1168
|
}
|
|
1166
1169
|
let notesPadding = isRtl ? 'padding: 0px 16px 10px 0px;' : 'padding: 0px 0px 10px 16px;';
|
|
1167
1170
|
let classNote = !isCompactView ? 'note-margin-bottom' : '';
|
|
1168
|
-
|
|
1171
|
+
if (useMonospace) {
|
|
1172
|
+
const monoStyle = `font-style: normal; font-size: 13px; color: #333; font-family: 'Roboto Mono', monospace; white-space: pre-wrap; overflow-x: auto;`;
|
|
1173
|
+
newBiomarkerHtml += `<div class="biomarker-notes 2 ${classNote}" style="${notesPadding} ${BioNoteStyle}"><span style="${monoStyle}">${biomarker.notes.join('<br/>')}</span></div>`;
|
|
1174
|
+
} else {
|
|
1175
|
+
newBiomarkerHtml += `<div class="biomarker-notes 2 ${classNote}" style="color: #8F8F92; ${notesPadding} ${BioNoteStyle}">${biomarker.notes.join('<br/>')}</div>`;
|
|
1176
|
+
}
|
|
1169
1177
|
}
|
|
1170
1178
|
}
|
|
1171
1179
|
|
|
@@ -1323,6 +1331,10 @@ function renderDetailsListV3(detailsList, nestingLevel, isCompactView) {
|
|
|
1323
1331
|
}
|
|
1324
1332
|
|
|
1325
1333
|
function renderNoteV3(note, nestingLevel, isCompactView, showInCompactView, showInDetailsView) {
|
|
1334
|
+
if (!note) return '';
|
|
1335
|
+
if (isCompactView && !showInCompactView) return '';
|
|
1336
|
+
if (!isCompactView && !showInDetailsView) return '';
|
|
1337
|
+
|
|
1326
1338
|
let blockStyle = '';
|
|
1327
1339
|
let plusPadding = 18;
|
|
1328
1340
|
if (nestingLevel > 0) {
|
|
@@ -1331,10 +1343,11 @@ function renderNoteV3(note, nestingLevel, isCompactView, showInCompactView, show
|
|
|
1331
1343
|
let levelNesting = extraPadding + nestingLevel * INDENTATION.BIOMARKER_DETAILS + plusPadding;
|
|
1332
1344
|
blockStyle = `padding-left: ${levelNesting}px`;
|
|
1333
1345
|
}
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1346
|
+
if (useMonospace) {
|
|
1347
|
+
const monoStyle = `padding: 2px 0; clear: both; margin-bottom: 3px; font-style: normal; display: block; font-size: 13px; color: #333; font-family: 'Roboto Mono', monospace; white-space: pre-wrap; overflow-x: auto;`;
|
|
1348
|
+
return `<div style="padding: 2px ${plusPadding}px; ${blockStyle}" class="note-block"><span style="${monoStyle}">${note}</span></div>`;
|
|
1349
|
+
}
|
|
1350
|
+
return `<div style="padding: 2px ${plusPadding}px; ${blockStyle}" class="note-block">${note}</div>`;
|
|
1338
1351
|
}
|
|
1339
1352
|
|
|
1340
1353
|
function renderAllergyClasses(allergyClasses, isRtl = false) {
|
|
@@ -1585,9 +1598,16 @@ function renderOneAllergyBiomarker(biomarker, isRtl, nestingLevel, isChildBiomar
|
|
|
1585
1598
|
}
|
|
1586
1599
|
bioIndentStyle = isRtl ? 'padding-right: 16px;' : 'padding-left: 16px;';
|
|
1587
1600
|
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1601
|
+
if (useMonospace) {
|
|
1602
|
+
const monoStyle = `font-style: normal; font-size: 13px; color: #333; font-family: 'Roboto Mono', monospace; white-space: pre-wrap; overflow-x: auto;`;
|
|
1603
|
+
biomarkerDetailsHtml += '<div class="biomarker-notes 1" style="padding-top: 10px;' + bioIndentStyle + '">';
|
|
1604
|
+
biomarkerDetailsHtml += `<span style="${monoStyle}">` + biomarker.notes.join('<br/>') + '</span>';
|
|
1605
|
+
biomarkerDetailsHtml += '</div>';
|
|
1606
|
+
} else {
|
|
1607
|
+
biomarkerDetailsHtml += '<div class="biomarker-notes 1" style="color: #8F8F92;padding-top: 10px;' + bioIndentStyle + '">';
|
|
1608
|
+
biomarkerDetailsHtml += biomarker.notes.join('<br/>');
|
|
1609
|
+
biomarkerDetailsHtml += '</div>';
|
|
1610
|
+
}
|
|
1591
1611
|
}
|
|
1592
1612
|
biomarkerDetailsHtml += '</div> <!-- end first col -->';
|
|
1593
1613
|
|
|
@@ -2196,8 +2216,9 @@ module.exports = {
|
|
|
2196
2216
|
find,
|
|
2197
2217
|
renderSummary,
|
|
2198
2218
|
renderReportSummary,
|
|
2199
|
-
renderHTMLTemplate
|
|
2200
|
-
|
|
2219
|
+
renderHTMLTemplate,
|
|
2220
|
+
renderAllergyClasses,
|
|
2221
|
+
setUseMonospace,
|
|
2201
2222
|
}
|
|
2202
2223
|
|
|
2203
2224
|
|
|
@@ -7,7 +7,7 @@ const path = require("path");
|
|
|
7
7
|
const LocaleService = require('../app/services/localeService.js');
|
|
8
8
|
const i18n = require('../app/i18n_wellbeing.config.js');
|
|
9
9
|
const puppeteer = require("puppeteer");
|
|
10
|
-
const { renderReportItems, find, renderSummary, renderReportSummary, renderHTMLTemplate, renderAllergyClasses } = require("./template.js");
|
|
10
|
+
const { renderReportItems, find, renderSummary, renderReportSummary, renderHTMLTemplate, renderAllergyClasses, setUseMonospace } = require("./template.js");
|
|
11
11
|
const { cli } = require("webpack");
|
|
12
12
|
|
|
13
13
|
|
|
@@ -90,6 +90,16 @@ const loadColorTheme = (clientName = 'default') => {
|
|
|
90
90
|
insightSecondary: '#1C2833',
|
|
91
91
|
warningIcon: '#F4D03F'
|
|
92
92
|
},
|
|
93
|
+
maisonsante: {
|
|
94
|
+
headerText: '#2C3E50',
|
|
95
|
+
headerBackground: '#ECF0F1',
|
|
96
|
+
headerDivider: '#0F2062',
|
|
97
|
+
footerText: '#95A5A6',
|
|
98
|
+
listIcon: '#7F8C8D',
|
|
99
|
+
insightPrimary: '#0F2062',
|
|
100
|
+
insightSecondary: '#2C3E50',
|
|
101
|
+
warningIcon: '#F39C12'
|
|
102
|
+
},
|
|
93
103
|
|
|
94
104
|
};
|
|
95
105
|
return themes[clientName?.toLowerCase()] || themes.mediclinic;
|
|
@@ -765,6 +775,7 @@ const generateExtendedReportStyles = (iconColor) => {
|
|
|
765
775
|
const styles = {
|
|
766
776
|
'.tips-text': `color: ${config.insights_font_color} !important;`,
|
|
767
777
|
'.first-level-font-color': `color: ${config.general_font_color} !important;`,
|
|
778
|
+
'h5.recommended-tips-title': `color: ${config.colors.insightPrimary} !important;`,
|
|
768
779
|
'.first-section-scores': `border-color: ${config.section_title_border_color} !important;`,
|
|
769
780
|
'.physical-score-section': `border-color: ${config.section_title_border_color} !important;`,
|
|
770
781
|
'.psychological-score-section, .psychological-score-section1, .psychological-score-section2': `border-color: ${config.body_font_color} !important;`,
|
|
@@ -1326,12 +1337,29 @@ let generateHTMLWellbeingReportWithSmartReport = async (data, isDebugging, clien
|
|
|
1326
1337
|
$('.doctor-details').html(doctorDetailsHtml);
|
|
1327
1338
|
}
|
|
1328
1339
|
|
|
1340
|
+
// Render Big Integral Questionnaire section (Maison Sante doctor PDF only)
|
|
1341
|
+
if (client.toLowerCase() === 'maisonsante' && data.IsDoctor) {
|
|
1342
|
+
const { renderBigIntegralQuestionnaire } = require('./big_integral_questionnaire');
|
|
1343
|
+
const rawClientConfig = (() => {
|
|
1344
|
+
try {
|
|
1345
|
+
const cfgPath = path.resolve(__dirname + '/../config/maisonsante.json');
|
|
1346
|
+
return JSON.parse(require('fs').readFileSync(cfgPath, 'utf8'));
|
|
1347
|
+
} catch (e) { return {}; }
|
|
1348
|
+
})();
|
|
1349
|
+
const integralHtml = renderBigIntegralQuestionnaire({
|
|
1350
|
+
clientConfig: rawClientConfig,
|
|
1351
|
+
});
|
|
1352
|
+
$('#big-integral-section').html(integralHtml);
|
|
1353
|
+
}
|
|
1354
|
+
|
|
1329
1355
|
// Update report info
|
|
1330
1356
|
$('.report-info').html(headerInfoHtml);
|
|
1331
1357
|
|
|
1332
1358
|
// Add smart report if available
|
|
1333
1359
|
if (!empty(smartReport)) {
|
|
1360
|
+
setUseMonospace(client.toLowerCase() === 'pha');
|
|
1334
1361
|
let smartReportHtml = generateReportHtml(smartReport, isRtl, false, false, language).html;
|
|
1362
|
+
setUseMonospace(false);
|
|
1335
1363
|
|
|
1336
1364
|
if (shouldHideWellbeingUI) {
|
|
1337
1365
|
// Parse and clean smart report HTML to remove page breaks when wellbeing is missing
|
|
@@ -1722,6 +1750,10 @@ const getPdfFooterTemplate = (client = 'mediclinic', selectedLabs = [], footerFr
|
|
|
1722
1750
|
<div style="font-family: 'Open Sans', sans-serif; font-feature-settings: 'tnum';">Tel: (877) 345-7775</div>
|
|
1723
1751
|
<div style="font-family: 'Open Sans', sans-serif;">Email: processing@wellness-partners.org</div>`;
|
|
1724
1752
|
}
|
|
1753
|
+
} else if (clientKey === 'maisonsante') {
|
|
1754
|
+
contactBlock = `
|
|
1755
|
+
<div style="font-family: 'Open Sans', sans-serif;">Address: Meyan Mall, Umm Suqeim 2, Dubai, United Arab Emirates</div>
|
|
1756
|
+
<div style="font-family: 'Open Sans', sans-serif;">Email: info@maisonsante.ae</div>`;
|
|
1725
1757
|
} else {
|
|
1726
1758
|
contactBlock = `
|
|
1727
1759
|
<div style="font-family: 'Open Sans', sans-serif;"> </div>`;
|
|
@@ -1967,7 +1999,7 @@ const renderInsightTips = (tips, clientName) => {
|
|
|
1967
1999
|
return '';
|
|
1968
2000
|
}
|
|
1969
2001
|
|
|
1970
|
-
const partImages = clientName.toLowerCase() === 'pha' ? {
|
|
2002
|
+
const partImages = (clientName.toLowerCase() === 'pha' || clientName.toLowerCase() === 'maisonsante') ? {
|
|
1971
2003
|
1: config.lifestyleImage,
|
|
1972
2004
|
2: config.bodyImage,
|
|
1973
2005
|
3: config.mindImage
|
|
@@ -1977,7 +2009,7 @@ const renderInsightTips = (tips, clientName) => {
|
|
|
1977
2009
|
3: config.bodyImage
|
|
1978
2010
|
};
|
|
1979
2011
|
|
|
1980
|
-
const partTitles = clientName.toLowerCase() === 'pha' ? {
|
|
2012
|
+
const partTitles = (clientName.toLowerCase() === 'pha' || clientName.toLowerCase() === 'maisonsante') ? {
|
|
1981
2013
|
1: localeService.t('lifeStyle'),
|
|
1982
2014
|
2: localeService.t('body'),
|
|
1983
2015
|
3: localeService.t('mind')
|
|
@@ -1987,7 +2019,7 @@ const renderInsightTips = (tips, clientName) => {
|
|
|
1987
2019
|
3: localeService.t('body')
|
|
1988
2020
|
};
|
|
1989
2021
|
|
|
1990
|
-
if (clientName === 'Mediclinic' || clientName.toLowerCase() === 'pha') {
|
|
2022
|
+
if (clientName === 'Mediclinic' || clientName.toLowerCase() === 'pha' || clientName.toLowerCase() === 'maisonsante') {
|
|
1991
2023
|
const tip = tips[0];
|
|
1992
2024
|
const tipImage = partImages[tip.partId] || '';
|
|
1993
2025
|
const translatedTitle = partTitles[tip.partId] || '';
|
package/locales/en.json
CHANGED
|
@@ -162,5 +162,69 @@
|
|
|
162
162
|
"signedBy": {
|
|
163
163
|
"message": "Signed by",
|
|
164
164
|
"description": "Label showing above the doctors who signed on this report"
|
|
165
|
+
},
|
|
166
|
+
"bigIntegralTitle": {
|
|
167
|
+
"message": "Key to the Big Integral Questionnaire",
|
|
168
|
+
"description": "Title of the Big Integral Questionnaire section in the Maison Sante doctor PDF"
|
|
169
|
+
},
|
|
170
|
+
"bigIntegralSystem": {
|
|
171
|
+
"message": "System",
|
|
172
|
+
"description": "Column header: body system name"
|
|
173
|
+
},
|
|
174
|
+
"bigIntegralHigh": {
|
|
175
|
+
"message": "High",
|
|
176
|
+
"description": "Column header: threshold above which result is considered elevated"
|
|
177
|
+
},
|
|
178
|
+
"bigIntegralQuestions": {
|
|
179
|
+
"message": "Questions",
|
|
180
|
+
"description": "Column header: number of questions for this system"
|
|
181
|
+
},
|
|
182
|
+
"bigIntegralResult": {
|
|
183
|
+
"message": "Result",
|
|
184
|
+
"description": "Column header: patient's result score"
|
|
185
|
+
},
|
|
186
|
+
"bigIntegralComments": {
|
|
187
|
+
"message": "Comments",
|
|
188
|
+
"description": "Column header: free-text comments area"
|
|
189
|
+
},
|
|
190
|
+
"bigIntegralMaximum": {
|
|
191
|
+
"message": "Maximum",
|
|
192
|
+
"description": "Column header: maximum possible score for this system"
|
|
193
|
+
},
|
|
194
|
+
"bigIntegralPerThree": {
|
|
195
|
+
"message": "/3",
|
|
196
|
+
"description": "Column header: score divided by 3"
|
|
197
|
+
},
|
|
198
|
+
"bigIntegralDateOfCompletion": {
|
|
199
|
+
"message": "Date of completion",
|
|
200
|
+
"description": "Footer meta label"
|
|
201
|
+
},
|
|
202
|
+
"bigIntegralPatientName": {
|
|
203
|
+
"message": "Client / Patient Full Name",
|
|
204
|
+
"description": "Footer meta label"
|
|
205
|
+
},
|
|
206
|
+
"bigIntegralAge": {
|
|
207
|
+
"message": "Age",
|
|
208
|
+
"description": "Footer meta label"
|
|
209
|
+
},
|
|
210
|
+
"bigIntegralBmi": {
|
|
211
|
+
"message": "BMI",
|
|
212
|
+
"description": "Footer meta label"
|
|
213
|
+
},
|
|
214
|
+
"bigIntegralElevated": {
|
|
215
|
+
"message": "ELEVATED",
|
|
216
|
+
"description": "Badge text shown when a system result exceeds its threshold"
|
|
217
|
+
},
|
|
218
|
+
"bigIntegralVariantClinical": {
|
|
219
|
+
"message": "Clinical View",
|
|
220
|
+
"description": "Variant label shown in the section header for the clinical table design"
|
|
221
|
+
},
|
|
222
|
+
"bigIntegralVariantScorecard": {
|
|
223
|
+
"message": "Scorecard View",
|
|
224
|
+
"description": "Variant label shown in the section header for the scorecard bar design"
|
|
225
|
+
},
|
|
226
|
+
"bigIntegralVariantHybrid": {
|
|
227
|
+
"message": "Hybrid View",
|
|
228
|
+
"description": "Variant label shown in the section header for the hybrid (table + bar) design"
|
|
165
229
|
}
|
|
166
230
|
}
|