@pih/esm-pathology-app 1.0.3 → 1.0.4
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/dist/00ebb57bb20c59433e84.gif +0 -0
- package/dist/16.js +3 -0
- package/dist/16.js.LICENSE.txt +1 -0
- package/dist/16.js.map +1 -0
- package/dist/24.js +3 -0
- package/dist/24.js.LICENSE.txt +16 -0
- package/dist/24.js.map +1 -0
- package/dist/248.js +3 -0
- package/dist/248.js.LICENSE.txt +99 -0
- package/dist/248.js.map +1 -0
- package/dist/294.js +3 -0
- package/dist/294.js.LICENSE.txt +14 -0
- package/dist/294.js.map +1 -0
- package/dist/574.js +1 -0
- package/dist/5b8bb278fcab4da4972e.ttf +0 -0
- package/dist/861.js +2 -0
- package/dist/861.js.map +1 -0
- package/dist/867.js +2 -0
- package/dist/867.js.map +1 -0
- package/dist/976.js +3 -0
- package/dist/976.js.LICENSE.txt +8 -0
- package/dist/976.js.map +1 -0
- package/dist/a5fad24f075c978ac04b.ttf +0 -0
- package/dist/pih-esm-pathology-app.js +1 -1
- package/dist/pih-esm-pathology-app.js.buildmanifest.json +153 -25
- package/dist/pih-esm-pathology-app.js.map +1 -1
- package/package.json +21 -10
- package/src/Fonts/georgia/GEORGIA4.TTF +0 -0
- package/src/Fonts/georgia/Georgia Bold Italic font.ttf +0 -0
- package/src/Fonts/georgia/Georgia Regular font.ttf +0 -0
- package/src/Fonts/georgia/Georgia.ttf +0 -0
- package/src/Fonts/georgia/georgia bold italic.ttf +0 -0
- package/src/Fonts/georgia/georgia italic.ttf +0 -0
- package/src/Fonts/georgia/georgia-bold.ttf +0 -0
- package/src/Fonts/georgia/georgiab.ttf +0 -0
- package/src/Fonts/georgia/georgiai.ttf +0 -0
- package/src/Fonts/georgia/georgiaz.ttf +0 -0
- package/src/Fonts/georgia/seriffic.ttf +0 -0
- package/src/Fonts/georgia/sharefonts.net.txt +1 -0
- package/src/Print-to-PDF/Document-Component.tsx +256 -0
- package/src/config-schema.ts +105 -6
- package/src/declarations.d.tsx +3 -0
- package/src/images/ButaroHospitalLogo.gif +0 -0
- package/src/pathology-report/ReportComponent.resource.ts +37 -34
- package/src/pathology-report/ReportComponent.tsx +44 -8
- package/src/test.html +0 -0
- package/webpack.config.js +30 -1
- package/dist/574.pih-esm-pathology-app.js +0 -1
- package/dist/633.pih-esm-pathology-app.js +0 -3
- package/dist/633.pih-esm-pathology-app.js.LICENSE.txt +0 -29
- package/dist/633.pih-esm-pathology-app.js.map +0 -1
- package/dist/66.pih-esm-pathology-app.js +0 -2
- package/dist/66.pih-esm-pathology-app.js.map +0 -1
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Document, Page, Text,Image, View, StyleSheet,Font } from "@react-pdf/renderer";
|
|
3
|
+
import ButaroLogo from '../images/ButaroHospitalLogo.gif';
|
|
4
|
+
import GeorgiaFontBold from '../Fonts/georgia/georgia-bold.ttf';
|
|
5
|
+
import GeorgiaFont from '../Fonts/georgia/Georgia.ttf';
|
|
6
|
+
|
|
7
|
+
// import { Font } from '@react-pdf/renderer';
|
|
8
|
+
Font.register({ family: 'GeorgiaBold', src: GeorgiaFontBold});
|
|
9
|
+
Font.register({ family: 'Georgia', src: GeorgiaFont});
|
|
10
|
+
|
|
11
|
+
// Font.register({ family: 'Georgia', src: '../Fonts/georgia/Georgia.ttf', fontStyle: 'normal', fontWeight: 'normal' });
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
// Create styles
|
|
17
|
+
const styles = StyleSheet.create({
|
|
18
|
+
page: {
|
|
19
|
+
flexDirection: "row",
|
|
20
|
+
},
|
|
21
|
+
section: {
|
|
22
|
+
margin: 10,
|
|
23
|
+
padding: 20,
|
|
24
|
+
flexGrow: 1,
|
|
25
|
+
},
|
|
26
|
+
textLabels: {
|
|
27
|
+
padding: 7,
|
|
28
|
+
fontFamily:"GeorgiaBold",
|
|
29
|
+
fontSize: 16,
|
|
30
|
+
fontWeight: 'bold',
|
|
31
|
+
paddingBottom:30,
|
|
32
|
+
},
|
|
33
|
+
sentenceLabels: {
|
|
34
|
+
paddingTop: 7,
|
|
35
|
+
fontFamily:"GeorgiaBold",
|
|
36
|
+
fontSize: 16,
|
|
37
|
+
fontWeight: 'bold',
|
|
38
|
+
paddingBottom:3,
|
|
39
|
+
},
|
|
40
|
+
textAnswers: {
|
|
41
|
+
margin: 10,
|
|
42
|
+
padding: 20,
|
|
43
|
+
fontFamily:"Georgia",
|
|
44
|
+
fontSize: 14,
|
|
45
|
+
},
|
|
46
|
+
sentenceAnswers: {
|
|
47
|
+
marginBottom: 10,
|
|
48
|
+
paddingBottom: 20,
|
|
49
|
+
fontFamily:"Georgia",
|
|
50
|
+
fontSize: 14,
|
|
51
|
+
},
|
|
52
|
+
logo: {
|
|
53
|
+
width: 61,
|
|
54
|
+
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// Create Document Component
|
|
59
|
+
const MyDocument = (props) => (
|
|
60
|
+
|
|
61
|
+
<Document title={`Pathology report
|
|
62
|
+
${props.encounterInfo.family_name}
|
|
63
|
+
${props.encounterInfo.given_name}
|
|
64
|
+
${props.encounterInfo.middle_name} `}
|
|
65
|
+
>
|
|
66
|
+
<Page size="A4" style={styles.page}>
|
|
67
|
+
|
|
68
|
+
<View style={styles.section}>
|
|
69
|
+
<Image style={styles.logo} src={ButaroLogo}/>
|
|
70
|
+
<Text style={{fontSize: 8}}>Butaro Hospital</Text>
|
|
71
|
+
<Text style={{ position: "absolute",top: 0,left: 300,width: 300 }}>
|
|
72
|
+
<Text style={styles.textAnswers}>
|
|
73
|
+
Lab phone number:
|
|
74
|
+
</Text>
|
|
75
|
+
<Text>{" "}{" "}0784433618</Text>
|
|
76
|
+
</Text>
|
|
77
|
+
<Text style={{ position: "absolute",top: 15,left: 300,width: 300 }}>
|
|
78
|
+
<Text style={styles.textAnswers}>
|
|
79
|
+
Accession number:
|
|
80
|
+
</Text>
|
|
81
|
+
<Text >
|
|
82
|
+
{" "}{" "}
|
|
83
|
+
{props.encounterInfo.resultsEncounter.obs.map((obser) => obser.concept.uuid==props.config.AccessionNumberconceptUUID && obser.value)}
|
|
84
|
+
</Text>
|
|
85
|
+
</Text>
|
|
86
|
+
<Text style={{ backgroundColor: "#E4E4E4",borderBottom:'1px', textAlign: 'center',fontWeight: 1500, marginBottom: 30,fontFamily:"GeorgiaBold" }}>
|
|
87
|
+
Pathology Report
|
|
88
|
+
</Text>
|
|
89
|
+
<Text style={{ paddingBottom: 10 }} >
|
|
90
|
+
<Text style={styles.textAnswers}>
|
|
91
|
+
Patient Name:
|
|
92
|
+
</Text>
|
|
93
|
+
<Text style={styles.textAnswers}>
|
|
94
|
+
{" "}{" "}
|
|
95
|
+
{props.encounterInfo.family_name} {" "}
|
|
96
|
+
{props.encounterInfo.given_name} {" "}
|
|
97
|
+
{props.encounterInfo.middle_name}
|
|
98
|
+
</Text>
|
|
99
|
+
|
|
100
|
+
</Text>
|
|
101
|
+
<Text style={{ paddingBottom: 10, position: "absolute",top: 140,left: 335 }}>
|
|
102
|
+
<Text style={styles.textAnswers}>
|
|
103
|
+
Surgery Date:
|
|
104
|
+
</Text>
|
|
105
|
+
<Text style={styles.textAnswers}>
|
|
106
|
+
{" "}{" "}
|
|
107
|
+
{props.encounterInfo.resultsEncounter.obs.map((obser) => obser.concept.uuid==props.config.DateBiopsySpecimenTakenconceptUUID &&
|
|
108
|
+
new Date(obser.value)
|
|
109
|
+
.toLocaleString(["en-GB","en-US","en","fr-RW"],{day: 'numeric',month: 'numeric',year: 'numeric'})
|
|
110
|
+
)}
|
|
111
|
+
</Text>
|
|
112
|
+
|
|
113
|
+
</Text>
|
|
114
|
+
<Text style={{ paddingBottom: 10 }} >
|
|
115
|
+
<Text style={styles.textAnswers}>
|
|
116
|
+
Patient Birthday:
|
|
117
|
+
</Text>
|
|
118
|
+
<Text style={styles.textAnswers}>
|
|
119
|
+
{" "}{" "}
|
|
120
|
+
{
|
|
121
|
+
new Date(props.encounterInfo.personBirthdate)
|
|
122
|
+
.toLocaleString(["en-GB","en-US","en","fr-RW"],{day: 'numeric',month: 'numeric',year: 'numeric'})
|
|
123
|
+
}
|
|
124
|
+
</Text>
|
|
125
|
+
|
|
126
|
+
</Text>
|
|
127
|
+
<Text style={{ paddingBottom: 10, position: "absolute",top: 168,left: 335,width: 200 }}>
|
|
128
|
+
<Text style={styles.textAnswers}>
|
|
129
|
+
Specimen Reception Date:
|
|
130
|
+
</Text>
|
|
131
|
+
<Text style={styles.textAnswers}>
|
|
132
|
+
{" "}{" "}
|
|
133
|
+
{props.encounterInfo.resultsEncounter.obs.map((obser) => obser.concept.uuid==props.config.SpecimenSubmissionDateconceptUUID &&
|
|
134
|
+
new Date(obser.value)
|
|
135
|
+
.toLocaleString(["en-GB","en-US","en","fr-RW"],{day: 'numeric',month: 'numeric',year: 'numeric'})
|
|
136
|
+
)}
|
|
137
|
+
</Text>
|
|
138
|
+
</Text>
|
|
139
|
+
<Text style={{ paddingBottom: 10,borderBottom:'1px' }} >
|
|
140
|
+
<Text style={styles.textAnswers}>
|
|
141
|
+
Patient Gender:
|
|
142
|
+
</Text>
|
|
143
|
+
<Text style={styles.textAnswers}>
|
|
144
|
+
{" "}{" "}
|
|
145
|
+
{props.encounterInfo.personGender}
|
|
146
|
+
</Text>
|
|
147
|
+
|
|
148
|
+
</Text>
|
|
149
|
+
<Text style={{ paddingBottom: 10, position: "absolute",top: 200,left: 335,width: 250 }}>
|
|
150
|
+
<Text style={styles.textAnswers}>
|
|
151
|
+
Signout Date:
|
|
152
|
+
</Text>
|
|
153
|
+
<Text style={styles.textAnswers}>
|
|
154
|
+
{" "}{" "}
|
|
155
|
+
{
|
|
156
|
+
new Date(props.encounterInfo.resultsEncounter.encounterDatetime)
|
|
157
|
+
.toLocaleString(["en-GB","en-US","en","fr-RW"],{day: 'numeric',month: 'numeric',year: 'numeric'})
|
|
158
|
+
}
|
|
159
|
+
</Text>
|
|
160
|
+
</Text>
|
|
161
|
+
|
|
162
|
+
<Text style={{ backgroundColor: "#E4E4E4",paddingBottom: 10 }}>
|
|
163
|
+
<Text style={styles.textLabels}>
|
|
164
|
+
Sending Physician:
|
|
165
|
+
</Text>
|
|
166
|
+
<Text style={styles.textAnswers}>
|
|
167
|
+
{" "}{" "}
|
|
168
|
+
{props.encounterInfo.resultsEncounter.obs.map((obser) => obser.concept.uuid==props.config.SendingPhysicianconceptUUID && obser.value)}
|
|
169
|
+
</Text>
|
|
170
|
+
</Text>
|
|
171
|
+
<Text style={{ backgroundColor: "#E4E4E4",paddingBottom: 10 }}>
|
|
172
|
+
<Text style={styles.textLabels}>
|
|
173
|
+
Sending Facility:
|
|
174
|
+
</Text>
|
|
175
|
+
<Text style={styles.textAnswers}>
|
|
176
|
+
{" "}{" "}
|
|
177
|
+
{props.encounterInfo.resultsEncounter.obs.map((obser) => obser.concept.uuid==props.config.OtherBiopsyLocationconceptUUID && obser.value)}
|
|
178
|
+
</Text>
|
|
179
|
+
</Text>
|
|
180
|
+
<Text style={{backgroundColor: "#E4E4E4",paddingBottom: 10 ,fontFamily:"Georgia"}}>Anatomical location:</Text>
|
|
181
|
+
<Text style={{backgroundColor: "#E4E4E4", paddingBottom: 10,paddingLeft:10 }}>
|
|
182
|
+
<Text style={styles.textLabels}>
|
|
183
|
+
i.System:
|
|
184
|
+
</Text>
|
|
185
|
+
<Text style={styles.textAnswers}>
|
|
186
|
+
{" "}{" "}
|
|
187
|
+
{props.encounterInfo.resultsEncounter.obs.map((obser) => obser.concept.uuid==props.config.OrganSystemconceptUUID && (obser.value.name.display+ ", "))}
|
|
188
|
+
</Text>
|
|
189
|
+
</Text>
|
|
190
|
+
<Text style={{backgroundColor: "#E4E4E4", paddingBottom: 10,paddingLeft:10 }}>
|
|
191
|
+
<Text style={styles.textLabels}>
|
|
192
|
+
ii.Organ:
|
|
193
|
+
</Text>
|
|
194
|
+
<Text style={styles.textAnswers}>
|
|
195
|
+
{" "}{" "}
|
|
196
|
+
{props.encounterInfo.resultsEncounter.obs.map((obser) => obser.concept.uuid==props.config.OrganconceptUUID && (obser.value.name.display+ ", "))}
|
|
197
|
+
</Text>
|
|
198
|
+
</Text>
|
|
199
|
+
<Text style={{backgroundColor: "#E4E4E4", paddingBottom: 10,paddingLeft:10 }}>
|
|
200
|
+
<Text style={styles.textLabels}>
|
|
201
|
+
iii.Detail:
|
|
202
|
+
</Text>
|
|
203
|
+
<Text style={styles.textAnswers}>
|
|
204
|
+
{" "}{" "}
|
|
205
|
+
{props.encounterInfo.resultsEncounter.obs.map((obser) => obser.concept.uuid==props.config.SpecimenDetailconceptUUID && obser.value)}
|
|
206
|
+
</Text>
|
|
207
|
+
</Text>
|
|
208
|
+
<Text style={{backgroundColor: "#E4E4E4", paddingBottom: 10 }}>
|
|
209
|
+
<Text style={styles.textLabels}>
|
|
210
|
+
Procedure type:
|
|
211
|
+
</Text>
|
|
212
|
+
<Text style={styles.textAnswers}>
|
|
213
|
+
{" "}{" "}
|
|
214
|
+
{props.encounterInfo.resultsEncounter.obs.map((obser) => obser.concept.uuid==props.config.OtherTestsOrProceduresconceptUUID && obser.value)}
|
|
215
|
+
</Text>
|
|
216
|
+
</Text>
|
|
217
|
+
<Text style={[styles.sentenceLabels]}>
|
|
218
|
+
Gross Description:
|
|
219
|
+
</Text>
|
|
220
|
+
<Text style={[styles.sentenceAnswers]}>
|
|
221
|
+
{props.encounterInfo.resultsEncounter.obs.map((obser) => obser.concept.uuid==props.config.GrossDescriptionconceptUUID && obser.value)}
|
|
222
|
+
|
|
223
|
+
</Text>
|
|
224
|
+
<Text style={styles.sentenceLabels}>
|
|
225
|
+
Microscopic Examination:
|
|
226
|
+
</Text>
|
|
227
|
+
<Text style={styles.sentenceAnswers}>
|
|
228
|
+
|
|
229
|
+
{props.encounterInfo.resultsEncounter.obs.map((obser) => obser.concept.uuid==props.config.MacroscopicExaminationconceptUUID && obser.value)}
|
|
230
|
+
|
|
231
|
+
</Text>
|
|
232
|
+
<Text style={styles.sentenceLabels}>
|
|
233
|
+
Conclusion:
|
|
234
|
+
</Text>
|
|
235
|
+
<Text style={styles.sentenceAnswers}>
|
|
236
|
+
|
|
237
|
+
{props.encounterInfo.resultsEncounter.obs.map((obser) => obser.concept.uuid==props.config.COMMENTSATCONCLUSIONOFEXAMINATIONconceptUUID && obser.value)}
|
|
238
|
+
|
|
239
|
+
</Text>
|
|
240
|
+
|
|
241
|
+
<Text style={{backgroundColor: "#E4E4E4", paddingBottom: 10 }}>
|
|
242
|
+
<Text style={styles.textLabels}>
|
|
243
|
+
Validated by pathologist:
|
|
244
|
+
</Text>
|
|
245
|
+
<Text style= {[styles.textAnswers, { fontWeight: 'bold' }]}>
|
|
246
|
+
{" "}{" "}
|
|
247
|
+
{props.encounterInfo.approvedBy}
|
|
248
|
+
</Text>
|
|
249
|
+
</Text>
|
|
250
|
+
</View>
|
|
251
|
+
</Page>
|
|
252
|
+
</Document>
|
|
253
|
+
);
|
|
254
|
+
|
|
255
|
+
export default MyDocument;
|
|
256
|
+
|
package/src/config-schema.ts
CHANGED
|
@@ -17,7 +17,7 @@ import { Type, validator } from "@openmrs/esm-framework";
|
|
|
17
17
|
export const configSchema = {
|
|
18
18
|
pathologyEncTypeUUID: {
|
|
19
19
|
_type: Type.String,
|
|
20
|
-
_default: "
|
|
20
|
+
_default: "70f18a24-92ec-4de5-acdc-7cae77414e32",
|
|
21
21
|
_description:
|
|
22
22
|
"This is to determine the UUID of the Pathology encounterType in the instance",
|
|
23
23
|
},
|
|
@@ -29,25 +29,25 @@ export const configSchema = {
|
|
|
29
29
|
},
|
|
30
30
|
pathologyFullAllowedLocationUUID: {
|
|
31
31
|
_type: Type.String,
|
|
32
|
-
_default: "
|
|
32
|
+
_default: "a62fd59a-6577-43e0-b39c-ba42ac8cfbc9",
|
|
33
33
|
_description:
|
|
34
34
|
"This is to determine the location allowed to view all other location data",
|
|
35
35
|
},
|
|
36
36
|
sampleStatusConceptUUID: {
|
|
37
37
|
_type: Type.String,
|
|
38
|
-
_default: "
|
|
38
|
+
_default: "3adca58e-9334-4be5-9bd3-74f7bbf82776",
|
|
39
39
|
_description:
|
|
40
40
|
"This is to determine the UUID of the sample status concept in the instance",
|
|
41
41
|
},
|
|
42
42
|
referralStatusConceptUUID: {
|
|
43
43
|
_type: Type.String,
|
|
44
|
-
_default: "
|
|
44
|
+
_default: "5a7a931f-97b8-4d59-b0de-3a83603aaad9",
|
|
45
45
|
_description:
|
|
46
46
|
"This is to determine the UUID of the referral status concept in the instance",
|
|
47
47
|
},
|
|
48
48
|
sampleDropOffconceptUUID: {
|
|
49
49
|
_type: Type.String,
|
|
50
|
-
_default: "
|
|
50
|
+
_default: "dc288e6c-84a4-4fd3-9136-ef9e13961b1e",
|
|
51
51
|
_description:
|
|
52
52
|
"This is to determine the UUID of the sample drop off concept in the instance",
|
|
53
53
|
},
|
|
@@ -66,10 +66,94 @@ export const configSchema = {
|
|
|
66
66
|
|
|
67
67
|
pathologyResultsFromID: {
|
|
68
68
|
_type: Type.Number,
|
|
69
|
-
_default:
|
|
69
|
+
_default: 5613,
|
|
70
70
|
_description:
|
|
71
71
|
"This is to determine the ID of the pathology results form in the instance",
|
|
72
72
|
},
|
|
73
|
+
pathologyResultsApprovedconceptUUID: {
|
|
74
|
+
_type: Type.String,
|
|
75
|
+
_default: "1f7742f0-4571-44d8-a88b-8bc60dc11e29",
|
|
76
|
+
_description:
|
|
77
|
+
"This is to determine the pathology results approved concept uuid",
|
|
78
|
+
},
|
|
79
|
+
AccessionNumberconceptUUID: {
|
|
80
|
+
_type: Type.String,
|
|
81
|
+
_default: "0e466f59-8070-45b5-97d1-575ec5cfd85d",
|
|
82
|
+
_description:
|
|
83
|
+
"This is to determine the Accession Number concept uuid",
|
|
84
|
+
},
|
|
85
|
+
DateBiopsySpecimenTakenconceptUUID: {
|
|
86
|
+
_type: Type.String,
|
|
87
|
+
_default: "e0436a5b-dc19-4cb9-ac1b-acc005272c08",
|
|
88
|
+
_description:
|
|
89
|
+
"This is to determine the Date Biopsy Specimen Taken concept uuid",
|
|
90
|
+
},
|
|
91
|
+
SpecimenSubmissionDateconceptUUID: {
|
|
92
|
+
_type: Type.String,
|
|
93
|
+
_default: "3928b7fc-b3ae-40a5-846f-d480120b04f6",
|
|
94
|
+
_description:
|
|
95
|
+
"This is to determine the Specimen Submission Date concept uuid",
|
|
96
|
+
},
|
|
97
|
+
SendingPhysicianconceptUUID: {
|
|
98
|
+
_type: Type.String,
|
|
99
|
+
_default: "0a4a22db-0e82-4669-9aba-086d841505b5",
|
|
100
|
+
_description:
|
|
101
|
+
"This is to determine the Sending Physician concept uuid",
|
|
102
|
+
},
|
|
103
|
+
OtherBiopsyLocationconceptUUID: {
|
|
104
|
+
_type: Type.String,
|
|
105
|
+
_default: "7c4650ee-45d5-435a-b968-511ef127a016",
|
|
106
|
+
_description:
|
|
107
|
+
"This is to determine the Other Biopsy Location concept uuid",
|
|
108
|
+
},
|
|
109
|
+
OrganSystemconceptUUID: {
|
|
110
|
+
_type: Type.String,
|
|
111
|
+
_default: "b88f9524-6b39-41b3-9b3a-f9a7a4b08fed",
|
|
112
|
+
_description:
|
|
113
|
+
"This is to determine the Organ System concept uuid",
|
|
114
|
+
},
|
|
115
|
+
OrganconceptUUID: {
|
|
116
|
+
_type: Type.String,
|
|
117
|
+
_default: "488fe4a2-7903-41da-b21e-fb236a1ee356",
|
|
118
|
+
_description:
|
|
119
|
+
"This is to determine the Organ concept uuid",
|
|
120
|
+
},
|
|
121
|
+
SpecimenDetailconceptUUID: {
|
|
122
|
+
_type: Type.String,
|
|
123
|
+
_default: "e99170a5-f46b-490b-8fbb-bb9eacba3500",
|
|
124
|
+
_description:
|
|
125
|
+
"This is to determine the Specimen Detail concept uuid",
|
|
126
|
+
},
|
|
127
|
+
OtherTestsOrProceduresconceptUUID: {
|
|
128
|
+
_type: Type.String,
|
|
129
|
+
_default: "66ad3230-59b2-4232-821e-a9ae86819e03",
|
|
130
|
+
_description:
|
|
131
|
+
"This is to determine the Other tests or procedures concept uuid",
|
|
132
|
+
},
|
|
133
|
+
GrossDescriptionconceptUUID: {
|
|
134
|
+
_type: Type.String,
|
|
135
|
+
_default: "1e97a4d3-1691-4fb7-be78-18e526e82b0b",
|
|
136
|
+
_description:
|
|
137
|
+
"This is to determine the Gross Description concept uuid",
|
|
138
|
+
},
|
|
139
|
+
MacroscopicExaminationconceptUUID: {
|
|
140
|
+
_type: Type.String,
|
|
141
|
+
_default: "5d149510-0767-4da7-82cd-be406b34877d",
|
|
142
|
+
_description:
|
|
143
|
+
"This is to determine the Macroscopic Examination concept uuid",
|
|
144
|
+
},
|
|
145
|
+
COMMENTSATCONCLUSIONOFEXAMINATIONconceptUUID: {
|
|
146
|
+
_type: Type.String,
|
|
147
|
+
_default: "3cdc5938-26fe-102b-80cb-0017a47871b2",
|
|
148
|
+
_description:
|
|
149
|
+
"This is to determine the COMMENTS AT CONCLUSION OF EXAMINATION concept uuid",
|
|
150
|
+
},
|
|
151
|
+
CanregCodeconceptUUID: {
|
|
152
|
+
_type: Type.String,
|
|
153
|
+
_default: "16931672-e068-4ea8-a89c-2ee7dbc07ad1",
|
|
154
|
+
_description:
|
|
155
|
+
"This is to determine the Canreg Code concept uuid",
|
|
156
|
+
},
|
|
73
157
|
};
|
|
74
158
|
|
|
75
159
|
export type Config = {
|
|
@@ -82,4 +166,19 @@ export type Config = {
|
|
|
82
166
|
yesConceptUUID: string;
|
|
83
167
|
yesConceptName: string;
|
|
84
168
|
pathologyResultsFromID: number;
|
|
169
|
+
pathologyResultsApprovedconceptUUID: string;
|
|
170
|
+
|
|
171
|
+
AccessionNumberconceptUUID: string;
|
|
172
|
+
DateBiopsySpecimenTakenconceptUUID: string;
|
|
173
|
+
SpecimenSubmissionDateconceptUUID: string;
|
|
174
|
+
SendingPhysicianconceptUUID: string;
|
|
175
|
+
OtherBiopsyLocationconceptUUID: string;
|
|
176
|
+
OrganSystemconceptUUID: string;
|
|
177
|
+
OrganconceptUUID: string;
|
|
178
|
+
SpecimenDetailconceptUUID: string;
|
|
179
|
+
OtherTestsOrProceduresconceptUUID: string;
|
|
180
|
+
GrossDescriptionconceptUUID: string;
|
|
181
|
+
MacroscopicExaminationconceptUUID: string;
|
|
182
|
+
COMMENTSATCONCLUSIONOFEXAMINATIONconceptUUID: string;
|
|
183
|
+
CanregCodeconceptUUID: string;
|
|
85
184
|
};
|
package/src/declarations.d.tsx
CHANGED
|
Binary file
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { openmrsFetch } from "@openmrs/esm-framework";
|
|
2
|
+
import cloneDeep from "lodash-es/cloneDeep";
|
|
3
|
+
|
|
2
4
|
|
|
3
5
|
export interface EncounterResult {
|
|
4
6
|
family_name: string;
|
|
@@ -15,6 +17,11 @@ export interface EncounterResult {
|
|
|
15
17
|
referralStatusObs: string;
|
|
16
18
|
sampleDropoffObs: string;
|
|
17
19
|
resultsEncounterId: string;
|
|
20
|
+
resultsEncounterUuid: string;
|
|
21
|
+
resultsEncounter: [];
|
|
22
|
+
approvedBy: string;
|
|
23
|
+
approvalObsUuid: string;
|
|
24
|
+
pathologicDiagnosisObs: string;
|
|
18
25
|
}
|
|
19
26
|
export interface Patient {
|
|
20
27
|
uuid: string;
|
|
@@ -24,6 +31,7 @@ export interface Concept {
|
|
|
24
31
|
name: string;
|
|
25
32
|
display: string;
|
|
26
33
|
}
|
|
34
|
+
|
|
27
35
|
export interface Obs {
|
|
28
36
|
patientUuid: string;
|
|
29
37
|
obsDateTime: string;
|
|
@@ -34,35 +42,9 @@ export interface Obs {
|
|
|
34
42
|
encounterUuid: string;
|
|
35
43
|
valueCodedName: string;
|
|
36
44
|
voided: boolean;
|
|
45
|
+
resultsEncounterUuid: string;
|
|
37
46
|
}
|
|
38
47
|
|
|
39
|
-
// export async function getPatientEncounters(patientUuid): Promise<Array<EncounterResult>> {
|
|
40
|
-
// const searchPatientEncounters = await openmrsFetch(
|
|
41
|
-
// `/ws/rest/v1/encounter?encounterType=${ENCOUNTERTYPEUUID}&patient=${patientUuid}`,
|
|
42
|
-
// );
|
|
43
|
-
// const fullPatientEncounterData = searchPatientEncounters.data.results.map(async (searchEnc) => {
|
|
44
|
-
// const enc = await openmrsFetch(`/ws/rest/v1/encounter/${searchEnc.uuid}?v=full`);
|
|
45
|
-
// const searchPatient = await openmrsFetch(`/ws/rest/v1/patient/${patientUuid}?v=full`);
|
|
46
|
-
// const retrievedObject = {
|
|
47
|
-
// patientName: searchPatient.data.person.names[0],
|
|
48
|
-
// patientPhoneNumber: searchPatient.data.person.attributes.filter(
|
|
49
|
-
// (attribute) => attribute.attributeType.uuid == PHONENUMBERATTRUUID,
|
|
50
|
-
// )[0],
|
|
51
|
-
// patientHealthCenter: searchPatient.data.person.attributes.filter(
|
|
52
|
-
// (attribute) => attribute.attributeType.uuid == HEALTHCENTERATTRTYPEUUID,
|
|
53
|
-
// )[0],
|
|
54
|
-
// patientUuid: searchPatient.data.uuid,
|
|
55
|
-
// encUuid: enc.data.uuid,
|
|
56
|
-
// encounterDatetime: enc.data.encounterDatetime,
|
|
57
|
-
// sampleStatusObs: enc.data.obs.filter((obs) => obs.concept.uuid === SAMPLESTATUSUUID)[0],
|
|
58
|
-
// referralStatusObs: enc.data.obs.filter((obs) => obs.concept.uuid === REFERRALSTATUSUUID)[0],
|
|
59
|
-
// sampleDropoffObs: enc.data.obs.filter((obs) => obs.concept.uuid === SAMPLEDROPOFFUUID)[0],
|
|
60
|
-
// };
|
|
61
|
-
|
|
62
|
-
// return retrievedObject;
|
|
63
|
-
// });
|
|
64
|
-
// return Promise.all(fullPatientEncounterData);
|
|
65
|
-
// }
|
|
66
48
|
|
|
67
49
|
export async function getUserLocation(healthCenterAttrTypeUUID) {
|
|
68
50
|
const session = await openmrsFetch(`/ws/rest/v1/session`);
|
|
@@ -73,7 +55,7 @@ export async function getUserLocation(healthCenterAttrTypeUUID) {
|
|
|
73
55
|
const hcPersonAttribute = person.data.results.filter(
|
|
74
56
|
(attr) => attr.attributeType.uuid === healthCenterAttrTypeUUID
|
|
75
57
|
);
|
|
76
|
-
return hcPersonAttribute[0]
|
|
58
|
+
return hcPersonAttribute[0] && hcPersonAttribute.value.uuid;
|
|
77
59
|
}
|
|
78
60
|
|
|
79
61
|
export async function getConceptAnswers(conceptUuid) {
|
|
@@ -89,11 +71,6 @@ export async function getLocations() {
|
|
|
89
71
|
return location.data.results;
|
|
90
72
|
}
|
|
91
73
|
|
|
92
|
-
// export async function getPatient(patientUuid): Promise<Patient> {
|
|
93
|
-
// const searchPatient = await openmrsFetch(`/ws/rest/v1/patient/c604dabc-2700-102b-80cb-0017a47871b2?v=full`);
|
|
94
|
-
// return searchPatient.data;
|
|
95
|
-
// }
|
|
96
|
-
|
|
97
74
|
export async function getEncounters(
|
|
98
75
|
healthCenterAttrTypeUUID: string,
|
|
99
76
|
pathologyFullAllowedLocationUUID: string
|
|
@@ -113,7 +90,20 @@ export async function getEncounters(
|
|
|
113
90
|
`/ws/rest/v1/reportingrest/reportdata/996cf192-ff54-11eb-a63a-080027ce9ca0`
|
|
114
91
|
);
|
|
115
92
|
}
|
|
116
|
-
|
|
93
|
+
|
|
94
|
+
const EncListClone = searchEncounter.data.dataSets[0].rows.map(async (encObject)=>{
|
|
95
|
+
if(encObject.resultsEncounterUuid){
|
|
96
|
+
const encIndex = searchEncounter.data.dataSets[0].rows.findIndex(
|
|
97
|
+
(enc) => enc.encounterUuid == encObject.encounterUuid
|
|
98
|
+
);
|
|
99
|
+
const resultsEnc =await getEncounter(encObject.resultsEncounterUuid);
|
|
100
|
+
encObject.resultsEncounter = resultsEnc;
|
|
101
|
+
|
|
102
|
+
}
|
|
103
|
+
return encObject;
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
return Promise.all(EncListClone);
|
|
117
107
|
}
|
|
118
108
|
|
|
119
109
|
export async function postSampleDropoffObs(
|
|
@@ -274,3 +264,16 @@ export async function updateReferralStatusChangeObs(
|
|
|
274
264
|
|
|
275
265
|
return response;
|
|
276
266
|
}
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
export async function getUser(userUuid: string) {
|
|
271
|
+
const user = await openmrsFetch(`/ws/rest/v1/user/${userUuid}`);
|
|
272
|
+
|
|
273
|
+
return user.data;
|
|
274
|
+
}
|
|
275
|
+
export async function getEncounter(encounterUuid) {
|
|
276
|
+
const encResult = await openmrsFetch(`/ws/rest/v1/encounter/${encounterUuid}?v=full`);
|
|
277
|
+
|
|
278
|
+
return encResult.data;
|
|
279
|
+
}
|
|
@@ -9,6 +9,7 @@ import DataTable, {
|
|
|
9
9
|
TableBody,
|
|
10
10
|
TableCell,
|
|
11
11
|
} from "carbon-components-react/es/components/DataTable";
|
|
12
|
+
import { PDFDownloadLink, PDFViewer } from "@react-pdf/renderer";
|
|
12
13
|
|
|
13
14
|
import styles from "./ReportComponent.css";
|
|
14
15
|
import {
|
|
@@ -23,8 +24,13 @@ import {
|
|
|
23
24
|
postReferralStatusChangeObs,
|
|
24
25
|
updateReferralStatusChangeObs,
|
|
25
26
|
EncounterResult,
|
|
27
|
+
// postApproval,
|
|
28
|
+
// voidApprovalObs,
|
|
29
|
+
getUser,
|
|
26
30
|
Concept,
|
|
31
|
+
getEncounter,
|
|
27
32
|
} from "./ReportComponent.resource";
|
|
33
|
+
import MyDocument from "../Print-to-PDF/Document-Component";
|
|
28
34
|
import { Config } from "../config-schema";
|
|
29
35
|
|
|
30
36
|
const ReportComponent = () => {
|
|
@@ -77,10 +83,18 @@ const ReportComponent = () => {
|
|
|
77
83
|
key: "sampleDropOff",
|
|
78
84
|
header: "Sample drop off?",
|
|
79
85
|
},
|
|
86
|
+
{
|
|
87
|
+
key: "pathologicDiagnosisObs",
|
|
88
|
+
header: "Pathologic diagnosis",
|
|
89
|
+
},
|
|
80
90
|
{
|
|
81
91
|
key: "resultsEncounter",
|
|
82
92
|
header: "Results",
|
|
83
93
|
},
|
|
94
|
+
{
|
|
95
|
+
key: "PDFReport",
|
|
96
|
+
header: "Report",
|
|
97
|
+
},
|
|
84
98
|
];
|
|
85
99
|
|
|
86
100
|
React.useEffect(() => {
|
|
@@ -95,7 +109,9 @@ const ReportComponent = () => {
|
|
|
95
109
|
getEncounters(
|
|
96
110
|
config.healthCenterAttrTypeUUID,
|
|
97
111
|
config.pathologyFullAllowedLocationUUID
|
|
98
|
-
).then(
|
|
112
|
+
).then(
|
|
113
|
+
setEncountersList
|
|
114
|
+
);
|
|
99
115
|
}, []);
|
|
100
116
|
|
|
101
117
|
const filteredEncList = encountersList
|
|
@@ -129,12 +145,6 @@ const ReportComponent = () => {
|
|
|
129
145
|
);
|
|
130
146
|
}
|
|
131
147
|
});
|
|
132
|
-
//replace(/\s+/g, '');
|
|
133
|
-
// const rows = filteredEncList.map(
|
|
134
|
-
// (encounterInfo) => {
|
|
135
|
-
// return {
|
|
136
|
-
// // patientLink: <a href={`/openmrs/patientDashboard.form?patientId=${encounterInfo.personId}`} >Link</a>,
|
|
137
|
-
// ...
|
|
138
148
|
|
|
139
149
|
const rows = filteredEncList.map((encounterInfo) => {
|
|
140
150
|
return {
|
|
@@ -192,7 +202,8 @@ const ReportComponent = () => {
|
|
|
192
202
|
))}
|
|
193
203
|
</select>
|
|
194
204
|
),
|
|
195
|
-
dateOfRequest: encounterInfo.encounterDatetime
|
|
205
|
+
dateOfRequest: new Date(encounterInfo.encounterDatetime)
|
|
206
|
+
.toLocaleString(["en-GB","en-US","en","fr-RW"],{day: 'numeric',month: 'numeric',year: 'numeric'}),
|
|
196
207
|
referralStatus: (
|
|
197
208
|
<select
|
|
198
209
|
onChange={(e) =>
|
|
@@ -228,6 +239,7 @@ const ReportComponent = () => {
|
|
|
228
239
|
onChange={(e) => sampleDropOffChange(encounterInfo)}
|
|
229
240
|
/>
|
|
230
241
|
),
|
|
242
|
+
pathologicDiagnosisObs: encounterInfo.pathologicDiagnosisObs,
|
|
231
243
|
resultsEncounter: encounterInfo.resultsEncounterId ? (
|
|
232
244
|
<a
|
|
233
245
|
data-testid="resultsEncounter"
|
|
@@ -247,6 +259,18 @@ const ReportComponent = () => {
|
|
|
247
259
|
</a>
|
|
248
260
|
)
|
|
249
261
|
),
|
|
262
|
+
PDFReport:
|
|
263
|
+
encounterInfo.resultsEncounterId &&
|
|
264
|
+
(
|
|
265
|
+
encounterInfo.approvedBy &&
|
|
266
|
+
<PDFDownloadLink document={<MyDocument encounterInfo={encounterInfo} config={config} />} fileName="Pathology Report">
|
|
267
|
+
{({loading}) => (loading ? 'loading...' : <button>Download</button>)}
|
|
268
|
+
</PDFDownloadLink>
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
)
|
|
273
|
+
|
|
250
274
|
};
|
|
251
275
|
});
|
|
252
276
|
|
|
@@ -283,6 +307,7 @@ const ReportComponent = () => {
|
|
|
283
307
|
}
|
|
284
308
|
};
|
|
285
309
|
|
|
310
|
+
|
|
286
311
|
const sampleStatusChange = (
|
|
287
312
|
newStatus: { uuid: string; display: string },
|
|
288
313
|
encounterInfo
|
|
@@ -372,6 +397,7 @@ const ReportComponent = () => {
|
|
|
372
397
|
});
|
|
373
398
|
}
|
|
374
399
|
};
|
|
400
|
+
|
|
375
401
|
|
|
376
402
|
return (
|
|
377
403
|
<div>
|
|
@@ -436,6 +462,7 @@ const ReportComponent = () => {
|
|
|
436
462
|
onChange={(e) => setPatientName(e.target.value)}
|
|
437
463
|
/>
|
|
438
464
|
</div>
|
|
465
|
+
{console.log( encountersList)}
|
|
439
466
|
<div className={styles.tableContainer}>
|
|
440
467
|
<DataTable rows={rows} headers={headers}>
|
|
441
468
|
{({ rows, headers, getTableProps, getHeaderProps, getRowProps }) => (
|
|
@@ -462,6 +489,15 @@ const ReportComponent = () => {
|
|
|
462
489
|
)}
|
|
463
490
|
</DataTable>
|
|
464
491
|
</div>
|
|
492
|
+
<div>
|
|
493
|
+
{/* <PDFViewer>
|
|
494
|
+
<MyDocument />
|
|
495
|
+
</PDFViewer> */}
|
|
496
|
+
{/* <PDFDownloadLink document={<MyDocument />} fileName="Pathology Report">
|
|
497
|
+
{({loading}) => (loading ? 'loading...' : <button>Download</button>)}
|
|
498
|
+
</PDFDownloadLink> */}
|
|
499
|
+
|
|
500
|
+
</div>
|
|
465
501
|
</div>
|
|
466
502
|
);
|
|
467
503
|
};
|
package/src/test.html
ADDED
|
File without changes
|