@openmrs/esm-generic-patient-widgets-app 11.3.0 → 11.3.1-patch.9064
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/.turbo/turbo-build.log +30 -26
- package/dist/1119.js +1 -1
- package/dist/1197.js +1 -1
- package/dist/1559.js +2 -0
- package/dist/1559.js.map +1 -0
- package/dist/2146.js +1 -1
- package/dist/251.js +2 -0
- package/dist/251.js.map +1 -0
- package/dist/2690.js +1 -1
- package/dist/3099.js +1 -1
- package/dist/3584.js +1 -1
- package/dist/4055.js +1 -1
- package/dist/4132.js +1 -1
- package/dist/4300.js +1 -1
- package/dist/4335.js +1 -1
- package/dist/4618.js +1 -1
- package/dist/4652.js +1 -1
- package/dist/4944.js +1 -1
- package/dist/5173.js +1 -1
- package/dist/5241.js +1 -1
- package/dist/5442.js +1 -1
- package/dist/5661.js +1 -1
- package/dist/5670.js +1 -0
- package/dist/5670.js.map +1 -0
- package/dist/5986.js +1 -1
- package/dist/5986.js.map +1 -1
- package/dist/6022.js +1 -1
- package/dist/6468.js +1 -1
- package/dist/6679.js +1 -1
- package/dist/6781.js +2 -0
- package/dist/{9582.js.LICENSE.txt → 6781.js.LICENSE.txt} +1 -1
- package/dist/6781.js.map +1 -0
- package/dist/6840.js +1 -1
- package/dist/6859.js +1 -1
- package/dist/7097.js +1 -1
- package/dist/7159.js +1 -1
- package/dist/723.js +1 -1
- package/dist/7617.js +1 -1
- package/dist/795.js +1 -1
- package/dist/8163.js +1 -1
- package/dist/8349.js +1 -1
- package/dist/8618.js +1 -1
- package/dist/8803.js +1 -0
- package/dist/8803.js.map +1 -0
- package/dist/890.js +1 -1
- package/dist/9214.js +1 -1
- package/dist/9538.js +1 -1
- package/dist/9569.js +1 -1
- package/dist/986.js +1 -1
- package/dist/9879.js +1 -1
- package/dist/9895.js +1 -1
- package/dist/9900.js +1 -1
- package/dist/9913.js +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.LICENSE.txt +1 -1
- package/dist/main.js.map +1 -1
- package/dist/openmrs-esm-generic-patient-widgets-app.js +1 -1
- package/dist/openmrs-esm-generic-patient-widgets-app.js.buildmanifest.json +210 -261
- package/dist/openmrs-esm-generic-patient-widgets-app.js.map +1 -1
- package/dist/routes.json +1 -1
- package/package.json +5 -4
- package/src/config-schema-obs-switchable.ts +9 -2
- package/src/obs-graph/obs-graph.component.tsx +105 -62
- package/src/obs-graph/obs-graph.scss +2 -11
- package/src/obs-switchable/obs-switchable.component.tsx +19 -24
- package/src/obs-switchable/obs-switchable.scss +1 -1
- package/src/obs-switchable/obs-switchable.test.tsx +275 -0
- package/src/obs-table/obs-table.component.tsx +1 -1
- package/src/resources/useObs.ts +1 -1
- package/translations/am.json +1 -4
- package/translations/ar.json +1 -4
- package/translations/ar_SY.json +1 -4
- package/translations/bn.json +1 -4
- package/translations/de.json +1 -4
- package/translations/en.json +1 -4
- package/translations/en_US.json +1 -4
- package/translations/es.json +1 -4
- package/translations/es_MX.json +1 -4
- package/translations/fr.json +1 -4
- package/translations/he.json +1 -4
- package/translations/hi.json +1 -4
- package/translations/hi_IN.json +1 -4
- package/translations/id.json +1 -4
- package/translations/it.json +1 -4
- package/translations/ka.json +1 -4
- package/translations/km.json +1 -4
- package/translations/ku.json +1 -4
- package/translations/ky.json +1 -4
- package/translations/lg.json +1 -4
- package/translations/ne.json +1 -4
- package/translations/pl.json +1 -4
- package/translations/pt.json +1 -4
- package/translations/pt_BR.json +1 -4
- package/translations/qu.json +1 -4
- package/translations/ro_RO.json +1 -4
- package/translations/ru_RU.json +1 -4
- package/translations/si.json +1 -4
- package/translations/sw.json +1 -4
- package/translations/sw_KE.json +1 -4
- package/translations/tr.json +1 -4
- package/translations/tr_TR.json +1 -4
- package/translations/uk.json +1 -4
- package/translations/uz.json +1 -4
- package/translations/uz@Latn.json +1 -4
- package/translations/uz_UZ.json +1 -4
- package/translations/vi.json +1 -4
- package/translations/zh.json +1 -4
- package/translations/zh_CN.json +1 -4
- package/dist/30.js +0 -2
- package/dist/30.js.map +0 -1
- package/dist/4051.js +0 -1
- package/dist/4051.js.map +0 -1
- package/dist/5048.js +0 -1
- package/dist/5048.js.map +0 -1
- package/dist/521.js +0 -2
- package/dist/521.js.map +0 -1
- package/dist/6432.js +0 -1
- package/dist/6432.js.map +0 -1
- package/dist/717.js +0 -1
- package/dist/717.js.map +0 -1
- package/dist/9582.js +0 -2
- package/dist/9582.js.map +0 -1
- /package/dist/{521.js.LICENSE.txt → 1559.js.LICENSE.txt} +0 -0
- /package/dist/{30.js.LICENSE.txt → 251.js.LICENSE.txt} +0 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { render, screen, waitFor } from '@testing-library/react';
|
|
3
|
+
import userEvent from '@testing-library/user-event';
|
|
4
|
+
import { LineChart } from '@carbon/charts-react';
|
|
5
|
+
import { getDefaultsFromConfigSchema, useConfig } from '@openmrs/esm-framework';
|
|
6
|
+
import ObsSwitchable from './obs-switchable.component';
|
|
7
|
+
import { useObs, type ObsResult } from '../resources/useObs';
|
|
8
|
+
import { configSchemaSwitchable } from '../config-schema-obs-switchable';
|
|
9
|
+
|
|
10
|
+
jest.mock('../resources/useObs', () => ({
|
|
11
|
+
useObs: jest.fn(),
|
|
12
|
+
}));
|
|
13
|
+
|
|
14
|
+
const mockLineChart = jest.mocked(LineChart);
|
|
15
|
+
|
|
16
|
+
const mockUseConfig = jest.mocked(useConfig);
|
|
17
|
+
|
|
18
|
+
const mockObsData = [
|
|
19
|
+
{
|
|
20
|
+
code: { text: 'Height' },
|
|
21
|
+
conceptUuid: '5090AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
|
|
22
|
+
dataType: 'Number',
|
|
23
|
+
effectiveDateTime: '2021-01-01T00:00:00Z',
|
|
24
|
+
valueQuantity: { value: 180 },
|
|
25
|
+
encounter: { reference: 'Encounter/123' },
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
code: { text: 'Height' },
|
|
29
|
+
conceptUuid: '5090AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
|
|
30
|
+
dataType: 'Number',
|
|
31
|
+
effectiveDateTime: '2021-02-01T00:00:00Z',
|
|
32
|
+
valueQuantity: { value: 182 },
|
|
33
|
+
encounter: { reference: 'Encounter/234' },
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
code: { text: 'Weight' },
|
|
37
|
+
conceptUuid: '2154AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
|
|
38
|
+
dataType: 'Number',
|
|
39
|
+
effectiveDateTime: '2021-01-01T00:00:00Z',
|
|
40
|
+
valueQuantity: { value: 70 },
|
|
41
|
+
encounter: { reference: 'Encounter/123' },
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
code: { text: 'Weight' },
|
|
45
|
+
conceptUuid: '2154AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
|
|
46
|
+
dataType: 'Number',
|
|
47
|
+
effectiveDateTime: '2021-02-01T00:00:00Z',
|
|
48
|
+
valueQuantity: { value: 72 },
|
|
49
|
+
encounter: { reference: 'Encounter/234' },
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
code: { text: 'Chief Complaint' },
|
|
53
|
+
conceptUuid: '164162AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
|
|
54
|
+
dataType: 'Text',
|
|
55
|
+
effectiveDateTime: '2021-01-01T00:00:00Z',
|
|
56
|
+
valueString: 'Too strong',
|
|
57
|
+
encounter: { reference: 'Encounter/123' },
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
code: { text: 'Power Level' },
|
|
61
|
+
conceptUuid: '164163AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
|
|
62
|
+
dataType: 'Number',
|
|
63
|
+
effectiveDateTime: '2021-01-01T00:00:00Z',
|
|
64
|
+
valueQuantity: { value: 9001 },
|
|
65
|
+
encounter: { reference: 'Encounter/123' },
|
|
66
|
+
},
|
|
67
|
+
];
|
|
68
|
+
|
|
69
|
+
const mockUseObs = jest.mocked(useObs);
|
|
70
|
+
|
|
71
|
+
describe('ObsSwitchable', () => {
|
|
72
|
+
it('should render all obs in table and numeric obs in graph', async () => {
|
|
73
|
+
mockUseObs.mockReturnValue({
|
|
74
|
+
data: mockObsData as Array<ObsResult>,
|
|
75
|
+
error: null,
|
|
76
|
+
isLoading: false,
|
|
77
|
+
isValidating: false,
|
|
78
|
+
});
|
|
79
|
+
mockUseConfig.mockReturnValue({
|
|
80
|
+
...(getDefaultsFromConfigSchema(configSchemaSwitchable) as Object),
|
|
81
|
+
title: 'My Stats',
|
|
82
|
+
data: [
|
|
83
|
+
{
|
|
84
|
+
concept: '5090AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
|
|
85
|
+
label: 'Tallitude',
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
concept: '2154AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
|
|
89
|
+
},
|
|
90
|
+
{ concept: '164162AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' },
|
|
91
|
+
{ concept: '164163AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' },
|
|
92
|
+
],
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
render(<ObsSwitchable patientUuid="123" />);
|
|
96
|
+
|
|
97
|
+
// Check table
|
|
98
|
+
expect(screen.getAllByRole('row')).toHaveLength(3);
|
|
99
|
+
const headerRow = screen.getAllByRole('row')[0];
|
|
100
|
+
expect(headerRow).toHaveTextContent('Tallitude');
|
|
101
|
+
expect(headerRow).toHaveTextContent('Weight');
|
|
102
|
+
expect(headerRow).toHaveTextContent('Chief Complaint');
|
|
103
|
+
expect(headerRow).toHaveTextContent('Power Level');
|
|
104
|
+
const firstRow = screen.getAllByRole('row')[1];
|
|
105
|
+
expect(firstRow).toHaveTextContent('180');
|
|
106
|
+
expect(firstRow).toHaveTextContent('70');
|
|
107
|
+
expect(firstRow).toHaveTextContent('Too strong');
|
|
108
|
+
expect(firstRow).toHaveTextContent('9001');
|
|
109
|
+
const secondRow = screen.getAllByRole('row')[2];
|
|
110
|
+
expect(secondRow).toHaveTextContent('182');
|
|
111
|
+
expect(secondRow).toHaveTextContent('72');
|
|
112
|
+
expect(secondRow).toHaveTextContent('--');
|
|
113
|
+
expect(secondRow).toHaveTextContent('--');
|
|
114
|
+
|
|
115
|
+
const user = userEvent.setup();
|
|
116
|
+
const chartViewButton = screen.getByLabelText('Chart view');
|
|
117
|
+
expect(chartViewButton).toBeInTheDocument();
|
|
118
|
+
await user.click(chartViewButton);
|
|
119
|
+
|
|
120
|
+
const tabs = screen.getByLabelText('Obs tabs');
|
|
121
|
+
expect(tabs).toHaveTextContent('Tallitude');
|
|
122
|
+
expect(tabs).toHaveTextContent('Weight');
|
|
123
|
+
expect(tabs).not.toHaveTextContent('Chief Complaint');
|
|
124
|
+
expect(tabs).toHaveTextContent('Power Level');
|
|
125
|
+
|
|
126
|
+
expect(mockLineChart).toHaveBeenNthCalledWith(
|
|
127
|
+
1,
|
|
128
|
+
expect.objectContaining({
|
|
129
|
+
data: [
|
|
130
|
+
{ group: 'Tallitude', key: '01-Jan-2021', value: 180 },
|
|
131
|
+
{ group: 'Tallitude', key: '01-Feb-2021', value: 182 },
|
|
132
|
+
],
|
|
133
|
+
options: expect.any(Object),
|
|
134
|
+
}),
|
|
135
|
+
{},
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
expect(mockLineChart).toHaveBeenNthCalledWith(
|
|
139
|
+
2,
|
|
140
|
+
expect.objectContaining({
|
|
141
|
+
data: [
|
|
142
|
+
{ group: 'Weight', key: '01-Jan-2021', value: 70 },
|
|
143
|
+
{ group: 'Weight', key: '01-Feb-2021', value: 72 },
|
|
144
|
+
],
|
|
145
|
+
options: expect.any(Object),
|
|
146
|
+
}),
|
|
147
|
+
{},
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
expect(mockLineChart).not.toHaveBeenCalledWith(
|
|
151
|
+
expect.objectContaining({
|
|
152
|
+
data: [expect.objectContaining({ group: 'Chief Complaint' })],
|
|
153
|
+
options: expect.any(Object),
|
|
154
|
+
}),
|
|
155
|
+
{},
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
expect(mockLineChart).toHaveBeenNthCalledWith(
|
|
159
|
+
3,
|
|
160
|
+
expect.objectContaining({
|
|
161
|
+
data: [{ group: 'Power Level', key: '01-Jan-2021', value: 9001 }],
|
|
162
|
+
options: expect.any(Object),
|
|
163
|
+
}),
|
|
164
|
+
{},
|
|
165
|
+
);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it('should support showing graph tab by default', async () => {
|
|
169
|
+
mockUseObs.mockReturnValue({
|
|
170
|
+
data: mockObsData as Array<ObsResult>,
|
|
171
|
+
error: null,
|
|
172
|
+
isLoading: false,
|
|
173
|
+
isValidating: false,
|
|
174
|
+
});
|
|
175
|
+
mockUseConfig.mockReturnValue({
|
|
176
|
+
...(getDefaultsFromConfigSchema(configSchemaSwitchable) as Object),
|
|
177
|
+
title: 'My Stats',
|
|
178
|
+
data: [{ concept: '5090AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' }, { concept: '2154AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' }],
|
|
179
|
+
showGraphByDefault: true,
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
render(<ObsSwitchable patientUuid="123" />);
|
|
183
|
+
|
|
184
|
+
const tabs = screen.getByLabelText('Obs tabs');
|
|
185
|
+
expect(tabs).toHaveTextContent('Height');
|
|
186
|
+
expect(tabs).toHaveTextContent('Weight');
|
|
187
|
+
|
|
188
|
+
expect(mockLineChart).toHaveBeenNthCalledWith(
|
|
189
|
+
1,
|
|
190
|
+
expect.objectContaining({
|
|
191
|
+
data: [
|
|
192
|
+
{ group: 'Height', key: '01-Jan-2021', value: 180 },
|
|
193
|
+
{ group: 'Height', key: '01-Feb-2021', value: 182 },
|
|
194
|
+
],
|
|
195
|
+
options: expect.any(Object),
|
|
196
|
+
}),
|
|
197
|
+
{},
|
|
198
|
+
);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it('should support grouping into multiline graphs', async () => {
|
|
202
|
+
mockUseObs.mockReturnValue({
|
|
203
|
+
data: mockObsData as Array<ObsResult>,
|
|
204
|
+
error: null,
|
|
205
|
+
isLoading: false,
|
|
206
|
+
isValidating: false,
|
|
207
|
+
});
|
|
208
|
+
mockUseConfig.mockReturnValue({
|
|
209
|
+
...(getDefaultsFromConfigSchema(configSchemaSwitchable) as Object),
|
|
210
|
+
title: 'My Stats',
|
|
211
|
+
showGraphByDefault: true,
|
|
212
|
+
data: [
|
|
213
|
+
{ concept: '164163AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', graphGroup: 'Power Level' },
|
|
214
|
+
{ concept: '5090AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', graphGroup: 'Biometrics' },
|
|
215
|
+
{ concept: '2154AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', graphGroup: 'Biometrics' },
|
|
216
|
+
],
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
render(<ObsSwitchable patientUuid="123" />);
|
|
220
|
+
|
|
221
|
+
const tabs = screen.getByLabelText('Obs tabs');
|
|
222
|
+
expect(tabs).toHaveTextContent('Power Level');
|
|
223
|
+
expect(tabs).toHaveTextContent('Biometrics');
|
|
224
|
+
|
|
225
|
+
expect(mockLineChart).toHaveBeenNthCalledWith(
|
|
226
|
+
1,
|
|
227
|
+
expect.objectContaining({
|
|
228
|
+
data: [{ group: 'Power Level', key: '01-Jan-2021', value: 9001 }],
|
|
229
|
+
options: expect.any(Object),
|
|
230
|
+
}),
|
|
231
|
+
{},
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
expect(mockLineChart).toHaveBeenNthCalledWith(
|
|
235
|
+
2,
|
|
236
|
+
expect.objectContaining({
|
|
237
|
+
data: [
|
|
238
|
+
{ group: 'Height', key: '01-Jan-2021', value: 180 },
|
|
239
|
+
{ group: 'Height', key: '01-Feb-2021', value: 182 },
|
|
240
|
+
{ group: 'Weight', key: '01-Jan-2021', value: 70 },
|
|
241
|
+
{ group: 'Weight', key: '01-Feb-2021', value: 72 },
|
|
242
|
+
],
|
|
243
|
+
options: expect.any(Object),
|
|
244
|
+
}),
|
|
245
|
+
{},
|
|
246
|
+
);
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
it('should hide the graph tab selection if there is only one graph', async () => {
|
|
250
|
+
mockUseObs.mockReturnValue({
|
|
251
|
+
data: mockObsData.filter((o) => o.conceptUuid === '164163AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA') as Array<ObsResult>,
|
|
252
|
+
error: null,
|
|
253
|
+
isLoading: false,
|
|
254
|
+
isValidating: false,
|
|
255
|
+
});
|
|
256
|
+
mockUseConfig.mockReturnValue({
|
|
257
|
+
...(getDefaultsFromConfigSchema(configSchemaSwitchable) as Object),
|
|
258
|
+
title: 'My Stats',
|
|
259
|
+
showGraphByDefault: true,
|
|
260
|
+
data: [{ concept: '164163AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' }],
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
render(<ObsSwitchable patientUuid="123" />);
|
|
264
|
+
|
|
265
|
+
expect(screen.queryByLabelText('Obs tabs')).not.toBeInTheDocument();
|
|
266
|
+
|
|
267
|
+
expect(mockLineChart).toHaveBeenCalledWith(
|
|
268
|
+
expect.objectContaining({
|
|
269
|
+
data: [{ group: 'Power Level', key: '01-Jan-2021', value: 9001 }],
|
|
270
|
+
options: expect.any(Object),
|
|
271
|
+
}),
|
|
272
|
+
{},
|
|
273
|
+
);
|
|
274
|
+
});
|
|
275
|
+
});
|
|
@@ -33,7 +33,7 @@ const ObsTable: React.FC<ObsTableProps> = ({ patientUuid }) => {
|
|
|
33
33
|
{ key: 'date', header: t('dateAndTime', 'Date and time'), isSortable: true },
|
|
34
34
|
...config.data.map(({ concept, label }) => ({
|
|
35
35
|
key: concept,
|
|
36
|
-
header: label,
|
|
36
|
+
header: label || obss.find((o) => o.conceptUuid == concept)?.code.text,
|
|
37
37
|
})),
|
|
38
38
|
];
|
|
39
39
|
|
package/src/resources/useObs.ts
CHANGED
package/translations/am.json
CHANGED
package/translations/ar.json
CHANGED
package/translations/ar_SY.json
CHANGED
package/translations/bn.json
CHANGED
package/translations/de.json
CHANGED
package/translations/en.json
CHANGED
package/translations/en_US.json
CHANGED
package/translations/es.json
CHANGED
package/translations/es_MX.json
CHANGED
package/translations/fr.json
CHANGED
package/translations/he.json
CHANGED
package/translations/hi.json
CHANGED
package/translations/hi_IN.json
CHANGED
package/translations/id.json
CHANGED
package/translations/it.json
CHANGED
package/translations/ka.json
CHANGED
package/translations/km.json
CHANGED
package/translations/ku.json
CHANGED
package/translations/ky.json
CHANGED
package/translations/lg.json
CHANGED
package/translations/ne.json
CHANGED
package/translations/pl.json
CHANGED
package/translations/pt.json
CHANGED
package/translations/pt_BR.json
CHANGED
package/translations/qu.json
CHANGED
package/translations/ro_RO.json
CHANGED
package/translations/ru_RU.json
CHANGED
package/translations/si.json
CHANGED
package/translations/sw.json
CHANGED
package/translations/sw_KE.json
CHANGED
package/translations/tr.json
CHANGED
package/translations/tr_TR.json
CHANGED
package/translations/uk.json
CHANGED
package/translations/uz.json
CHANGED