@openmrs/esm-patient-chart-app 11.3.0 → 11.3.1-patch.9310
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 +27 -24
- package/dist/1119.js +1 -1
- package/dist/1197.js +1 -1
- package/dist/1815.js +2 -0
- package/dist/1815.js.map +1 -0
- package/dist/2146.js +1 -1
- package/dist/2690.js +1 -1
- package/dist/2761.js +1 -1
- package/dist/2761.js.map +1 -1
- package/dist/2859.js +1 -1
- package/dist/2859.js.map +1 -1
- package/dist/3099.js +1 -1
- package/dist/3584.js +1 -1
- package/dist/3697.js +1 -0
- package/dist/3697.js.map +1 -0
- 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/4632.js +1 -1
- package/dist/4632.js.map +1 -1
- package/dist/4652.js +1 -1
- package/dist/4718.js +1 -1
- package/dist/4754.js +1 -1
- package/dist/4944.js +1 -1
- package/dist/5173.js +1 -1
- package/dist/5205.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/5827.js +1 -0
- package/dist/5827.js.map +1 -0
- package/dist/6022.js +1 -1
- package/dist/6336.js +1 -0
- package/dist/6336.js.map +1 -0
- package/dist/6411.js +1 -1
- package/dist/6411.js.map +1 -1
- package/dist/6468.js +1 -1
- package/dist/6529.js +1 -1
- package/dist/6568.js +1 -0
- package/dist/6568.js.map +1 -0
- package/dist/6679.js +1 -1
- package/dist/68.js +2 -0
- package/dist/68.js.map +1 -0
- package/dist/6840.js +1 -1
- package/dist/6859.js +1 -1
- package/dist/6924.js +1 -0
- package/dist/6924.js.map +1 -0
- 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/7816.js +2 -0
- package/dist/7816.js.map +1 -0
- package/dist/7818.js +1 -0
- package/dist/7818.js.map +1 -0
- package/dist/7822.js +1 -0
- package/dist/7822.js.map +1 -0
- package/dist/795.js +1 -1
- package/dist/8163.js +1 -1
- package/dist/8260.js +1 -0
- package/dist/8260.js.map +1 -0
- package/dist/8278.js +1 -0
- package/dist/8278.js.map +1 -0
- package/dist/8349.js +1 -1
- package/dist/8454.js +1 -1
- package/dist/8454.js.map +1 -1
- package/dist/8618.js +1 -1
- package/dist/8709.js +1 -1
- package/dist/8709.js.map +1 -1
- package/dist/890.js +1 -1
- package/dist/9007.js +1 -1
- package/dist/9007.js.map +1 -1
- package/dist/9214.js +1 -1
- package/dist/{4727.js → 9294.js} +1 -1
- package/dist/9294.js.map +1 -0
- package/dist/9329.js +1 -0
- package/dist/9329.js.map +1 -0
- 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.map +1 -1
- package/dist/openmrs-esm-patient-chart-app.js +1 -1
- package/dist/openmrs-esm-patient-chart-app.js.buildmanifest.json +457 -453
- package/dist/openmrs-esm-patient-chart-app.js.map +1 -1
- package/dist/routes.json +1 -1
- package/package.json +5 -4
- package/src/actions-buttons/delete-visit.component.tsx +8 -3
- package/src/actions-buttons/mark-patient-deceased.component.tsx +2 -2
- package/src/actions-buttons/start-visit.component.tsx +10 -5
- package/src/actions-buttons/start-visit.test.tsx +9 -5
- package/src/actions-buttons/stop-visit.component.tsx +1 -1
- package/src/clinical-views/encounter-list/{encounter-list-tabs.component.tsx → encounter-list-tabs.extension.tsx} +10 -6
- package/src/clinical-views/encounter-list/tag.component.test.tsx +306 -0
- package/src/clinical-views/encounter-list/tag.component.tsx +27 -28
- package/src/clinical-views/encounter-tile/encounter-tile.component.tsx +7 -6
- package/src/clinical-views/encounter-tile/tile.scss +0 -1
- package/src/clinical-views/hooks/useEncountersByVisit.ts +13 -0
- package/src/clinical-views/hooks/useLastEncounter.ts +1 -1
- package/src/clinical-views/types.ts +2 -1
- package/src/clinical-views/utils/concept-utils.ts +24 -0
- package/src/clinical-views/utils/helpers.ts +2 -2
- package/src/clinical-views/utils/index.ts +4 -1
- package/src/config-schema.ts +42 -9
- package/src/dashboard.meta.ts +4 -2
- package/src/index.ts +21 -22
- package/src/mark-patient-deceased/mark-patient-deceased-form.test.tsx +22 -11
- package/src/mark-patient-deceased/mark-patient-deceased-form.workspace.tsx +147 -138
- package/src/patient-banner-tags/{visit-attribute-tags.component.tsx → visit-attribute-tags.extension.tsx} +9 -4
- package/src/patient-chart/chart-review/dashboard-view.component.tsx +2 -2
- package/src/patient-chart/patient-chart.component.tsx +19 -36
- package/src/patient-chart/patient-chart.resources.ts +150 -0
- package/src/routes.json +17 -6
- package/src/visit/hooks/useDeleteVisit.test.tsx +39 -42
- package/src/visit/hooks/useDeleteVisit.tsx +33 -17
- package/src/visit/start-visit-button.component.tsx +2 -2
- package/src/visit/start-visit-button.test.tsx +2 -2
- package/src/visit/visit-action-items/edit-visit-details.component.tsx +29 -8
- package/src/visit/visit-form/base-visit-type.component.tsx +2 -2
- package/src/visit/visit-form/exported-visit-form.workspace.tsx +697 -0
- package/src/visit/visit-form/visit-attribute-type.component.tsx +2 -1
- package/src/visit/visit-form/visit-form.resource.ts +2 -1
- package/src/visit/visit-form/visit-form.test.tsx +28 -25
- package/src/visit/visit-form/visit-form.workspace.tsx +63 -643
- package/src/visit/visit-history-table/visit-actions-cell.component.tsx +3 -2
- package/src/visit/visit-history-table/visit-date-cell.component.tsx +1 -0
- package/src/visit/visit-history-table/visit-diagnoses-cell.component.tsx +1 -0
- package/src/visit/visit-history-table/visit-history-table.component.tsx +3 -2
- package/src/visit/visit-history-table/visit-type-cell.component.tsx +1 -0
- package/src/visit/visit-prompt/{delete-visit-dialog.component.tsx → delete-visit-dialog.modal.tsx} +10 -4
- package/src/visit/visit-prompt/delete-visit-dialog.test.tsx +21 -3
- package/src/visit/visit-prompt/{end-visit-dialog.component.tsx → end-visit-dialog.modal.tsx} +7 -1
- package/src/visit/visit-prompt/end-visit-dialog.test.tsx +20 -1
- package/src/visit/visit-prompt/{start-visit-dialog.component.tsx → start-visit-dialog.modal.tsx} +10 -4
- package/src/visit/visit-prompt/start-visit-dialog.test.tsx +3 -3
- package/src/visit/visits-widget/active-visit-buttons/active-visit-buttons.tsx +7 -6
- package/src/visit/visits-widget/current-visit-summary.extension.tsx +48 -0
- package/src/visit/visits-widget/current-visit-summary.test.tsx +45 -25
- package/src/visit/visits-widget/past-visits-components/encounters-table/encounters-table.component.tsx +15 -37
- package/src/visit/visits-widget/past-visits-components/encounters-table/encounters-table.resource.ts +0 -1
- package/src/visit/visits-widget/past-visits-components/medications-summary.component.tsx +2 -3
- package/src/visit/visits-widget/past-visits-components/visit-summary.component.tsx +8 -1
- package/src/visit/visits-widget/past-visits-components/visit-summary.scss +1 -1
- package/src/visit/visits-widget/single-visit-details/visit-timeline/visit-timeline.component.tsx +94 -0
- package/src/visit/visits-widget/single-visit-details/visit-timeline/visit-timeline.scss +60 -0
- package/src/visit/visits-widget/visit-context/retrospective-data-date-time-picker/retrospective-date-time-picker.component.tsx +6 -7
- package/src/visit/visits-widget/visit-context/{visit-context-header.component.tsx → visit-context-header.extension.tsx} +17 -15
- package/src/visit/visits-widget/visit-context/visit-context-header.test.tsx +35 -29
- package/src/visit/visits-widget/visit-context/visit-context-switcher.modal.tsx +15 -13
- package/src/visit/visits-widget/visit-context/visit-context-switcher.test.tsx +31 -9
- package/src/visit/visits-widget/visit-detail-overview.component.tsx +3 -2
- package/src/visit/visits-widget/visit-detail-overview.test.tsx +4 -4
- package/src/visit/visits-widget/visit.resource.tsx +1 -1
- package/translations/am.json +6 -0
- package/translations/ar.json +6 -0
- package/translations/ar_SY.json +6 -0
- package/translations/bn.json +6 -0
- package/translations/de.json +6 -0
- package/translations/en.json +7 -2
- package/translations/en_US.json +6 -0
- package/translations/es.json +6 -0
- package/translations/es_MX.json +6 -0
- package/translations/fr.json +15 -9
- package/translations/he.json +6 -0
- package/translations/hi.json +6 -0
- package/translations/hi_IN.json +6 -0
- package/translations/id.json +6 -0
- package/translations/it.json +24 -18
- package/translations/ka.json +6 -0
- package/translations/km.json +6 -0
- package/translations/ku.json +6 -0
- package/translations/ky.json +6 -0
- package/translations/lg.json +6 -0
- package/translations/ne.json +6 -0
- package/translations/pl.json +6 -0
- package/translations/pt.json +6 -0
- package/translations/pt_BR.json +6 -0
- package/translations/qu.json +6 -0
- package/translations/ro_RO.json +6 -0
- package/translations/ru_RU.json +6 -0
- package/translations/si.json +6 -0
- package/translations/sw.json +6 -0
- package/translations/sw_KE.json +6 -0
- package/translations/tr.json +6 -0
- package/translations/tr_TR.json +6 -0
- package/translations/uk.json +6 -0
- package/translations/uz.json +6 -0
- package/translations/uz@Latn.json +6 -0
- package/translations/uz_UZ.json +6 -0
- package/translations/vi.json +6 -0
- package/translations/zh.json +6 -0
- package/translations/zh_CN.json +6 -0
- package/dist/2537.js +0 -1
- package/dist/2537.js.map +0 -1
- package/dist/2735.js +0 -2
- package/dist/2735.js.map +0 -1
- package/dist/276.js +0 -1
- package/dist/276.js.map +0 -1
- package/dist/3042.js +0 -1
- package/dist/3042.js.map +0 -1
- package/dist/3119.js +0 -1
- package/dist/3119.js.map +0 -1
- package/dist/3184.js +0 -1
- package/dist/3184.js.map +0 -1
- package/dist/385.js +0 -2
- package/dist/385.js.map +0 -1
- package/dist/3905.js +0 -1
- package/dist/3905.js.map +0 -1
- package/dist/4713.js +0 -1
- package/dist/4713.js.map +0 -1
- package/dist/4727.js.map +0 -1
- package/dist/717.js +0 -1
- package/dist/717.js.map +0 -1
- package/dist/9162.js +0 -2
- package/dist/9162.js.map +0 -1
- package/dist/9206.js +0 -1
- package/dist/9206.js.map +0 -1
- package/dist/9615.js +0 -1
- package/dist/9615.js.map +0 -1
- package/src/visit/visits-widget/current-visit-summary.component.tsx +0 -55
- /package/dist/{9162.js.LICENSE.txt → 1815.js.LICENSE.txt} +0 -0
- /package/dist/{385.js.LICENSE.txt → 68.js.LICENSE.txt} +0 -0
- /package/dist/{2735.js.LICENSE.txt → 7816.js.LICENSE.txt} +0 -0
package/src/visit/visits-widget/single-visit-details/visit-timeline/visit-timeline.component.tsx
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import dayjs from 'dayjs';
|
|
3
|
+
import { useTranslation } from 'react-i18next';
|
|
4
|
+
import { SkeletonText } from '@carbon/react';
|
|
5
|
+
import { formatDate } from '@openmrs/esm-framework';
|
|
6
|
+
import { CardHeader, EmptyState } from '@openmrs/esm-patient-common-lib';
|
|
7
|
+
import { useEncountersByVisit } from '../../../../clinical-views/hooks/useEncountersByVisit';
|
|
8
|
+
import styles from './visit-timeline.scss';
|
|
9
|
+
|
|
10
|
+
interface VisitTimelineProps {
|
|
11
|
+
patientUuid: string;
|
|
12
|
+
visitUuid: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function VisitTimeline({ patientUuid, visitUuid }: VisitTimelineProps) {
|
|
16
|
+
const { t } = useTranslation();
|
|
17
|
+
const { encounters, isLoading } = useEncountersByVisit(patientUuid, visitUuid);
|
|
18
|
+
|
|
19
|
+
if (isLoading) {
|
|
20
|
+
return (
|
|
21
|
+
<div className={styles.visitTimeline}>
|
|
22
|
+
<CardHeader title={t('timeline', 'Timeline')}>{null}</CardHeader>
|
|
23
|
+
<p className={styles.timelineHeader}>
|
|
24
|
+
<span>{t('encounter', 'Encounter')}</span> <span>·</span>
|
|
25
|
+
<span>{t('provider', 'Provider')}</span> <span>·</span>{' '}
|
|
26
|
+
<span>
|
|
27
|
+
{t('timeStarted', 'Time started')} <span>—</span> {t('timeCompleted', 'Time completed')}{' '}
|
|
28
|
+
</span>
|
|
29
|
+
</p>
|
|
30
|
+
<div className={styles.timelineEntries}>
|
|
31
|
+
{Array.from({ length: 3 }).map((_, index) => (
|
|
32
|
+
<p className={styles.timelineEntry} key={index}>
|
|
33
|
+
<div className={styles.timelineDot} />
|
|
34
|
+
<SkeletonText className={styles.skeleton} />
|
|
35
|
+
<span>·</span>
|
|
36
|
+
<SkeletonText className={styles.skeleton} />
|
|
37
|
+
<span>·</span>
|
|
38
|
+
<SkeletonText className={styles.skeleton} />
|
|
39
|
+
<span>—</span>
|
|
40
|
+
<SkeletonText className={styles.skeleton} />
|
|
41
|
+
</p>
|
|
42
|
+
))}
|
|
43
|
+
<div className={styles.timelineLine} />
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (encounters?.length === 0) {
|
|
50
|
+
return (
|
|
51
|
+
<EmptyState
|
|
52
|
+
displayText={t('encountersForThisVisit', 'encounters for this visit')}
|
|
53
|
+
headerTitle={t('timeline', 'Timeline')}
|
|
54
|
+
/>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return (
|
|
59
|
+
<div className={styles.visitTimeline}>
|
|
60
|
+
<p className={styles.timelineHeader}>
|
|
61
|
+
<span>{t('encounter', 'Encounter')}</span> <span>·</span>
|
|
62
|
+
<span>{t('provider', 'Provider')}</span> <span>·</span>
|
|
63
|
+
<span>{t('timeStarted', 'Time started')}</span>
|
|
64
|
+
</p>
|
|
65
|
+
<div className={styles.timelineEntries}>
|
|
66
|
+
{encounters?.map((encounter) => (
|
|
67
|
+
<p className={styles.timelineEntry} key={encounter.uuid}>
|
|
68
|
+
<div className={styles.timelineDot} />
|
|
69
|
+
<span className={styles.encounterType}>{encounter.encounterType.display}</span>
|
|
70
|
+
<span>·</span>
|
|
71
|
+
{encounter.encounterProviders.length === 0 ? (
|
|
72
|
+
<span>{t('noProvider', 'No provider')}</span>
|
|
73
|
+
) : (
|
|
74
|
+
<span>
|
|
75
|
+
{encounter.encounterProviders
|
|
76
|
+
.map((encounterProvider) => encounterProvider.provider.person.display)
|
|
77
|
+
.join(', ')}
|
|
78
|
+
</span>
|
|
79
|
+
)}
|
|
80
|
+
<span>·</span>{' '}
|
|
81
|
+
<span>
|
|
82
|
+
{formatDate(new Date(encounter.encounterDatetime), {
|
|
83
|
+
time: dayjs(encounter.encounterDatetime).isSame(dayjs(), 'day') ? 'for today' : true,
|
|
84
|
+
})}
|
|
85
|
+
</span>
|
|
86
|
+
</p>
|
|
87
|
+
))}
|
|
88
|
+
<div className={styles.timelineLine} />
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export default VisitTimeline;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
@use '@carbon/colors';
|
|
2
|
+
@use '@carbon/layout';
|
|
3
|
+
@use '@carbon/type';
|
|
4
|
+
|
|
5
|
+
.visitTimeline {
|
|
6
|
+
border: 1px solid colors.$gray-20;
|
|
7
|
+
background-color: colors.$white;
|
|
8
|
+
padding-top: layout.$spacing-05;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.timelineHeader {
|
|
12
|
+
padding: 0 layout.$spacing-10;
|
|
13
|
+
@include type.type-style('helper-text-01');
|
|
14
|
+
display: flex;
|
|
15
|
+
gap: layout.$spacing-03;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.timelineEntries {
|
|
19
|
+
margin: 0 layout.$spacing-08;
|
|
20
|
+
margin-top: layout.$spacing-04;
|
|
21
|
+
display: flex;
|
|
22
|
+
flex-direction: column;
|
|
23
|
+
gap: layout.$spacing-05;
|
|
24
|
+
margin-bottom: layout.$spacing-05;
|
|
25
|
+
position: relative;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.timelineEntry {
|
|
29
|
+
display: flex;
|
|
30
|
+
gap: layout.$spacing-03;
|
|
31
|
+
align-items: center;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.encounterType {
|
|
35
|
+
font-weight: 700;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.timelineDot {
|
|
39
|
+
height: 8px;
|
|
40
|
+
width: 8px;
|
|
41
|
+
background-color: colors.$blue-30;
|
|
42
|
+
border-radius: 50%;
|
|
43
|
+
display: inline-block;
|
|
44
|
+
margin-right: layout.$spacing-03;
|
|
45
|
+
z-index: 10;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.timelineLine {
|
|
49
|
+
position: absolute;
|
|
50
|
+
border-left: 1px solid colors.$blue-20;
|
|
51
|
+
height: 100%;
|
|
52
|
+
left: 3.4px;
|
|
53
|
+
top: 4px;
|
|
54
|
+
z-index: 9;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.skeleton {
|
|
58
|
+
width: 5% !important; // using hardcoded px values could be a bad idea.
|
|
59
|
+
margin-bottom: 0 !important;
|
|
60
|
+
}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { SelectItem, TimePickerSelect, TimePicker, Checkbox } from '@carbon/react';
|
|
2
|
-
import { OpenmrsDatePicker, ResponsiveWrapper, useFeatureFlag,
|
|
2
|
+
import { OpenmrsDatePicker, ResponsiveWrapper, useFeatureFlag, type Visit } from '@openmrs/esm-framework';
|
|
3
3
|
import React, { useEffect, useState } from 'react';
|
|
4
4
|
import { type Control, Controller, useForm } from 'react-hook-form';
|
|
5
5
|
import { useTranslation } from 'react-i18next';
|
|
6
6
|
import styles from './restrospective-date-time-picker.scss';
|
|
7
|
-
import { useSystemVisitSetting } from '@openmrs/esm-patient-common-lib';
|
|
8
7
|
|
|
9
8
|
type FormValues = {
|
|
10
9
|
retrospectiveDate: Date;
|
|
@@ -14,22 +13,22 @@ type FormValues = {
|
|
|
14
13
|
|
|
15
14
|
type RetrospectiveDateTimePickerProps = {
|
|
16
15
|
patientUuid: string;
|
|
16
|
+
visitContext: Visit;
|
|
17
17
|
control?: Control<FormValues>;
|
|
18
18
|
onChange?: (data: FormValues) => void;
|
|
19
19
|
};
|
|
20
20
|
|
|
21
21
|
const RetrospectiveDateTimePicker = ({
|
|
22
|
-
|
|
22
|
+
visitContext,
|
|
23
23
|
control: propControl,
|
|
24
24
|
onChange,
|
|
25
25
|
}: RetrospectiveDateTimePickerProps) => {
|
|
26
26
|
const { t } = useTranslation();
|
|
27
27
|
const isRdeEnabled = useFeatureFlag('rde');
|
|
28
28
|
|
|
29
|
-
const
|
|
30
|
-
const
|
|
31
|
-
const
|
|
32
|
-
const minDate = currentVisit?.startDatetime;
|
|
29
|
+
const isActiveVisit = !Boolean(visitContext && visitContext.stopDatetime);
|
|
30
|
+
const maxDate = visitContext?.stopDatetime;
|
|
31
|
+
const minDate = visitContext?.startDatetime;
|
|
33
32
|
|
|
34
33
|
const [manuallyEnableDateTimePicker, setManuallyEnableDateTimePicker] = useState<boolean>(false);
|
|
35
34
|
|
|
@@ -1,24 +1,33 @@
|
|
|
1
|
-
import { Button
|
|
2
|
-
import { showModal, useFeatureFlag
|
|
1
|
+
import { Button } from '@carbon/react';
|
|
2
|
+
import { showModal, useFeatureFlag } from '@openmrs/esm-framework';
|
|
3
3
|
import classNames from 'classnames';
|
|
4
4
|
import React from 'react';
|
|
5
5
|
import { useTranslation } from 'react-i18next';
|
|
6
6
|
import styles from './visit-context-header.scss';
|
|
7
7
|
import VisitContextInfo from './visit-context-info.component';
|
|
8
|
-
import { useSystemVisitSetting } from '@openmrs/esm-patient-common-lib';
|
|
8
|
+
import { usePatientChartStore, useSystemVisitSetting } from '@openmrs/esm-patient-common-lib';
|
|
9
9
|
|
|
10
10
|
interface VisitContextHeaderProps {
|
|
11
11
|
patientUuid: string;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
+
/**
|
|
15
|
+
* The visit context header displays the currently select visit context in the patient chart store.
|
|
16
|
+
* When creating encounters (ex: visit notes, order entry, vitals), they are associated
|
|
17
|
+
* with the visit in context.
|
|
18
|
+
*
|
|
19
|
+
* This extension uses the patient chart store and should only be shown within the patient chart.
|
|
20
|
+
* It does not render when mounted outside the patient chart.
|
|
21
|
+
*/
|
|
14
22
|
const VisitContextHeader: React.FC<VisitContextHeaderProps> = ({ patientUuid }) => {
|
|
15
23
|
const { t } = useTranslation();
|
|
16
24
|
const { systemVisitEnabled } = useSystemVisitSetting();
|
|
17
25
|
const isRdeEnabled = useFeatureFlag('rde');
|
|
18
|
-
const showVisitContextHeader = systemVisitEnabled && isRdeEnabled;
|
|
19
26
|
|
|
20
|
-
const {
|
|
21
|
-
const isActiveVisit =
|
|
27
|
+
const { visitContext } = usePatientChartStore(patientUuid);
|
|
28
|
+
const isActiveVisit = Boolean(visitContext && !visitContext.stopDatetime);
|
|
29
|
+
|
|
30
|
+
const showVisitContextHeader = systemVisitEnabled && isRdeEnabled && visitContext;
|
|
22
31
|
|
|
23
32
|
const openVisitSwitcherModal = () => {
|
|
24
33
|
const dispose = showModal('visit-context-switcher', {
|
|
@@ -31,26 +40,19 @@ const VisitContextHeader: React.FC<VisitContextHeaderProps> = ({ patientUuid })
|
|
|
31
40
|
if (!showVisitContextHeader) {
|
|
32
41
|
return null;
|
|
33
42
|
}
|
|
34
|
-
if (isLoading) {
|
|
35
|
-
return (
|
|
36
|
-
<div className={styles.visitContextHeader}>
|
|
37
|
-
<Loading small />
|
|
38
|
-
</div>
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
43
|
return (
|
|
42
44
|
<div
|
|
43
45
|
className={classNames(styles.visitContextHeader, isActiveVisit ? styles.activeVisit : styles.retroactiveVisit)}
|
|
44
46
|
>
|
|
45
47
|
<div className={styles.addingTo}>{t('addingToVisit', 'Adding to:')}</div>
|
|
46
|
-
<div className={styles.visitType}>{
|
|
48
|
+
<div className={styles.visitType}>{visitContext.visitType?.display}</div>
|
|
47
49
|
<div className={styles.changeVisitButton}>
|
|
48
50
|
<Button kind="ghost" size="sm" onClick={openVisitSwitcherModal}>
|
|
49
51
|
{t('change', 'Change')}
|
|
50
52
|
</Button>
|
|
51
53
|
</div>
|
|
52
54
|
<div className={styles.visitInfo}>
|
|
53
|
-
<VisitContextInfo visit={
|
|
55
|
+
<VisitContextInfo visit={visitContext} />
|
|
54
56
|
</div>
|
|
55
57
|
</div>
|
|
56
58
|
);
|
|
@@ -1,51 +1,57 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { useSystemVisitSetting } from '@openmrs/esm-patient-common-lib';
|
|
1
|
+
import { usePatientChartStore, useSystemVisitSetting } from '@openmrs/esm-patient-common-lib';
|
|
3
2
|
import { render, screen } from '@testing-library/react';
|
|
4
3
|
import { mockCurrentVisit } from '__mocks__';
|
|
5
4
|
import React from 'react';
|
|
6
|
-
import VisitContextHeader from './visit-context-header.
|
|
5
|
+
import VisitContextHeader from './visit-context-header.extension';
|
|
6
|
+
import { mockPatient } from 'tools';
|
|
7
7
|
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
errorFetchingSystemVisitSetting: null,
|
|
11
|
-
isLoadingSystemVisitSetting: false,
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
jest.mocked(useVisitContextStore).mockReturnValue({
|
|
15
|
-
manuallySetVisitUuid: null,
|
|
16
|
-
mutateVisitCallbacks: {},
|
|
17
|
-
patientUuid: null,
|
|
18
|
-
setVisitContext: jest.fn(),
|
|
19
|
-
mutateVisit: jest.fn(),
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
jest.mocked(useVisit).mockReturnValue({
|
|
23
|
-
currentVisit: mockCurrentVisit,
|
|
24
|
-
error: null,
|
|
25
|
-
mutate: jest.fn(),
|
|
26
|
-
isValidating: false,
|
|
27
|
-
activeVisit: null,
|
|
28
|
-
currentVisitIsRetrospective: false,
|
|
29
|
-
isLoading: false,
|
|
30
|
-
});
|
|
8
|
+
const mockUsePatientChartStore = jest.mocked(usePatientChartStore);
|
|
9
|
+
const mockUseSystemVisitSetting = jest.mocked(useSystemVisitSetting);
|
|
31
10
|
|
|
32
|
-
jest.mock('@openmrs/esm-patient-common-lib
|
|
33
|
-
|
|
11
|
+
jest.mock('@openmrs/esm-patient-common-lib', () => ({
|
|
12
|
+
usePatientChartStore: jest.fn(),
|
|
13
|
+
useSystemVisitSetting: jest.fn(),
|
|
34
14
|
}));
|
|
35
15
|
|
|
36
16
|
describe('VisitContextHeader', () => {
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
mockUseSystemVisitSetting.mockReturnValue({
|
|
19
|
+
systemVisitEnabled: true,
|
|
20
|
+
errorFetchingSystemVisitSetting: null,
|
|
21
|
+
isLoadingSystemVisitSetting: false,
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
|
|
37
25
|
it('should not show header if system does not support visits', () => {
|
|
38
26
|
mockUseSystemVisitSetting.mockReturnValueOnce({
|
|
39
27
|
systemVisitEnabled: false,
|
|
40
28
|
errorFetchingSystemVisitSetting: null,
|
|
41
29
|
isLoadingSystemVisitSetting: false,
|
|
42
30
|
});
|
|
31
|
+
mockUsePatientChartStore.mockReturnValue({
|
|
32
|
+
patientUuid: mockPatient.id,
|
|
33
|
+
patient: mockPatient,
|
|
34
|
+
visitContext: null,
|
|
35
|
+
mutateVisitContext: null,
|
|
36
|
+
setPatient: jest.fn(),
|
|
37
|
+
setVisitContext: jest.fn(),
|
|
38
|
+
});
|
|
39
|
+
|
|
43
40
|
render(<VisitContextHeader patientUuid="some-uuid" />);
|
|
44
41
|
expect(screen.queryByText('Adding to')).not.toBeInTheDocument();
|
|
45
42
|
});
|
|
46
43
|
|
|
47
44
|
it('should show the current visit', () => {
|
|
48
|
-
|
|
45
|
+
mockUsePatientChartStore.mockReturnValue({
|
|
46
|
+
patientUuid: mockPatient.id,
|
|
47
|
+
patient: mockPatient,
|
|
48
|
+
visitContext: mockCurrentVisit,
|
|
49
|
+
mutateVisitContext: null,
|
|
50
|
+
setPatient: jest.fn(),
|
|
51
|
+
setVisitContext: jest.fn(),
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
render(<VisitContextHeader patientUuid={mockPatient.id} />);
|
|
49
55
|
expect(screen.getByText(/Adding to/i)).toBeInTheDocument();
|
|
50
56
|
expect(screen.getByText(mockCurrentVisit.visitType.display)).toBeInTheDocument();
|
|
51
57
|
});
|
|
@@ -5,16 +5,17 @@ import { Button, ModalBody, ModalFooter, ModalHeader, RadioButton, InlineLoading
|
|
|
5
5
|
import { useTranslation } from 'react-i18next';
|
|
6
6
|
import {
|
|
7
7
|
ErrorState,
|
|
8
|
-
|
|
8
|
+
launchWorkspace2,
|
|
9
9
|
OpenmrsDatePicker,
|
|
10
10
|
useDebounce,
|
|
11
11
|
useOnVisible,
|
|
12
|
-
useVisitContextStore,
|
|
13
12
|
type Visit,
|
|
14
13
|
} from '@openmrs/esm-framework';
|
|
14
|
+
import { invalidateVisitByUuid, usePatientChartStore } from '@openmrs/esm-patient-common-lib';
|
|
15
15
|
import { useInfiniteVisits } from '../visit.resource';
|
|
16
16
|
import VisitContextInfo from './visit-context-info.component';
|
|
17
17
|
import styles from './visit-context-switcher.scss';
|
|
18
|
+
import { useSWRConfig } from 'swr';
|
|
18
19
|
|
|
19
20
|
interface VisitContextSwitcherProps {
|
|
20
21
|
patientUuid: string;
|
|
@@ -37,10 +38,9 @@ const VisitContextSwitcherModal: React.FC<VisitContextSwitcherProps> = ({
|
|
|
37
38
|
{ toStartDate: dayjs(maxStartDateDebounced).endOf('day').toISOString() },
|
|
38
39
|
rep,
|
|
39
40
|
);
|
|
40
|
-
const {
|
|
41
|
-
const [
|
|
42
|
-
|
|
43
|
-
);
|
|
41
|
+
const { visitContext, setVisitContext } = usePatientChartStore(patientUuid);
|
|
42
|
+
const [selectedVisitUuid, setSelectedVisitUuid] = useState<string>(visitContext?.uuid ?? null);
|
|
43
|
+
const { mutate: globalMutate } = useSWRConfig();
|
|
44
44
|
|
|
45
45
|
const onScrollToEnd = useCallback(() => {
|
|
46
46
|
if (hasMore) {
|
|
@@ -51,7 +51,7 @@ const VisitContextSwitcherModal: React.FC<VisitContextSwitcherProps> = ({
|
|
|
51
51
|
|
|
52
52
|
const openStartVisitWorkspace = () => {
|
|
53
53
|
closeModal();
|
|
54
|
-
|
|
54
|
+
launchWorkspace2('start-visit-workspace-form', {
|
|
55
55
|
openedFrom: 'visit-context-switcher',
|
|
56
56
|
});
|
|
57
57
|
};
|
|
@@ -71,7 +71,7 @@ const VisitContextSwitcherModal: React.FC<VisitContextSwitcherProps> = ({
|
|
|
71
71
|
<ModalBody>
|
|
72
72
|
{error ? (
|
|
73
73
|
<ErrorState headerTitle={t('visits', 'visits')} error={error} />
|
|
74
|
-
) : visits?.length
|
|
74
|
+
) : visits?.length === 0 ? (
|
|
75
75
|
<Tile className={styles.tile}>
|
|
76
76
|
<div className={styles.tileContent}>
|
|
77
77
|
<p className={styles.content}>{t('noVisitsToDisplay', 'No visits to display')}</p>
|
|
@@ -85,8 +85,8 @@ const VisitContextSwitcherModal: React.FC<VisitContextSwitcherProps> = ({
|
|
|
85
85
|
<VisitCardRow
|
|
86
86
|
key={visit.uuid}
|
|
87
87
|
visit={visit}
|
|
88
|
-
setSelectedVisit={
|
|
89
|
-
isSelected={
|
|
88
|
+
setSelectedVisit={setSelectedVisitUuid}
|
|
89
|
+
isSelected={selectedVisitUuid === visit.uuid}
|
|
90
90
|
/>
|
|
91
91
|
);
|
|
92
92
|
})}
|
|
@@ -104,9 +104,11 @@ const VisitContextSwitcherModal: React.FC<VisitContextSwitcherProps> = ({
|
|
|
104
104
|
{t('cancel', 'Cancel')}
|
|
105
105
|
</Button>
|
|
106
106
|
<Button
|
|
107
|
-
disabled={
|
|
107
|
+
disabled={selectedVisitUuid === null || isLoading}
|
|
108
108
|
onClick={() => {
|
|
109
|
-
|
|
109
|
+
const selectedVisit = visits.find((v) => v.uuid === selectedVisitUuid);
|
|
110
|
+
const mutateVisitContext = () => invalidateVisitByUuid(globalMutate, selectedVisit.uuid);
|
|
111
|
+
setVisitContext(selectedVisit, mutateVisitContext);
|
|
110
112
|
onAfterVisitSelected?.();
|
|
111
113
|
closeModal();
|
|
112
114
|
}}
|
|
@@ -125,7 +127,7 @@ interface VisitCardRowProps {
|
|
|
125
127
|
}
|
|
126
128
|
|
|
127
129
|
/**
|
|
128
|
-
* A clickable row within the
|
|
130
|
+
* A clickable row within the visit context switcher to select a visit. This
|
|
129
131
|
* has slightly different UX than a regular radio button, as the entire card
|
|
130
132
|
* (not just the radio button and the label) is clickable
|
|
131
133
|
*/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { render, screen } from '@testing-library/react';
|
|
3
|
-
import
|
|
3
|
+
import userEvent from '@testing-library/user-event';
|
|
4
4
|
import { useSystemVisitSetting } from '@openmrs/esm-patient-common-lib';
|
|
5
5
|
import { mockCurrentVisit, mockVisit2, mockVisit3 } from '__mocks__';
|
|
6
6
|
import { useInfiniteVisits } from '../visit.resource';
|
|
@@ -12,14 +12,6 @@ const mockUseSystemVisitSetting = jest.fn(useSystemVisitSetting).mockReturnValue
|
|
|
12
12
|
systemVisitEnabled: true,
|
|
13
13
|
});
|
|
14
14
|
|
|
15
|
-
jest.mocked(useVisitContextStore).mockReturnValue({
|
|
16
|
-
manuallySetVisitUuid: null,
|
|
17
|
-
mutateVisitCallbacks: {},
|
|
18
|
-
patientUuid: null,
|
|
19
|
-
setVisitContext: jest.fn(),
|
|
20
|
-
mutateVisit: jest.fn(),
|
|
21
|
-
});
|
|
22
|
-
|
|
23
15
|
const mockUseInfiniteVisits = jest.fn(useInfiniteVisits).mockReturnValue({
|
|
24
16
|
visits: [mockCurrentVisit, mockVisit2, mockVisit3],
|
|
25
17
|
error: null,
|
|
@@ -40,7 +32,20 @@ jest.mock('../visit.resource', () => ({
|
|
|
40
32
|
useInfiniteVisits: () => mockUseInfiniteVisits('some-uuid'),
|
|
41
33
|
}));
|
|
42
34
|
|
|
35
|
+
const mockSetVisitContext = jest.fn();
|
|
36
|
+
jest.mock('@openmrs/esm-patient-common-lib', () => ({
|
|
37
|
+
...jest.requireActual('@openmrs/esm-patient-common-lib'),
|
|
38
|
+
usePatientChartStore: jest.fn(() => ({
|
|
39
|
+
visitContext: null,
|
|
40
|
+
setVisitContext: mockSetVisitContext,
|
|
41
|
+
})),
|
|
42
|
+
}));
|
|
43
|
+
|
|
43
44
|
describe('VisitContextSwitcherModal', () => {
|
|
45
|
+
beforeEach(() => {
|
|
46
|
+
jest.clearAllMocks();
|
|
47
|
+
});
|
|
48
|
+
|
|
44
49
|
it('should display a list of past visits', () => {
|
|
45
50
|
mockUseSystemVisitSetting.mockReturnValueOnce({
|
|
46
51
|
systemVisitEnabled: false,
|
|
@@ -53,6 +58,23 @@ describe('VisitContextSwitcherModal', () => {
|
|
|
53
58
|
// visit type - only check the visitType div elements
|
|
54
59
|
expect(screen.getAllByText('Facility Visit', { selector: '.visitType' })).toHaveLength(3);
|
|
55
60
|
});
|
|
61
|
+
|
|
62
|
+
it('should call setVisitContext when continue button is clicked with selected visit', async () => {
|
|
63
|
+
const user = userEvent.setup();
|
|
64
|
+
|
|
65
|
+
renderVisitContextSwitcherModal();
|
|
66
|
+
|
|
67
|
+
// Select a visit by clicking on the first visit card
|
|
68
|
+
const firstVisitRadio = screen.getAllByRole('radio', { name: /Facility Visit/ })[0];
|
|
69
|
+
await user.click(firstVisitRadio);
|
|
70
|
+
|
|
71
|
+
// Click the continue button
|
|
72
|
+
const continueButton = screen.getByRole('button', { name: /continue/i });
|
|
73
|
+
await user.click(continueButton);
|
|
74
|
+
|
|
75
|
+
// Verify setVisitContext was called with the selected visit
|
|
76
|
+
expect(mockSetVisitContext).toHaveBeenCalledWith(mockCurrentVisit, expect.any(Function));
|
|
77
|
+
});
|
|
56
78
|
});
|
|
57
79
|
|
|
58
80
|
function renderVisitContextSwitcherModal() {
|
|
@@ -9,9 +9,10 @@ import styles from './visit-detail-overview.scss';
|
|
|
9
9
|
|
|
10
10
|
interface VisitOverviewComponentProps {
|
|
11
11
|
patientUuid: string;
|
|
12
|
+
patient: fhir.Patient;
|
|
12
13
|
}
|
|
13
14
|
|
|
14
|
-
function VisitDetailOverviewComponent({ patientUuid }: VisitOverviewComponentProps) {
|
|
15
|
+
function VisitDetailOverviewComponent({ patientUuid, patient }: VisitOverviewComponentProps) {
|
|
15
16
|
const { t } = useTranslation();
|
|
16
17
|
const [tabIndex, setTabIndex] = useState(0);
|
|
17
18
|
const { showAllEncountersTab } = useConfig<ChartConfig>();
|
|
@@ -33,7 +34,7 @@ function VisitDetailOverviewComponent({ patientUuid }: VisitOverviewComponentPro
|
|
|
33
34
|
</TabList>
|
|
34
35
|
<TabPanels>
|
|
35
36
|
<TabPanel>
|
|
36
|
-
<VisitHistoryTable patientUuid={patientUuid} />
|
|
37
|
+
<VisitHistoryTable patientUuid={patientUuid} patient={patient} />
|
|
37
38
|
</TabPanel>
|
|
38
39
|
{showAllEncountersTab && (
|
|
39
40
|
<TabPanel>
|
|
@@ -82,7 +82,7 @@ describe('VisitDetailOverview', () => {
|
|
|
82
82
|
});
|
|
83
83
|
mockGetConfig.mockResolvedValue({ htmlFormEntryForms: [] });
|
|
84
84
|
|
|
85
|
-
renderWithSwr(<VisitDetailOverview patientUuid={mockPatient.id} />);
|
|
85
|
+
renderWithSwr(<VisitDetailOverview patientUuid={mockPatient.id} patient={mockPatient} />);
|
|
86
86
|
|
|
87
87
|
await waitForLoadingToFinish();
|
|
88
88
|
|
|
@@ -106,7 +106,7 @@ describe('VisitDetailOverview', () => {
|
|
|
106
106
|
error,
|
|
107
107
|
});
|
|
108
108
|
|
|
109
|
-
renderWithSwr(<VisitDetailOverview patientUuid={mockPatient.id} />);
|
|
109
|
+
renderWithSwr(<VisitDetailOverview patientUuid={mockPatient.id} patient={mockPatient} />);
|
|
110
110
|
|
|
111
111
|
await waitForLoadingToFinish();
|
|
112
112
|
|
|
@@ -125,7 +125,7 @@ describe('VisitDetailOverview', () => {
|
|
|
125
125
|
});
|
|
126
126
|
mockUsePaginatedVisits.mockReturnValue(mockPaginatedVisitsData);
|
|
127
127
|
|
|
128
|
-
renderWithSwr(<VisitDetailOverview patientUuid={mockPatient.id} />);
|
|
128
|
+
renderWithSwr(<VisitDetailOverview patientUuid={mockPatient.id} patient={mockPatient} />);
|
|
129
129
|
|
|
130
130
|
await waitForLoadingToFinish();
|
|
131
131
|
|
|
@@ -161,7 +161,7 @@ describe('VisitDetailOverview', () => {
|
|
|
161
161
|
});
|
|
162
162
|
mockUsePaginatedVisits.mockReturnValue(mockPaginatedVisitsData);
|
|
163
163
|
|
|
164
|
-
renderWithSwr(<VisitDetailOverview patientUuid={mockPatient.id} />);
|
|
164
|
+
renderWithSwr(<VisitDetailOverview patientUuid={mockPatient.id} patient={mockPatient} />);
|
|
165
165
|
|
|
166
166
|
await waitForLoadingToFinish();
|
|
167
167
|
|
|
@@ -53,7 +53,7 @@ export function deleteVisit(visitUuid: string) {
|
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
export function restoreVisit(visitUuid: string) {
|
|
56
|
-
return openmrsFetch(`${restBaseUrl}/visit/${visitUuid}`, {
|
|
56
|
+
return openmrsFetch<Visit>(`${restBaseUrl}/visit/${visitUuid}`, {
|
|
57
57
|
headers: {
|
|
58
58
|
'content-type': 'application/json',
|
|
59
59
|
},
|
package/translations/am.json
CHANGED
|
@@ -41,8 +41,10 @@
|
|
|
41
41
|
"editVisitDetails": "Edit visit details",
|
|
42
42
|
"emptyStateText": "There are no {{displayText}} to display for this patient",
|
|
43
43
|
"enable": "Enable",
|
|
44
|
+
"encounter": "Encounter",
|
|
44
45
|
"encounterDeleted": "Encounter deleted",
|
|
45
46
|
"encounters_title": "Encounters",
|
|
47
|
+
"encountersForThisVisit": "encounters for this visit",
|
|
46
48
|
"encounterSuccessfullyDeleted": "The encounter has been deleted successfully",
|
|
47
49
|
"encounterTableActionsMenu": "Encounter table actions menu",
|
|
48
50
|
"encounterType": "Encounter type",
|
|
@@ -105,6 +107,7 @@
|
|
|
105
107
|
"nonCodedCauseOfDeath": "Non-coded cause of death",
|
|
106
108
|
"nonCodedCauseOfDeathRequired": "Please enter the non-coded cause of death",
|
|
107
109
|
"noObservationsFound": "No observations found",
|
|
110
|
+
"noProvider": "No provider",
|
|
108
111
|
"notes": "Notes",
|
|
109
112
|
"notes__lower": "notes",
|
|
110
113
|
"noVisitsToDisplay": "No visits to display",
|
|
@@ -156,7 +159,10 @@
|
|
|
156
159
|
"tests": "Tests",
|
|
157
160
|
"theVisitIs": "The visit is",
|
|
158
161
|
"time": "Time",
|
|
162
|
+
"timeCompleted": "Time completed",
|
|
159
163
|
"timeFormat ": "Time Format",
|
|
164
|
+
"timeline": "Timeline",
|
|
165
|
+
"timeStarted": "Time started",
|
|
160
166
|
"undo": "Undo",
|
|
161
167
|
"unknownError": "Unknown error",
|
|
162
168
|
"updateVisit": "Update visit",
|
package/translations/ar.json
CHANGED
|
@@ -41,8 +41,10 @@
|
|
|
41
41
|
"editVisitDetails": "Edit visit details",
|
|
42
42
|
"emptyStateText": "لا يوجد {{displayText}} لعرضه لهذا المريض",
|
|
43
43
|
"enable": "Enable",
|
|
44
|
+
"encounter": "Encounter",
|
|
44
45
|
"encounterDeleted": "تم حذف اللقاء",
|
|
45
46
|
"encounters_title": "اللقاءات",
|
|
47
|
+
"encountersForThisVisit": "encounters for this visit",
|
|
46
48
|
"encounterSuccessfullyDeleted": "The encounter has been deleted successfully",
|
|
47
49
|
"encounterTableActionsMenu": "Encounter table actions menu",
|
|
48
50
|
"encounterType": "نوع اللقاء",
|
|
@@ -105,6 +107,7 @@
|
|
|
105
107
|
"nonCodedCauseOfDeath": "Non-coded cause of death",
|
|
106
108
|
"nonCodedCauseOfDeathRequired": "Please enter the non-coded cause of death",
|
|
107
109
|
"noObservationsFound": "لم يتم العثور على ملاحظات",
|
|
110
|
+
"noProvider": "No provider",
|
|
108
111
|
"notes": "ملاحظات",
|
|
109
112
|
"notes__lower": "notes",
|
|
110
113
|
"noVisitsToDisplay": "No visits to display",
|
|
@@ -156,7 +159,10 @@
|
|
|
156
159
|
"tests": "اختبارات",
|
|
157
160
|
"theVisitIs": "The visit is",
|
|
158
161
|
"time": "Time",
|
|
162
|
+
"timeCompleted": "Time completed",
|
|
159
163
|
"timeFormat ": "Time Format",
|
|
164
|
+
"timeline": "Timeline",
|
|
165
|
+
"timeStarted": "Time started",
|
|
160
166
|
"undo": "Undo",
|
|
161
167
|
"unknownError": "Unknown error",
|
|
162
168
|
"updateVisit": "Update visit",
|
package/translations/ar_SY.json
CHANGED
|
@@ -41,8 +41,10 @@
|
|
|
41
41
|
"editVisitDetails": "Edit visit details",
|
|
42
42
|
"emptyStateText": "There are no {{displayText}} to display for this patient",
|
|
43
43
|
"enable": "Enable",
|
|
44
|
+
"encounter": "Encounter",
|
|
44
45
|
"encounterDeleted": "Encounter deleted",
|
|
45
46
|
"encounters_title": "Encounters",
|
|
47
|
+
"encountersForThisVisit": "encounters for this visit",
|
|
46
48
|
"encounterSuccessfullyDeleted": "The encounter has been deleted successfully",
|
|
47
49
|
"encounterTableActionsMenu": "Encounter table actions menu",
|
|
48
50
|
"encounterType": "Encounter type",
|
|
@@ -105,6 +107,7 @@
|
|
|
105
107
|
"nonCodedCauseOfDeath": "Non-coded cause of death",
|
|
106
108
|
"nonCodedCauseOfDeathRequired": "Please enter the non-coded cause of death",
|
|
107
109
|
"noObservationsFound": "No observations found",
|
|
110
|
+
"noProvider": "No provider",
|
|
108
111
|
"notes": "Notes",
|
|
109
112
|
"notes__lower": "notes",
|
|
110
113
|
"noVisitsToDisplay": "No visits to display",
|
|
@@ -156,7 +159,10 @@
|
|
|
156
159
|
"tests": "Tests",
|
|
157
160
|
"theVisitIs": "The visit is",
|
|
158
161
|
"time": "Time",
|
|
162
|
+
"timeCompleted": "Time completed",
|
|
159
163
|
"timeFormat ": "Time Format",
|
|
164
|
+
"timeline": "Timeline",
|
|
165
|
+
"timeStarted": "Time started",
|
|
160
166
|
"undo": "Undo",
|
|
161
167
|
"unknownError": "Unknown error",
|
|
162
168
|
"updateVisit": "Update visit",
|