@tebokaroa/openmrs-esm-patient-notes-app 12.1.0-custom.1
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/README.md +4 -0
- package/jest.config.js +3 -0
- package/package.json +56 -0
- package/rspack.config.js +1 -0
- package/src/config-schema.ts +22 -0
- package/src/dashboard.meta.ts +7 -0
- package/src/declarations.d.ts +4 -0
- package/src/index.ts +34 -0
- package/src/notes/notes-overview.extension.tsx +74 -0
- package/src/notes/notes-overview.scss +40 -0
- package/src/notes/notes-overview.test.tsx +100 -0
- package/src/notes/paginated-notes.component.tsx +182 -0
- package/src/notes/visit-note-config-schema.ts +38 -0
- package/src/notes/visit-notes-form.scss +228 -0
- package/src/notes/visit-notes-form.test.tsx +494 -0
- package/src/notes/visit-notes-form.workspace.tsx +943 -0
- package/src/notes/visit-notes.resource.ts +113 -0
- package/src/routes.json +32 -0
- package/src/types/index.ts +202 -0
- package/src/visit-note-action-button.extension.tsx +28 -0
- package/src/visit-note-action-button.test.tsx +41 -0
- package/translations/am.json +39 -0
- package/translations/ar.json +39 -0
- package/translations/ar_SY.json +39 -0
- package/translations/bn.json +39 -0
- package/translations/cs.json +39 -0
- package/translations/de.json +39 -0
- package/translations/en.json +41 -0
- package/translations/en_US.json +39 -0
- package/translations/es.json +39 -0
- package/translations/es_MX.json +39 -0
- package/translations/fr.json +39 -0
- package/translations/he.json +39 -0
- package/translations/hi.json +39 -0
- package/translations/hi_IN.json +39 -0
- package/translations/id.json +39 -0
- package/translations/it.json +39 -0
- package/translations/ka.json +39 -0
- package/translations/km.json +39 -0
- package/translations/ku.json +39 -0
- package/translations/ky.json +39 -0
- package/translations/lg.json +39 -0
- package/translations/ne.json +39 -0
- package/translations/pl.json +39 -0
- package/translations/pt.json +39 -0
- package/translations/pt_BR.json +39 -0
- package/translations/qu.json +39 -0
- package/translations/ro_RO.json +39 -0
- package/translations/ru_RU.json +39 -0
- package/translations/si.json +39 -0
- package/translations/sq.json +39 -0
- package/translations/sw.json +39 -0
- package/translations/sw_KE.json +39 -0
- package/translations/tr.json +39 -0
- package/translations/tr_TR.json +39 -0
- package/translations/uk.json +39 -0
- package/translations/uz.json +39 -0
- package/translations/uz@Latn.json +39 -0
- package/translations/uz_UZ.json +39 -0
- package/translations/vi.json +39 -0
- package/translations/zh.json +39 -0
- package/translations/zh_CN.json +39 -0
- package/translations/zh_TW.json +39 -0
- package/tsconfig.json +4 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import useSWR from 'swr';
|
|
2
|
+
import useSWRInfinite from 'swr/infinite';
|
|
3
|
+
import { openmrsFetch, restBaseUrl, useConfig } from '@openmrs/esm-framework';
|
|
4
|
+
import { type ConfigObject } from '../config-schema';
|
|
5
|
+
import type {
|
|
6
|
+
Concept,
|
|
7
|
+
DiagnosisPayload,
|
|
8
|
+
EncountersFetchResponse,
|
|
9
|
+
PatientNote,
|
|
10
|
+
RESTPatientNote,
|
|
11
|
+
VisitNotePayload,
|
|
12
|
+
} from '../types';
|
|
13
|
+
|
|
14
|
+
interface UseVisitNotes {
|
|
15
|
+
visitNotes: Array<PatientNote> | null;
|
|
16
|
+
error: Error;
|
|
17
|
+
isLoading: boolean;
|
|
18
|
+
isValidating?: boolean;
|
|
19
|
+
mutateVisitNotes: () => void;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function useVisitNotes(patientUuid: string): UseVisitNotes {
|
|
23
|
+
const {
|
|
24
|
+
visitNoteConfig: { encounterNoteTextConceptUuid, visitDiagnosesConceptUuid },
|
|
25
|
+
} = useConfig<ConfigObject>();
|
|
26
|
+
|
|
27
|
+
const customRepresentation =
|
|
28
|
+
'custom:(uuid,display,encounterDatetime,patient,obs,' +
|
|
29
|
+
'encounterProviders:(uuid,display,' +
|
|
30
|
+
'encounterRole:(uuid,display),' +
|
|
31
|
+
'provider:(uuid,person:(uuid,display))),' +
|
|
32
|
+
'diagnoses';
|
|
33
|
+
const encountersApiUrl = `${restBaseUrl}/encounter?patient=${patientUuid}&obs=${visitDiagnosesConceptUuid}&v=${customRepresentation}`;
|
|
34
|
+
|
|
35
|
+
const { data, error, isLoading, isValidating, mutate } = useSWR<{ data: EncountersFetchResponse }, Error>(
|
|
36
|
+
encountersApiUrl,
|
|
37
|
+
openmrsFetch,
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
const mapNoteProperties = (note: RESTPatientNote, index: number): PatientNote => ({
|
|
41
|
+
id: `${index}`,
|
|
42
|
+
diagnoses: note.diagnoses
|
|
43
|
+
.filter((diagnosis) => !diagnosis.voided)
|
|
44
|
+
.map((diagnosisData) => diagnosisData.display)
|
|
45
|
+
.filter((val) => val)
|
|
46
|
+
.join(', '),
|
|
47
|
+
encounterDate: note.encounterDatetime,
|
|
48
|
+
encounterNote: note.obs.find((observation) => observation.concept.uuid === encounterNoteTextConceptUuid)?.value,
|
|
49
|
+
encounterNoteRecordedAt: note.obs.find((observation) => observation.concept.uuid === encounterNoteTextConceptUuid)
|
|
50
|
+
?.obsDatetime,
|
|
51
|
+
encounterProvider: note?.encounterProviders[0]?.provider?.person?.display,
|
|
52
|
+
encounterProviderRole: note?.encounterProviders[0]?.encounterRole?.display,
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
const formattedVisitNotes = data?.data?.results
|
|
56
|
+
?.map(mapNoteProperties)
|
|
57
|
+
?.sort((noteA, noteB) => new Date(noteB.encounterDate).getTime() - new Date(noteA.encounterDate).getTime());
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
visitNotes: data ? formattedVisitNotes : null,
|
|
61
|
+
error,
|
|
62
|
+
isLoading,
|
|
63
|
+
isValidating,
|
|
64
|
+
mutateVisitNotes: mutate,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function fetchDiagnosisConceptsByName(searchTerm: string, diagnosisConceptClass: string) {
|
|
69
|
+
const customRepresentation = 'custom:(uuid,display)';
|
|
70
|
+
const url = `${restBaseUrl}/concept?name=${searchTerm}&searchType=fuzzy&class=${diagnosisConceptClass}&v=${customRepresentation}`;
|
|
71
|
+
|
|
72
|
+
return openmrsFetch<Array<Concept>>(url).then(({ data }) => Promise.resolve(data['results']));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function saveVisitNote(abortController: AbortController, payload: VisitNotePayload) {
|
|
76
|
+
return openmrsFetch(`${restBaseUrl}/encounter`, {
|
|
77
|
+
headers: {
|
|
78
|
+
'Content-Type': 'application/json',
|
|
79
|
+
},
|
|
80
|
+
method: 'POST',
|
|
81
|
+
body: payload,
|
|
82
|
+
signal: abortController.signal,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function updateVisitNote(abortController: AbortController, encounterUuid: string, payload: VisitNotePayload) {
|
|
87
|
+
return openmrsFetch(`${restBaseUrl}/encounter/${encounterUuid}`, {
|
|
88
|
+
headers: {
|
|
89
|
+
'Content-Type': 'application/json',
|
|
90
|
+
},
|
|
91
|
+
method: 'POST',
|
|
92
|
+
body: payload,
|
|
93
|
+
signal: abortController.signal,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export function savePatientDiagnosis(abortController: AbortController, payload: DiagnosisPayload) {
|
|
98
|
+
return openmrsFetch(`${restBaseUrl}/patientdiagnoses`, {
|
|
99
|
+
headers: {
|
|
100
|
+
'Content-Type': 'application/json',
|
|
101
|
+
},
|
|
102
|
+
method: 'POST',
|
|
103
|
+
body: payload,
|
|
104
|
+
signal: abortController.signal,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export function deletePatientDiagnosis(abortController: AbortController, diagnosisUuid: string) {
|
|
109
|
+
return openmrsFetch(`${restBaseUrl}/patientdiagnoses/${diagnosisUuid}`, {
|
|
110
|
+
method: 'DELETE',
|
|
111
|
+
signal: abortController.signal,
|
|
112
|
+
});
|
|
113
|
+
}
|
package/src/routes.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json.openmrs.org/routes.schema.json",
|
|
3
|
+
"backendDependencies": {
|
|
4
|
+
"fhir2": ">=1.2",
|
|
5
|
+
"webservices.rest": ">=2.2.0"
|
|
6
|
+
},
|
|
7
|
+
"extensions": [
|
|
8
|
+
{
|
|
9
|
+
"name": "notes-overview-widget",
|
|
10
|
+
"component": "notesOverview",
|
|
11
|
+
"meta": {
|
|
12
|
+
"fullWidth": false
|
|
13
|
+
},
|
|
14
|
+
"order": 5
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
"workspaces2": [
|
|
18
|
+
{
|
|
19
|
+
"name": "visit-notes-form-workspace",
|
|
20
|
+
"component": "visitNotesFormWorkspace",
|
|
21
|
+
"window": "visit-note"
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"workspaceWindows2": [
|
|
25
|
+
{
|
|
26
|
+
"name": "visit-note",
|
|
27
|
+
"icon": "visitNotesActionButton",
|
|
28
|
+
"group": "patient-chart",
|
|
29
|
+
"order": 2
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
export interface EncountersFetchResponse {
|
|
2
|
+
results: Array<RESTPatientNote>;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export interface RESTPatientNote {
|
|
6
|
+
uuid: string;
|
|
7
|
+
display: string;
|
|
8
|
+
encounterDatetime: string;
|
|
9
|
+
encounterType: { name: string; uuid: string };
|
|
10
|
+
encounterProviders: [{ encounterRole: { uuid: string; display: string }; provider: { person: { display: string } } }];
|
|
11
|
+
location: { uuid: string; display: string; name: string };
|
|
12
|
+
auditInfo: {
|
|
13
|
+
creator: any;
|
|
14
|
+
uuid: string;
|
|
15
|
+
display: string;
|
|
16
|
+
links: any;
|
|
17
|
+
dateCreated: Date;
|
|
18
|
+
changedBy?: any;
|
|
19
|
+
dateChanged?: Date;
|
|
20
|
+
};
|
|
21
|
+
obs: Array<ObsData>;
|
|
22
|
+
diagnoses: Array<DiagnosisData>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface PatientNote {
|
|
26
|
+
id: string;
|
|
27
|
+
diagnoses: string;
|
|
28
|
+
encounterDate: string;
|
|
29
|
+
encounterNote: string;
|
|
30
|
+
encounterNoteRecordedAt: string;
|
|
31
|
+
encounterProvider: string;
|
|
32
|
+
encounterProviderRole: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface Concept {
|
|
36
|
+
display: string;
|
|
37
|
+
uuid: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface DiagnosisData {
|
|
41
|
+
uuid: string;
|
|
42
|
+
display: string;
|
|
43
|
+
conceptClass: {
|
|
44
|
+
uuid: string;
|
|
45
|
+
name: string;
|
|
46
|
+
description: string;
|
|
47
|
+
};
|
|
48
|
+
names: Array<ConceptNames>;
|
|
49
|
+
mappings: Array<ConceptMapping>;
|
|
50
|
+
voided: boolean;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface ConceptNames {
|
|
54
|
+
uuid: string;
|
|
55
|
+
name: string;
|
|
56
|
+
conceptNameType: string;
|
|
57
|
+
}
|
|
58
|
+
export interface ConceptMapping {
|
|
59
|
+
conceptMapType: {
|
|
60
|
+
uuid: string;
|
|
61
|
+
display: string;
|
|
62
|
+
};
|
|
63
|
+
conceptReferenceTerm: {
|
|
64
|
+
display: string;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface DisplayMetadata {
|
|
69
|
+
display?: string;
|
|
70
|
+
links?: Links;
|
|
71
|
+
uuid?: string;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export interface SessionData {
|
|
75
|
+
authenticated: boolean;
|
|
76
|
+
locale: string;
|
|
77
|
+
currentProvider: {
|
|
78
|
+
uuid: string;
|
|
79
|
+
display: string;
|
|
80
|
+
person: DisplayMetadata;
|
|
81
|
+
identifier: string;
|
|
82
|
+
attributes: Array<{}>;
|
|
83
|
+
retired: boolean;
|
|
84
|
+
links: Links;
|
|
85
|
+
resourceVersion: string;
|
|
86
|
+
};
|
|
87
|
+
sessionLocation: {
|
|
88
|
+
uuid: string;
|
|
89
|
+
display: string;
|
|
90
|
+
name: string;
|
|
91
|
+
description?: string;
|
|
92
|
+
};
|
|
93
|
+
user: {
|
|
94
|
+
uuid: string;
|
|
95
|
+
display: string;
|
|
96
|
+
username: string;
|
|
97
|
+
};
|
|
98
|
+
privileges: Array<DisplayMetadata>;
|
|
99
|
+
roles: Array<DisplayMetadata>;
|
|
100
|
+
retired: false;
|
|
101
|
+
links: Links;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export type Links = Array<{
|
|
105
|
+
rel: string;
|
|
106
|
+
uri: string;
|
|
107
|
+
}>;
|
|
108
|
+
|
|
109
|
+
export interface Provider {
|
|
110
|
+
uuid: string;
|
|
111
|
+
display: string;
|
|
112
|
+
person: {
|
|
113
|
+
uuid: string;
|
|
114
|
+
display: string;
|
|
115
|
+
links: Links;
|
|
116
|
+
};
|
|
117
|
+
identifier: string;
|
|
118
|
+
attributes: Array<any>;
|
|
119
|
+
retired: boolean;
|
|
120
|
+
links: Links;
|
|
121
|
+
resourceVersion: string;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export interface Location {
|
|
125
|
+
uuid: string;
|
|
126
|
+
display: string;
|
|
127
|
+
name: string;
|
|
128
|
+
description?: string;
|
|
129
|
+
address1?: string;
|
|
130
|
+
address2?: string;
|
|
131
|
+
cityVillage?: string;
|
|
132
|
+
stateProvince?: string;
|
|
133
|
+
country?: string;
|
|
134
|
+
postalCode?: string;
|
|
135
|
+
latitude?: string;
|
|
136
|
+
longitude?: string;
|
|
137
|
+
countryDistrict?: string;
|
|
138
|
+
address3?: string;
|
|
139
|
+
address4?: string;
|
|
140
|
+
address5?: string;
|
|
141
|
+
address6?: string;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export interface ObsData {
|
|
145
|
+
concept: Concept;
|
|
146
|
+
value?: string | any;
|
|
147
|
+
groupMembers?: Array<{
|
|
148
|
+
concept: Concept;
|
|
149
|
+
value?: string | any;
|
|
150
|
+
}>;
|
|
151
|
+
obsDatetime: string;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export interface Diagnosis {
|
|
155
|
+
patient: string;
|
|
156
|
+
diagnosis: {
|
|
157
|
+
coded?: string; // Made optional
|
|
158
|
+
nonCoded?: string; // Added for custom text
|
|
159
|
+
};
|
|
160
|
+
certainty: string;
|
|
161
|
+
rank: number;
|
|
162
|
+
display: string;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export interface DiagnosisPayload {
|
|
166
|
+
encounter: string;
|
|
167
|
+
patient: string;
|
|
168
|
+
condition: null;
|
|
169
|
+
diagnosis: {
|
|
170
|
+
coded?: string; // Made optional
|
|
171
|
+
nonCoded?: string; // Added for custom text
|
|
172
|
+
};
|
|
173
|
+
certainty: string;
|
|
174
|
+
rank: number;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export interface VisitNotePayload {
|
|
178
|
+
encounterDatetime: string; // date and time the encounter was created (ISO8601 Long) (REQUIRED)
|
|
179
|
+
encounterType: string; // uuid of the encounter type - initial visit, return visit etc. (REQUIRED)
|
|
180
|
+
patient: string; // the patient to whom the encounter applies
|
|
181
|
+
location: string; // the location at which the encounter occurred (REQUIRED)
|
|
182
|
+
encounterProviders: Array<{ encounterRole: string; provider: string }>; // array of providers and their role within the encounter. At least 1 provider is required
|
|
183
|
+
obs: Array<ObsPayload>; // array of observations and values for the encounter
|
|
184
|
+
form: string; // target form uuid to be filled for the encounter
|
|
185
|
+
orders?: Array<any>; // list of orders created during the encounter
|
|
186
|
+
visit?: string; // when creating an encounter for a specific visit, this specifies the visit
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export interface ObsPayload {
|
|
190
|
+
concept: Concept;
|
|
191
|
+
value?: string;
|
|
192
|
+
groupMembers?: Array<{
|
|
193
|
+
concept: Concept;
|
|
194
|
+
value: string;
|
|
195
|
+
}>;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// a "Virtual" type to allow custom free custom text when there are no corresponding concepts
|
|
199
|
+
export interface FreeConcept {
|
|
200
|
+
display: string;
|
|
201
|
+
uuid?: string; // Optional because custom text won't have a UUID
|
|
202
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import React, { type ComponentProps } from 'react';
|
|
2
|
+
import { useTranslation } from 'react-i18next';
|
|
3
|
+
import { ActionMenuButton2, PenIcon } from '@openmrs/esm-framework';
|
|
4
|
+
import { useStartVisitIfNeeded, type PatientChartWorkspaceActionButtonProps } from '@openmrs/esm-patient-common-lib';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* This button uses the patient chart store and MUST only be used
|
|
8
|
+
* within the patient chart
|
|
9
|
+
*/
|
|
10
|
+
const VisitNoteActionButton: React.FC<PatientChartWorkspaceActionButtonProps> = ({ groupProps: { patientUuid } }) => {
|
|
11
|
+
const { t } = useTranslation();
|
|
12
|
+
|
|
13
|
+
const startVisitIfNeeded = useStartVisitIfNeeded(patientUuid);
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<ActionMenuButton2
|
|
17
|
+
icon={(props: ComponentProps<typeof PenIcon>) => <PenIcon {...props} />}
|
|
18
|
+
label={t('visitNote', 'Visit note')}
|
|
19
|
+
workspaceToLaunch={{
|
|
20
|
+
workspaceName: 'visit-notes-form-workspace',
|
|
21
|
+
workspaceProps: {},
|
|
22
|
+
}}
|
|
23
|
+
onBeforeWorkspaceLaunch={startVisitIfNeeded}
|
|
24
|
+
/>
|
|
25
|
+
);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export default VisitNoteActionButton;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { screen, render } from '@testing-library/react';
|
|
3
|
+
import { type LayoutType, useLayoutType } from '@openmrs/esm-framework';
|
|
4
|
+
import VisitNoteActionButton from './visit-note-action-button.extension';
|
|
5
|
+
import { mockPatient } from 'tools';
|
|
6
|
+
|
|
7
|
+
const mockUseLayoutType = jest.mocked(useLayoutType);
|
|
8
|
+
|
|
9
|
+
jest.mock('@openmrs/esm-patient-common-lib', () => {
|
|
10
|
+
const originalModule = jest.requireActual('@openmrs/esm-patient-common-lib');
|
|
11
|
+
|
|
12
|
+
return {
|
|
13
|
+
...originalModule,
|
|
14
|
+
useStartVisitIfNeeded: jest.fn(() => () => Promise.resolve(true)),
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
describe('VisitNoteActionButton', () => {
|
|
19
|
+
it('should display tablet view', async () => {
|
|
20
|
+
mockUseLayoutType.mockReturnValue('tablet');
|
|
21
|
+
|
|
22
|
+
render(
|
|
23
|
+
<VisitNoteActionButton
|
|
24
|
+
groupProps={{ patientUuid: 'patient-uuid', mutateVisitContext: null, patient: null, visitContext: null }}
|
|
25
|
+
/>,
|
|
26
|
+
);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('should display desktop view', async () => {
|
|
30
|
+
mockUseLayoutType.mockReturnValue('desktop' as LayoutType);
|
|
31
|
+
|
|
32
|
+
render(
|
|
33
|
+
<VisitNoteActionButton
|
|
34
|
+
groupProps={{ patientUuid: mockPatient.id, patient: mockPatient, visitContext: null, mutateVisitContext: null }}
|
|
35
|
+
/>,
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
const visitNoteButton = screen.getByRole('button', { name: /Note/i });
|
|
39
|
+
expect(visitNoteButton).toBeInTheDocument();
|
|
40
|
+
});
|
|
41
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"add": "Add",
|
|
3
|
+
"addImage": "Add image",
|
|
4
|
+
"addVisitNote": "Add a visit note",
|
|
5
|
+
"clinicalNoteLabel": "Write your notes",
|
|
6
|
+
"clinicalNotePlaceholder": "Write any notes here",
|
|
7
|
+
"date": "Date",
|
|
8
|
+
"diagnoses": "Diagnoses",
|
|
9
|
+
"discard": "Discard",
|
|
10
|
+
"emptyDiagnosisText": "No diagnosis selected — Enter a diagnosis below",
|
|
11
|
+
"enterPrimaryDiagnoses": "Enter Primary diagnoses",
|
|
12
|
+
"enterSecondaryDiagnoses": "Enter Secondary diagnoses",
|
|
13
|
+
"error": "Error",
|
|
14
|
+
"errorFetchingConcepts": "There was a problem fetching concepts",
|
|
15
|
+
"errorTransformingDiagnoses": "Error transforming diagnoses",
|
|
16
|
+
"image": "Image",
|
|
17
|
+
"imageRemoved": "Image removed",
|
|
18
|
+
"imageUploadHelperText": "Upload an image or use this device's camera to capture an image",
|
|
19
|
+
"noMatchingDiagnoses": "No diagnoses found matching",
|
|
20
|
+
"note": "Note",
|
|
21
|
+
"noVisitNoteToDisplay": "No visit note to display",
|
|
22
|
+
"primaryDiagnosis": "Primary diagnosis",
|
|
23
|
+
"primaryDiagnosisInputPlaceholder": "Choose a primary diagnosis",
|
|
24
|
+
"primaryDiagnosisRequired": "Choose at least one primary diagnosis",
|
|
25
|
+
"saveAndClose": "Save and close",
|
|
26
|
+
"saving": "Saving",
|
|
27
|
+
"searchForPrimaryDiagnosis": "Search for a primary diagnosis",
|
|
28
|
+
"searchForSecondaryDiagnosis": "Search for a secondary diagnosis",
|
|
29
|
+
"secondaryDiagnosis": "Secondary diagnosis",
|
|
30
|
+
"secondaryDiagnosisInputPlaceholder": "Choose a secondary diagnosis",
|
|
31
|
+
"seeAll": "See all",
|
|
32
|
+
"visitDate": "Visit date",
|
|
33
|
+
"visitNote": "Visit note",
|
|
34
|
+
"visitNoteNowVisible": "It is now visible on the Encounters page",
|
|
35
|
+
"visitNotes": "Visit notes",
|
|
36
|
+
"visitNoteSaved": "Visit note saved",
|
|
37
|
+
"visitNoteSaveError": "Error saving visit note",
|
|
38
|
+
"visitNoteWorkspaceTitle": "Visit Note"
|
|
39
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"add": "أضف",
|
|
3
|
+
"addImage": "أضف صورة",
|
|
4
|
+
"addVisitNote": "أضف ملاحظة للزيارة",
|
|
5
|
+
"clinicalNoteLabel": "اكتب ملاحظاتك",
|
|
6
|
+
"clinicalNotePlaceholder": "اكتب أي ملاحظات هنا",
|
|
7
|
+
"date": "تاريخ",
|
|
8
|
+
"diagnoses": "التشخيصات",
|
|
9
|
+
"discard": "تجاهل",
|
|
10
|
+
"emptyDiagnosisText": "لم يتم اختيار تشخيص — أدخل تشخيصًا أدناه",
|
|
11
|
+
"enterPrimaryDiagnoses": "أدخل التشخيص الرئيسي",
|
|
12
|
+
"enterSecondaryDiagnoses": "أدخل التشخيص الثانوي",
|
|
13
|
+
"error": "Error",
|
|
14
|
+
"errorFetchingConcepts": "There was a problem fetching concepts",
|
|
15
|
+
"errorTransformingDiagnoses": "Error transforming diagnoses",
|
|
16
|
+
"image": "صورة",
|
|
17
|
+
"imageRemoved": "Image removed",
|
|
18
|
+
"imageUploadHelperText": "قم بتحميل صورة أو استخدم كاميرا هذا الجهاز لالتقاط صورة",
|
|
19
|
+
"noMatchingDiagnoses": "لم يتم العثور على تشخيصات مطابقة",
|
|
20
|
+
"note": "ملاحظة",
|
|
21
|
+
"noVisitNoteToDisplay": "لا توجد ملاحظة للزيارة لعرضها",
|
|
22
|
+
"primaryDiagnosis": "التشخيص الرئيسي",
|
|
23
|
+
"primaryDiagnosisInputPlaceholder": "اختر التشخيص الرئيسي",
|
|
24
|
+
"primaryDiagnosisRequired": "Choose at least one primary diagnosis",
|
|
25
|
+
"saveAndClose": "حفظ وإغلاق",
|
|
26
|
+
"saving": "Saving",
|
|
27
|
+
"searchForPrimaryDiagnosis": "ابحث عن التشخيص الرئيسي",
|
|
28
|
+
"searchForSecondaryDiagnosis": "ابحث عن التشخيص الثانوي",
|
|
29
|
+
"secondaryDiagnosis": "التشخيص الثانوي",
|
|
30
|
+
"secondaryDiagnosisInputPlaceholder": "اختر التشخيص الثانوي",
|
|
31
|
+
"seeAll": "عرض الكل",
|
|
32
|
+
"visitDate": "تاريخ الزيارة",
|
|
33
|
+
"visitNote": "ملاحظة الزيارة",
|
|
34
|
+
"visitNoteNowVisible": "أصبحت مرئية الآن في صفحة اللقاءات",
|
|
35
|
+
"visitNotes": "ملاحظات الزيارة",
|
|
36
|
+
"visitNoteSaved": "تم حفظ ملاحظة الزيارة",
|
|
37
|
+
"visitNoteSaveError": "خطأ في حفظ ملاحظة الزيارة",
|
|
38
|
+
"visitNoteWorkspaceTitle": "ملاحظة الزيارة"
|
|
39
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"add": "Add",
|
|
3
|
+
"addImage": "Add image",
|
|
4
|
+
"addVisitNote": "Add a visit note",
|
|
5
|
+
"clinicalNoteLabel": "Write your notes",
|
|
6
|
+
"clinicalNotePlaceholder": "Write any notes here",
|
|
7
|
+
"date": "Date",
|
|
8
|
+
"diagnoses": "Diagnoses",
|
|
9
|
+
"discard": "Discard",
|
|
10
|
+
"emptyDiagnosisText": "No diagnosis selected — Enter a diagnosis below",
|
|
11
|
+
"enterPrimaryDiagnoses": "Enter Primary diagnoses",
|
|
12
|
+
"enterSecondaryDiagnoses": "Enter Secondary diagnoses",
|
|
13
|
+
"error": "Error",
|
|
14
|
+
"errorFetchingConcepts": "There was a problem fetching concepts",
|
|
15
|
+
"errorTransformingDiagnoses": "Error transforming diagnoses",
|
|
16
|
+
"image": "Image",
|
|
17
|
+
"imageRemoved": "Image removed",
|
|
18
|
+
"imageUploadHelperText": "Upload an image or use this device's camera to capture an image",
|
|
19
|
+
"noMatchingDiagnoses": "No diagnoses found matching",
|
|
20
|
+
"note": "Note",
|
|
21
|
+
"noVisitNoteToDisplay": "No visit note to display",
|
|
22
|
+
"primaryDiagnosis": "Primary diagnosis",
|
|
23
|
+
"primaryDiagnosisInputPlaceholder": "Choose a primary diagnosis",
|
|
24
|
+
"primaryDiagnosisRequired": "Choose at least one primary diagnosis",
|
|
25
|
+
"saveAndClose": "Save and close",
|
|
26
|
+
"saving": "Saving",
|
|
27
|
+
"searchForPrimaryDiagnosis": "Search for a primary diagnosis",
|
|
28
|
+
"searchForSecondaryDiagnosis": "Search for a secondary diagnosis",
|
|
29
|
+
"secondaryDiagnosis": "Secondary diagnosis",
|
|
30
|
+
"secondaryDiagnosisInputPlaceholder": "Choose a secondary diagnosis",
|
|
31
|
+
"seeAll": "See all",
|
|
32
|
+
"visitDate": "Visit date",
|
|
33
|
+
"visitNote": "Visit note",
|
|
34
|
+
"visitNoteNowVisible": "It is now visible on the Encounters page",
|
|
35
|
+
"visitNotes": "Visit notes",
|
|
36
|
+
"visitNoteSaved": "Visit note saved",
|
|
37
|
+
"visitNoteSaveError": "Error saving visit note",
|
|
38
|
+
"visitNoteWorkspaceTitle": "Visit Note"
|
|
39
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"add": "Add",
|
|
3
|
+
"addImage": "Add image",
|
|
4
|
+
"addVisitNote": "Add a visit note",
|
|
5
|
+
"clinicalNoteLabel": "Write your notes",
|
|
6
|
+
"clinicalNotePlaceholder": "Write any notes here",
|
|
7
|
+
"date": "Date",
|
|
8
|
+
"diagnoses": "Diagnoses",
|
|
9
|
+
"discard": "Discard",
|
|
10
|
+
"emptyDiagnosisText": "No diagnosis selected — Enter a diagnosis below",
|
|
11
|
+
"enterPrimaryDiagnoses": "Enter Primary diagnoses",
|
|
12
|
+
"enterSecondaryDiagnoses": "Enter Secondary diagnoses",
|
|
13
|
+
"error": "Error",
|
|
14
|
+
"errorFetchingConcepts": "There was a problem fetching concepts",
|
|
15
|
+
"errorTransformingDiagnoses": "Error transforming diagnoses",
|
|
16
|
+
"image": "Image",
|
|
17
|
+
"imageRemoved": "Image removed",
|
|
18
|
+
"imageUploadHelperText": "Upload an image or use this device's camera to capture an image",
|
|
19
|
+
"noMatchingDiagnoses": "No diagnoses found matching",
|
|
20
|
+
"note": "Note",
|
|
21
|
+
"noVisitNoteToDisplay": "No visit note to display",
|
|
22
|
+
"primaryDiagnosis": "Primary diagnosis",
|
|
23
|
+
"primaryDiagnosisInputPlaceholder": "Choose a primary diagnosis",
|
|
24
|
+
"primaryDiagnosisRequired": "Choose at least one primary diagnosis",
|
|
25
|
+
"saveAndClose": "Save and close",
|
|
26
|
+
"saving": "Saving",
|
|
27
|
+
"searchForPrimaryDiagnosis": "Search for a primary diagnosis",
|
|
28
|
+
"searchForSecondaryDiagnosis": "Search for a secondary diagnosis",
|
|
29
|
+
"secondaryDiagnosis": "Secondary diagnosis",
|
|
30
|
+
"secondaryDiagnosisInputPlaceholder": "Choose a secondary diagnosis",
|
|
31
|
+
"seeAll": "See all",
|
|
32
|
+
"visitDate": "Visit date",
|
|
33
|
+
"visitNote": "Visit note",
|
|
34
|
+
"visitNoteNowVisible": "It is now visible on the Encounters page",
|
|
35
|
+
"visitNotes": "Visit notes",
|
|
36
|
+
"visitNoteSaved": "Visit note saved",
|
|
37
|
+
"visitNoteSaveError": "Error saving visit note",
|
|
38
|
+
"visitNoteWorkspaceTitle": "Visit Note"
|
|
39
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"add": "Add",
|
|
3
|
+
"addImage": "Add image",
|
|
4
|
+
"addVisitNote": "Add a visit note",
|
|
5
|
+
"clinicalNoteLabel": "Write your notes",
|
|
6
|
+
"clinicalNotePlaceholder": "Write any notes here",
|
|
7
|
+
"date": "Date",
|
|
8
|
+
"diagnoses": "Diagnoses",
|
|
9
|
+
"discard": "Discard",
|
|
10
|
+
"emptyDiagnosisText": "No diagnosis selected — Enter a diagnosis below",
|
|
11
|
+
"enterPrimaryDiagnoses": "Enter Primary diagnoses",
|
|
12
|
+
"enterSecondaryDiagnoses": "Enter Secondary diagnoses",
|
|
13
|
+
"error": "Error",
|
|
14
|
+
"errorFetchingConcepts": "There was a problem fetching concepts",
|
|
15
|
+
"errorTransformingDiagnoses": "Error transforming diagnoses",
|
|
16
|
+
"image": "Image",
|
|
17
|
+
"imageRemoved": "Image removed",
|
|
18
|
+
"imageUploadHelperText": "Upload an image or use this device's camera to capture an image",
|
|
19
|
+
"noMatchingDiagnoses": "No diagnoses found matching",
|
|
20
|
+
"note": "Note",
|
|
21
|
+
"noVisitNoteToDisplay": "No visit note to display",
|
|
22
|
+
"primaryDiagnosis": "Primary diagnosis",
|
|
23
|
+
"primaryDiagnosisInputPlaceholder": "Choose a primary diagnosis",
|
|
24
|
+
"primaryDiagnosisRequired": "Choose at least one primary diagnosis",
|
|
25
|
+
"saveAndClose": "Save and close",
|
|
26
|
+
"saving": "Saving",
|
|
27
|
+
"searchForPrimaryDiagnosis": "Search for a primary diagnosis",
|
|
28
|
+
"searchForSecondaryDiagnosis": "Search for a secondary diagnosis",
|
|
29
|
+
"secondaryDiagnosis": "Secondary diagnosis",
|
|
30
|
+
"secondaryDiagnosisInputPlaceholder": "Choose a secondary diagnosis",
|
|
31
|
+
"seeAll": "See all",
|
|
32
|
+
"visitDate": "Visit date",
|
|
33
|
+
"visitNote": "Visit note",
|
|
34
|
+
"visitNoteNowVisible": "It is now visible on the Encounters page",
|
|
35
|
+
"visitNotes": "Visit notes",
|
|
36
|
+
"visitNoteSaved": "Visit note saved",
|
|
37
|
+
"visitNoteSaveError": "Error saving visit note",
|
|
38
|
+
"visitNoteWorkspaceTitle": "Visit Note"
|
|
39
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"add": "Hinzufügen",
|
|
3
|
+
"addImage": "Bild hinzufügen",
|
|
4
|
+
"addVisitNote": "Eine Aufenthaltsnotiz hinzufügen",
|
|
5
|
+
"clinicalNoteLabel": "Schreiben Sie Ihre Notizen",
|
|
6
|
+
"clinicalNotePlaceholder": "Trage hier deine Notizen ein",
|
|
7
|
+
"date": "Datum",
|
|
8
|
+
"diagnoses": "Diagnosen",
|
|
9
|
+
"discard": "Verwerfen",
|
|
10
|
+
"emptyDiagnosisText": "Es wurde keine Diagnose ausgewählt – Geben Sie unten eine Diagnose ein",
|
|
11
|
+
"enterPrimaryDiagnoses": "Hauptdiagnose eintragen",
|
|
12
|
+
"enterSecondaryDiagnoses": "Nebendiagnose",
|
|
13
|
+
"error": "Fehler",
|
|
14
|
+
"errorFetchingConcepts": "Beim Abrufen der Konzepte ist ein Problem aufgetreten",
|
|
15
|
+
"errorTransformingDiagnoses": "Fehler bei der Umwandlung von Diagnosen",
|
|
16
|
+
"image": "Bild",
|
|
17
|
+
"imageRemoved": "Bild entfernt",
|
|
18
|
+
"imageUploadHelperText": "Laden Sie ein Bild hoch oder nehmen Sie mit der Kamera dieses Geräts ein Bild auf",
|
|
19
|
+
"noMatchingDiagnoses": "Keine passenden Diagnosen gefunden",
|
|
20
|
+
"note": "Notiz",
|
|
21
|
+
"noVisitNoteToDisplay": "Keine Aufenthaltsnotiz anzuzeigen",
|
|
22
|
+
"primaryDiagnosis": "Hauptdiagnose",
|
|
23
|
+
"primaryDiagnosisInputPlaceholder": "Wählen Sie eine Hauptdiagnose",
|
|
24
|
+
"primaryDiagnosisRequired": "Wählen Sie mindestens eine Hauptdiagnose",
|
|
25
|
+
"saveAndClose": "Speichern und Schließen",
|
|
26
|
+
"saving": "Speichern",
|
|
27
|
+
"searchForPrimaryDiagnosis": "Nach einer Hauptdiagnose suchen",
|
|
28
|
+
"searchForSecondaryDiagnosis": "Nach einer Nebendiagnose suchen",
|
|
29
|
+
"secondaryDiagnosis": "Nebendiagnose",
|
|
30
|
+
"secondaryDiagnosisInputPlaceholder": "Wählen Sie eine Sekundärdiagnose",
|
|
31
|
+
"seeAll": "Alle anzeigen",
|
|
32
|
+
"visitDate": "Aufenthaltsdatum",
|
|
33
|
+
"visitNote": "Aufenthaltsnotiz",
|
|
34
|
+
"visitNoteNowVisible": "Es ist nun auf der Seite Ereignisse zu sehen",
|
|
35
|
+
"visitNotes": "Aufenthaltsnotizen",
|
|
36
|
+
"visitNoteSaved": "Aufenthaltsnotiz gespeichert",
|
|
37
|
+
"visitNoteSaveError": "Fehler beim Speichern der Aufenthaltsnotiz",
|
|
38
|
+
"visitNoteWorkspaceTitle": "Aufenthaltsnotiz"
|
|
39
|
+
}
|