@bahmni/clinical-app 0.0.1-dev.328 → 0.0.1-dev.330
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/{ConsultationPage-BLvxF8kV.js → ConsultationPage-C2Uocg1j.js} +7816 -7827
- package/dist/{DocumentsTable-Cd0rZQF3-CAeFGxaz.js → DocumentsTable-Il19n5sp-Dnv62E5k.js} +43 -43
- package/dist/FormsTable-CUvcHb6f-Bs-FhRl9.js +234 -0
- package/dist/{LNWAZHJI-SQd0D-eQ.js → LNWAZHJI-CGNUX_T0.js} +4 -4
- package/dist/{MWZ6AO7Z-P43V0sDv.js → MWZ6AO7Z-BVvg_5Wl.js} +3 -3
- package/dist/{Observations-3VgJK5Ks-BF9if6iv.js → Observations-CeCquAyF-DYz0-SHp.js} +58 -58
- package/dist/{YPM2AS64-Cqh6aPgw.js → YPM2AS64-Bf0OGz_l.js} +1 -1
- package/dist/components/consultationPad/__tests__/__mocks__/servicesMocks.d.ts +1 -1
- package/dist/components/consultationPad/__tests__/__mocks__/servicesMocks.d.ts.map +1 -1
- package/dist/components/consultationPad/services.d.ts.map +1 -1
- package/dist/components/forms/immunization/utils.d.ts.map +1 -1
- package/dist/components/forms/medicationRequest/utils.d.ts.map +1 -1
- package/dist/components/forms/observations/ObservationFormsContainer.d.ts.map +1 -1
- package/dist/constants/app.d.ts +0 -1
- package/dist/constants/app.d.ts.map +1 -1
- package/dist/{hook-DE7_WRwf.js → hook-C37CVFLY.js} +1 -1
- package/dist/{index-DSm8uWLC.js → index-ByPig1cy.js} +17 -17
- package/dist/{index-BHPHdADf.js → index-CQXUH749.js} +75268 -64125
- package/dist/{index-DEe43Szm.js → index-CgLzBjgf.js} +3 -3
- package/dist/index.css +1 -1
- package/dist/index.js +1 -1
- package/dist/services/encounterBundleService.d.ts +1 -2
- package/dist/services/encounterBundleService.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/FormsTable-CgyxKp9V-fNe7NXXc.js +0 -234
- package/dist/models/encounterBundle.d.ts +0 -8
- package/dist/models/encounterBundle.d.ts.map +0 -1
- package/dist/utils/fhir/encounterBundleCreator.d.ts +0 -5
- package/dist/utils/fhir/encounterBundleCreator.d.ts.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { ConditionInputEntry, DiagnosisInputEntry, Form2Observation } from '@bahmni/services';
|
|
1
|
+
import { ConditionInputEntry, DiagnosisInputEntry, Form2Observation, EncounterBundle } from '@bahmni/services';
|
|
2
2
|
import { BundleEntry, Encounter, Reference } from 'fhir/r4';
|
|
3
3
|
import { AllergyInputEntry } from '../models/allergy';
|
|
4
|
-
import { EncounterBundle } from '../models/encounterBundle';
|
|
5
4
|
import { ServiceRequestInputEntry } from '../models/serviceRequest';
|
|
6
5
|
interface CreateAllergiesBundleEntriesParams {
|
|
7
6
|
selectedAllergies: AllergyInputEntry[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encounterBundleService.d.ts","sourceRoot":"","sources":["../../src/services/encounterBundleService.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"encounterBundleService.d.ts","sourceRoot":"","sources":["../../src/services/encounterBundleService.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
import { jsx as i, jsxs as re, Fragment as ae } from "react/jsx-runtime";
|
|
2
|
-
import { u as te, n as oe, N as se, a as ne, e as de, m as ie, b as le, j as me, D as q, g as ue, f as ce, O as x, v as fe, E as ye, p as be, c as pe, d as ge } from "./index-BHPHdADf.js";
|
|
3
|
-
import { useQueryClient as he, useQuery as b } from "@tanstack/react-query";
|
|
4
|
-
import { useState as j, useMemo as d, useCallback as p } from "react";
|
|
5
|
-
const Ne = "FormsTable-module_formsTableBody__SvGha", Oe = "FormsTable-module_customAccordianItem__isszs", v = {
|
|
6
|
-
formsTableBody: Ne,
|
|
7
|
-
customAccordianItem: Oe
|
|
8
|
-
}, Ae = (u) => u ? u.extension?.find(
|
|
9
|
-
(l) => l.url === ge
|
|
10
|
-
)?.valueString : void 0, De = ({
|
|
11
|
-
episodeOfCareUuids: u,
|
|
12
|
-
encounterUuids: l,
|
|
13
|
-
config: k
|
|
14
|
-
}) => {
|
|
15
|
-
const { t: n } = te(), c = oe(), [f, E] = j(!1), [o, I] = j(null), {
|
|
16
|
-
numberOfVisits: w,
|
|
17
|
-
hideThumbnail: H = !1,
|
|
18
|
-
forms: y
|
|
19
|
-
} = k ?? {}, T = se(
|
|
20
|
-
u,
|
|
21
|
-
l
|
|
22
|
-
), K = he(), {
|
|
23
|
-
data: D = [],
|
|
24
|
-
isLoading: F,
|
|
25
|
-
isError: L,
|
|
26
|
-
error: V,
|
|
27
|
-
refetch: $
|
|
28
|
-
} = b({
|
|
29
|
-
queryKey: ["forms", c, u],
|
|
30
|
-
queryFn: () => ne(c, void 0, w),
|
|
31
|
-
enabled: !!c && !T
|
|
32
|
-
}), B = d(() => {
|
|
33
|
-
let e = D;
|
|
34
|
-
return l && l.length > 0 && (e = e.filter(
|
|
35
|
-
(r) => l.includes(r.encounterUuid)
|
|
36
|
-
)), Array.isArray(y) && y.length > 0 && (e = e.filter(
|
|
37
|
-
(r) => y.some((a) => a.toLowerCase() === r.formName.toLowerCase())
|
|
38
|
-
)), e;
|
|
39
|
-
}, [D, l, y]), { data: M = [] } = b({
|
|
40
|
-
queryKey: ["observationForms"],
|
|
41
|
-
queryFn: () => de()
|
|
42
|
-
}), S = p(
|
|
43
|
-
(e) => M.find((r) => r.name === e)?.uuid,
|
|
44
|
-
[M]
|
|
45
|
-
), g = d(() => {
|
|
46
|
-
if (o)
|
|
47
|
-
return S(o.formName);
|
|
48
|
-
}, [o, S]), {
|
|
49
|
-
data: m,
|
|
50
|
-
isLoading: z,
|
|
51
|
-
isError: G,
|
|
52
|
-
error: h
|
|
53
|
-
} = b({
|
|
54
|
-
queryKey: ["formMetadata", g],
|
|
55
|
-
queryFn: () => ie(g),
|
|
56
|
-
enabled: !!g && f
|
|
57
|
-
}), {
|
|
58
|
-
data: N,
|
|
59
|
-
isLoading: Q,
|
|
60
|
-
isError: Y,
|
|
61
|
-
error: O
|
|
62
|
-
} = b({
|
|
63
|
-
queryKey: ["formsEncounterFHIR", o?.encounterUuid],
|
|
64
|
-
queryFn: () => le(o.encounterUuid),
|
|
65
|
-
enabled: !!o?.encounterUuid && f
|
|
66
|
-
});
|
|
67
|
-
me(
|
|
68
|
-
(e) => {
|
|
69
|
-
e.patientUUID === c && e.updatedConcepts.size > 0 && ($(), K.invalidateQueries({ queryKey: ["formsEncounterFHIR"] }));
|
|
70
|
-
},
|
|
71
|
-
[c]
|
|
72
|
-
);
|
|
73
|
-
const J = d(() => !N?.entry || !o?.formName ? [] : N.entry.filter((e) => e.resource?.resourceType === "Observation").map((e) => e.resource).filter((e) => {
|
|
74
|
-
const r = Ae(e);
|
|
75
|
-
return !r || r.includes(o.formName);
|
|
76
|
-
}), [N, o?.formName]), P = d(() => {
|
|
77
|
-
if (!m?.schema) return;
|
|
78
|
-
const e = [], r = (a) => {
|
|
79
|
-
(a ?? []).forEach((s) => {
|
|
80
|
-
const t = s;
|
|
81
|
-
t.id != null && e.push(String(t.id)), t.controls && r(t.controls);
|
|
82
|
-
});
|
|
83
|
-
};
|
|
84
|
-
return r(
|
|
85
|
-
m.schema.controls ?? []
|
|
86
|
-
), e.length > 0 ? e : void 0;
|
|
87
|
-
}, [m]), W = d(() => {
|
|
88
|
-
if (!m?.schema) return;
|
|
89
|
-
const e = {}, r = (a, s) => {
|
|
90
|
-
for (const t of a)
|
|
91
|
-
if (t.type === "section") {
|
|
92
|
-
const A = t.label?.value ?? "Section";
|
|
93
|
-
r(t.controls ?? [], A);
|
|
94
|
-
} else
|
|
95
|
-
t.id != null && s && (e[String(t.id)] = s), t.controls && r(t.controls, s);
|
|
96
|
-
};
|
|
97
|
-
return r(
|
|
98
|
-
m.schema.controls ?? [],
|
|
99
|
-
null
|
|
100
|
-
), Object.keys(e).length > 0 ? e : void 0;
|
|
101
|
-
}, [m]), X = d(() => {
|
|
102
|
-
if (h)
|
|
103
|
-
return q(h).message;
|
|
104
|
-
if (O)
|
|
105
|
-
return q(O).message;
|
|
106
|
-
}, [h, O]), _ = d(
|
|
107
|
-
() => [
|
|
108
|
-
{ key: "recordedOn", header: n("RECORDED_ON") },
|
|
109
|
-
{ key: "recordedBy", header: n("RECORDED_BY") }
|
|
110
|
-
],
|
|
111
|
-
[n]
|
|
112
|
-
), Z = d(
|
|
113
|
-
() => [
|
|
114
|
-
{ key: "recordedOn", sortable: !0 },
|
|
115
|
-
{ key: "recordedBy", sortable: !0 }
|
|
116
|
-
],
|
|
117
|
-
[]
|
|
118
|
-
), C = d(() => {
|
|
119
|
-
const e = B.reduce(
|
|
120
|
-
(r, a) => {
|
|
121
|
-
const s = a.formName;
|
|
122
|
-
r[s] ??= [];
|
|
123
|
-
const t = a.providers.map((A) => A.providerName).filter(Boolean).join(", ");
|
|
124
|
-
return r[s].push({
|
|
125
|
-
id: a.encounterUuid,
|
|
126
|
-
formName: a.formName,
|
|
127
|
-
recordedOn: ue(a.encounterDateTime, n, !0).formattedResult,
|
|
128
|
-
recordedBy: t ?? "--",
|
|
129
|
-
encounterDateTime: a.encounterDateTime,
|
|
130
|
-
encounterUuid: a.encounterUuid
|
|
131
|
-
}), r;
|
|
132
|
-
},
|
|
133
|
-
{}
|
|
134
|
-
);
|
|
135
|
-
return Object.entries(e).map(
|
|
136
|
-
([r, a]) => ({
|
|
137
|
-
formName: r,
|
|
138
|
-
records: a.sort(
|
|
139
|
-
(s, t) => t.encounterDateTime - s.encounterDateTime
|
|
140
|
-
)
|
|
141
|
-
})
|
|
142
|
-
).sort((r, a) => r.formName.localeCompare(a.formName));
|
|
143
|
-
}, [B, n]), R = p((e) => {
|
|
144
|
-
I(e), E(!0);
|
|
145
|
-
}, []), ee = p(() => {
|
|
146
|
-
E(!1), I(null);
|
|
147
|
-
}, []), U = p(
|
|
148
|
-
(e, r) => {
|
|
149
|
-
switch (r) {
|
|
150
|
-
case "recordedOn":
|
|
151
|
-
return /* @__PURE__ */ i(ce, { onClick: () => R(e), children: e.recordedOn });
|
|
152
|
-
case "recordedBy":
|
|
153
|
-
return e.recordedBy;
|
|
154
|
-
default:
|
|
155
|
-
return null;
|
|
156
|
-
}
|
|
157
|
-
},
|
|
158
|
-
[R]
|
|
159
|
-
);
|
|
160
|
-
return /* @__PURE__ */ re(ae, { children: [
|
|
161
|
-
/* @__PURE__ */ i("div", { id: "forms-table", "data-testid": "forms-table", children: F || L || C.length === 0 || T ? /* @__PURE__ */ i(
|
|
162
|
-
x,
|
|
163
|
-
{
|
|
164
|
-
headers: _,
|
|
165
|
-
ariaLabel: n("FORMS_HEADING"),
|
|
166
|
-
rows: [],
|
|
167
|
-
loading: F,
|
|
168
|
-
errorStateMessage: L ? V?.message : void 0,
|
|
169
|
-
emptyStateMessage: n("FORMS_UNAVAILABLE"),
|
|
170
|
-
renderCell: U,
|
|
171
|
-
className: v.formsTableBody,
|
|
172
|
-
dataTestId: "forms-table"
|
|
173
|
-
}
|
|
174
|
-
) : /* @__PURE__ */ i(fe, { align: "start", children: C.map((e, r) => {
|
|
175
|
-
const { formName: a, records: s } = e;
|
|
176
|
-
return /* @__PURE__ */ i(
|
|
177
|
-
ye,
|
|
178
|
-
{
|
|
179
|
-
title: a,
|
|
180
|
-
className: v.customAccordianItem,
|
|
181
|
-
testId: `accordian-title-${a}`,
|
|
182
|
-
open: r === 0,
|
|
183
|
-
children: /* @__PURE__ */ i(
|
|
184
|
-
x,
|
|
185
|
-
{
|
|
186
|
-
headers: _,
|
|
187
|
-
ariaLabel: n("FORMS_HEADING"),
|
|
188
|
-
rows: s,
|
|
189
|
-
loading: !1,
|
|
190
|
-
errorStateMessage: "",
|
|
191
|
-
sortable: Z,
|
|
192
|
-
emptyStateMessage: n("FORMS_UNAVAILABLE"),
|
|
193
|
-
renderCell: U,
|
|
194
|
-
className: v.formsTableBody,
|
|
195
|
-
dataTestId: `forms-table-${a}`
|
|
196
|
-
}
|
|
197
|
-
)
|
|
198
|
-
},
|
|
199
|
-
a
|
|
200
|
-
);
|
|
201
|
-
}) }) }),
|
|
202
|
-
f && o && /* @__PURE__ */ i(
|
|
203
|
-
be,
|
|
204
|
-
{
|
|
205
|
-
id: "modalIdForActionAreaLayout",
|
|
206
|
-
portalId: "main-display-area",
|
|
207
|
-
open: f,
|
|
208
|
-
onRequestClose: ee,
|
|
209
|
-
modalHeading: o.formName,
|
|
210
|
-
modalLabel: `${o.recordedOn} | ${o.recordedBy}`,
|
|
211
|
-
passiveModal: !0,
|
|
212
|
-
size: "md",
|
|
213
|
-
testId: "form-details-modal",
|
|
214
|
-
children: /* @__PURE__ */ i(
|
|
215
|
-
pe,
|
|
216
|
-
{
|
|
217
|
-
observations: J,
|
|
218
|
-
isLoading: z || Q,
|
|
219
|
-
isError: G || Y,
|
|
220
|
-
errorMessage: X,
|
|
221
|
-
emptyStateMessage: n("NO_FORM_DATA_AVAILABLE"),
|
|
222
|
-
testIdPrefix: o.formName,
|
|
223
|
-
hideThumbnail: H,
|
|
224
|
-
controlOrder: P,
|
|
225
|
-
sectionMap: W
|
|
226
|
-
}
|
|
227
|
-
)
|
|
228
|
-
}
|
|
229
|
-
)
|
|
230
|
-
] });
|
|
231
|
-
};
|
|
232
|
-
export {
|
|
233
|
-
De as default
|
|
234
|
-
};
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { BundleEntry, FhirResource, Resource } from 'fhir/r4';
|
|
2
|
-
export interface EncounterBundle extends Resource {
|
|
3
|
-
readonly resourceType: 'EncounterBundle';
|
|
4
|
-
readonly type: 'transaction';
|
|
5
|
-
timestamp?: string | undefined;
|
|
6
|
-
entry?: Array<BundleEntry<FhirResource>> | undefined;
|
|
7
|
-
}
|
|
8
|
-
//# sourceMappingURL=encounterBundle.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"encounterBundle.d.ts","sourceRoot":"","sources":["../../src/models/encounterBundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE9D,MAAM,WAAW,eAAgB,SAAQ,QAAQ;IAC/C,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,KAAK,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,GAAG,SAAS,CAAC;CACtD"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { BundleEntry, FhirResource } from 'fhir/r4';
|
|
2
|
-
import { EncounterBundle } from '../../models/encounterBundle';
|
|
3
|
-
export declare const createEncounterBundle: (entries: Array<BundleEntry<FhirResource>>) => EncounterBundle;
|
|
4
|
-
export declare const createBundleEntry: (fullURL: string, resource: FhirResource, requestMethod: "POST" | "PUT" | "DELETE", resourceUrl?: string) => BundleEntry<FhirResource>;
|
|
5
|
-
//# sourceMappingURL=encounterBundleCreator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"encounterBundleCreator.d.ts","sourceRoot":"","sources":["../../../src/utils/fhir/encounterBundleCreator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,eAAO,MAAM,qBAAqB,GAChC,SAAS,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,KACxC,eAQF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,SAAS,MAAM,EACf,UAAU,YAAY,EACtB,eAAe,MAAM,GAAG,KAAK,GAAG,QAAQ,EACxC,cAAc,MAAM,KACnB,WAAW,CAAC,YAAY,CAS1B,CAAC"}
|