@kenyaemr/esm-care-panel-app 4.1.1-pre.72

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.
Files changed (53) hide show
  1. package/.turbo/turbo-build.log +42 -0
  2. package/LICENSE.md +401 -0
  3. package/README.md +5 -0
  4. package/dist/150.js +1 -0
  5. package/dist/150.js.map +1 -0
  6. package/dist/24.js +2 -0
  7. package/dist/24.js.LICENSE.txt +19 -0
  8. package/dist/24.js.map +1 -0
  9. package/dist/561.js +1 -0
  10. package/dist/561.js.map +1 -0
  11. package/dist/574.js +1 -0
  12. package/dist/690.js +1 -0
  13. package/dist/690.js.map +1 -0
  14. package/dist/709.js +1 -0
  15. package/dist/709.js.map +1 -0
  16. package/dist/784.js +2 -0
  17. package/dist/784.js.LICENSE.txt +9 -0
  18. package/dist/784.js.map +1 -0
  19. package/dist/832.js +1 -0
  20. package/dist/832.js.map +1 -0
  21. package/dist/858.js +2 -0
  22. package/dist/858.js.LICENSE.txt +3 -0
  23. package/dist/858.js.map +1 -0
  24. package/dist/958.js +2 -0
  25. package/dist/958.js.LICENSE.txt +15 -0
  26. package/dist/958.js.map +1 -0
  27. package/dist/kenyaemr-esm-care-panel-app.js +1 -0
  28. package/dist/kenyaemr-esm-care-panel-app.js.buildmanifest.json +354 -0
  29. package/dist/kenyaemr-esm-care-panel-app.js.map +1 -0
  30. package/dist/kenyaemr-esm-care-panel-app.old +1 -0
  31. package/dist/main.js +1 -0
  32. package/dist/main.js.map +1 -0
  33. package/package.json +50 -0
  34. package/src/care-panel/care-panel.component.tsx +67 -0
  35. package/src/care-panel/care-panel.scss +50 -0
  36. package/src/config-schema.ts +1 -0
  37. package/src/declarations.d.tsx +2 -0
  38. package/src/hooks/useEnrollmentHistory.ts +34 -0
  39. package/src/hooks/usePatientSummary.ts +14 -0
  40. package/src/hooks/useProgramSummary.ts +14 -0
  41. package/src/index.ts +43 -0
  42. package/src/patient-summary/patient-summary.component.tsx +575 -0
  43. package/src/patient-summary/patient-summary.scss +83 -0
  44. package/src/print-layout/print.component.tsx +16 -0
  45. package/src/print-layout/print.scss +10 -0
  46. package/src/program-enrollment/program-enrollment.component.tsx +243 -0
  47. package/src/program-enrollment/program-enrollment.scss +75 -0
  48. package/src/program-summary/program-summary.component.tsx +233 -0
  49. package/src/program-summary/program-summary.scss +70 -0
  50. package/src/types/index.ts +156 -0
  51. package/translations/en.json +1 -0
  52. package/tsconfig.json +5 -0
  53. package/webpack.config.js +1 -0
@@ -0,0 +1,14 @@
1
+ import { openmrsFetch } from '@openmrs/esm-framework';
2
+ import useSWR from 'swr';
3
+ import { PatientSummary } from '../types/index';
4
+
5
+ export const usePatientSummary = (patientUuid: string) => {
6
+ const programSummaryUrl = `/ws/rest/v1/kenyaemr/patientSummary?patientUuid=${patientUuid}`;
7
+ const { data, mutate, error, isLoading } = useSWR<{ data: PatientSummary }>(programSummaryUrl, openmrsFetch);
8
+
9
+ return {
10
+ data: data?.data ? data?.data : null,
11
+ isError: error,
12
+ isLoading: isLoading,
13
+ };
14
+ };
@@ -0,0 +1,14 @@
1
+ import { openmrsFetch } from '@openmrs/esm-framework';
2
+ import useSWR from 'swr';
3
+ import { ProgramSummary } from '../types/index';
4
+
5
+ export const useProgramSummary = (patientUuid: string) => {
6
+ const programSummaryUrl = `/ws/rest/v1/kenyaemr/currentProgramDetails?patientUuid=${patientUuid}`;
7
+ const { data, mutate, error, isLoading } = useSWR<{ data: ProgramSummary }>(programSummaryUrl, openmrsFetch);
8
+
9
+ return {
10
+ data: data?.data ? data?.data : null,
11
+ isError: error,
12
+ isLoading: isLoading,
13
+ };
14
+ };
package/src/index.ts ADDED
@@ -0,0 +1,43 @@
1
+ import { getAsyncLifecycle, defineConfigSchema } from '@openmrs/esm-framework';
2
+ import { configSchema } from './config-schema';
3
+
4
+ const importTranslation = require.context('../translations', false, /.json$/, 'lazy');
5
+
6
+ const backendDependencies = {
7
+ kenyaemr: '^18.2.0',
8
+ };
9
+
10
+ function setupOpenMRS() {
11
+ const moduleName = '@kenyaemr/esm-care-panel-app';
12
+
13
+ const options = {
14
+ featureName: 'patient-care-panels',
15
+ moduleName,
16
+ };
17
+
18
+ defineConfigSchema(moduleName, configSchema);
19
+
20
+ return {
21
+ pages: [],
22
+ extensions: [
23
+ {
24
+ name: 'patient-program-summary',
25
+ slot: 'top-of-all-patient-dashboards-slot',
26
+ order: 1,
27
+ load: getAsyncLifecycle(() => import('./care-panel/care-panel.component'), options),
28
+ online: true,
29
+ offline: false,
30
+ },
31
+ {
32
+ name: 'patient-summary',
33
+ slot: 'top-of-all-patient-dashboards-slot',
34
+ order: 2,
35
+ load: getAsyncLifecycle(() => import('./patient-summary/patient-summary.component'), options),
36
+ online: true,
37
+ offline: false,
38
+ },
39
+ ],
40
+ };
41
+ }
42
+
43
+ export { backendDependencies, importTranslation, setupOpenMRS };
@@ -0,0 +1,575 @@
1
+ import React, { useEffect, useRef, useState } from 'react';
2
+ import styles from './patient-summary.scss';
3
+ import { useTranslation } from 'react-i18next';
4
+ import { useLayoutType, useSession } from '@openmrs/esm-framework';
5
+ import { StructuredListSkeleton, Button } from '@carbon/react';
6
+ import { usePatientSummary } from '../hooks/usePatientSummary';
7
+ import { Printer } from '@carbon/react/icons';
8
+ import { useReactToPrint } from 'react-to-print';
9
+ import PrintComponent from '../print-layout/print.component';
10
+
11
+ interface PatientSummaryProps {
12
+ patientUuid: string;
13
+ }
14
+
15
+ const PatientSummary: React.FC<PatientSummaryProps> = ({ patientUuid }) => {
16
+ const { data, isError, isLoading } = usePatientSummary(patientUuid);
17
+ const currentUserSession = useSession();
18
+ const componentRef = useRef(null);
19
+ const [printMode, setPrintMode] = useState(false);
20
+
21
+ const { t } = useTranslation();
22
+ const isTablet = useLayoutType() == 'tablet';
23
+
24
+ const printRef = useReactToPrint({
25
+ content: () => componentRef.current,
26
+ onBeforeGetContent: () => setPrintMode(true),
27
+ onAfterPrint: () => setPrintMode(false),
28
+ pageStyle: styles.pageStyle,
29
+ documentTitle: data?.patientName,
30
+ });
31
+
32
+ const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
33
+ const handlePrint = async () => {
34
+ await delay(500);
35
+ printRef();
36
+ };
37
+
38
+ if (isLoading) {
39
+ return <StructuredListSkeleton role="progressbar" />;
40
+ }
41
+
42
+ if (isError) {
43
+ return <span>{t('errorPatientSummary', 'Error loading patient summary')}</span>;
44
+ }
45
+
46
+ if (Object.keys(data)?.length === 0) {
47
+ return;
48
+ }
49
+
50
+ if (Object.keys(data).length > 0) {
51
+ return (
52
+ <div className={styles.bodyContainer} ref={componentRef}>
53
+ {printMode === true && <PrintComponent />}
54
+ <div className={styles.card}>
55
+ <div className={isTablet ? styles.tabletHeading : styles.desktopHeading}>
56
+ <h4 className={styles.title}> {t('patientSummary', 'Patient summary')}</h4>
57
+ {printMode === false && (
58
+ <Button
59
+ size="sm"
60
+ className={styles.btnShow}
61
+ onClick={() => {
62
+ handlePrint(), setPrintMode(true);
63
+ }}
64
+ kind="tertiary"
65
+ renderIcon={(props) => <Printer size={16} {...props} />}
66
+ iconDescription={t('print', 'Print')}>
67
+ {t('print', 'Print')}
68
+ </Button>
69
+ )}
70
+ </div>
71
+ <div className={styles.container}>
72
+ <div className={styles.content}>
73
+ <p className={styles.label}>{t('reportDate', 'Report date')}</p>
74
+ <p>
75
+ <span className={styles.value}>{data?.reportDate}</span>
76
+ </p>
77
+ </div>
78
+ <div className={styles.content}>
79
+ <p className={styles.label}>{t('clinicName', 'Clinic name')}</p>
80
+ <p>
81
+ <span className={styles.value}>{data?.clinicName}</span>
82
+ </p>
83
+ </div>
84
+ <div className={styles.content}>
85
+ <p className={styles.label}>{t('mflCode', 'MFL code')}</p>
86
+ <p>
87
+ <span className={styles.value}>{data?.mflCode}</span>
88
+ </p>
89
+ </div>
90
+ </div>
91
+
92
+ <div className={styles.container}>
93
+ <div className={styles.content}>
94
+ <p className={styles.label}>{t('uniquePatientIdentifier', 'Unique patient identifier')}</p>
95
+ <p>
96
+ <span className={styles.value}>{data?.uniquePatientIdentifier}</span>
97
+ </p>
98
+ </div>
99
+ <div className={styles.content}>
100
+ <p className={styles.label}>
101
+ {t('nationalUniquePatientIdentifier', 'National unique patient identifier')}
102
+ </p>
103
+ <p>
104
+ <span className={styles.value}>{data?.nationalUniquePatientIdentifier}</span>
105
+ </p>
106
+ </div>
107
+ <div className={styles.content}>
108
+ <p className={styles.label}>{t('patientName', 'Patient name')}</p>
109
+ <p>
110
+ <span className={styles.value}>{data?.patientName}</span>
111
+ </p>
112
+ </div>
113
+ </div>
114
+
115
+ <div className={styles.container}>
116
+ <div className={styles.content}>
117
+ <p className={styles.label}>{t('birthDate', 'Birth date')}</p>
118
+ <p>
119
+ <span className={styles.value}>{data?.birthDate}</span>
120
+ </p>
121
+ </div>
122
+ <div className={styles.content}>
123
+ <p className={styles.label}>{t('age', 'Age')}</p>
124
+ <p>
125
+ <span className={styles.value}>{data?.age}</span>
126
+ </p>
127
+ </div>
128
+ <div className={styles.content}>
129
+ <p className={styles.label}>{t('gender', 'Gender')}</p>
130
+ <p>
131
+ <span className={styles.value}>
132
+ {data?.gender === 'F' ? 'Female' : data?.gender === 'M' ? 'Male' : 'Unknown'}
133
+ </span>
134
+ </p>
135
+ </div>
136
+ </div>
137
+
138
+ <div className={styles.container}>
139
+ <div className={styles.content}>
140
+ <p className={styles.label}>{t('maritalStatus', 'Marital status')}</p>
141
+ <p>
142
+ <span className={styles.value}>{data?.maritalStatus}</span>
143
+ </p>
144
+ </div>
145
+ </div>
146
+
147
+ <hr />
148
+
149
+ <div className={styles.container}>
150
+ <div className={styles.content}>
151
+ <p className={styles.label}>{t('dateConfirmedPositive', 'Date confirmed HIV positive')}</p>
152
+ <p>
153
+ <span className={styles.value}>{data?.dateConfirmedHIVPositive}</span>
154
+ </p>
155
+ </div>
156
+ <div className={styles.content}>
157
+ <p className={styles.label}>{t('firstCD4', 'First CD4')}</p>
158
+ <p>
159
+ <span className={styles.value}>{data?.firstCd4 ? data?.firstCd4 : '--'}</span>
160
+ </p>
161
+ </div>
162
+ <div className={styles.content}>
163
+ <p className={styles.label}>{t('dateFirstCD4', 'Date first CD4')}</p>
164
+ <p>
165
+ <span className={styles.value}>{data?.firstCd4Date}</span>
166
+ </p>
167
+ </div>
168
+ </div>
169
+
170
+ <div className={styles.container}>
171
+ <div className={styles.content}>
172
+ <p className={styles.label}>{t('dateEnrolledToCare', 'Date enrolled into care')}</p>
173
+ <p>
174
+ <span className={styles.value}>{data?.dateEnrolledIntoCare}</span>
175
+ </p>
176
+ </div>
177
+ <div className={styles.content}>
178
+ <p className={styles.label}>{t('whoAtEnrollment', 'WHO stage at enrollment')}</p>
179
+ <p>
180
+ <span className={styles.value}>{data?.whoStagingAtEnrollment}</span>
181
+ </p>
182
+ </div>
183
+ <div className={styles.content}>
184
+ <p className={styles.label}>{t('transferInDate', 'Transfer in date')}</p>
185
+ <p>
186
+ <span className={styles.value}>{data?.transferInDate ? data?.transferInDate : '--'}</span>
187
+ </p>
188
+ </div>
189
+ </div>
190
+
191
+ <div className={styles.container}>
192
+ <div className={styles.content}>
193
+ <p className={styles.label}>{t('entryPoint', 'Entry point')}</p>
194
+ <p>
195
+ <span className={styles.value}>{data?.patientEntryPoint}</span>
196
+ </p>
197
+ </div>
198
+ <div className={styles.content}>
199
+ <p className={styles.label}>{t('dateOfEntryPoint', 'Date of entry point')}</p>
200
+ <p>
201
+ <span className={styles.value}>{data?.patientEntryPointDate}</span>
202
+ </p>
203
+ </div>
204
+ <div className={styles.content}>
205
+ <p className={styles.label}>{t('facilityTransferredFrom', 'Facility transferred from')}</p>
206
+ <p>
207
+ <span className={styles.value}>{data?.transferInFacility}</span>
208
+ </p>
209
+ </div>
210
+ </div>
211
+
212
+ <hr />
213
+
214
+ <div className={styles.container}>
215
+ <div className={styles.content}>
216
+ <p className={styles.label}>{t('weight', 'Weight')}</p>
217
+ <p>
218
+ <span className={styles.value}>{data?.weight}</span>
219
+ </p>
220
+ </div>
221
+ <div className={styles.content}>
222
+ <p className={styles.label}>{t('height', 'Height')}</p>
223
+ <p>
224
+ <span className={styles.value}>{data?.height}</span>
225
+ </p>
226
+ </div>
227
+ <div className={styles.content}>
228
+ <p className={styles.label}>{t('bmi', 'BMI')}</p>
229
+ <p>
230
+ <span className={styles.value}>{data?.bmi}</span>
231
+ </p>
232
+ </div>
233
+ </div>
234
+
235
+ <div className={styles.container}>
236
+ <div className={styles.content}>
237
+ <p className={styles.label}>{t('bloodPressure', 'Blood pressure')}</p>
238
+ <p>
239
+ <span className={styles.value}>{data?.bloodPressure}</span>
240
+ </p>
241
+ </div>
242
+ <div className={styles.content}>
243
+ <p className={styles.label}>{t('oxygenSaturation', 'Oxygen saturation')}</p>
244
+ <p>
245
+ <span className={styles.value}>{data?.oxygenSaturation}</span>
246
+ </p>
247
+ </div>
248
+ <div className={styles.content}>
249
+ <p className={styles.label}>{t('respiratoryRate', 'Respiratory rate')}</p>
250
+ <p>
251
+ <span className={styles.value}>{data?.respiratoryRate}</span>
252
+ </p>
253
+ </div>
254
+ </div>
255
+
256
+ <div className={styles.container}>
257
+ <div className={styles.content}>
258
+ <p className={styles.label}>{t('pulseRate', 'Pulse rate')}</p>
259
+ <p>
260
+ <span className={styles.value}>{data?.pulseRate}</span>
261
+ </p>
262
+ </div>
263
+ <div className={styles.content}>
264
+ <p className={styles.label}>{t('familyProtection', 'FP method')}</p>
265
+ <p>
266
+ <span className={styles.value}>{data?.familyProtection ? data?.familyProtection : '--'}</span>
267
+ </p>
268
+ </div>
269
+ <div className={styles.content}>
270
+ <p className={styles.label}>{t('tbScreeningOutcome', 'TB screening outcome')}</p>
271
+ <p>
272
+ <span className={styles.value}>{data?.tbScreeningOutcome}</span>
273
+ </p>
274
+ </div>
275
+ </div>
276
+
277
+ <div className={styles.container}>
278
+ <div className={styles.content}>
279
+ <p className={styles.label}>{t('chronicDisease', 'Chronic disease')}</p>
280
+ <p>
281
+ <span className={styles.value}>{data?.chronicDisease}</span>
282
+ </p>
283
+ </div>
284
+ <div className={styles.content}>
285
+ <p className={styles.label}>{t('ioHistory', ' OI history')}</p>
286
+ <p>
287
+ <span className={styles.value}>{data?.iosResults ? data?.iosResults : '--'}</span>
288
+ </p>
289
+ </div>
290
+ <div className={styles.content}>
291
+ <p className={styles.label}>{t('stiScreeningOutcome', 'Sti screening')}</p>
292
+ <p>
293
+ <span className={styles.value}>{data?.stiScreeningOutcome ? data?.stiScreeningOutcome : '--'}</span>
294
+ </p>
295
+ </div>
296
+ </div>
297
+
298
+ <div className={styles.container}>
299
+ {data?.gender === 'F' && (
300
+ <div className={styles.content}>
301
+ <p className={styles.label}>{t('caxcScreeningOutcome', 'Caxc screening')}</p>
302
+ <p>
303
+ <span className={styles.value}>{data?.caxcScreeningOutcome}</span>
304
+ </p>
305
+ </div>
306
+ )}
307
+
308
+ <div className={styles.content}>
309
+ <p className={styles.label}>{t('dateEnrolledInTb', 'TPT start date')}</p>
310
+ <p>
311
+ <span className={styles.value}>{data?.dateEnrolledInTb}</span>
312
+ </p>
313
+ </div>
314
+ <div className={styles.content}>
315
+ <p className={styles.label}>{t('dateCompletedInTb', 'TPT completion date')}</p>
316
+ <p>
317
+ <span className={styles.value}>{data?.dateCompletedInTb}</span>
318
+ </p>
319
+ </div>
320
+ {data?.gender === 'F' && (
321
+ <div className={styles.content}>
322
+ <p className={styles.label}>{t('lmp', 'LMP')}</p>
323
+ <p>
324
+ <span className={styles.value}>{data?.lmp}</span>
325
+ </p>
326
+ </div>
327
+ )}
328
+ </div>
329
+
330
+ <hr />
331
+
332
+ <div className={styles.container}>
333
+ <div className={styles.content}>
334
+ <p className={styles.label}>{t('treatmentSupporterName', 'Treatment supporter name')}</p>
335
+ <p>
336
+ <span className={styles.value}>{data?.nameOfTreatmentSupporter}</span>
337
+ </p>
338
+ </div>
339
+ <div className={styles.content}>
340
+ <p className={styles.label}>{t('treatmentSupporterRelationship', 'Treatment supporter relationship')}</p>
341
+ <p>
342
+ <span className={styles.value}>{data?.relationshipToTreatmentSupporter}</span>
343
+ </p>
344
+ </div>
345
+ <div className={styles.content}>
346
+ <p className={styles.label}>{t('treatmentSupporterContact', 'Treatment Supporter contact')}</p>
347
+ <p>
348
+ <span className={styles.value}>{data?.contactOfTreatmentSupporter}</span>
349
+ </p>
350
+ </div>
351
+ </div>
352
+
353
+ <hr />
354
+
355
+ <div className={styles.container}>
356
+ <div className={styles.content}>
357
+ <p className={styles.label}>{t('drugAllergies', 'Drug allergies')}</p>
358
+ <p>
359
+ <span className={styles.value}>{data?.allergies}</span>
360
+ </p>
361
+ </div>
362
+ </div>
363
+
364
+ <hr />
365
+
366
+ <div className={styles.container}>
367
+ <div className={styles.content}>
368
+ <p className={styles.label}>{t('previousART', 'Previous ART')}</p>
369
+ <p>
370
+ <span className={styles.value}>{data?.previousArtStatus}</span>
371
+ </p>
372
+ </div>
373
+ <div className={styles.content}>
374
+ <p className={styles.label}>{t('dateStartedART', 'Date started ART')}</p>
375
+ <p>
376
+ <span className={styles.value}>{data?.dateStartedArt}</span>
377
+ </p>
378
+ </div>
379
+ <div className={styles.content}>
380
+ <p className={styles.label}>{t('clinicalStageART', 'Clinical stage at ART')}</p>
381
+ <p>
382
+ <span className={styles.value}>{data?.whoStageAtArtStart ? data?.whoStageAtArtStart : '--'}</span>
383
+ </p>
384
+ </div>
385
+ </div>
386
+
387
+ <div className={styles.container}>
388
+ <div className={styles.content}>
389
+ <p className={styles.label}>{t('purposeDrugs', 'Purpose drugs')}</p>
390
+ <p>
391
+ <span className={styles.value}>{data?.purposeDrugs ? data?.purposeDrugs : 'None'}</span>
392
+ </p>
393
+ </div>
394
+ <div className={styles.content}>
395
+ <p className={styles.label}>{t('purposeDate', 'Purpose drugs date')}</p>
396
+ <p>
397
+ <span className={styles.value}>{data?.purposeDate ? data?.purposeDate : 'None'}</span>
398
+ </p>
399
+ </div>
400
+ <div className={styles.content}>
401
+ <p className={styles.label}>{t('cd4AtArtStart', 'CD4 at ART start')}</p>
402
+ <p>
403
+ <span className={styles.value}>{data?.cd4AtArtStart ? data?.cd4AtArtStart : '--'}</span>
404
+ </p>
405
+ </div>
406
+ </div>
407
+
408
+ <div className={styles.container}>
409
+ <div className={styles.content}>
410
+ <p className={styles.label}>{t('firstRegimen', 'First regimen')}</p>
411
+ <p>
412
+ <span className={styles.value}>{data?.firstRegimen}</span>
413
+ </p>
414
+ </div>
415
+ <div className={styles.content}>
416
+ <p className={styles.label}>{t('currentArtRegimen', 'Current Art regimen')}</p>
417
+ <p>
418
+ <span className={styles.value}>{data?.currentArtRegimen}</span>
419
+ </p>
420
+ </div>
421
+ </div>
422
+
423
+ <hr />
424
+
425
+ <div className={styles.container}>
426
+ <div className={styles.content}>
427
+ <p className={styles.label}>{t('artInterruptionReason', 'ART interruptions reason')}</p>
428
+ <p>
429
+ <span className={styles.value}>--</span>
430
+ <span className={styles.label}> </span>
431
+ </p>
432
+ </div>
433
+ <div className={styles.content}>
434
+ <p className={styles.label}>
435
+ {t('substitutionWithin1stLineRegimen', 'Substitution within 1st line regimen')}
436
+ </p>
437
+ <p>
438
+ <span className={styles.value}>--</span>
439
+ <span className={styles.label}> </span>
440
+ </p>
441
+ </div>
442
+ <div className={styles.content}>
443
+ <p className={styles.label}>{t('switchTo2ndLineRegimen', 'Switch to 2nd line regimen')}</p>
444
+ <p>
445
+ <span className={styles.value}>--</span>
446
+ <span className={styles.label}> </span>
447
+ </p>
448
+ </div>
449
+ </div>
450
+
451
+ <div className={styles.container}>
452
+ <div className={styles.content}>
453
+ <p className={styles.label}>{t('Dapsone', 'Dapsone')}</p>
454
+ <p>
455
+ <span className={styles.value}>{data?.dapsone}</span>
456
+ </p>
457
+ </div>
458
+ <div className={styles.content}>
459
+ <p className={styles.label}>{t('tpt', 'TPT')}</p>
460
+ <p>
461
+ <span className={styles.value}>{data?.onIpt}</span>
462
+ </p>
463
+ </div>
464
+ <div className={styles.content}>
465
+ <p className={styles.label}>{t('clinicsEnrolled', 'Clinics enrolled')}</p>
466
+ <p>
467
+ <span className={styles.value}>{data?.clinicsEnrolled}</span>
468
+ </p>
469
+ </div>
470
+ </div>
471
+
472
+ <div className={styles.container}>
473
+ <div className={styles.content}>
474
+ <p className={styles.label}>{t('transferOutDate', 'Transfer out date')}</p>
475
+ <p>
476
+ <span className={styles.value}>{data?.transferOutDate}</span>
477
+ </p>
478
+ </div>
479
+ <div className={styles.content}>
480
+ <p className={styles.label}>{t('transferOutFacility', 'Transfer out facility')}</p>
481
+ <p>
482
+ <span className={styles.value}>{data?.transferOutFacility}</span>
483
+ </p>
484
+ </div>
485
+ <div className={styles.content}>
486
+ <p className={styles.label}>{t('deathDate', 'Death date')}</p>
487
+ <p>
488
+ <span className={styles.value}>{data?.deathDate}</span>
489
+ </p>
490
+ </div>
491
+ </div>
492
+
493
+ <div className={styles.container}>
494
+ <div className={styles.content}>
495
+ <p className={styles.label}>{t('mostRecentCD4', 'Most recent CD4')}</p>
496
+ <p>
497
+ <span className={styles.value}>{data?.mostRecentCd4 ? data?.mostRecentCd4 : '--'}</span>
498
+ <span> {data?.mostRecentCd4Date ? data?.mostRecentCd4Date : null} </span> <br />
499
+ </p>
500
+ </div>
501
+ <div className={styles.content}>
502
+ <p className={styles.label}>{t('mostRecentVL', 'Most recent VL')}</p>
503
+ <p>
504
+ <span className={styles.value}>{data?.viralLoadValue}</span>{' '}
505
+ <span className={styles.label}> ({data?.viralLoadDate})</span> <br />
506
+ </p>
507
+ </div>
508
+ <div className={styles.content}>
509
+ <p className={styles.label}>{t('nextAppointmentDate', ' Next appointment')}</p>
510
+ <p>
511
+ <span className={styles.value}>{data?.nextAppointmentDate}</span>
512
+ </p>
513
+ </div>
514
+ </div>
515
+
516
+ <div className={styles.container}>
517
+ <div className={styles.content}>
518
+ <p className={styles.label}>{t('viralLoadTrends', 'Viral load trends')}</p>
519
+ {data?.allVlResults?.value?.length > 0
520
+ ? data?.allVlResults?.value?.map((vl) => {
521
+ return (
522
+ <>
523
+ <span className={styles.value}> {vl.vl} </span>
524
+ <span className={styles.label}> ({vl.vlDate}) </span>
525
+ <br />
526
+ </>
527
+ );
528
+ })
529
+ : '--'}
530
+ </div>
531
+ <div className={styles.content}>
532
+ <p className={styles.label}>{t('cd4Trends', 'CD4 Trends')}</p>
533
+ {data?.allCd4CountResults?.length > 0
534
+ ? data?.allCd4CountResults?.map((cd4) => {
535
+ return (
536
+ <>
537
+ <span className={styles.value}> {cd4.cd4Count} </span>
538
+ <span> {cd4.cd4CountDate}</span>
539
+ <br />
540
+ </>
541
+ );
542
+ })
543
+ : '--'}
544
+ </div>
545
+ </div>
546
+
547
+ <hr />
548
+
549
+ <div className={styles.container}>
550
+ <div className={styles.content}>
551
+ <p className={styles.label}>{t('clinicalNotes', 'Clinical notes')}</p>
552
+ <p>
553
+ <span className={styles.value}>--</span>
554
+ </p>
555
+ </div>
556
+ <div className={styles.content}>
557
+ <p className={styles.label}>{t('clinicianName', 'Clinician name')}</p>
558
+ <p>
559
+ <span className={styles.value}>{currentUserSession?.user?.person?.display}</span>
560
+ </p>
561
+ </div>
562
+ <div className={styles.content}>
563
+ <p className={styles.label}>{t('clinicianSignature', 'Clinician signature')}</p>
564
+ <p>
565
+ <span className={styles.value}>{currentUserSession?.user?.person?.display}</span>
566
+ </p>
567
+ </div>
568
+ </div>
569
+ </div>
570
+ </div>
571
+ );
572
+ }
573
+ };
574
+
575
+ export default PatientSummary;