@openmrs/esm-generic-patient-widgets-app 11.3.1-patch.9064 → 11.3.1-patch.9508

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.
Files changed (133) hide show
  1. package/.turbo/turbo-build.log +23 -23
  2. package/dist/1119.js +1 -1
  3. package/dist/1197.js +1 -1
  4. package/dist/1936.js +1 -0
  5. package/dist/1936.js.map +1 -0
  6. package/dist/2146.js +1 -1
  7. package/dist/2606.js +2 -0
  8. package/dist/2606.js.map +1 -0
  9. package/dist/2690.js +1 -1
  10. package/dist/3099.js +1 -1
  11. package/dist/3204.js +2 -0
  12. package/dist/3204.js.map +1 -0
  13. package/dist/3584.js +1 -1
  14. package/dist/4055.js +1 -1
  15. package/dist/4132.js +1 -1
  16. package/dist/4300.js +1 -1
  17. package/dist/4335.js +1 -1
  18. package/dist/439.js +1 -0
  19. package/dist/4618.js +1 -1
  20. package/dist/4652.js +1 -1
  21. package/dist/4944.js +1 -1
  22. package/dist/5173.js +1 -1
  23. package/dist/5241.js +1 -1
  24. package/dist/5442.js +1 -1
  25. package/dist/5661.js +1 -1
  26. package/dist/5670.js +1 -1
  27. package/dist/5670.js.map +1 -1
  28. package/dist/6022.js +1 -1
  29. package/dist/6336.js +1 -0
  30. package/dist/6336.js.map +1 -0
  31. package/dist/6468.js +1 -1
  32. package/dist/6589.js +1 -0
  33. package/dist/6679.js +1 -1
  34. package/dist/6840.js +1 -1
  35. package/dist/6859.js +1 -1
  36. package/dist/7097.js +1 -1
  37. package/dist/7159.js +1 -1
  38. package/dist/723.js +1 -1
  39. package/dist/7545.js +2 -0
  40. package/dist/7545.js.map +1 -0
  41. package/dist/7617.js +1 -1
  42. package/dist/795.js +1 -1
  43. package/dist/8163.js +1 -1
  44. package/dist/8349.js +1 -1
  45. package/dist/8371.js +1 -0
  46. package/dist/8618.js +1 -1
  47. package/dist/8803.js +1 -1
  48. package/dist/8803.js.map +1 -1
  49. package/dist/890.js +1 -1
  50. package/dist/9214.js +1 -1
  51. package/dist/9538.js +1 -1
  52. package/dist/9569.js +1 -1
  53. package/dist/986.js +1 -1
  54. package/dist/9879.js +1 -1
  55. package/dist/9895.js +1 -1
  56. package/dist/9900.js +1 -1
  57. package/dist/9913.js +1 -1
  58. package/dist/main.js +1 -1
  59. package/dist/main.js.map +1 -1
  60. package/dist/openmrs-esm-generic-patient-widgets-app.js +1 -1
  61. package/dist/openmrs-esm-generic-patient-widgets-app.js.buildmanifest.json +285 -219
  62. package/dist/openmrs-esm-generic-patient-widgets-app.js.map +1 -1
  63. package/dist/routes.json +1 -1
  64. package/package.json +4 -4
  65. package/src/config-schema-obs-horizontal.ts +12 -0
  66. package/src/config-schema-obs-switchable.ts +7 -1
  67. package/src/obs-graph/obs-graph.component.tsx +85 -36
  68. package/src/obs-graph/obs-graph.scss +19 -11
  69. package/src/obs-switchable/obs-switchable.component.tsx +12 -11
  70. package/src/obs-switchable/obs-switchable.test.tsx +145 -42
  71. package/src/obs-table/obs-table.component.tsx +104 -20
  72. package/src/obs-table-horizontal/obs-table-horizontal.component.tsx +470 -57
  73. package/src/obs-table-horizontal/obs-table-horizontal.resource.ts +67 -0
  74. package/src/obs-table-horizontal/obs-table-horizontal.scss +47 -0
  75. package/src/obs-table-horizontal/obs-table-horizontal.test.tsx +923 -0
  76. package/src/resources/useConcepts.ts +51 -0
  77. package/src/resources/useEncounterTypes.ts +34 -0
  78. package/src/resources/useObs.ts +40 -31
  79. package/translations/am.json +7 -1
  80. package/translations/ar.json +7 -1
  81. package/translations/ar_SY.json +7 -1
  82. package/translations/bn.json +7 -1
  83. package/translations/cs.json +10 -0
  84. package/translations/de.json +7 -1
  85. package/translations/en.json +7 -1
  86. package/translations/en_US.json +7 -1
  87. package/translations/es.json +7 -1
  88. package/translations/es_MX.json +7 -1
  89. package/translations/fr.json +7 -1
  90. package/translations/he.json +7 -1
  91. package/translations/hi.json +7 -1
  92. package/translations/hi_IN.json +7 -1
  93. package/translations/id.json +7 -1
  94. package/translations/it.json +7 -1
  95. package/translations/ka.json +7 -1
  96. package/translations/km.json +7 -1
  97. package/translations/ku.json +7 -1
  98. package/translations/ky.json +7 -1
  99. package/translations/lg.json +7 -1
  100. package/translations/ne.json +7 -1
  101. package/translations/pl.json +7 -1
  102. package/translations/pt.json +7 -1
  103. package/translations/pt_BR.json +7 -1
  104. package/translations/qu.json +7 -1
  105. package/translations/ro_RO.json +7 -1
  106. package/translations/ru_RU.json +7 -1
  107. package/translations/si.json +7 -1
  108. package/translations/sq.json +10 -0
  109. package/translations/sw.json +7 -1
  110. package/translations/sw_KE.json +7 -1
  111. package/translations/tr.json +7 -1
  112. package/translations/tr_TR.json +7 -1
  113. package/translations/uk.json +7 -1
  114. package/translations/uz.json +7 -1
  115. package/translations/uz@Latn.json +7 -1
  116. package/translations/uz_UZ.json +7 -1
  117. package/translations/vi.json +7 -1
  118. package/translations/zh.json +7 -1
  119. package/translations/zh_CN.json +7 -1
  120. package/translations/zh_TW.json +10 -0
  121. package/dist/1559.js +0 -2
  122. package/dist/1559.js.map +0 -1
  123. package/dist/251.js +0 -2
  124. package/dist/251.js.map +0 -1
  125. package/dist/5639.js +0 -1
  126. package/dist/5639.js.map +0 -1
  127. package/dist/5986.js +0 -1
  128. package/dist/5986.js.map +0 -1
  129. package/dist/6781.js +0 -2
  130. package/dist/6781.js.map +0 -1
  131. /package/dist/{251.js.LICENSE.txt → 2606.js.LICENSE.txt} +0 -0
  132. /package/dist/{6781.js.LICENSE.txt → 3204.js.LICENSE.txt} +0 -0
  133. /package/dist/{1559.js.LICENSE.txt → 7545.js.LICENSE.txt} +0 -0
@@ -0,0 +1,51 @@
1
+ import { openmrsFetch, type FetchResponse, restBaseUrl, showSnackbar } from '@openmrs/esm-framework';
2
+ import chunk from 'lodash/chunk';
3
+ import useSWRImmutable from 'swr/immutable';
4
+
5
+ export interface ConceptReferenceResponse {
6
+ [key: string]: {
7
+ uuid: string;
8
+ display: string;
9
+ datatype: {
10
+ name: string;
11
+ };
12
+ answers: Array<{
13
+ uuid: string;
14
+ display: string;
15
+ }>;
16
+ };
17
+ }
18
+
19
+ export function useConcepts(conceptUuids: Array<string>) {
20
+ const { data, error, isLoading } = useSWRImmutable<Array<FetchResponse<ConceptReferenceResponse>>, Error>(
21
+ conceptUuids && conceptUuids.length > 0 ? getConceptReferenceUrls(conceptUuids) : null,
22
+ (key: Array<string>) => Promise.all(key.map((url) => openmrsFetch<ConceptReferenceResponse>(url))),
23
+ );
24
+
25
+ const res: ConceptReferenceResponse = data?.reduce((acc, response) => ({ ...acc, ...response.data }), {});
26
+ const concepts = res
27
+ ? Object.values(res).map((value) => ({
28
+ uuid: value.uuid,
29
+ display: value.display,
30
+ dataType: value.datatype.name,
31
+ answers: value.answers,
32
+ }))
33
+ : [];
34
+
35
+ if (error) {
36
+ showSnackbar({
37
+ title: error.name,
38
+ subtitle: error.message,
39
+ kind: 'error',
40
+ });
41
+ }
42
+
43
+ return { concepts, isLoading };
44
+ }
45
+
46
+ function getConceptReferenceUrls(conceptUuids: Array<string>) {
47
+ return chunk(conceptUuids, 10).map(
48
+ (partition) =>
49
+ `${restBaseUrl}/conceptreferences?references=${partition.join(',')}&v=custom:(uuid,display,datatype,answers)`,
50
+ );
51
+ }
@@ -0,0 +1,34 @@
1
+ import { restBaseUrl, type Privilege } from '@openmrs/esm-framework';
2
+ import useSWRImmutable from 'swr/immutable';
3
+
4
+ export interface EncounterType {
5
+ uuid: string;
6
+ editPrivilege?: Privilege;
7
+ }
8
+
9
+ export interface UseEncountersResult {
10
+ encounterTypes: Array<EncounterType>;
11
+ error: Error;
12
+ isLoading: boolean;
13
+ isValidating: boolean;
14
+ mutate: () => Promise<any>;
15
+ }
16
+
17
+ export function useEncounterTypes() {
18
+ const customRep = 'custom:(uuid,editPrivilege)';
19
+ const url = new URL(`${restBaseUrl}/encountertype`, window.location.toString());
20
+ url.searchParams.set('v', customRep);
21
+
22
+ const { data, error, isLoading, isValidating, mutate } = useSWRImmutable<
23
+ { data: { results: Array<EncounterType> } },
24
+ Error
25
+ >(`${restBaseUrl}/encountertype?v=${customRep}`);
26
+
27
+ return {
28
+ encounterTypes: data?.data?.results || [],
29
+ error: error,
30
+ isLoading,
31
+ isValidating,
32
+ mutate,
33
+ };
34
+ }
@@ -2,14 +2,20 @@ import useSWR from 'swr';
2
2
  import { openmrsFetch, fhirBaseUrl, useConfig } from '@openmrs/esm-framework';
3
3
  import { type ConfigObjectSwitchable } from '../config-schema-obs-switchable';
4
4
  import { type ConfigObjectHorizontal } from '../config-schema-obs-horizontal';
5
+ import { useConcepts } from './useConcepts';
5
6
 
6
7
  type CommonConfig = ConfigObjectSwitchable | ConfigObjectHorizontal;
7
8
 
8
9
  export interface UseObsResult {
9
- data: Array<ObsResult>;
10
+ data: {
11
+ observations: Array<ObsResult>;
12
+ concepts: Array<{ uuid: string; display: string; dataType: string }>;
13
+ encounters: Array<{ reference: string; display: string; encounterTypeUuid: string }>;
14
+ };
10
15
  error: Error;
11
16
  isLoading: boolean;
12
17
  isValidating: boolean;
18
+ mutate: () => Promise<any>;
13
19
  }
14
20
 
15
21
  export type ObsResult = fhir.Observation & {
@@ -22,40 +28,53 @@ export type ObsResult = fhir.Observation & {
22
28
  * Reference to the encounter resource, in the format `Encounter/{uuid}`
23
29
  */
24
30
  reference: string;
31
+ encounterTypeUuid?: string;
25
32
  };
26
33
  };
27
34
 
28
35
  export const pageSize = 100;
29
36
 
30
- export function useObs(patientUuid: string, includeEncounters: boolean = false): UseObsResult {
31
- const { encounterTypes, data, showEncounterType } = useConfig<CommonConfig>();
37
+ /**
38
+ * Fetches the observations for the concepts in the config for this widget.
39
+ * For any concept that has neither label nor obs, the concept is fetched to
40
+ * get the label.
41
+ */
42
+ export function useObs(patientUuid: string): UseObsResult {
43
+ const { encounterTypes, data } = useConfig<CommonConfig>();
32
44
  const urlEncounterTypes: string = encounterTypes.length ? `&encounter.type=${encounterTypes.toString()}` : '';
33
45
 
46
+ // TODO: Make sorting respect oldestFirst/graphOldestFirst
34
47
  let url = `${fhirBaseUrl}/Observation?subject:Patient=${patientUuid}&code=${data
35
48
  .map((d) => d.concept)
36
- .join(',')}&_summary=data&_sort=-date&_count=${pageSize}${urlEncounterTypes}`;
37
-
38
- if (showEncounterType) {
39
- url += '&_include=Observation:encounter';
40
- }
49
+ .join(',')}&_summary=data&_include=Observation:encounter&_sort=-date&_count=${pageSize}${urlEncounterTypes}`;
41
50
 
42
- const { data: result, error, isLoading, isValidating } = useSWR<{ data: fhir.Bundle }, Error>(url, openmrsFetch);
51
+ const {
52
+ data: result,
53
+ error,
54
+ isLoading,
55
+ isValidating,
56
+ mutate,
57
+ } = useSWR<{ data: fhir.Bundle }, Error>(url, openmrsFetch);
43
58
 
44
- const encounters = showEncounterType ? getEncountersByResources(result?.data?.entry) : [];
45
- const observations = filterAndMapObservations(result?.data?.entry, encounters);
59
+ const { concepts } = useConcepts(data.map((d) => d.concept));
46
60
 
61
+ const encounters = getEncountersFromResources(result?.data?.entry);
62
+ const observations = filterAndMapObservations(result?.data?.entry, encounters, concepts);
47
63
  return {
48
- data: observations,
64
+ data: { observations, concepts, encounters },
49
65
  error: error,
50
66
  isLoading,
51
67
  isValidating,
68
+ mutate,
52
69
  };
53
70
  }
54
71
 
55
72
  function filterAndMapObservations(
56
73
  entries: Array<fhir.BundleEntry>,
57
- encounters: Array<{ reference: string; display: string }>,
74
+ encounters: Array<{ reference: string; display: string; encounterTypeUuid: string }>,
75
+ concepts: Array<{ uuid: string; display: string; dataType: string }>,
58
76
  ): ObsResult[] {
77
+ const conceptByUuid = Object.fromEntries(concepts.map((c) => [c.uuid, c]));
59
78
  return (
60
79
  entries
61
80
  ?.filter((entry) => entry?.resource?.resourceType === 'Observation')
@@ -64,39 +83,29 @@ function filterAndMapObservations(
64
83
  const observation: ObsResult = {
65
84
  ...resource,
66
85
  conceptUuid: resource.code.coding.find((c) => isUuid(c.code))?.code,
86
+ dataType: conceptByUuid[resource.code.coding.find((c) => isUuid(c.code))?.code]?.dataType,
67
87
  };
68
- if (resource.hasOwnProperty('valueDateTime')) {
69
- observation.dataType = 'DateTime';
70
- }
71
88
 
72
- if (entry.resource.hasOwnProperty('valueString')) {
73
- observation.dataType = 'Text';
74
- }
75
-
76
- if (entry.resource.hasOwnProperty('valueQuantity')) {
77
- observation.dataType = 'Number';
78
- }
79
-
80
- if (entry.resource.hasOwnProperty('valueCodeableConcept')) {
81
- observation.dataType = 'Coded';
82
- }
83
-
84
- observation.encounter.name = encounters.find(
89
+ const encounter = encounters.find(
85
90
  (e) =>
86
91
  e.reference === (resource as fhir.Observation & { encounter: { reference?: string } }).encounter.reference,
87
- )?.display;
92
+ );
93
+
94
+ observation.encounter.name = encounter?.display;
95
+ observation.encounter.encounterTypeUuid = encounter?.encounterTypeUuid;
88
96
 
89
97
  return observation;
90
98
  }) || []
91
99
  );
92
100
  }
93
101
 
94
- function getEncountersByResources(resources: Array<fhir.BundleEntry>) {
102
+ function getEncountersFromResources(resources: Array<fhir.BundleEntry>) {
95
103
  return resources
96
104
  ?.filter((entry) => entry?.resource?.resourceType === 'Encounter')
97
105
  .map((entry: fhir.BundleEntry) => ({
98
106
  reference: `Encounter/${entry.resource.id}`,
99
107
  display: (entry.resource as fhir.Encounter).type?.[0]?.coding?.[0]?.display || '--',
108
+ encounterTypeUuid: (entry.resource as fhir.Encounter).type?.[0]?.coding?.[0]?.code,
100
109
  }));
101
110
  }
102
111
 
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Date and time",
3
- "encounterType": "Encounter type"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Encounter type",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "التاريخ والوقت",
3
- "encounterType": "نوع اللقاء"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "نوع اللقاء",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Date and time",
3
- "encounterType": "Encounter type"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Encounter type",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Date and time",
3
- "encounterType": "Encounter type"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Encounter type",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -0,0 +1,10 @@
1
+ {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
4
+ "dateAndTime": "Date and time",
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Encounter type",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
10
+ }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Date and time",
3
- "encounterType": "Encounter type"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Encounter type",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Date and time",
3
- "encounterType": "Encounter type"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Encounter type",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Date and time",
3
- "encounterType": "Encounter type"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Encounter type",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Fecha y hora",
3
- "encounterType": "Tipo de encuentro"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Tipo de encuentro",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Date and time",
3
- "encounterType": "Encounter type"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Encounter type",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Date et heure",
3
- "encounterType": "Type de consultation"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Type de consultation",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "תאריך ושעה",
3
- "encounterType": "סוג הביקור"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "סוג הביקור",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Date and time",
3
- "encounterType": "Encounter type"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Encounter type",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Date and time",
3
- "encounterType": "Encounter type"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Encounter type",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Tanggal dan waktu",
3
- "encounterType": "Jenis pertemuan"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Jenis pertemuan",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Data e ora",
3
- "encounterType": "Tipo di incontro"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Tipo di incontro",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "თარიღი და დრო",
3
- "encounterType": "კონსულტაციის ტიპი"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "კონსულტაციის ტიპი",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "កាលបរិច្ឆេទ និងម៉ោង",
3
- "encounterType": "ប្រភេទនៃការជួបប្រទះ"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "ប្រភេទនៃការជួបប្រទះ",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Date and time",
3
- "encounterType": "Encounter type"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Encounter type",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Date and time",
3
- "encounterType": "Encounter type"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Encounter type",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Date and time",
3
- "encounterType": "Encounter type"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Encounter type",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Date and time",
3
- "encounterType": "Encounter type"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Encounter type",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Date and time",
3
- "encounterType": "Encounter type"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Encounter type",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Data e hora",
3
- "encounterType": "Tipo de consulta"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Tipo de consulta",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Data e hora",
3
- "encounterType": "Tipo de encontro"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Tipo de encontro",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Date and time",
3
- "encounterType": "Encounter type"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Encounter type",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Data si ora",
3
- "encounterType": "Tip intalnire"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Tip intalnire",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Date and time",
3
- "encounterType": "Encounter type"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Encounter type",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Date and time",
3
- "encounterType": "Encounter type"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Encounter type",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -0,0 +1,10 @@
1
+ {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
4
+ "dateAndTime": "Date and time",
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Encounter type",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
10
+ }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Date and time",
3
- "encounterType": "Encounter type"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Encounter type",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }
@@ -1,4 +1,10 @@
1
1
  {
2
+ "addEncounter": "Add encounter",
3
+ "date": "Date",
2
4
  "dateAndTime": "Date and time",
3
- "encounterType": "Encounter type"
5
+ "editabilityNote": "Tap an observation to edit",
6
+ "encounterType": "Encounter type",
7
+ "errorSavingObservation": "Error saving observation",
8
+ "noValue": "No value",
9
+ "observationSaved": "Observation saved successfully"
4
10
  }